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 <sys/prctl.h>
17
18 #include "br_connection_manager.h"
19 #include "br_trans_manager.h"
20 #include "bus_center_manager.h"
21 #include "common_list.h"
22 #include "message_handler.h"
23 #include "securec.h"
24 #include "softbus_adapter_mem.h"
25 #include "softbus_adapter_timer.h"
26 #include "softbus_conn_manager.h"
27 #include "softbus_def.h"
28 #include "softbus_errcode.h"
29 #include "softbus_feature_config.h"
30 #include "softbus_json_utils.h"
31 #include "softbus_log.h"
32 #include "softbus_type_def.h"
33 #include "softbus_utils.h"
34 #include "stdbool.h"
35 #include "string.h"
36 #include "time.h"
37 #include "unistd.h"
38 #include "wrapper_br_interface.h"
39 #define SEND_WAIT_TIMEOUT 1000
40 #define DISCONN_DELAY_TIME 200
41 #define BR_ACCEPET_WAIT_TIME 1000
42 #define CONNECT_REF_INCRESE 1
43 #define CONNECT_REF_DECRESE (-1)
44 #define BR_SEND_THREAD_STACK 5120
45 #define BR_ACCECT_THREAD_STACK 4096
46 #define BR_RECE_THREAD_STACK 4096
47 #define MAX_BR_SIZE (40 * 1000)
48 #define MAX_BR_PEER_SIZE (3*1024)
49 #define INVALID_LENGTH (-1)
50 #define PRIORITY_HIGH 64
51 #define PRIORITY_MID 8
52 #define PRIORITY_LOW 1
53 #define PRIORITY_DAF 1
54
55 #define BR_SERVER_NAME_LEN 24
56 #define UUID "8ce255c0-200a-11e0-ac64-0800200c9a66"
57
58 static pthread_mutex_t g_brConnLock;
59 static int32_t g_brMaxConnCount;
60
61 static SoftBusHandler g_brAsyncHandler = {
62 .name = "g_brAsyncHandler"
63 };
64
65 typedef struct {
66 ListNode node;
67 uint32_t connectionId;
68 int32_t pid;
69 int32_t priority;
70 uint32_t dataLen;
71 int32_t sendPos;
72 char *data;
73 } SendItemStruct;
74
75 typedef struct {
76 ListNode node;
77 int32_t pid;
78 int32_t itemCount;
79 } DataPidQueueStruct;
80
81 typedef struct {
82 ListNode sendList;
83 ListNode pidList;
84 pthread_mutex_t lock;
85 pthread_cond_t cond;
86 SoftBusHandler *handler;
87 } DataQueueStruct;
88
89 static int32_t ConnectDevice(const ConnectOption *option, uint32_t requestId, const ConnectResult *result);
90
91 static int32_t DisconnectDevice(uint32_t connectionId);
92
93 static int32_t DisconnectDeviceNow(const ConnectOption *option);
94
95 static int32_t StartLocalListening(const LocalListenerInfo *info);
96
97 static int32_t StopLocalListening(const LocalListenerInfo *info);
98
99 static int32_t PostBytes(uint32_t connectionId, const char *data, int32_t len, int32_t pid, int32_t flag);
100
101 static ConnectFuncInterface g_brInterface = {
102 .ConnectDevice = ConnectDevice,
103 .PostBytes = PostBytes,
104 .DisconnectDevice = DisconnectDevice,
105 .DisconnectDeviceNow = DisconnectDeviceNow,
106 .GetConnectionInfo = GetConnectionInfo,
107 .StartLocalListening = StartLocalListening,
108 .StopLocalListening = StopLocalListening,
109 .CheckActiveConnection = BrCheckActiveConnection
110 };
111
112 static DataQueueStruct g_dataQueue;
113 static SppSocketDriver *g_sppDriver = NULL;
114 static ConnectCallback *g_connectCallback = NULL;
115
116 static int32_t g_brBuffSize;
117 static int32_t g_brSendPeerLen;
118 static int32_t g_brSendQueueMaxLen;
119
120 static SoftBusBtStateListener g_sppBrCallback;
121 static bool g_startListenFlag = false;
122 static int32_t g_brEnable = SOFTBUS_BR_STATE_TURN_OFF;
123
BrFreeMessage(SoftBusMessage * msg)124 static void BrFreeMessage(SoftBusMessage *msg)
125 {
126 if (msg->obj != NULL) {
127 SoftBusFree(msg->obj);
128 }
129 SoftBusFree((void *)msg);
130 }
131
BrConnCreateLoopMsg(BrConnLoopMsgType what,uint64_t arg1,uint64_t arg2,const char * data)132 static SoftBusMessage *BrConnCreateLoopMsg(BrConnLoopMsgType what, uint64_t arg1, uint64_t arg2, const char *data)
133 {
134 SoftBusMessage *msg = NULL;
135 msg = (SoftBusMessage *)SoftBusCalloc(sizeof(SoftBusMessage));
136 if (msg == NULL) {
137 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "BrConnCreateLoopMsg SoftBusCalloc failed");
138 return NULL;
139 }
140 msg->what = what;
141 msg->arg1 = arg1;
142 msg->arg2 = arg2;
143 msg->handler = &g_brAsyncHandler;
144 msg->FreeMessage = BrFreeMessage;
145 msg->obj = (void *)data;
146 return msg;
147 }
148
PackRequest(int32_t delta,uint32_t connectionId)149 static void PackRequest(int32_t delta, uint32_t connectionId)
150 {
151 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[PackRequest: delta=%d, connectionId=%u]", delta, connectionId);
152 int32_t refCount = -1;
153 int32_t state = SetRefCountByConnId(delta, &refCount, connectionId);
154 if (state != BR_CONNECTION_STATE_CONNECTED) {
155 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "Br Not Connected!");
156 return;
157 }
158 int32_t dataLen = 0;
159 char *buf = BrPackRequestOrResponse(METHOD_NOTIFY_REQUEST, delta, refCount, &dataLen);
160 if (buf != NULL) {
161 (void)PostBytes(connectionId, buf, dataLen, 0, 0);
162 }
163 }
164
DeviceConnectPackRequest(int32_t value,uint32_t connectionId)165 static void DeviceConnectPackRequest(int32_t value, uint32_t connectionId)
166 {
167 int32_t data = value;
168 while (--data > 0) {
169 (void)PackRequest(CONNECT_REF_INCRESE, connectionId);
170 }
171 }
172
ClientOnBrConnectDevice(int32_t connId,int32_t * outSocketFd)173 static int32_t ClientOnBrConnectDevice(int32_t connId, int32_t *outSocketFd)
174 {
175 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "sppDriver connect start.");
176 BrConnectionInfo *brConn = GetConnectionRef(connId);
177 if (brConn == NULL) {
178 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "BrClient not find connInfo.");
179 return SOFTBUS_BRCONNECTION_GETCONNINFO_ERROR;
180 }
181 if (brConn->sideType != BR_CLIENT_TYPE) {
182 ReleaseConnectionRef(brConn);
183 return SOFTBUS_INVALID_PARAM;
184 }
185 uint8_t btAddr[BT_ADDR_LEN];
186 if (ConvertBtMacToBinary(brConn->mac, BT_MAC_LEN, btAddr, BT_ADDR_LEN) != SOFTBUS_OK) {
187 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "convert bt mac to binary fail.");
188 ReleaseConnectionRef(brConn);
189 return SOFTBUS_ERR;
190 }
191 int32_t socketFd = SOFTBUS_ERR;
192 if (g_sppDriver != NULL) {
193 socketFd = g_sppDriver->Connect(UUID, btAddr);
194 }
195 if (socketFd == SOFTBUS_ERR) {
196 ReleaseConnectionRef(brConn);
197 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "sppDriver connect failed");
198 return SOFTBUS_BRCONNECTION_CONNECTDEVICE_GETSOCKETIDFAIL;
199 }
200 brConn->socketFd = socketFd;
201 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "br connection ok, Id=%d, socket=%d", connId, socketFd);
202 if (g_sppDriver->IsConnected(socketFd)) {
203 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "sppDriver IsConnected true.");
204 }
205 if (brConn->state == BR_CONNECTION_STATE_CLOSED || brConn->state == BR_CONNECTION_STATE_CLOSING) {
206 g_sppDriver->DisConnect(socketFd);
207 ReleaseConnectionRef(brConn);
208 return SOFTBUS_ERR;
209 }
210 brConn->state = BR_CONNECTION_STATE_CONNECTED;
211 *outSocketFd = socketFd;
212 ReleaseConnectionRef(brConn);
213 return SOFTBUS_OK;
214 }
215
ClientNoticeResultBrConnect(uint32_t connId,bool result,int32_t value)216 static void ClientNoticeResultBrConnect(uint32_t connId, bool result, int32_t value)
217 {
218 ListNode notifyList;
219 ListInit(¬ifyList);
220 ListNode *item = NULL;
221 ListNode *itemNext = NULL;
222 RequestInfo *requestInfo = NULL;
223 ConnectionInfo connectionInfo;
224 if (!result) {
225 SetBrConnStateByConnId(connId, BR_CONNECTION_STATE_CLOSING);
226 }
227 int32_t sideType = BR_CLIENT_TYPE;
228 int32_t packRequestFlag = GetBrRequestListByConnId(connId, ¬ifyList, &connectionInfo, &sideType);
229 if (packRequestFlag != 0) {
230 if (result) {
231 connectionInfo.isAvailable = 1;
232 DeviceConnectPackRequest(packRequestFlag, connId);
233 }
234 LIST_FOR_EACH_SAFE(item, itemNext, ¬ifyList) {
235 requestInfo = LIST_ENTRY(item, RequestInfo, node);
236 if (result) {
237 if (requestInfo->callback.OnConnectSuccessed != NULL) {
238 requestInfo->callback.OnConnectSuccessed(requestInfo->requestId, connId, &connectionInfo);
239 }
240 } else {
241 if (requestInfo->callback.OnConnectFailed != NULL) {
242 requestInfo->callback.OnConnectFailed(requestInfo->requestId, value);
243 }
244 }
245 ListDelete(&requestInfo->node);
246 SoftBusFree(requestInfo);
247 }
248 }
249 }
250
ClientOnBrConnect(int32_t connId)251 static int32_t ClientOnBrConnect(int32_t connId)
252 {
253 int32_t socketFd = -1;
254 bool isSuccess = true;
255 if (ClientOnBrConnectDevice(connId, &socketFd) != SOFTBUS_OK) {
256 isSuccess = false;
257 }
258 ClientNoticeResultBrConnect(connId, isSuccess, socketFd);
259 if (!isSuccess) {
260 ReleaseConnectionRefByConnId(connId);
261 }
262 return socketFd;
263 }
264
NotifyDisconnect(const ListNode * notifyList,int32_t connectionId,ConnectionInfo connectionInfo,int32_t value,int32_t sideType)265 static void NotifyDisconnect(const ListNode *notifyList, int32_t connectionId,
266 ConnectionInfo connectionInfo, int32_t value, int32_t sideType)
267 {
268 ListNode *item = NULL;
269 ListNode *itemNext = NULL;
270 if (IsListEmpty(notifyList) != true) {
271 LIST_FOR_EACH_SAFE(item, itemNext, notifyList) {
272 RequestInfo *requestInfo = LIST_ENTRY(item, RequestInfo, node);
273 if (requestInfo->callback.OnConnectFailed != NULL) {
274 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "notify disconn connectionId=%d", connectionId);
275 requestInfo->callback.OnConnectFailed(requestInfo->requestId, value);
276 }
277 ListDelete(&requestInfo->node);
278 SoftBusFree(requestInfo);
279 }
280 }
281 (void)sideType;
282 if (g_connectCallback != NULL) {
283 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[ClientOnEvent] disconn connectionId=%d", connectionId);
284 g_connectCallback->OnDisconnected(connectionId, &connectionInfo);
285 }
286 }
287
NotifyServerConn(int connectionId,const char * mac,int32_t sideType)288 static int32_t NotifyServerConn(int connectionId, const char *mac, int32_t sideType)
289 {
290 ConnectionInfo connectionInfo;
291 connectionInfo.isAvailable = 1;
292 connectionInfo.isServer = sideType;
293 connectionInfo.type = CONNECT_BR;
294 if (strcpy_s(connectionInfo.info.brInfo.brMac, BT_MAC_LEN, mac) != EOK) {
295 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "NotifyServerConn scpy error");
296 return SOFTBUS_ERR;
297 }
298 g_connectCallback->OnConnected(connectionId, &connectionInfo);
299 return SOFTBUS_OK;
300 }
301
ClearDataPidByPid(int32_t pid)302 static void ClearDataPidByPid(int32_t pid)
303 {
304 ListNode *item = NULL;
305 ListNode *nextItem = NULL;
306 LIST_FOR_EACH_SAFE(item, nextItem, &g_dataQueue.pidList) {
307 DataPidQueueStruct *itemNode = LIST_ENTRY(item, DataPidQueueStruct, node);
308 if (itemNode->pid == pid) {
309 ListDelete(item);
310 SoftBusFree(itemNode);
311 }
312 }
313 }
314
FreeSendItem(SendItemStruct * sendItem)315 static void FreeSendItem(SendItemStruct *sendItem)
316 {
317 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[FreeSendItem]");
318 if (sendItem == NULL) {
319 return;
320 }
321 if (sendItem->data != NULL) {
322 SoftBusFree(sendItem->data);
323 }
324 SoftBusFree(sendItem);
325 }
326
ClearSendItemByConnId(uint32_t connectionId)327 static void ClearSendItemByConnId(uint32_t connectionId)
328 {
329 if (pthread_mutex_lock(&g_dataQueue.lock) != 0) {
330 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "[ClearSendItemByConnId] mutex failed");
331 return;
332 }
333 ListNode *sendItemNode = NULL;
334 ListNode *nextItem = NULL;
335 SendItemStruct *sendItem = NULL;
336 LIST_FOR_EACH_SAFE(sendItemNode, nextItem, &g_dataQueue.sendList) {
337 sendItem = LIST_ENTRY(sendItemNode, SendItemStruct, node);
338 if (sendItem->connectionId == connectionId) {
339 ClearDataPidByPid(sendItem->pid);
340 ListDelete(sendItemNode);
341 FreeSendItem(sendItem);
342 }
343 }
344 (void)pthread_mutex_unlock(&g_dataQueue.lock);
345 }
346
BrDisconnect(int32_t socketFd,int32_t value)347 static void BrDisconnect(int32_t socketFd, int32_t value)
348 {
349 ListNode notifyList;
350 ListInit(¬ifyList);
351 ConnectionInfo connectionInfo;
352 int32_t sideType = BR_CLIENT_TYPE;
353 int32_t perState = BR_CONNECTION_STATE_CLOSED;
354 uint32_t connectionId = SetBrConnStateBySocket(socketFd, BR_CONNECTION_STATE_CLOSED, &perState);
355 if (connectionId != 0) {
356 (void)GetBrRequestListByConnId(connectionId, ¬ifyList, &connectionInfo, &sideType);
357 ClearSendItemByConnId(connectionId);
358 if (perState != BR_CONNECTION_STATE_CLOSED) {
359 NotifyDisconnect(¬ifyList, connectionId, connectionInfo, value, sideType);
360 ReleaseConnectionRefByConnId(connectionId);
361 }
362 }
363 }
364
ConnBrOnEvent(BrConnLoopMsgType type,int32_t socketFd,int32_t value)365 int32_t ConnBrOnEvent(BrConnLoopMsgType type, int32_t socketFd, int32_t value)
366 {
367 if (type >= ADD_CONN_BR_MAX || type <= ADD_CONN_BR_INVALID) {
368 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "[ConnBrOnEvent] type(%d) failed", type);
369 return SOFTBUS_ERR;
370 }
371 if (type == ADD_CONN_BR_CONGEST_MSG) {
372 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "[ConnBrOnEvent] ADD_CONN_BR_CONGEST_MSG");
373 RfcomCongestEvent(socketFd, value);
374 return SOFTBUS_ERR;
375 }
376
377 SoftBusMessage *msg = BrConnCreateLoopMsg(type, (uint64_t)socketFd, (uint64_t)value, NULL);
378 if (msg == NULL) {
379 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "[ConnBrOnEvent] BrConnCreateLoopMsg failed");
380 return SOFTBUS_ERR;
381 }
382 g_brAsyncHandler.looper->PostMessage(g_brAsyncHandler.looper, msg);
383 return SOFTBUS_OK;
384 }
385
ConnectDeviceExit(const uint32_t connId,uint32_t requestId,const ConnectResult * result)386 static void ConnectDeviceExit(const uint32_t connId, uint32_t requestId, const ConnectResult *result)
387 {
388 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[ConnectDeviceExit]");
389 BrConnectionInfo *connInfo = GetConnectionRef(connId);
390 if (connInfo == NULL) {
391 return;
392 }
393 ConnectionInfo connectionInfo;
394 connectionInfo.isAvailable = 1;
395 connectionInfo.isServer = connInfo->sideType;
396 connectionInfo.type = CONNECT_BR;
397 if (strcpy_s(connectionInfo.info.brInfo.brMac, BT_MAC_LEN, connInfo->mac) != EOK) {
398 ReleaseConnectionRef(connInfo);
399 return;
400 }
401 ReleaseConnectionRef(connInfo);
402
403 if (result->OnConnectSuccessed != NULL) {
404 result->OnConnectSuccessed(requestId, connId, &connectionInfo);
405 }
406
407 (void)PackRequest(CONNECT_REF_INCRESE, connId);
408 }
409
ConnectDeviceStateConnecting(const uint32_t connId,uint32_t requestId,const ConnectResult * result)410 static int32_t ConnectDeviceStateConnecting(const uint32_t connId, uint32_t requestId, const ConnectResult *result)
411 {
412 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[ConnectDeviceStateConnecting]");
413 RequestInfo *requestInfo = (RequestInfo *)SoftBusMalloc(sizeof(RequestInfo));
414 if (requestInfo == NULL) {
415 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "SoftBusMalloc failed");
416 return SOFTBUS_ERR;
417 }
418 (void)memset_s(requestInfo, sizeof(RequestInfo), 0, sizeof(RequestInfo));
419 ListInit(&requestInfo->node);
420 requestInfo->requestId = requestId;
421 if (memcpy_s(&requestInfo->callback, sizeof(requestInfo->callback), result, sizeof(*result)) != EOK) {
422 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "AddRequestByConnId memcpy_s fail");
423 SoftBusFree(requestInfo);
424 return SOFTBUS_ERR;
425 }
426 if (AddRequestByConnId(connId, requestInfo) != SOFTBUS_OK) {
427 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "AddRequestByConnId failed");
428 SoftBusFree(requestInfo);
429 return SOFTBUS_ERR;
430 }
431 return SOFTBUS_OK;
432 }
433
ConnectDeviceFristTime(const ConnectOption * option,uint32_t requestId,const ConnectResult * result)434 static int32_t ConnectDeviceFristTime(const ConnectOption *option, uint32_t requestId, const ConnectResult *result)
435 {
436 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[ConnectDeviceFristTime]");
437 if (g_sppDriver == NULL) {
438 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "[sppDriver null]");
439 return SOFTBUS_ERR;
440 }
441 BrConnectionInfo *newConnInfo = CreateBrconnectionNode(true);
442 if (newConnInfo == NULL) {
443 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "[client node create fail]");
444 return SOFTBUS_ERR;
445 }
446 RequestInfo *requestInfo = (RequestInfo *)SoftBusCalloc(sizeof(RequestInfo));
447 if (requestInfo == NULL) {
448 ReleaseBrconnectionNode(newConnInfo);
449 return SOFTBUS_ERR;
450 }
451 ListInit(&requestInfo->node);
452 requestInfo->requestId = requestId;
453 if (memcpy_s(&requestInfo->callback, sizeof(requestInfo->callback), result, sizeof(*result)) != EOK) {
454 ReleaseBrconnectionNode(newConnInfo);
455 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "ConnectDeviceFirstTime memcpy_s fail");
456 return SOFTBUS_ERR;
457 }
458 ListAdd(&newConnInfo->requestList, &requestInfo->node);
459 if (strcpy_s(newConnInfo->mac, sizeof(newConnInfo->mac), option->info.brOption.brMac) != EOK) {
460 ReleaseBrconnectionNode(newConnInfo);
461 return SOFTBUS_ERR;
462 }
463 uint32_t connId = newConnInfo->connectionId;
464 if (AddConnectionList(newConnInfo) != SOFTBUS_OK) {
465 ReleaseBrconnectionNode(newConnInfo);
466 return SOFTBUS_ERR;
467 }
468
469 if (ConnBrOnEvent(ADD_CONN_BR_CLIENT_CONNECTED_MSG, (int32_t)connId, (int32_t)connId) != SOFTBUS_OK) {
470 ReleaseConnectionRef(newConnInfo);
471 return SOFTBUS_ERR;
472 }
473 return SOFTBUS_OK;
474 }
475
ConnectDevice(const ConnectOption * option,uint32_t requestId,const ConnectResult * result)476 static int32_t ConnectDevice(const ConnectOption *option, uint32_t requestId, const ConnectResult *result)
477 {
478 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[ConnectDevice]");
479 if (HasDiffMacDeviceExit(option)) {
480 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[has diff mac device]");
481 }
482 int32_t connId = -1;
483 int32_t ret = SOFTBUS_OK;
484 if (pthread_mutex_lock(&g_brConnLock) != 0) {
485 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "lock mutex failed");
486 return SOFTBUS_ERR;
487 }
488 int32_t connState = GetBrConnStateByConnOption(option, &connId);
489 if (connState == BR_CONNECTION_STATE_CONNECTED) {
490 ConnectDeviceExit(connId, requestId, result);
491 } else if (connState == BR_CONNECTION_STATE_CONNECTING) {
492 ret = ConnectDeviceStateConnecting((uint32_t)connId, requestId, result);
493 } else if (connState == BR_CONNECTION_STATE_CLOSING) {
494 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[BR_CONNECTION_STATE_CLOSING]");
495 result->OnConnectFailed(requestId, 0);
496 ret = SOFTBUS_ERR;
497 } else if (connState == BR_CONNECTION_STATE_CLOSED) {
498 int32_t connCount = GetBrConnectionCount();
499 if (connCount == SOFTBUS_ERR || connCount > g_brMaxConnCount) {
500 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "ConnectDevice connCount: %d", connCount);
501 result->OnConnectFailed(requestId, 0);
502 ret = SOFTBUS_ERR;
503 } else {
504 ret = ConnectDeviceFristTime(option, requestId, result);
505 }
506 }
507 (void)pthread_mutex_unlock(&g_brConnLock);
508 return ret;
509 }
510
ServerOnBrConnect(int32_t socketFd)511 static uint32_t ServerOnBrConnect(int32_t socketFd)
512 {
513 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[new connection, socket = %d]", socketFd);
514 if (IsExitBrConnectByFd(socketFd)) {
515 return SOFTBUS_ERR;
516 }
517 uint32_t connectionId = 0;
518 BrConnectionInfo *newConnectionInfo = CreateBrconnectionNode(false);
519 if (newConnectionInfo == NULL) {
520 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "[service node create fail]");
521 g_sppDriver->DisConnect(socketFd);
522 return connectionId;
523 }
524 RequestInfo *requestInfo = (RequestInfo *)SoftBusCalloc(sizeof(RequestInfo));
525 if (requestInfo == NULL) {
526 ReleaseBrconnectionNode(newConnectionInfo);
527 g_sppDriver->DisConnect(socketFd);
528 return connectionId;
529 }
530 ListInit(&requestInfo->node);
531 ListAdd(&newConnectionInfo->requestList, &requestInfo->node);
532 BluetoothRemoteDevice deviceInfo;
533 if (g_sppDriver->GetRemoteDeviceInfo(socketFd, &deviceInfo) != SOFTBUS_OK) {
534 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "GetRemoteDeviceInfo fail");
535 ReleaseBrconnectionNode(newConnectionInfo);
536 g_sppDriver->DisConnect(socketFd);
537 return connectionId;
538 }
539 if (ConvertBtMacToStr(newConnectionInfo->mac, BT_MAC_LEN, (uint8_t *)deviceInfo.mac, BT_ADDR_LEN) != SOFTBUS_OK) {
540 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "BrServer convert bt mac to str fail");
541 ReleaseBrconnectionNode(newConnectionInfo);
542 g_sppDriver->DisConnect(socketFd);
543 return connectionId;
544 }
545 newConnectionInfo->socketFd = socketFd;
546 newConnectionInfo->state = BR_CONNECTION_STATE_CONNECTED;
547 connectionId = newConnectionInfo->connectionId;
548 char mac[BT_MAC_LEN] = {0};
549 if (memcpy_s(mac, BT_MAC_LEN, newConnectionInfo->mac, BT_MAC_LEN) != EOK) {
550 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "BrServer memcpy mac fail");
551 ReleaseBrconnectionNode(newConnectionInfo);
552 g_sppDriver->DisConnect(socketFd);
553 return 0;
554 }
555 if (AddConnectionList(newConnectionInfo) != SOFTBUS_OK) {
556 ListDelete(&newConnectionInfo->node);
557 ReleaseBrconnectionNode(newConnectionInfo);
558 g_sppDriver->DisConnect(socketFd);
559 return connectionId;
560 }
561 if (NotifyServerConn(connectionId, mac, BR_SERVICE_TYPE) != SOFTBUS_OK) {
562 g_sppDriver->DisConnect(socketFd);
563 ReleaseConnectionRefByConnId(connectionId);
564 connectionId = 0;
565 }
566 return connectionId;
567 }
568
GetPriority(int32_t flag)569 static int32_t GetPriority(int32_t flag)
570 {
571 int priority;
572 switch (flag) {
573 case CONN_HIGH: {
574 priority = PRIORITY_HIGH;
575 break;
576 }
577 case CONN_MIDDLE: {
578 priority = PRIORITY_MID;
579 break;
580 }
581 case CONN_LOW: {
582 priority = PRIORITY_LOW;
583 break;
584 }
585 default:
586 priority = PRIORITY_DAF;
587 break;
588 }
589 return priority;
590 }
591
CheckSendQueueLength(void)592 static int32_t CheckSendQueueLength(void)
593 {
594 int totalSendNum = 0;
595 ListNode *sendItemNode = NULL;
596 if (pthread_mutex_lock(&g_dataQueue.lock) != 0) {
597 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "CheckSendQueueLength mutex failed");
598 return SOFTBUS_ERR;
599 }
600 LIST_FOR_EACH(sendItemNode, &g_dataQueue.sendList) {
601 totalSendNum++;
602 }
603 (void)pthread_mutex_unlock(&g_dataQueue.lock);
604 if (totalSendNum > g_brSendQueueMaxLen) {
605 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "SOFTBUS_CONNECTION_ERR_SENDQUEUE_FULL!!!");
606 return SOFTBUS_CONNECTION_ERR_SENDQUEUE_FULL;
607 }
608 return SOFTBUS_OK;
609 }
610
GetPidQueue(int pid)611 static DataPidQueueStruct *GetPidQueue(int pid)
612 {
613 ListNode *item = NULL;
614 LIST_FOR_EACH(item, &g_dataQueue.pidList) {
615 DataPidQueueStruct *itemNode = LIST_ENTRY(item, DataPidQueueStruct, node);
616 if (itemNode->pid == pid) {
617 return itemNode;
618 }
619 }
620
621 DataPidQueueStruct *pidQueue = (DataPidQueueStruct *)SoftBusCalloc(sizeof(DataPidQueueStruct));
622 if (pidQueue == NULL) {
623 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "Creat New PidNode fail");
624 return NULL;
625 }
626
627 ListInit(&pidQueue->node);
628 pidQueue->pid = pid;
629 ListTailInsert(&g_dataQueue.pidList, &pidQueue->node);
630 return pidQueue;
631 }
632
CreateNewSendItem(int pid,int flag,uint32_t connectionId,int len,const char * data)633 static int32_t CreateNewSendItem(int pid, int flag, uint32_t connectionId, int len, const char *data)
634 {
635 SendItemStruct *sendItem = (SendItemStruct *)SoftBusCalloc(sizeof(SendItemStruct));
636 if (sendItem == NULL) {
637 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "PostBytes CreateNewSendItem fail");
638 return SOFTBUS_ERR;
639 }
640 ListInit(&sendItem->node);
641 sendItem->pid = pid;
642 sendItem->priority = GetPriority(flag);
643 sendItem->connectionId = connectionId;
644 sendItem->dataLen = (uint32_t)len;
645 sendItem->data = (char*)data;
646
647 ListNode *item = NULL;
648 ListNode *nextItem = NULL;
649 SendItemStruct *sendItemInsert = NULL;
650 int lastInsertFlag = false;
651 LIST_FOR_EACH_SAFE(item, nextItem, &g_dataQueue.sendList) {
652 sendItemInsert = LIST_ENTRY(item, SendItemStruct, node);
653 if (sendItemInsert->pid == pid && sendItemInsert->priority < sendItem->priority) {
654 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "SendItem ListAdd");
655 ListNode *sendItemNode = item->prev;
656 ListAdd(sendItemNode, &sendItem->node);
657 lastInsertFlag = true;
658 break;
659 }
660 }
661 if (lastInsertFlag != true) {
662 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "SendItem ListTailInsert");
663 ListTailInsert(&g_dataQueue.sendList, &sendItem->node);
664 }
665 return SOFTBUS_OK;
666 }
667
PostBytes(uint32_t connectionId,const char * data,int32_t len,int32_t pid,int32_t flag)668 static int32_t PostBytes(uint32_t connectionId, const char *data, int32_t len, int32_t pid, int32_t flag)
669 {
670 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO,
671 "PostBytes connectionId=%u,pid=%d,len=%d flag=%d", connectionId, pid, len, flag);
672 if (CheckSendQueueLength() != SOFTBUS_OK) {
673 SoftBusFree((void*)data);
674 return SOFTBUS_CONNECTION_ERR_SENDQUEUE_FULL;
675 }
676
677 if (!IsBrDeviceReady(connectionId)) {
678 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "connectionId(%u) device is not ready", connectionId);
679 SoftBusFree((void*)data);
680 return SOFTBUS_BRCONNECTION_POSTBYTES_ERROR;
681 }
682
683 (void)pthread_mutex_lock(&g_dataQueue.lock);
684 DataPidQueueStruct *pidQueue = GetPidQueue(pid);
685 if (pidQueue == NULL) {
686 SoftBusFree((void*)data);
687 (void)pthread_mutex_unlock(&g_dataQueue.lock);
688 return SOFTBUS_BRCONNECTION_POSTBYTES_ERROR;
689 }
690
691 pidQueue->itemCount++;
692 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "PostBytes pidQueue count=%d", pidQueue->itemCount);
693 if (CreateNewSendItem(pid, flag, connectionId, len, data) != SOFTBUS_OK) {
694 SoftBusFree((void*)data);
695 pidQueue->itemCount--;
696 if (pidQueue->itemCount == 0) {
697 ListDelete(&pidQueue->node);
698 SoftBusFree(pidQueue);
699 }
700 (void)pthread_mutex_unlock(&g_dataQueue.lock);
701 return SOFTBUS_BRCONNECTION_POSTBYTES_ERROR;
702 }
703
704 pthread_cond_broadcast(&g_dataQueue.cond);
705 (void)pthread_mutex_unlock(&g_dataQueue.lock);
706 return SOFTBUS_OK;
707 }
708
DisconnectDevice(uint32_t connectionId)709 static int32_t DisconnectDevice(uint32_t connectionId)
710 {
711 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[DisconnectDevice]");
712 if (!IsExitConnectionById(connectionId)) {
713 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "[not find connectionId: %u]", connectionId);
714 return SOFTBUS_BRCONNECTION_DISCONNECT_NOTFIND;
715 }
716 (void)PackRequest(CONNECT_REF_DECRESE, connectionId);
717 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[DisconnectDevice over]");
718 return SOFTBUS_OK;
719 }
720
DisconnectDeviceNow(const ConnectOption * option)721 static int32_t DisconnectDeviceNow(const ConnectOption *option)
722 {
723 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[DisconnectDeviceNow]");
724 if (option == NULL || option->type != CONNECT_BR) {
725 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "option check fail");
726 return SOFTBUS_ERR;
727 }
728 int32_t socketFd = -1;
729 int32_t sideType = -1;
730 if (BrClosingByConnOption(option, &socketFd, &sideType) != SOFTBUS_OK) {
731 return SOFTBUS_ERR;
732 }
733 if (!IsListEmpty(&g_dataQueue.sendList)) {
734 SoftBusSleepMs(DISCONN_DELAY_TIME);
735 }
736 if (sideType == BR_SERVICE_TYPE) {
737 return ConnBrOnEvent(ADD_CONN_BR_SERVICE_DISCONNECTED_MSG, socketFd, socketFd);
738 } else {
739 return ConnBrOnEvent(ADD_CONN_BR_CLIENT_DISCONNECTED_MSG, socketFd, socketFd);
740 }
741 return SOFTBUS_ERR;
742 }
743
GetTimeDelay(uint32_t delay,struct timespec * tv)744 static void GetTimeDelay(uint32_t delay, struct timespec *tv)
745 {
746 #define USECTONSEC 1000LL
747 SoftBusSysTime now;
748 (void)SoftBusGetTime(&now);
749 int64_t time = now.sec * USECTONSEC * USECTONSEC + now.usec + SEND_WAIT_TIMEOUT * USECTONSEC;
750 tv->tv_sec = time / USECTONSEC / USECTONSEC;
751 tv->tv_nsec = time % (USECTONSEC * USECTONSEC) * USECTONSEC;
752 }
753
SendHandlerLoop(void * arg)754 void *SendHandlerLoop(void *arg)
755 {
756 while (1) {
757 if (pthread_mutex_lock(&g_dataQueue.lock) != 0) {
758 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "[SendHandlerLoop] mutex failed");
759 break;
760 }
761 if (IsListEmpty(&g_dataQueue.sendList)) {
762 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "br wait send cond start");
763 struct timespec tv;
764 GetTimeDelay(SEND_WAIT_TIMEOUT, &tv);
765 (void)pthread_cond_timedwait(&g_dataQueue.cond, &g_dataQueue.lock, &tv);
766 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "br wait send cond end");
767 (void)pthread_mutex_unlock(&g_dataQueue.lock);
768 continue;
769 }
770 ListNode *item = NULL;
771 int32_t sendPid = -1;
772 LIST_FOR_EACH(item, &g_dataQueue.pidList) {
773 DataPidQueueStruct *itemNode = LIST_ENTRY(item, DataPidQueueStruct, node);
774 ListDelete(item);
775 itemNode->itemCount--;
776 sendPid = itemNode->pid;
777 if (itemNode->itemCount == 0) {
778 SoftBusFree(itemNode);
779 } else {
780 ListTailInsert(&g_dataQueue.pidList, &itemNode->node);
781 }
782 break;
783 }
784 ListNode *sendItemNode = NULL;
785 SendItemStruct *sendItem = NULL;
786 LIST_FOR_EACH(sendItemNode, &g_dataQueue.sendList) {
787 SendItemStruct *tmpSendItem = LIST_ENTRY(sendItemNode, SendItemStruct, node);
788 if (tmpSendItem->pid == sendPid) {
789 ListDelete(sendItemNode);
790 sendItem = tmpSendItem;
791 break;
792 }
793 }
794 (void)pthread_mutex_unlock(&g_dataQueue.lock);
795 if (sendItem == NULL) {
796 continue;
797 }
798 if (BrTransSend(sendItem->connectionId, g_sppDriver, g_brSendPeerLen, sendItem->data, sendItem->dataLen)
799 != SOFTBUS_OK) {
800 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "BrTransSend fail");
801 }
802 FreeSendItem(sendItem);
803 }
804 return NULL;
805 }
806
InitDataQueue(void)807 static int32_t InitDataQueue(void)
808 {
809 ListInit(&g_dataQueue.sendList);
810 ListInit(&g_dataQueue.pidList);
811 pthread_mutex_init(&g_dataQueue.lock, NULL);
812 pthread_cond_init(&g_dataQueue.cond, NULL);
813
814 pthread_t tid;
815 pthread_attr_t threadAttr;
816 pthread_attr_init(&threadAttr);
817 pthread_attr_setstacksize(&threadAttr, BR_SEND_THREAD_STACK);
818 if (pthread_create(&tid, &threadAttr, SendHandlerLoop, NULL) != 0) {
819 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "create DeathProcTask failed");
820 pthread_attr_destroy(&threadAttr);
821 return SOFTBUS_ERR;
822 }
823
824 pthread_attr_destroy(&threadAttr);
825 return SOFTBUS_OK;
826 }
827
ConnBrAccept(void * arg)828 void *ConnBrAccept(void *arg)
829 {
830 #define TRY_OPEN_SERVER_COUNT 5
831 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "ConnBrAccept start\n");
832 int32_t serverId;
833 int32_t clientId;
834 char name[BR_SERVER_NAME_LEN] = {0};
835 int32_t ret;
836 int32_t num = 0;
837 int32_t tryCount = 0;
838 while (tryCount < TRY_OPEN_SERVER_COUNT) {
839 if (g_sppDriver == NULL || !g_startListenFlag || g_brEnable != SOFTBUS_BR_STATE_TURN_ON) {
840 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "g_sppDriver failed EXIT!");
841 break;
842 }
843 int32_t connCount = GetBrConnectionCount();
844 if (connCount == SOFTBUS_ERR || connCount > g_brMaxConnCount) {
845 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "connCount: %d", connCount);
846 SoftBusSleepMs(BR_ACCEPET_WAIT_TIME);
847 continue;
848 }
849 ret = sprintf_s(name, BR_SERVER_NAME_LEN, "SOFTBUS_BR_%d", num);
850 if (ret <= 0) {
851 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "ConnBrAccept sprintf_s failed %d", num);
852 SoftBusSleepMs(BR_ACCEPET_WAIT_TIME);
853 tryCount++;
854 continue;
855 }
856 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "OpenSppServer %s start", name);
857 serverId = g_sppDriver->OpenSppServer(name, strlen(name), UUID, 0);
858 if (serverId == SOFTBUS_ERR) {
859 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "OpenSppServer name %s failed", name);
860 SoftBusSleepMs(BR_ACCEPET_WAIT_TIME);
861 tryCount++;
862 continue;
863 }
864 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "OpenSppServer ok");
865 clientId = g_sppDriver->Accept(serverId);
866 if (clientId != SOFTBUS_ERR && g_brEnable == SOFTBUS_BR_STATE_TURN_ON) {
867 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "Accept ok clientId: %d", clientId);
868 ConnBrOnEvent(ADD_CONN_BR_SERVICE_CONNECTED_MSG, clientId, clientId);
869 } else {
870 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "spp Accept %s failed, clientId: %d", name, clientId);
871 }
872 g_sppDriver->CloseSppServer(serverId);
873 num++;
874 tryCount = 0;
875 }
876 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "OpenSppServer failed EXIT!");
877 return NULL;
878 }
879
StartLocalListening(const LocalListenerInfo * info)880 static int32_t StartLocalListening(const LocalListenerInfo *info)
881 {
882 if (g_sppDriver == NULL || info->type != CONNECT_BR) {
883 return SOFTBUS_ERR;
884 }
885
886 if (g_startListenFlag) {
887 return SOFTBUS_OK;
888 }
889
890 pthread_t tid;
891 pthread_attr_t threadAttr;
892 pthread_attr_init(&threadAttr);
893 pthread_attr_setstacksize(&threadAttr, BR_ACCECT_THREAD_STACK);
894 if (pthread_create(&tid, &threadAttr, ConnBrAccept, NULL) != 0) {
895 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "create ConnBrAccept failed");
896 pthread_attr_destroy(&threadAttr);
897 return SOFTBUS_ERR;
898 }
899 g_startListenFlag = true;
900 pthread_attr_destroy(&threadAttr);
901 return SOFTBUS_OK;
902 }
903
StopLocalListening(const LocalListenerInfo * info)904 static int32_t StopLocalListening(const LocalListenerInfo *info)
905 {
906 if (g_sppDriver == NULL || info->type != CONNECT_BR) {
907 return SOFTBUS_ERR;
908 }
909 g_startListenFlag = false;
910 return SOFTBUS_OK;
911 }
912
InitProperty()913 static int32_t InitProperty()
914 {
915 g_brBuffSize = INVALID_LENGTH;
916 g_brSendPeerLen = INVALID_LENGTH;
917 g_brMaxConnCount = INVALID_LENGTH;
918 if (SoftbusGetConfig(SOFTBUS_INT_CONN_BR_MAX_DATA_LENGTH,
919 (unsigned char*)&g_brBuffSize, sizeof(g_brBuffSize)) != SOFTBUS_OK) {
920 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "get br BuffSize fail");
921 }
922 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "br BuffSize is %u", g_brBuffSize);
923 if (SoftbusGetConfig(SOFTBUS_INT_CONN_RFCOM_SEND_MAX_LEN,
924 (unsigned char*)&g_brSendPeerLen, sizeof(g_brSendPeerLen)) != SOFTBUS_OK) {
925 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "get br SendPeerLen fail");
926 }
927 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "br SendPeerLen is %u", g_brSendPeerLen);
928 if (SoftbusGetConfig(SOFTBUS_INT_CONN_BR_RECEIVE_MAX_LEN,
929 (unsigned char*)&g_brSendQueueMaxLen, sizeof(g_brSendQueueMaxLen)) != SOFTBUS_OK) {
930 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "get br SendQueueMaxLen fail");
931 }
932 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "br SendQueueMaxLen is %u", g_brSendQueueMaxLen);
933 if (SoftbusGetConfig(SOFTBUS_INT_CONN_BR_MAX_CONN_NUM,
934 (unsigned char*)&g_brMaxConnCount, sizeof(g_brMaxConnCount)) != SOFTBUS_OK) {
935 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "get br MaxConnCount fail");
936 }
937 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "br MaxConnCount is %d", g_brMaxConnCount);
938 if (g_brBuffSize == INVALID_LENGTH || g_brBuffSize > MAX_BR_SIZE) {
939 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "Cannot get brBuffSize");
940 return SOFTBUS_ERR;
941 }
942 if (g_brSendPeerLen == INVALID_LENGTH || g_brSendPeerLen > MAX_BR_PEER_SIZE) {
943 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "Cannot get brSendPeerLen");
944 return SOFTBUS_ERR;
945 }
946 if (g_brSendQueueMaxLen == SOFTBUS_ERR || g_brSendQueueMaxLen > MAX_BR_PEER_SIZE) {
947 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "Cannot get brSendQueueMaxLen");
948 return SOFTBUS_ERR;
949 }
950 if (g_brMaxConnCount == INVALID_LENGTH) {
951 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "Cannot get brMaxConnCount");
952 return SOFTBUS_ERR;
953 }
954 return SOFTBUS_OK;
955 }
956
957 typedef struct BrReadThreadParams {
958 uint32_t connInfoId;
959 int32_t socketFd;
960 } BrReadThreadParams;
961
ConnBrRead(void * arg)962 void *ConnBrRead(void *arg)
963 {
964 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "ConnBrRead start");
965 if (arg == NULL) {
966 return NULL;
967 }
968 BrReadThreadParams *values = (BrReadThreadParams *)arg;
969 uint32_t connId = values->connInfoId;
970 int32_t socketFd = values->socketFd;
971 SoftBusFree(arg);
972
973 if (socketFd == -1) {
974 socketFd = ClientOnBrConnect(connId);
975 if (socketFd == -1) {
976 return NULL;
977 }
978 }
979 while (1) {
980 char *outBuf = NULL;
981 int32_t packLen = BrTransReadOneFrame(connId, g_sppDriver, socketFd, &outBuf);
982 if (packLen == BR_READ_SOCKET_CLOSED) {
983 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "[ConnBrRead] failed socket close");
984 g_sppDriver->DisConnect(socketFd);
985 BrDisconnect(socketFd, socketFd);
986 return NULL;
987 }
988 if (packLen == BR_READ_FAILED) {
989 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "[ConnBrRead] failed");
990 g_sppDriver->DisConnect(socketFd);
991 BrDisconnect(socketFd, socketFd);
992 return NULL;
993 }
994 if (outBuf == NULL) {
995 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "[ConnBrRead] outBuf null");
996 continue;
997 }
998 SoftBusMessage *msg = BrConnCreateLoopMsg(ADD_CONN_BR_RECV_MSG, (uint64_t)connId, (uint64_t)packLen, outBuf);
999 if (msg == NULL) {
1000 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "[ConnBrRead] BrConnCreateLoopMsg failed");
1001 SoftBusFree(outBuf);
1002 continue;
1003 }
1004 g_brAsyncHandler.looper->PostMessage(g_brAsyncHandler.looper, msg);
1005 }
1006 return NULL;
1007 }
1008
BrConnectedEventHandle(bool isClient,uint32_t value)1009 void BrConnectedEventHandle(bool isClient, uint32_t value)
1010 {
1011 uint32_t connInfoId;
1012 int32_t socketFd = -1;
1013 if (isClient) {
1014 connInfoId = value;
1015 } else {
1016 socketFd = (int32_t)value;
1017 connInfoId = ServerOnBrConnect(socketFd);
1018 }
1019 if (connInfoId == 0) {
1020 return;
1021 }
1022 pthread_t tid;
1023 BrReadThreadParams *args = (BrReadThreadParams *)SoftBusCalloc(sizeof(BrReadThreadParams));
1024 if (args == NULL) {
1025 goto EXIT;
1026 }
1027 args->connInfoId = connInfoId;
1028 args->socketFd = socketFd;
1029 if (pthread_create(&tid, NULL, ConnBrRead, (void *)args) != 0) {
1030 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "create ConnBrRead failed");
1031 goto EXIT;
1032 }
1033 return;
1034 EXIT:
1035 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "BrConnectedEventHandle EXIT");
1036 if (!isClient) {
1037 ConnBrOnEvent(ADD_CONN_BR_SERVICE_DISCONNECTED_MSG, socketFd, socketFd);
1038 } else {
1039 ClientNoticeResultBrConnect(connInfoId, false, socketFd);
1040 ReleaseConnectionRefByConnId(connInfoId);
1041 }
1042 return;
1043 }
1044
OnPackResponse(int32_t delta,int32_t peerRef,uint32_t connectionId)1045 static void OnPackResponse(int32_t delta, int32_t peerRef, uint32_t connectionId)
1046 {
1047 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO,
1048 "[OnPackResponse: delta=%d, RemoteRef=%d, connectionIds=%u", delta, peerRef, connectionId);
1049 BrConnectionInfo *connInfo = GetConnectionRef(connectionId);
1050 if (connInfo == NULL) {
1051 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "[OnPackResponse] not find device");
1052 return;
1053 }
1054 connInfo->refCount += delta;
1055 int32_t myRefCount = connInfo->refCount;
1056 int32_t mySocketFd = connInfo->socketFd;
1057 int32_t sideType = connInfo->sideType;
1058 ReleaseConnectionRef(connInfo);
1059
1060 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[onPackRequest: myRefCount=%d]", myRefCount);
1061 if (peerRef > 0) {
1062 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[remote device Ref is > 0, do not reply]");
1063 return;
1064 }
1065 if (myRefCount <= 0) {
1066 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[local device Ref <= 0, close connection now]");
1067 SetBrConnStateByConnId(connectionId, BR_CONNECTION_STATE_CLOSING);
1068 if (sideType == BR_SERVICE_TYPE) {
1069 ConnBrOnEvent(ADD_CONN_BR_SERVICE_DISCONNECTED_MSG, mySocketFd, mySocketFd);
1070 } else {
1071 ConnBrOnEvent(ADD_CONN_BR_CLIENT_DISCONNECTED_MSG, mySocketFd, mySocketFd);
1072 }
1073 return;
1074 }
1075 int32_t outLen = -1;
1076 char *buf = BrPackRequestOrResponse(METHOD_NOTIFY_RESPONSE, delta, myRefCount, &outLen);
1077 if (buf == NULL) {
1078 return;
1079 }
1080 (void)PostBytes(connectionId, buf, outLen, 0, 0);
1081 }
1082
BrConnectedComdHandl(uint32_t connectionId,const cJSON * data)1083 static void BrConnectedComdHandl(uint32_t connectionId, const cJSON *data)
1084 {
1085 int32_t keyMethod = 0;
1086 int32_t keyDelta = 0;
1087 int32_t keyReferenceNum = 0;
1088
1089 if (!GetJsonObjectNumberItem(data, KEY_METHOD, &keyMethod)) {
1090 return;
1091 }
1092 if (keyMethod == METHOD_NOTIFY_REQUEST) {
1093 if (!GetJsonObjectNumberItem(data, KEY_METHOD, &keyMethod) ||
1094 !GetJsonObjectSignedNumberItem(data, KEY_DELTA, &keyDelta) ||
1095 !GetJsonObjectSignedNumberItem(data, KEY_REFERENCE_NUM, &keyReferenceNum)) {
1096 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "REQUEST fail");
1097 return;
1098 }
1099 OnPackResponse(keyDelta, keyReferenceNum, connectionId);
1100 }
1101 if (keyMethod == METHOD_NOTIFY_RESPONSE) {
1102 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "NOTIFY_RESPONSE");
1103 if (!GetJsonObjectNumberItem(data, KEY_METHOD, &keyMethod) ||
1104 !GetJsonObjectSignedNumberItem(data, KEY_REFERENCE_NUM, &keyReferenceNum)) {
1105 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "RESPONSE fail");
1106 return;
1107 }
1108
1109 SetBrConnStateByConnId(connectionId, BR_CONNECTION_STATE_CONNECTED);
1110 }
1111 }
1112
BrRecvDataHandle(uint32_t connectionId,const char * buf,int32_t len)1113 static void BrRecvDataHandle(uint32_t connectionId, const char *buf, int32_t len)
1114 {
1115 if (len - (int32_t)sizeof(ConnPktHead) <= 0) {
1116 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "br recv data illegal data size: %d", len);
1117 return;
1118 }
1119 ConnPktHead *head = (ConnPktHead *)buf;
1120 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "BrRecvDataHandle module: %d", head->module);
1121 if (head->module == MODULE_CONNECTION) {
1122 cJSON *data = NULL;
1123 data = cJSON_ParseWithLength(buf + sizeof(ConnPktHead), len - (int32_t)sizeof(ConnPktHead));
1124 if (data == NULL) {
1125 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "br recv data invalid");
1126 return;
1127 }
1128 BrConnectedComdHandl(connectionId, (const cJSON *)data);
1129 cJSON_Delete(data);
1130 } else {
1131 if (g_connectCallback != NULL) {
1132 g_connectCallback->OnDataReceived(connectionId, (ConnModule)head->module, head->seq, (char *)buf, len);
1133 }
1134 }
1135 }
1136
BrConnMsgHandler(SoftBusMessage * msg)1137 static void BrConnMsgHandler(SoftBusMessage *msg)
1138 {
1139 if (msg == NULL) {
1140 return;
1141 }
1142 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "br conn loop process msg type %d", msg->what);
1143 switch (msg->what) {
1144 case ADD_CONN_BR_CLIENT_CONNECTED_MSG:
1145 BrConnectedEventHandle(true, msg->arg1);
1146 break;
1147 case ADD_CONN_BR_SERVICE_CONNECTED_MSG:
1148 BrConnectedEventHandle(false, msg->arg1);
1149 break;
1150 case ADD_CONN_BR_CLIENT_DISCONNECTED_MSG:
1151 case ADD_CONN_BR_SERVICE_DISCONNECTED_MSG:
1152 g_sppDriver->DisConnect(msg->arg1);
1153 BrDisconnect(msg->arg1, msg->arg2);
1154 break;
1155 case ADD_CONN_BR_RECV_MSG: {
1156 uint32_t connId = (uint32_t)msg->arg1;
1157 int32_t len = (int32_t)msg->arg2;
1158 BrRecvDataHandle(connId, (const char *)msg->obj, len);
1159 SoftBusFree((void *)msg->obj);
1160 msg->obj = NULL;
1161 break;
1162 }
1163 default:
1164 break;
1165 }
1166 }
1167
BrConnLooperInit(void)1168 static int32_t BrConnLooperInit(void)
1169 {
1170 g_brAsyncHandler.looper = CreateNewLooper("brRecv_looper");
1171 if (g_brAsyncHandler.looper == NULL) {
1172 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "BrConnLooperInit failed");
1173 return SOFTBUS_ERR;
1174 }
1175 g_brAsyncHandler.HandleMessage = BrConnMsgHandler;
1176 return SOFTBUS_OK;
1177 }
1178
UpdateLocalBtMac(void)1179 static void UpdateLocalBtMac(void)
1180 {
1181 SoftBusBtAddr mac;
1182 if (SoftBusGetBtMacAddr(&mac) != SOFTBUS_OK) {
1183 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "Get bt mac addr fail");
1184 return;
1185 }
1186 char macStr[BT_MAC_LEN] = {0};
1187 if (ConvertBtMacToStr(macStr, sizeof(macStr), mac.addr, sizeof(mac.addr)) != SOFTBUS_OK) {
1188 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "Convert bt mac to str fail");
1189 return;
1190 }
1191 if (LnnSetLocalStrInfo(STRING_KEY_BT_MAC, macStr) != SOFTBUS_OK) {
1192 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_ERROR, "Set bt mac to local fail");
1193 return;
1194 }
1195 }
1196
StateChangedCallback(int32_t listenerId,int32_t status)1197 static void StateChangedCallback(int32_t listenerId, int32_t status)
1198 {
1199 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "StateChanged id: %d, status: %d", listenerId, status);
1200
1201 LocalListenerInfo info;
1202 info.type = CONNECT_BR;
1203 if (status == SOFTBUS_BR_STATE_TURN_ON) {
1204 g_brEnable = status;
1205 UpdateLocalBtMac();
1206 (void)StartLocalListening(&info);
1207 } else if (status == SOFTBUS_BR_STATE_TURN_OFF) {
1208 g_brEnable = status;
1209 (void)StopLocalListening(&info);
1210 }
1211 }
1212
SppRegisterConnCallback(void)1213 static int32_t SppRegisterConnCallback(void)
1214 {
1215 (void)memset_s(&g_sppBrCallback, sizeof(g_sppBrCallback), 0, sizeof(g_sppBrCallback));
1216 g_sppBrCallback.OnBtStateChanged = StateChangedCallback;
1217 return SppGattsRegisterHalCallback(&g_sppBrCallback);
1218 }
1219
ConnInitBr(const ConnectCallback * callback)1220 ConnectFuncInterface *ConnInitBr(const ConnectCallback *callback)
1221 {
1222 SoftBusLog(SOFTBUS_LOG_CONN, SOFTBUS_LOG_INFO, "[InitBR]");
1223 if (InitProperty() != SOFTBUS_OK) {
1224 return NULL;
1225 }
1226 g_sppDriver = InitSppSocketDriver();
1227 if (g_sppDriver == NULL) {
1228 return NULL;
1229 }
1230 InitBrConnectionManager(g_brBuffSize);
1231 if (InitDataQueue() != SOFTBUS_OK) {
1232 return NULL;
1233 }
1234 if (BrConnLooperInit() != SOFTBUS_OK) {
1235 return NULL;
1236 }
1237 if (SppRegisterConnCallback() != SOFTBUS_OK) {
1238 DestroyLooper(g_brAsyncHandler.looper);
1239 return NULL;
1240 }
1241 pthread_mutex_init(&g_brConnLock, NULL);
1242 g_connectCallback = (ConnectCallback*)callback;
1243 return &g_brInterface;
1244 }
1245