• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <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(&notifyList);
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, &notifyList, &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, &notifyList) {
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(&notifyList);
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, &notifyList, &connectionInfo, &sideType);
357         ClearSendItemByConnId(connectionId);
358         if (perState != BR_CONNECTION_STATE_CLOSED) {
359             NotifyDisconnect(&notifyList, 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