1 /*
2 * Copyright (c) 2025 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 <securec.h>
17
18 #include "access_control.h"
19 #include "br_proxy.h"
20 #include "br_proxy_common.h"
21 #include "br_proxy_server_manager.h"
22 #include "bus_center_event.h"
23 #include "hap_uninstall_observer.h"
24 #include "proxy_manager.h"
25 #include "softbus_adapter_mem.h"
26 #include "softbus_common.h"
27 #include "softbus_error_code.h"
28 #include "softbus_utils.h"
29 #include "trans_channel_common.h"
30 #include "trans_client_proxy.h"
31 #include "trans_log.h"
32
33 #define DEFAULT_INVALID_CHANNEL_ID (-1)
34 #define DEFAULT_INVALID_REQ_ID 10000000
35 #define BR_PROXY_MAX_WAIT_TIME_MS 10000 // 10000ms
36 #define SINGLE_TIME_MAX_BYTES 4096
37 #define HAP_NAME_MAX_LEN 256
38 #define IS_CONNECTED true
39 #define IS_DISCONNECTED false
40
41 typedef struct {
42 char brMac[BR_MAC_LEN];
43 char uuid[UUID_LEN];
44 } ProxyBaseInfo;
45
46 typedef struct {
47 pid_t uid;
48 uint32_t cnt;
49 ListNode node;
50 }RetryInfo;
51
52 typedef struct {
53 ProxyBaseInfo proxyInfo;
54 char bundleName[HAP_NAME_MAX_LEN];
55 char abilityName[HAP_NAME_MAX_LEN];
56 int32_t channelId;
57 pid_t uid;
58 bool isEnable;
59 bool isConnected;
60 struct ProxyChannel channel;
61 ListNode node;
62 } BrProxyInfo;
63
64 typedef struct {
65 pid_t callingPid;
66 pid_t callingUid;
67 uint32_t callingTokenId;
68 int32_t channelId;
69 uint32_t requestId;
70 ProxyBaseInfo proxyInfo;
71 bool isReceiveCbSet;
72 bool isChannelStateCbSet;
73 ListNode node;
74 struct ProxyChannel channel;
75 } ServerBrProxyChannelInfo;
76
77 typedef struct {
78 uint32_t dataLen;
79 char brMac[BR_MAC_LEN];
80 char uuid[UUID_LEN];
81 uint8_t *data;
82 ListNode node;
83 } ServerDataInfo;
84
85 typedef enum {
86 PRIORITY_HIGH = 1,
87 PRIORITY_LOW,
88 PRIORITY_DEFAULT
89 } RECEIVE_DATA_PRI;
90
91 static SoftBusList *g_serverList = NULL;
92 static SoftBusList *g_dataList = NULL;
93 static SoftBusList *g_proxyList = NULL;
94 static SoftBusList *g_retryList = NULL;
95 static SoftBusMutex g_channelIdLock;
96 static void ClearCountInRetryList(pid_t uid);
97
IsBrProxy(const char * bundleName)98 bool IsBrProxy(const char *bundleName)
99 {
100 if (g_proxyList == NULL) {
101 TRANS_LOGE(TRANS_SVC, "[br_proxy] Something that couldn't have happened!");
102 return false;
103 }
104 if (SoftBusMutexLock(&(g_proxyList->lock)) != SOFTBUS_OK) {
105 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
106 return false;
107 }
108 BrProxyInfo *nodeInfo = NULL;
109 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_proxyList->list), BrProxyInfo, node) {
110 if (strcmp(bundleName, nodeInfo->bundleName) != 0) {
111 continue;
112 }
113 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
114 return true;
115 }
116 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
117 return false;
118 }
119
GetServerListCount(int32_t * count)120 static int32_t GetServerListCount(int32_t *count)
121 {
122 if (count == NULL) {
123 return SOFTBUS_INVALID_PARAM;
124 }
125 if (g_serverList == NULL) {
126 TRANS_LOGE(TRANS_SVC, "[br_proxy] not init");
127 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
128 }
129 if (SoftBusMutexLock(&(g_serverList->lock)) != SOFTBUS_OK) {
130 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
131 return SOFTBUS_LOCK_ERR;
132 }
133 *count = g_serverList->cnt;
134 (void)SoftBusMutexUnlock(&(g_serverList->lock));
135 return SOFTBUS_OK;
136 }
137
GetChannelIdFromServerList(int32_t * channelId)138 static int32_t GetChannelIdFromServerList(int32_t *channelId)
139 {
140 if (channelId == NULL) {
141 return SOFTBUS_INVALID_PARAM;
142 }
143 if (g_serverList == NULL) {
144 TRANS_LOGE(TRANS_SVC, "[br_proxy] not init");
145 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
146 }
147 if (SoftBusMutexLock(&(g_serverList->lock)) != SOFTBUS_OK) {
148 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
149 return SOFTBUS_LOCK_ERR;
150 }
151 ServerBrProxyChannelInfo *nodeInfo = NULL;
152 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_serverList->list), ServerBrProxyChannelInfo, node) {
153 *channelId = nodeInfo->channelId;
154 (void)SoftBusMutexUnlock(&(g_serverList->lock));
155 return SOFTBUS_OK;
156 }
157 (void)SoftBusMutexUnlock(&(g_serverList->lock));
158 return SOFTBUS_NOT_FIND;
159 }
160
CloseAllBrProxy()161 static int32_t CloseAllBrProxy()
162 {
163 if (g_proxyList == NULL) {
164 TRANS_LOGE(TRANS_SVC, "[br_proxy] not init");
165 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
166 }
167 if (SoftBusMutexLock(&(g_proxyList->lock)) != SOFTBUS_OK) {
168 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
169 return SOFTBUS_LOCK_ERR;
170 }
171 BrProxyInfo *nodeInfo = NULL;
172 BrProxyInfo *nodeNext = NULL;
173 LIST_FOR_EACH_ENTRY_SAFE(nodeInfo, nodeNext, &(g_proxyList->list), BrProxyInfo, node) {
174 if (nodeInfo->isEnable && nodeInfo->channel.close != NULL) {
175 nodeInfo->channel.close(&nodeInfo->channel);
176 }
177 ListDelete(&nodeInfo->node);
178 SoftBusFree(nodeInfo);
179 g_proxyList->cnt--;
180 TRANS_LOGI(TRANS_SVC, "[br_proxy] brproxy is close");
181 }
182 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
183 return SOFTBUS_OK;
184 }
185
CloseAllConnect()186 void CloseAllConnect()
187 {
188 int32_t count = 0;
189 int32_t ret = GetServerListCount(&count);
190 if (ret != SOFTBUS_OK) {
191 TRANS_LOGE(TRANS_SVC, "[br_proxy] get list conut failed! ret:%{public}d", ret);
192 return;
193 }
194 int32_t channelId = 0;
195 for (int32_t i = 0; i < count; i++) {
196 ret = GetChannelIdFromServerList(&channelId);
197 if (ret != SOFTBUS_OK) {
198 continue;
199 }
200 ret = TransCloseBrProxy(channelId, true);
201 if (ret != SOFTBUS_OK) {
202 TRANS_LOGE(TRANS_SVC, "[br_proxy] close brproxy failed! ret:%{public}d, channelId:%{public}d",
203 ret, channelId);
204 continue;
205 }
206 TRANS_LOGI(TRANS_SVC, "[br_proxy] close brproxy success! channelId:%{public}d", channelId);
207 }
208 // if client died, need clear g_proxyList
209 CloseAllBrProxy();
210 }
211
UserSwitchedHandler(const LnnEventBasicInfo * info)212 static void UserSwitchedHandler(const LnnEventBasicInfo *info)
213 {
214 if (info == NULL || info->event != LNN_EVENT_USER_SWITCHED) {
215 TRANS_LOGE(TRANS_SVC, "[br_proxy] invalid param");
216 return;
217 }
218 const LnnMonitorHbStateChangedEvent *event = (const LnnMonitorHbStateChangedEvent *)info;
219 SoftBusUserSwitchState userSwitchState = (SoftBusUserSwitchState)event->status;
220 switch (userSwitchState) {
221 case SOFTBUS_USER_SWITCHED:
222 TRANS_LOGE(TRANS_SVC, "[br_proxy] SOFTBUS_USER_SWITCHED");
223 CloseAllConnect();
224 break;
225 default:
226 return;
227 }
228 }
229
RegisterUserSwitchEvent()230 static int32_t RegisterUserSwitchEvent()
231 {
232 static bool flag = true;
233 if (!flag) {
234 return SOFTBUS_OK;
235 }
236 int32_t ret = LnnRegisterEventHandler(LNN_EVENT_USER_SWITCHED, UserSwitchedHandler);
237 if (ret != SOFTBUS_OK) {
238 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed! ret=%{public}d", ret);
239 return ret;
240 }
241 TRANS_LOGI(TRANS_SVC, "[br_proxy] register user switch event success!");
242 flag = false;
243 return ret;
244 }
245
PermissionCheckPass(const char * bundleName)246 static bool PermissionCheckPass(const char *bundleName)
247 {
248 if (bundleName == NULL) {
249 TRANS_LOGE(TRANS_SVC, "[br_proxy] bundleName is null");
250 return false;
251 }
252 bool isEmpowered = false;
253 int32_t ret = ClientIpcQueryPermission(COMM_PKGNAME_PUSH, bundleName, &isEmpowered);
254 if (ret != SOFTBUS_OK) {
255 TRANS_LOGE(TRANS_SVC, "[br_proxy] query permission from push_service failed! ret:%{public}d", ret);
256 return false;
257 }
258 TRANS_LOGI(TRANS_SVC, "[br_proxy] query permission:%{public}s", isEmpowered ? "accept":"denied");
259 return isEmpowered;
260 }
261
GetNewChannelId(int32_t * channelId)262 static int32_t GetNewChannelId(int32_t *channelId)
263 {
264 if (channelId == NULL) {
265 return SOFTBUS_INVALID_PARAM;
266 }
267 static int32_t g_channelId = 0;
268 int32_t id = 0;
269
270 if (SoftBusMutexLock(&g_channelIdLock) != SOFTBUS_OK) {
271 TRANS_LOGE(TRANS_SVC, "[br_proxy] get channelId lock fail");
272 return SOFTBUS_LOCK_ERR;
273 }
274 id = ++g_channelId;
275 (void)SoftBusMutexUnlock(&g_channelIdLock);
276 *channelId = id;
277 return SOFTBUS_OK;
278 }
279
BrProxyServerInit(void)280 static int32_t BrProxyServerInit(void)
281 {
282 if (g_serverList == NULL) {
283 g_serverList = CreateSoftBusList();
284 }
285 if (g_serverList == NULL) {
286 TRANS_LOGE(TRANS_SVC, "[br_proxy] init server list failed");
287 return SOFTBUS_CREATE_LIST_ERR;
288 }
289 if (g_dataList == NULL) {
290 g_dataList = CreateSoftBusList();
291 }
292 if (g_dataList == NULL) {
293 TRANS_LOGE(TRANS_SVC, "[br_proxy] init data list failed");
294 return SOFTBUS_CREATE_LIST_ERR;
295 }
296 if (g_proxyList == NULL) {
297 g_proxyList = CreateSoftBusList();
298 }
299 if (g_proxyList == NULL) {
300 TRANS_LOGE(TRANS_SVC, "[br_proxy] init proxy list failed");
301 return SOFTBUS_CREATE_LIST_ERR;
302 }
303
304 static bool lockInited = false;
305 if (lockInited) {
306 TRANS_LOGI(TRANS_SVC, "[br_proxy] init trans server success");
307 return SOFTBUS_OK;
308 }
309 int32_t ret = RegisterHapUninstallEvent();
310 if (ret != SOFTBUS_OK) {
311 return ret;
312 }
313
314 SoftBusMutexAttr mutexAttr;
315 mutexAttr.type = SOFTBUS_MUTEX_RECURSIVE;
316 if (SoftBusMutexInit(&g_channelIdLock, &mutexAttr) != SOFTBUS_OK) {
317 TRANS_LOGE(TRANS_SVC, "[br_proxy] init lock failed");
318 return SOFTBUS_TRANS_INIT_FAILED;
319 }
320 lockInited = true;
321 TRANS_LOGI(TRANS_SVC, "[br_proxy] init trans server success, channleIdLock init success");
322 return SOFTBUS_OK;
323 }
324
ServerAddDataToList(ProxyBaseInfo * baseInfo,const uint8_t * data,uint32_t dataLen)325 static int32_t ServerAddDataToList(ProxyBaseInfo *baseInfo, const uint8_t *data, uint32_t dataLen)
326 {
327 if (baseInfo == NULL || data == NULL) {
328 return SOFTBUS_INVALID_PARAM;
329 }
330 int32_t ret = SOFTBUS_OK;
331 ServerDataInfo *info = (ServerDataInfo *)SoftBusCalloc(sizeof(ServerDataInfo));
332 if (info == NULL) {
333 TRANS_LOGE(TRANS_SVC, "[br_proxy] calloc failed");
334 return SOFTBUS_MALLOC_ERR;
335 }
336 if (strcpy_s(info->brMac, sizeof(info->brMac), baseInfo->brMac) != EOK ||
337 strcpy_s(info->uuid, sizeof(info->uuid), baseInfo->uuid) != EOK) {
338 ret = SOFTBUS_MEM_ERR;
339 goto EXIT_WITH_FREE_INFO;
340 }
341 info->data = (uint8_t *)SoftBusCalloc(dataLen * sizeof(uint8_t));
342 if (info->data == NULL) {
343 ret = SOFTBUS_MEM_ERR;
344 goto EXIT_WITH_FREE_INFO;
345 }
346 if (memcpy_s(info->data, dataLen, data, dataLen) != EOK) {
347 ret = SOFTBUS_MEM_ERR;
348 goto EXIT_WITH_FREE_DATA;
349 }
350 info->dataLen = dataLen;
351 ListInit(&info->node);
352 if (SoftBusMutexLock(&(g_dataList->lock)) != SOFTBUS_OK) {
353 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
354 ret = SOFTBUS_LOCK_ERR;
355 goto EXIT_WITH_FREE_DATA;
356 }
357 ListTailInsert(&g_dataList->list, &info->node);
358 g_dataList->cnt++;
359 (void)SoftBusMutexUnlock(&g_dataList->lock);
360 return SOFTBUS_OK;
361
362 EXIT_WITH_FREE_DATA:
363 SoftBusFree(info->data);
364 EXIT_WITH_FREE_INFO:
365 SoftBusFree(info);
366 return ret;
367 }
368
IsBrProxyEnable(pid_t uid)369 static bool IsBrProxyEnable(pid_t uid)
370 {
371 if (g_proxyList == NULL) {
372 TRANS_LOGE(TRANS_SVC, "[br_proxy] Something that couldn't have happened!");
373 return false;
374 }
375 if (SoftBusMutexLock(&(g_proxyList->lock)) != SOFTBUS_OK) {
376 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
377 return false;
378 }
379 BrProxyInfo *nodeInfo = NULL;
380 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_proxyList->list), BrProxyInfo, node) {
381 if (nodeInfo->uid != uid) {
382 continue;
383 }
384 bool flag = nodeInfo->isEnable;
385 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
386 return flag;
387 }
388 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
389 return false;
390 }
391
GetBrProxy(const char * brMac,const char * uuid,BrProxyInfo * info)392 static int32_t GetBrProxy(const char *brMac, const char *uuid, BrProxyInfo *info)
393 {
394 if (brMac == NULL || uuid == NULL || g_proxyList == NULL || info == NULL) {
395 TRANS_LOGE(TRANS_SVC, "[br_proxy] Something that couldn't have happened!");
396 return SOFTBUS_INVALID_PARAM;
397 }
398 if (SoftBusMutexLock(&(g_proxyList->lock)) != SOFTBUS_OK) {
399 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
400 return SOFTBUS_LOCK_ERR;
401 }
402 BrProxyInfo *nodeInfo = NULL;
403 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_proxyList->list), BrProxyInfo, node) {
404 if (strcmp(nodeInfo->proxyInfo.brMac, brMac) != 0 || strcmp(nodeInfo->proxyInfo.uuid, uuid) != 0) {
405 continue;
406 }
407 int32_t ret = memcpy_s(info, sizeof(BrProxyInfo), nodeInfo, sizeof(BrProxyInfo));
408 if (ret != EOK) {
409 TRANS_LOGE(TRANS_SVC, "[br_proxy] memcpy failed! ret=%{public}d", ret);
410 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
411 return SOFTBUS_MEM_ERR;
412 }
413 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
414 return SOFTBUS_OK;
415 }
416 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
417 return SOFTBUS_NOT_FIND;
418 }
419
UpdateBrProxy(const char * brMac,const char * uuid,struct ProxyChannel * channel,bool updateChannelId,int32_t channelId)420 static int32_t UpdateBrProxy(const char *brMac, const char *uuid, struct ProxyChannel *channel,
421 bool updateChannelId, int32_t channelId)
422 {
423 if (brMac == NULL || uuid == NULL || g_proxyList == NULL || channel == NULL) {
424 TRANS_LOGE(TRANS_SVC, "[br_proxy] invalid param!");
425 return SOFTBUS_INVALID_PARAM;
426 }
427 if (SoftBusMutexLock(&(g_proxyList->lock)) != SOFTBUS_OK) {
428 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
429 return SOFTBUS_LOCK_ERR;
430 }
431 BrProxyInfo *nodeInfo = NULL;
432 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_proxyList->list), BrProxyInfo, node) {
433 if (strcmp(nodeInfo->proxyInfo.brMac, brMac) != 0 || strcmp(nodeInfo->proxyInfo.uuid, uuid) != 0) {
434 continue;
435 }
436 nodeInfo->isEnable = true;
437 if (updateChannelId) {
438 nodeInfo->channelId = channelId;
439 TRANS_LOGI(TRANS_SVC, "[br_proxy] channelId:%{public}d", channelId);
440 }
441 int32_t ret = memcpy_s(&nodeInfo->channel, sizeof(struct ProxyChannel), channel, sizeof(struct ProxyChannel));
442 if (ret != EOK) {
443 TRANS_LOGE(TRANS_SVC, "[br_proxy] memcpy failed! ret:%{public}d", ret);
444 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
445 return SOFTBUS_MEM_ERR;
446 }
447 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
448 return SOFTBUS_OK;
449 }
450 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
451 TRANS_LOGE(TRANS_SVC, "[br_proxy] update failed!");
452 return SOFTBUS_NOT_FIND;
453 }
454
UpdateConnectState(const char * brMac,const char * uuid,bool isConnect)455 static int32_t UpdateConnectState(const char *brMac, const char *uuid, bool isConnect)
456 {
457 if (brMac == NULL || g_proxyList == NULL) {
458 TRANS_LOGE(TRANS_SVC, "[br_proxy] Something that couldn't have happened!");
459 return SOFTBUS_INVALID_PARAM;
460 }
461 if (SoftBusMutexLock(&(g_proxyList->lock)) != SOFTBUS_OK) {
462 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
463 return SOFTBUS_LOCK_ERR;
464 }
465 BrProxyInfo *nodeInfo = NULL;
466 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_proxyList->list), BrProxyInfo, node) {
467 if (strcmp(nodeInfo->proxyInfo.brMac, brMac) != 0 || strcmp(nodeInfo->proxyInfo.uuid, uuid) != 0) {
468 continue;
469 }
470 nodeInfo->isConnected = isConnect;
471 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
472 return SOFTBUS_OK;
473 }
474 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
475 return SOFTBUS_NOT_FIND;
476 }
477
IsBrProxyExist(const char * brMac,const char * uuid)478 static bool IsBrProxyExist(const char *brMac, const char *uuid) // brmac and uuid determine the unique proxy
479 {
480 if (brMac == NULL || uuid == NULL || g_proxyList == NULL) {
481 TRANS_LOGE(TRANS_SVC, "[br_proxy] Something that couldn't have happened!");
482 return false;
483 }
484 if (SoftBusMutexLock(&(g_proxyList->lock)) != SOFTBUS_OK) {
485 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
486 return false;
487 }
488 BrProxyInfo *nodeInfo = NULL;
489 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_proxyList->list), BrProxyInfo, node) {
490 if (strcmp(nodeInfo->proxyInfo.brMac, brMac) != 0 || strcmp(nodeInfo->proxyInfo.uuid, uuid) != 0) {
491 continue;
492 }
493 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
494 TRANS_LOGI(TRANS_SVC, "[br_proxy] the proxy is exist!");
495 return true;
496 }
497 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
498 return false;
499 }
500
GetCallerInfoAndVerifyPermission(BrProxyInfo * info)501 static int32_t GetCallerInfoAndVerifyPermission(BrProxyInfo *info)
502 {
503 if (info == NULL) {
504 return SOFTBUS_INVALID_PARAM;
505 }
506 int32_t ret = GetCallerHapInfo(info->bundleName, HAP_NAME_MAX_LEN, info->abilityName, HAP_NAME_MAX_LEN);
507 if (ret != SOFTBUS_OK) {
508 TRANS_LOGE(TRANS_SVC, "[br_proxy] get caller hap info failed! ret=%{public}d", ret);
509 return ret;
510 }
511 if (!PermissionCheckPass(info->bundleName)) {
512 TRANS_LOGE(TRANS_SVC, "[br_proxy] get caller hap info failed! ret=%{public}d", ret);
513 return SOFTBUS_TRANS_BR_PROXY_CALLER_RESTRICTED;
514 }
515 return SOFTBUS_OK;
516 }
517
ServerAddProxyToList(const char * brMac,const char * uuid)518 static int32_t ServerAddProxyToList(const char *brMac, const char *uuid)
519 {
520 if (brMac == NULL || uuid == NULL || g_proxyList == NULL) {
521 return SOFTBUS_INVALID_PARAM;
522 }
523 if (IsBrProxyExist(brMac, uuid)) {
524 return SOFTBUS_OK;
525 }
526 int32_t ret = SOFTBUS_OK;
527 BrProxyInfo *info = (BrProxyInfo *)SoftBusCalloc(sizeof(BrProxyInfo));
528 if (info == NULL) {
529 TRANS_LOGE(TRANS_SVC, "[br_proxy] calloc failed");
530 return SOFTBUS_MALLOC_ERR;
531 }
532
533 ret = GetCallerInfoAndVerifyPermission(info);
534 if (ret != SOFTBUS_OK) {
535 goto EXIT_WITH_FREE_INFO;
536 }
537 if (strcpy_s(info->proxyInfo.brMac, sizeof(info->proxyInfo.brMac), brMac) != EOK ||
538 strcpy_s(info->proxyInfo.uuid, sizeof(info->proxyInfo.uuid), uuid) != EOK) {
539 TRANS_LOGE(TRANS_SVC, "[br_proxy] copy brMac or uuid failed");
540 ret = SOFTBUS_STRCPY_ERR;
541 goto EXIT_WITH_FREE_INFO;
542 }
543 info->uid = GetCallerUid();
544 info->isEnable = false;
545 info->isConnected = IS_DISCONNECTED;
546 ListInit(&info->node);
547 if (SoftBusMutexLock(&(g_proxyList->lock)) != SOFTBUS_OK) {
548 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
549 ret = SOFTBUS_LOCK_ERR;
550 goto EXIT_WITH_FREE_INFO;
551 }
552 ListAdd(&g_proxyList->list, &info->node);
553 g_proxyList->cnt++;
554 TRANS_LOGI(TRANS_SVC, "[br_proxy] serverInfo add success, cnt:%{public}d", g_proxyList->cnt);
555 (void)SoftBusMutexUnlock(&g_proxyList->lock);
556 return SOFTBUS_OK;
557
558 EXIT_WITH_FREE_INFO:
559 SoftBusFree(info);
560 return ret;
561 }
562
ServerDeleteProxyFromList(const char * brMac,const char * uuid)563 static int32_t ServerDeleteProxyFromList(const char *brMac, const char *uuid)
564 {
565 if (g_proxyList == NULL) {
566 TRANS_LOGE(TRANS_SVC, "[br_proxy] not init");
567 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
568 }
569 if (SoftBusMutexLock(&(g_proxyList->lock)) != SOFTBUS_OK) {
570 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
571 return SOFTBUS_LOCK_ERR;
572 }
573 BrProxyInfo *nodeInfo = NULL;
574 BrProxyInfo *nodeNext = NULL;
575 LIST_FOR_EACH_ENTRY_SAFE(nodeInfo, nodeNext, &(g_proxyList->list), BrProxyInfo, node) {
576 if (strcmp(brMac, nodeInfo->proxyInfo.brMac) != 0 || strcmp(uuid, nodeInfo->proxyInfo.uuid) != 0) {
577 continue;
578 }
579 ListDelete(&nodeInfo->node);
580 SoftBusFree(nodeInfo);
581 g_proxyList->cnt--;
582 TRANS_LOGI(TRANS_SVC, "[br_proxy] brproxy is close");
583 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
584 return SOFTBUS_OK;
585 }
586 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
587 return SOFTBUS_NOT_FIND;
588 }
589
IsSessionExist(const char * brMac,const char * uuid)590 static bool IsSessionExist(const char *brMac, const char *uuid)
591 {
592 if (brMac == NULL || uuid == NULL || g_serverList == NULL) {
593 return false;
594 }
595 if (SoftBusMutexLock(&(g_serverList->lock)) != SOFTBUS_OK) {
596 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
597 return false;
598 }
599 ServerBrProxyChannelInfo *nodeInfo = NULL;
600 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_serverList->list), ServerBrProxyChannelInfo, node) {
601 if (strcmp(nodeInfo->proxyInfo.brMac, brMac) != 0 || strcmp(nodeInfo->proxyInfo.uuid, uuid) != 0) {
602 continue;
603 }
604 (void)SoftBusMutexUnlock(&(g_serverList->lock));
605 return true;
606 }
607 (void)SoftBusMutexUnlock(&(g_serverList->lock));
608 return false;
609 }
610
ServerAddChannelToList(const char * brMac,const char * uuid,int32_t channelId,uint32_t requestId)611 static int32_t ServerAddChannelToList(const char *brMac, const char *uuid, int32_t channelId, uint32_t requestId)
612 {
613 if (brMac == NULL || uuid == NULL || g_serverList == NULL) {
614 return SOFTBUS_INVALID_PARAM;
615 }
616 if (IsSessionExist(brMac, uuid)) {
617 TRANS_LOGI(TRANS_SVC, "[br_proxy] the session is reopen");
618 return SOFTBUS_OK;
619 }
620 int32_t ret = SOFTBUS_OK;
621 ServerBrProxyChannelInfo *info = (ServerBrProxyChannelInfo *)SoftBusCalloc(sizeof(ServerBrProxyChannelInfo));
622 if (info == NULL) {
623 TRANS_LOGE(TRANS_SVC, "[br_proxy] calloc failed");
624 return SOFTBUS_MALLOC_ERR;
625 }
626 if (strcpy_s(info->proxyInfo.brMac, sizeof(info->proxyInfo.brMac), brMac) != EOK ||
627 strcpy_s(info->proxyInfo.uuid, sizeof(info->proxyInfo.uuid), uuid) != EOK) {
628 TRANS_LOGE(TRANS_SVC, "[br_proxy] copy brMac or uuid failed");
629 ret = SOFTBUS_STRCPY_ERR;
630 goto EXIT_WITH_FREE_INFO;
631 }
632 info->channelId = channelId;
633 info->requestId = requestId;
634 info->callingPid = GetCallerPid();
635 info->callingUid = GetCallerUid();
636 info->callingTokenId = GetCallerTokenId();
637 ListInit(&info->node);
638 if (SoftBusMutexLock(&(g_serverList->lock)) != SOFTBUS_OK) {
639 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
640 ret = SOFTBUS_LOCK_ERR;
641 goto EXIT_WITH_FREE_INFO;
642 }
643 ListAdd(&g_serverList->list, &info->node);
644 g_serverList->cnt++;
645 TRANS_LOGI(TRANS_SVC, "[br_proxy] serverInfo channelId:%{public}d, cnt:%{public}d", channelId, g_serverList->cnt);
646 (void)SoftBusMutexUnlock(&g_serverList->lock);
647 return SOFTBUS_OK;
648
649 EXIT_WITH_FREE_INFO:
650 SoftBusFree(info);
651 return ret;
652 }
653
ServerDeleteChannelFromList(int32_t channelId)654 static int32_t ServerDeleteChannelFromList(int32_t channelId)
655 {
656 if (g_serverList == NULL) {
657 TRANS_LOGE(TRANS_SVC, "[br_proxy] not init");
658 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
659 }
660 if (SoftBusMutexLock(&(g_serverList->lock)) != SOFTBUS_OK) {
661 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
662 return SOFTBUS_LOCK_ERR;
663 }
664 ServerBrProxyChannelInfo *nodeInfo = NULL;
665 ServerBrProxyChannelInfo *nodeNext = NULL;
666 LIST_FOR_EACH_ENTRY_SAFE(nodeInfo, nodeNext, &(g_serverList->list), ServerBrProxyChannelInfo, node) {
667 if (nodeInfo->channelId != channelId) {
668 continue;
669 }
670 ListDelete(&nodeInfo->node);
671 SoftBusFree(nodeInfo);
672 g_serverList->cnt--;
673 TRANS_LOGI(TRANS_SVC, "[br_proxy] by channelId:%{public}d delete node success, cnt%{public}d",
674 channelId, g_serverList->cnt);
675 (void)SoftBusMutexUnlock(&(g_serverList->lock));
676 return SOFTBUS_OK;
677 }
678 (void)SoftBusMutexUnlock(&(g_serverList->lock));
679 return SOFTBUS_NOT_FIND;
680 }
681
UpdateProxyChannel(const char * brMac,const char * uuid,struct ProxyChannel * channel)682 static int32_t UpdateProxyChannel(const char *brMac, const char *uuid, struct ProxyChannel *channel)
683 {
684 if (g_serverList == NULL) {
685 TRANS_LOGE(TRANS_SVC, "[br_proxy] not init");
686 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
687 }
688 if (SoftBusMutexLock(&(g_serverList->lock)) != SOFTBUS_OK) {
689 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
690 return SOFTBUS_LOCK_ERR;
691 }
692 ServerBrProxyChannelInfo *info = NULL;
693 LIST_FOR_EACH_ENTRY(info, &(g_serverList->list), ServerBrProxyChannelInfo, node) {
694 if (strcmp(brMac, info->proxyInfo.brMac) != 0 || strcmp(uuid, info->proxyInfo.uuid) != 0) {
695 continue;
696 }
697 int32_t ret = memcpy_s(&info->channel, sizeof(struct ProxyChannel), channel, sizeof(struct ProxyChannel));
698 if (ret != EOK) {
699 TRANS_LOGE(TRANS_SVC, "[br_proxy] memcpy failed! ret:%{public}d", ret);
700 (void)SoftBusMutexUnlock(&(g_serverList->lock));
701 return SOFTBUS_MEM_ERR;
702 }
703 (void)SoftBusMutexUnlock(&(g_serverList->lock));
704 return SOFTBUS_OK;
705 }
706 (void)SoftBusMutexUnlock(&(g_serverList->lock));
707 char *tmpName = NULL;
708 Anonymize(brMac, &tmpName);
709 TRANS_LOGE(TRANS_SVC, "[br_proxy] update failed! brMac=%{public}s", tmpName);
710 AnonymizeFree(tmpName);
711 return SOFTBUS_NOT_FIND;
712 }
713
GetChannelInfo(const char * brMac,const char * uuid,int32_t channelId,uint32_t requestId,ServerBrProxyChannelInfo * info)714 static int32_t GetChannelInfo(const char *brMac, const char *uuid, int32_t channelId,
715 uint32_t requestId, ServerBrProxyChannelInfo *info)
716 {
717 if (g_serverList == NULL) {
718 TRANS_LOGE(TRANS_SVC, "[br_proxy] not init");
719 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
720 }
721 if (SoftBusMutexLock(&(g_serverList->lock)) != SOFTBUS_OK) {
722 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
723 return SOFTBUS_LOCK_ERR;
724 }
725 ServerBrProxyChannelInfo *nodeInfo = NULL;
726 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_serverList->list), ServerBrProxyChannelInfo, node) {
727 if (channelId != DEFAULT_INVALID_CHANNEL_ID) {
728 if (nodeInfo->channelId != channelId) {
729 continue;
730 }
731 } else if (requestId != DEFAULT_INVALID_REQ_ID) {
732 if (nodeInfo->requestId != requestId) {
733 continue;
734 }
735 } else if (brMac != NULL) {
736 if (strcmp(brMac, nodeInfo->proxyInfo.brMac) != 0 || strcmp(uuid, nodeInfo->proxyInfo.uuid) != 0) {
737 continue;
738 }
739 } else {
740 continue;
741 }
742 int32_t ret = memcpy_s(info, sizeof(ServerBrProxyChannelInfo), nodeInfo, sizeof(ServerBrProxyChannelInfo));
743 if (ret != SOFTBUS_OK) {
744 (void)SoftBusMutexUnlock(&(g_serverList->lock));
745 return SOFTBUS_MEM_ERR;
746 }
747 (void)SoftBusMutexUnlock(&(g_serverList->lock));
748 return SOFTBUS_OK;
749 }
750 (void)SoftBusMutexUnlock(&(g_serverList->lock));
751 char *tmpName = NULL;
752 Anonymize(brMac, &tmpName);
753 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed! brMac:%{public}s, requestId:%{public}d, channelId:%{public}d",
754 AnonymizeWrapper(tmpName), requestId, channelId);
755 AnonymizeFree(tmpName);
756 if (channelId != DEFAULT_INVALID_CHANNEL_ID) {
757 return SOFTBUS_TRANS_INVALID_CHANNEL_ID;
758 }
759 return SOFTBUS_NOT_FIND;
760 }
761
onOpenSuccess(uint32_t requestId,struct ProxyChannel * channel)762 static void onOpenSuccess(uint32_t requestId, struct ProxyChannel *channel)
763 {
764 if (channel == NULL) {
765 TRANS_LOGE(TRANS_SVC, "[br_proxy] channel is null");
766 return;
767 }
768 char *tmpName = NULL;
769 Anonymize(channel->brMac, &tmpName);
770 TRANS_LOGI(TRANS_SVC, "[br_proxy] OpenSuccess! requestId=%{public}d, brMac:%{public}s", requestId, tmpName);
771 AnonymizeFree(tmpName);
772
773 ServerBrProxyChannelInfo nodeInfo = {0};
774 int32_t ret = GetChannelInfo(channel->brMac, channel->uuid,
775 DEFAULT_INVALID_CHANNEL_ID, DEFAULT_INVALID_REQ_ID, &nodeInfo);
776 if (ret != SOFTBUS_OK) {
777 return;
778 }
779
780 ret = UpdateProxyChannel(channel->brMac, channel->uuid, channel);
781 if (ret != SOFTBUS_OK) {
782 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed! ret=%{public}d requestId=%{public}d", ret, requestId);
783 return;
784 }
785
786 ret = UpdateBrProxy(channel->brMac, channel->uuid, channel, true, nodeInfo.channelId);
787 if (ret != SOFTBUS_OK) {
788 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed! ret=%{public}d requestId=%{public}d", ret, requestId);
789 return;
790 }
791 ret = UpdateConnectState(channel->brMac, channel->uuid, IS_CONNECTED);
792 if (ret != SOFTBUS_OK) {
793 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed! ret=%{public}d requestId=%{public}d", ret, requestId);
794 return;
795 }
796
797 ret = ClientIpcBrProxyOpened(COMM_PKGNAME_BRPROXY, nodeInfo.channelId,
798 (const char *)nodeInfo.proxyInfo.brMac, (const char *)nodeInfo.proxyInfo.uuid, SOFTBUS_OK);
799 if (ret != SOFTBUS_OK) {
800 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed! ret=%{public}d requestId=%{public}d", ret, requestId);
801 return;
802 }
803 ClearCountInRetryList(nodeInfo.callingUid);
804 }
805
onOpenFail(uint32_t requestId,int32_t reason)806 void onOpenFail(uint32_t requestId, int32_t reason)
807 {
808 TRANS_LOGE(TRANS_SVC, "[br_proxy] OpenFail requestId=%{public}d, reason = %{public}d",
809 requestId, reason);
810 ServerBrProxyChannelInfo info = {0};
811 int32_t ret = GetChannelInfo(NULL, NULL, DEFAULT_INVALID_CHANNEL_ID, requestId, &info);
812 if (ret != SOFTBUS_OK) {
813 return;
814 }
815 ret = ServerDeleteChannelFromList(info.channelId);
816 if (ret != SOFTBUS_OK) {
817 return;
818 }
819 if (!IsBrProxyEnable(info.callingUid)) {
820 ret = ServerDeleteProxyFromList(info.proxyInfo.brMac, info.proxyInfo.uuid);
821 if (ret != SOFTBUS_OK) {
822 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed, ret:%{public}d", ret);
823 return;
824 }
825 }
826
827 ret = ClientIpcBrProxyOpened(COMM_PKGNAME_BRPROXY, DEFAULT_INVALID_CHANNEL_ID,
828 (const char *)info.proxyInfo.brMac, (const char *)info.proxyInfo.uuid, reason);
829 if (ret != SOFTBUS_OK) {
830 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed! ret=%{public}d requestId=%{public}d", ret, requestId);
831 return;
832 }
833 }
834
835 static OpenProxyChannelCallback g_channelOpen = {
836 .onOpenSuccess = onOpenSuccess,
837 .onOpenFail = onOpenFail,
838 };
839
ConnectPeerDevice(const char * brMac,const char * uuid,uint32_t * requestId)840 static int32_t ConnectPeerDevice(const char *brMac, const char *uuid, uint32_t *requestId)
841 {
842 ProxyChannelManager *proxyMgr = GetProxyChannelManager();
843 if (proxyMgr == NULL) {
844 return SOFTBUS_INVALID_PARAM;
845 }
846 *requestId = proxyMgr->generateRequestId();
847 ProxyChannelParam param;
848 param.requestId = *requestId;
849
850 if (strcpy_s(param.brMac, sizeof(param.brMac), brMac) != EOK ||
851 strcpy_s(param.uuid, sizeof(param.uuid), uuid) != EOK) {
852 TRANS_LOGE(TRANS_SVC, "[br_proxy] copy brMac or uuid failed");
853 return SOFTBUS_MEM_ERR;
854 }
855
856 param.timeoutMs = BR_PROXY_MAX_WAIT_TIME_MS;
857 TRANS_LOGI(TRANS_SVC, "[br_proxy] open br, requestId=%{public}d", *requestId);
858 int32_t ret = proxyMgr->openProxyChannel(¶m, &g_channelOpen);
859 if (ret != SOFTBUS_OK) {
860 TRANS_LOGE(TRANS_SVC, "[br_proxy] openProxyChannel failed, ret=%{public}d", ret);
861 return ret;
862 }
863 return ret;
864 }
865
GetChannelId(const char * mac,const char * uuid,int32_t * channelId)866 static int32_t GetChannelId(const char *mac, const char *uuid, int32_t *channelId)
867 {
868 if (mac == NULL || uuid == NULL || g_proxyList == NULL || channelId == NULL) {
869 TRANS_LOGE(TRANS_SVC, "[br_proxy] invalid param!");
870 return SOFTBUS_INVALID_PARAM;
871 }
872 if (SoftBusMutexLock(&(g_proxyList->lock)) != SOFTBUS_OK) {
873 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
874 return SOFTBUS_LOCK_ERR;
875 }
876 BrProxyInfo *nodeInfo = NULL;
877 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_proxyList->list), BrProxyInfo, node) {
878 if (strcmp(nodeInfo->proxyInfo.brMac, mac) != 0 || strcmp(nodeInfo->proxyInfo.uuid, uuid) != 0) {
879 continue;
880 }
881 if (nodeInfo->isEnable) {
882 *channelId = nodeInfo->channelId;
883 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
884 TRANS_LOGI(TRANS_SVC, "[br_proxy] channelId:%{public}d is exist!", *channelId);
885 return SOFTBUS_OK;
886 } else {
887 break;
888 }
889 }
890 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
891 int32_t ret = GetNewChannelId(channelId);
892 if (ret != SOFTBUS_OK) {
893 TRANS_LOGE(TRANS_SVC, "[br_proxy] get new channelId failed! ret:%{public}d", ret);
894 return ret;
895 }
896 TRANS_LOGI(TRANS_SVC, "[br_proxy] new channelId:%{public}d!", *channelId);
897 return SOFTBUS_OK;
898 }
899
TransOpenBrProxy(const char * brMac,const char * uuid)900 int32_t TransOpenBrProxy(const char *brMac, const char *uuid)
901 {
902 if (brMac == NULL || uuid == NULL) {
903 TRANS_LOGE(TRANS_SVC, "[br_proxy] brMac or uuid is null");
904 return SOFTBUS_INVALID_PARAM;
905 }
906
907 int32_t ret = BrProxyServerInit();
908 if (ret != SOFTBUS_OK) {
909 return ret;
910 }
911 ret = RegisterUserSwitchEvent();
912 if (ret != SOFTBUS_OK) {
913 return ret;
914 }
915 ret = ServerAddProxyToList(brMac, uuid);
916 if (ret != SOFTBUS_OK) {
917 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed, ret=%{public}d", ret);
918 return ret;
919 }
920
921 uint32_t requestId = 0;
922 ret = ConnectPeerDevice(brMac, uuid, &requestId);
923 if (ret != SOFTBUS_OK) {
924 return ret;
925 }
926 int32_t channelId = 0;
927 ret = GetChannelId(brMac, uuid, &channelId);
928 if (ret != SOFTBUS_OK) {
929 return ret;
930 }
931 ret = ServerAddChannelToList(brMac, uuid, channelId, requestId);
932 if (ret != SOFTBUS_OK) {
933 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed, ret=%{public}d", ret);
934 return ret;
935 }
936 char *brMactmpName = NULL;
937 char *uuidtmpName = NULL;
938 Anonymize(brMac, &brMactmpName);
939 Anonymize(uuid, &uuidtmpName);
940 TRANS_LOGI(TRANS_SVC, "[br_proxy] brproxy open! brMac:%{public}s,uuid:%{public}s", brMactmpName, uuidtmpName);
941 AnonymizeFree(brMactmpName);
942 AnonymizeFree(uuidtmpName);
943 return SOFTBUS_OK;
944 }
945
TransCloseBrProxy(int32_t channelId,bool isInnerCall)946 int32_t TransCloseBrProxy(int32_t channelId, bool isInnerCall)
947 {
948 TRANS_LOGI(TRANS_SVC, "[br_proxy] enter, channelId:%{public}d", channelId);
949 ServerBrProxyChannelInfo info;
950 int32_t ret = GetChannelInfo(NULL, NULL, channelId, DEFAULT_INVALID_REQ_ID, &info);
951 if (ret != SOFTBUS_OK) {
952 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed, ret:%{public}d, channelId:%{public}d", ret, channelId);
953 return ret;
954 }
955 if (!isInnerCall) {
956 uint32_t tokenId = GetCallerTokenId();
957 if (tokenId != info.callingTokenId) {
958 TRANS_LOGE(TRANS_SVC, "[br_proxy] tokenid check failed");
959 return SOFTBUS_TRANS_BR_PROXY_TOKENID_ERR;
960 }
961 }
962 ret = ServerDeleteProxyFromList(info.proxyInfo.brMac, info.proxyInfo.uuid);
963 if (ret != SOFTBUS_OK) {
964 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed, ret:%{public}d, channelId:%{public}d", ret, channelId);
965 return ret;
966 }
967 ret = ServerDeleteChannelFromList(channelId);
968 if (ret != SOFTBUS_OK) {
969 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed, ret:%{public}d, channelId:%{public}d", ret, channelId);
970 return ret;
971 }
972 info.channel.close(&info.channel);
973 return SOFTBUS_OK;
974 }
975
TransSendBrProxyData(int32_t channelId,char * data,uint32_t dataLen)976 int32_t TransSendBrProxyData(int32_t channelId, char* data, uint32_t dataLen)
977 {
978 if (data == NULL) {
979 TRANS_LOGE(TRANS_SVC, "[br_proxy] data is null");
980 return SOFTBUS_INVALID_PARAM;
981 }
982 TRANS_LOGI(TRANS_SVC, "[br_proxy] enter, channelId:%{public}d, dataLen:%{public}d", channelId, dataLen);
983
984 ServerBrProxyChannelInfo info = {0};
985 int32_t ret = GetChannelInfo(NULL, NULL, channelId, DEFAULT_INVALID_REQ_ID, &info);
986 if (ret != SOFTBUS_OK) {
987 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed, ret=%{public}d", ret);
988 return ret;
989 }
990 uint32_t tokenId = GetCallerTokenId();
991 if (tokenId != info.callingTokenId) {
992 TRANS_LOGE(TRANS_SVC, "[br_proxy] tokenid check failed");
993 return SOFTBUS_TRANS_BR_PROXY_TOKENID_ERR;
994 }
995 ret = info.channel.send(&info.channel, (const uint8_t *)data, dataLen);
996 if (ret != SOFTBUS_OK) {
997 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed, ret=%{public}d", ret);
998 return SOFTBUS_CONN_BR_UNDERLAY_WRITE_FAIL;
999 }
1000 return SOFTBUS_OK;
1001 }
1002
SetListenerStateByChannelId(int32_t channelId,ListenerType type,bool isEnable)1003 static int32_t SetListenerStateByChannelId(int32_t channelId, ListenerType type, bool isEnable)
1004 {
1005 if (g_serverList == NULL) {
1006 TRANS_LOGE(TRANS_SVC, "[br_proxy] not init");
1007 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
1008 }
1009
1010 if (type != DATA_RECEIVE && type != CHANNEL_STATE) {
1011 TRANS_LOGE(TRANS_SVC, "[br_proxy] wrong type:%{public}d", type);
1012 return SOFTBUS_INVALID_PARAM;
1013 }
1014
1015 if (SoftBusMutexLock(&(g_serverList->lock)) != SOFTBUS_OK) {
1016 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
1017 return SOFTBUS_LOCK_ERR;
1018 }
1019 ServerBrProxyChannelInfo *nodeInfo = NULL;
1020 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_serverList->list), ServerBrProxyChannelInfo, node) {
1021 if (nodeInfo->channelId != channelId) {
1022 continue;
1023 }
1024 switch (type) {
1025 case DATA_RECEIVE:
1026 nodeInfo->isReceiveCbSet = isEnable;
1027 break;
1028 case CHANNEL_STATE:
1029 nodeInfo->isChannelStateCbSet = isEnable;
1030 break;
1031 default:
1032 break;
1033 }
1034 (void)SoftBusMutexUnlock(&(g_serverList->lock));
1035 return SOFTBUS_OK;
1036 }
1037 (void)SoftBusMutexUnlock(&(g_serverList->lock));
1038 TRANS_LOGE(TRANS_SVC, "[br_proxy] invalid channelId:%{public}d", channelId);
1039 return SOFTBUS_NOT_FIND;
1040 }
1041
SelectClient(ProxyBaseInfo * baseInfo,pid_t * pid,int32_t * channelId)1042 static int32_t SelectClient(ProxyBaseInfo *baseInfo, pid_t *pid, int32_t *channelId)
1043 {
1044 if (g_serverList == NULL) {
1045 TRANS_LOGE(TRANS_SVC, "[br_proxy] not init");
1046 return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
1047 }
1048 if (SoftBusMutexLock(&(g_serverList->lock)) != SOFTBUS_OK) {
1049 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
1050 return SOFTBUS_LOCK_ERR;
1051 }
1052 ServerBrProxyChannelInfo *nodeInfo = NULL;
1053 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_serverList->list), ServerBrProxyChannelInfo, node) {
1054 if (strcmp(baseInfo->brMac, nodeInfo->proxyInfo.brMac) != 0 ||
1055 strcmp(baseInfo->uuid, nodeInfo->proxyInfo.uuid) != 0 || !nodeInfo->isReceiveCbSet) {
1056 continue;
1057 }
1058 *channelId = nodeInfo->channelId;
1059 *pid = nodeInfo->callingPid;
1060 (void)SoftBusMutexUnlock(&(g_serverList->lock));
1061 return SOFTBUS_OK;
1062 }
1063 (void)SoftBusMutexUnlock(&(g_serverList->lock));
1064 return SOFTBUS_NOT_FIND;
1065 }
1066
GetDataFromList(ProxyBaseInfo * baseInfo,uint8_t ** data,uint32_t * realLen,bool * isEmpty)1067 static void GetDataFromList(ProxyBaseInfo *baseInfo, uint8_t **data, uint32_t *realLen, bool *isEmpty)
1068 {
1069 if (g_dataList == NULL || baseInfo == NULL || realLen == NULL || isEmpty == NULL) {
1070 TRANS_LOGE(TRANS_SVC, "[br_proxy] not init");
1071 return;
1072 }
1073 if (SoftBusMutexLock(&(g_dataList->lock)) != SOFTBUS_OK) {
1074 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
1075 return;
1076 }
1077 int32_t ret;
1078 *isEmpty = true;
1079 ServerDataInfo *nodeInfo = NULL;
1080 ServerDataInfo *nodeNext = NULL;
1081 LIST_FOR_EACH_ENTRY_SAFE(nodeInfo, nodeNext, &(g_dataList->list), ServerDataInfo, node) {
1082 if (strcmp(baseInfo->brMac, nodeInfo->brMac) != 0 ||
1083 strcmp(baseInfo->uuid, nodeInfo->uuid) != 0) {
1084 continue;
1085 }
1086 *data = (uint8_t *)SoftBusCalloc(nodeInfo->dataLen * sizeof(uint8_t));
1087 if (*data == NULL) {
1088 TRANS_LOGE(TRANS_SVC, "[br_proxy] calloc failed!");
1089 (void)SoftBusMutexUnlock(&(g_dataList->lock));
1090 return;
1091 }
1092 ret = memcpy_s(*data, nodeInfo->dataLen, nodeInfo->data, nodeInfo->dataLen);
1093 if (ret != EOK) {
1094 SoftBusFree(*data);
1095 TRANS_LOGE(TRANS_SVC, "[br_proxy] memcpy_s failed! ret:%{public}d", ret);
1096 (void)SoftBusMutexUnlock(&(g_dataList->lock));
1097 return;
1098 }
1099 *realLen = nodeInfo->dataLen;
1100 ListDelete(&nodeInfo->node);
1101 SoftBusFree(nodeInfo->data);
1102 SoftBusFree(nodeInfo);
1103 g_dataList->cnt--;
1104 *isEmpty = false;
1105 break;
1106 }
1107 (void)SoftBusMutexUnlock(&(g_dataList->lock));
1108 return;
1109 }
1110
CleanUpDataListWithSameMac(ProxyBaseInfo * baseInfo,int32_t channelId,pid_t pid)1111 static void CleanUpDataListWithSameMac(ProxyBaseInfo *baseInfo, int32_t channelId, pid_t pid)
1112 {
1113 bool isEmpty = false;
1114 while (!isEmpty) {
1115 uint8_t *data = NULL;
1116 uint32_t realLen = 0;
1117 GetDataFromList(baseInfo, &data, &realLen, &isEmpty);
1118 if (isEmpty) {
1119 return;
1120 }
1121 ClientIpcBrProxyReceivedData(COMM_PKGNAME_BRPROXY, channelId, (const uint8_t *)data, realLen);
1122 SoftBusFree(data);
1123 }
1124 }
1125
IsForegroundProcess(ProxyBaseInfo * baseInfo)1126 static bool IsForegroundProcess(ProxyBaseInfo *baseInfo)
1127 {
1128 if (g_serverList == NULL) {
1129 TRANS_LOGE(TRANS_SVC, "[br_proxy] not init");
1130 return false;
1131 }
1132 if (SoftBusMutexLock(&(g_serverList->lock)) != SOFTBUS_OK) {
1133 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
1134 return false;
1135 }
1136 ServerBrProxyChannelInfo *nodeInfo = NULL;
1137 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_serverList->list), ServerBrProxyChannelInfo, node) {
1138 if (strcmp(baseInfo->brMac, nodeInfo->proxyInfo.brMac) != 0 &&
1139 strcmp(baseInfo->uuid, nodeInfo->proxyInfo.uuid) != 0) {
1140 continue;
1141 }
1142 (void)SoftBusMutexUnlock(&(g_serverList->lock));
1143 return true;
1144 }
1145 (void)SoftBusMutexUnlock(&(g_serverList->lock));
1146 TRANS_LOGI(TRANS_SVC, "[br_proxy] is dead");
1147 return false;
1148 }
1149
DealDataWhenForeground(ProxyBaseInfo * baseInfo,const uint8_t * data,uint32_t dataLen)1150 static void DealDataWhenForeground(ProxyBaseInfo *baseInfo, const uint8_t *data, uint32_t dataLen)
1151 {
1152 pid_t pid = 0;
1153 int32_t channelId = 0;
1154 int32_t ret = SelectClient(baseInfo, &pid, &channelId);
1155 if (ret != SOFTBUS_OK) {
1156 TRANS_LOGE(TRANS_SVC, "[br_proxy] select pid failed! ret:%{public}d", ret);
1157 return;
1158 }
1159 ret = ServerAddDataToList(baseInfo, data, dataLen);
1160 if (ret != SOFTBUS_OK) {
1161 TRANS_LOGE(TRANS_SVC, "[br_proxy] add data to list failed! ret:%{public}d", ret);
1162 return;
1163 }
1164 CleanUpDataListWithSameMac(baseInfo, channelId, pid);
1165 }
1166
DealDataWhenBackground(ProxyBaseInfo * baseInfo,const uint8_t * data,uint32_t dataLen)1167 static void DealDataWhenBackground(ProxyBaseInfo *baseInfo, const uint8_t *data, uint32_t dataLen)
1168 {
1169 int32_t ret = ServerAddDataToList(baseInfo, data, dataLen);
1170 if (ret != SOFTBUS_OK) {
1171 TRANS_LOGE(TRANS_SVC, "[br_proxy] add to datalist failed. ret:%{public}d", ret);
1172 return;
1173 }
1174 BrProxyInfo info;
1175 ret = GetBrProxy(baseInfo->brMac, baseInfo->uuid, &info);
1176 if (ret != SOFTBUS_OK) {
1177 TRANS_LOGE(TRANS_SVC, "[br_proxy] get brproxy failed. ret:%{public}d", ret);
1178 return;
1179 }
1180 PullUpHap(info.bundleName, info.abilityName);
1181 }
1182
DealWithDataRecv(ProxyBaseInfo * baseInfo,const uint8_t * data,uint32_t dataLen)1183 static void DealWithDataRecv(ProxyBaseInfo *baseInfo, const uint8_t *data, uint32_t dataLen)
1184 {
1185 bool isForeground = IsForegroundProcess(baseInfo);
1186 if (isForeground) {
1187 DealDataWhenForeground(baseInfo, data, dataLen);
1188 } else {
1189 DealDataWhenBackground(baseInfo, data, dataLen);
1190 }
1191 }
1192
OnDataReceived(struct ProxyChannel * channel,const uint8_t * data,uint32_t dataLen)1193 static void OnDataReceived(struct ProxyChannel *channel, const uint8_t *data, uint32_t dataLen)
1194 {
1195 if (channel == NULL || data == NULL) {
1196 TRANS_LOGE(TRANS_SVC, "[br_proxy] channle or data is null");
1197 return;
1198 }
1199 TRANS_LOGI(TRANS_SVC, "[br_proxy] data recv, requestId:%{public}d, dataLen:%{public}d",
1200 channel->requestId, dataLen);
1201
1202 ProxyBaseInfo info;
1203 if (strcpy_s(info.brMac, sizeof(info.brMac), channel->brMac) != EOK ||
1204 strcpy_s(info.uuid, sizeof(info.uuid), channel->uuid) != EOK) {
1205 TRANS_LOGE(TRANS_SVC, "[br_proxy] strcpy failed");
1206 return;
1207 }
1208
1209 DealWithDataRecv(&info, data, dataLen);
1210 }
1211
OnDisconnected(struct ProxyChannel * channel,int32_t reason)1212 static void OnDisconnected(struct ProxyChannel *channel, int32_t reason)
1213 {
1214 if (channel == NULL) {
1215 TRANS_LOGE(TRANS_SVC, "[br_proxy] channle is null");
1216 return;
1217 }
1218 char *tmpMacName = NULL;
1219 char *tmpUuidName = NULL;
1220 Anonymize(channel->brMac, &tmpMacName);
1221 Anonymize(channel->uuid, &tmpUuidName);
1222 TRANS_LOGE(TRANS_SVC, "[br_proxy] disconnect enter! brMac:%{public}s, uuid:%{public}s, reason:%{public}d",
1223 AnonymizeWrapper(tmpMacName), AnonymizeWrapper(tmpUuidName), reason);
1224 AnonymizeFree(tmpMacName);
1225 AnonymizeFree(tmpUuidName);
1226
1227 ServerBrProxyChannelInfo info = {0};
1228 int32_t ret = GetChannelInfo(channel->brMac, channel->uuid,
1229 DEFAULT_INVALID_CHANNEL_ID, DEFAULT_INVALID_REQ_ID, &info);
1230 if (ret != SOFTBUS_OK) {
1231 // client is died
1232 goto EXIT;
1233 }
1234 ClientIpcBrProxyStateChanged(COMM_PKGNAME_BRPROXY, info.channelId, reason);
1235 EXIT:
1236 if (reason == SOFTBUS_CONN_BR_UNPAIRED || reason == SOFTBUS_CONN_PROXY_RETRY_FAILED) {
1237 CloseAllConnect();
1238 }
1239 ret = UpdateConnectState(channel->brMac, channel->uuid, IS_DISCONNECTED);
1240 if (ret != SOFTBUS_OK) {
1241 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed! ret=%{public}d", ret);
1242 }
1243 }
1244
OnReconnected(char * addr,struct ProxyChannel * channel)1245 static void OnReconnected(char *addr, struct ProxyChannel *channel)
1246 {
1247 if (channel == NULL || addr == NULL) {
1248 TRANS_LOGE(TRANS_SVC, "[br_proxy] channel or addr is null");
1249 return;
1250 }
1251 TRANS_LOGI(TRANS_SVC, "[br_proxy] reconnect ok");
1252 int32_t ret = UpdateConnectState(channel->brMac, channel->uuid, IS_CONNECTED);
1253 if (ret != SOFTBUS_OK) {
1254 TRANS_LOGE(TRANS_SVC, "[br_proxy] Update ConnectState failed! ret=%{public}d", ret);
1255 return;
1256 }
1257 if (IsSessionExist(channel->brMac, channel->uuid)) {
1258 ServerBrProxyChannelInfo info = {0};
1259 ret = GetChannelInfo(channel->brMac, channel->uuid, DEFAULT_INVALID_CHANNEL_ID, DEFAULT_INVALID_REQ_ID, &info);
1260 if (ret != SOFTBUS_OK) {
1261 return;
1262 }
1263 ClientIpcBrProxyStateChanged(COMM_PKGNAME_BRPROXY, info.channelId, SOFTBUS_OK);
1264 UpdateProxyChannel(channel->brMac, channel->uuid, channel);
1265 UpdateBrProxy(channel->brMac, channel->uuid, channel, false, 0);
1266 return;
1267 }
1268 // the client is dead
1269 UpdateBrProxy(channel->brMac, channel->uuid, channel, false, 0);
1270 BrProxyInfo info;
1271 ret = GetBrProxy(channel->brMac, channel->uuid, &info);
1272 if (ret != SOFTBUS_OK) {
1273 TRANS_LOGE(TRANS_SVC, "[br_proxy] get brproxy failed. ret:%{public}d", ret);
1274 return;
1275 }
1276 PullUpHap(info.bundleName, info.abilityName);
1277 }
1278
1279 static ProxyConnectListener g_channelListener = {
1280 .onProxyChannelDataReceived = OnDataReceived,
1281 .onProxyChannelDisconnected = OnDisconnected,
1282 .onProxyChannelReconnected = OnReconnected,
1283 };
1284
SendDataIfExistsInList(int32_t channelId)1285 static void SendDataIfExistsInList(int32_t channelId)
1286 {
1287 ServerBrProxyChannelInfo info = {0};
1288 int32_t ret = GetChannelInfo(NULL, NULL, channelId, DEFAULT_INVALID_REQ_ID, &info);
1289 if (ret != SOFTBUS_OK) {
1290 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed, ret=%{public}d", ret);
1291 return;
1292 }
1293 ProxyBaseInfo baseInfo;
1294 if (strcpy_s(baseInfo.brMac, sizeof(baseInfo.brMac), info.proxyInfo.brMac) != EOK ||
1295 strcpy_s(baseInfo.uuid, sizeof(baseInfo.uuid), info.proxyInfo.uuid) != EOK) {
1296 TRANS_LOGE(TRANS_SVC, "[br_proxy] strcpy failed");
1297 return;
1298 }
1299 CleanUpDataListWithSameMac(&baseInfo, channelId, info.callingPid);
1300 }
1301
TransSetListenerState(int32_t channelId,int32_t type,bool isEnable)1302 int32_t TransSetListenerState(int32_t channelId, int32_t type, bool isEnable)
1303 {
1304 ServerBrProxyChannelInfo info;
1305 int32_t ret = GetChannelInfo(NULL, NULL, channelId, DEFAULT_INVALID_REQ_ID, &info);
1306 if (ret != SOFTBUS_OK) {
1307 TRANS_LOGE(TRANS_SVC, "[br_proxy] failed, ret=%{public}d", ret);
1308 return ret;
1309 }
1310 uint32_t tokenId = GetCallerTokenId();
1311 if (tokenId != info.callingTokenId) {
1312 TRANS_LOGE(TRANS_SVC, "[br_proxy] tokenid check failed");
1313 return SOFTBUS_TRANS_BR_PROXY_TOKENID_ERR;
1314 }
1315 TRANS_LOGI(TRANS_SVC, "[br_proxy], chanId:%{public}d, type:%{public}d, type_desc:%{public}s, isEnable:%{public}s",
1316 channelId, type, type == DATA_RECEIVE ? "receiveData":"receiveChannelStatus", isEnable ? "on" : "off");
1317 ret = SetListenerStateByChannelId(channelId, (ListenerType)type, isEnable);
1318 if (ret != SOFTBUS_OK) {
1319 return ret;
1320 }
1321 static bool flag = true;
1322 if (flag) {
1323 flag = false;
1324 ProxyChannelManager *proxyMgr = GetProxyChannelManager();
1325 proxyMgr->registerProxyChannelListener(&g_channelListener);
1326 }
1327 if ((ListenerType)type == DATA_RECEIVE && isEnable) {
1328 SendDataIfExistsInList(channelId);
1329 }
1330 return SOFTBUS_OK;
1331 }
1332
ServerDeleteChannelByPid(pid_t callingPid)1333 static void ServerDeleteChannelByPid(pid_t callingPid)
1334 {
1335 TRANS_LOGE(TRANS_SVC, "[br_proxy] enter");
1336 if (g_serverList == NULL) {
1337 TRANS_LOGE(TRANS_SVC, "[br_proxy] not init");
1338 return;
1339 }
1340 if (SoftBusMutexLock(&(g_serverList->lock)) != SOFTBUS_OK) {
1341 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
1342 return;
1343 }
1344 ServerBrProxyChannelInfo *nodeInfo = NULL;
1345 ServerBrProxyChannelInfo *nodeNext = NULL;
1346 LIST_FOR_EACH_ENTRY_SAFE(nodeInfo, nodeNext, &(g_serverList->list), ServerBrProxyChannelInfo, node) {
1347 TRANS_LOGI(TRANS_SVC, "[br_proxy] by pid:%{public}d pid:%{public}d",
1348 callingPid, nodeInfo->callingPid);
1349 if (nodeInfo->callingPid != callingPid) {
1350 continue;
1351 }
1352 ListDelete(&nodeInfo->node);
1353 SoftBusFree(nodeInfo);
1354 g_serverList->cnt--;
1355 TRANS_LOGI(TRANS_SVC, "[br_proxy] by pid:%{public}d delete node success, cnt%{public}d",
1356 callingPid, g_serverList->cnt);
1357 break;
1358 }
1359 (void)SoftBusMutexUnlock(&(g_serverList->lock));
1360 return;
1361 }
1362
BrProxyClientDeathClearResource(pid_t callingPid)1363 void BrProxyClientDeathClearResource(pid_t callingPid)
1364 {
1365 ServerDeleteChannelByPid(callingPid);
1366 }
1367
CheckSessionExistByUid(pid_t uid)1368 static bool CheckSessionExistByUid(pid_t uid)
1369 {
1370 if (g_proxyList == NULL) {
1371 return false;
1372 }
1373 if (SoftBusMutexLock(&(g_proxyList->lock)) != SOFTBUS_OK) {
1374 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
1375 return false;
1376 }
1377 BrProxyInfo *nodeInfo = NULL;
1378 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_proxyList->list), BrProxyInfo, node) {
1379 if (nodeInfo->uid != uid) {
1380 continue;
1381 }
1382 bool flag = nodeInfo->isConnected;
1383 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
1384 return flag;
1385 }
1386 (void)SoftBusMutexUnlock(&(g_proxyList->lock));
1387 return false;
1388 }
1389
RetryListInit()1390 static int32_t RetryListInit()
1391 {
1392 if (g_retryList != NULL) {
1393 return SOFTBUS_OK;
1394 }
1395 g_retryList = CreateSoftBusList();
1396 if (g_retryList == NULL) {
1397 TRANS_LOGE(TRANS_SVC, "[br_proxy] init retry list failed");
1398 return SOFTBUS_CREATE_LIST_ERR;
1399 }
1400 return SOFTBUS_OK;
1401 }
1402
IsUidExist(pid_t uid)1403 static bool IsUidExist(pid_t uid)
1404 {
1405 if (g_retryList == NULL) {
1406 TRANS_LOGE(TRANS_SVC, "[br_proxy] Something that couldn't have happened!");
1407 return false;
1408 }
1409 if (SoftBusMutexLock(&(g_retryList->lock)) != SOFTBUS_OK) {
1410 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
1411 return false;
1412 }
1413 RetryInfo *nodeInfo = NULL;
1414 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_retryList->list), RetryInfo, node) {
1415 if (nodeInfo->uid != uid) {
1416 continue;
1417 }
1418 (void)SoftBusMutexUnlock(&(g_retryList->lock));
1419 TRANS_LOGI(TRANS_SVC, "[br_proxy] the uid is exist!");
1420 return true;
1421 }
1422 (void)SoftBusMutexUnlock(&(g_retryList->lock));
1423 return false;
1424 }
1425
AddToRetryList(pid_t uid)1426 static int32_t AddToRetryList(pid_t uid)
1427 {
1428 if (g_retryList == NULL) {
1429 return SOFTBUS_INVALID_PARAM;
1430 }
1431 if (IsUidExist(uid)) {
1432 return SOFTBUS_OK;
1433 }
1434 int32_t ret = SOFTBUS_OK;
1435 RetryInfo *info = (RetryInfo *)SoftBusCalloc(sizeof(RetryInfo));
1436 if (info == NULL) {
1437 TRANS_LOGE(TRANS_SVC, "[br_proxy] calloc failed");
1438 return SOFTBUS_MALLOC_ERR;
1439 }
1440
1441 info->uid = uid;
1442 info->cnt = 0;
1443 ListInit(&info->node);
1444 if (SoftBusMutexLock(&(g_retryList->lock)) != SOFTBUS_OK) {
1445 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
1446 ret = SOFTBUS_LOCK_ERR;
1447 goto EXIT_WITH_FREE_INFO;
1448 }
1449 ListAdd(&g_retryList->list, &info->node);
1450 g_retryList->cnt++;
1451 TRANS_LOGI(TRANS_SVC, "[br_proxy] retry info add success, cnt:%{public}d", g_retryList->cnt);
1452 (void)SoftBusMutexUnlock(&g_retryList->lock);
1453 return SOFTBUS_OK;
1454
1455 EXIT_WITH_FREE_INFO:
1456 SoftBusFree(info);
1457 return ret;
1458 }
1459
GetCountFromRetryList(pid_t uid,uint32_t * cnt)1460 static int32_t GetCountFromRetryList(pid_t uid, uint32_t *cnt)
1461 {
1462 if (g_retryList == NULL) {
1463 TRANS_LOGE(TRANS_SVC, "[br_proxy] Something that couldn't have happened!");
1464 return SOFTBUS_INVALID_PARAM;
1465 }
1466 if (cnt == NULL) {
1467 TRANS_LOGE(TRANS_SVC, "[br_proxy] cnt is null!");
1468 return SOFTBUS_INVALID_PARAM;
1469 }
1470 if (SoftBusMutexLock(&(g_retryList->lock)) != SOFTBUS_OK) {
1471 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
1472 return SOFTBUS_LOCK_ERR;
1473 }
1474 RetryInfo *nodeInfo = NULL;
1475 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_retryList->list), RetryInfo, node) {
1476 if (nodeInfo->uid != uid) {
1477 continue;
1478 }
1479 *cnt = nodeInfo->cnt;
1480 nodeInfo->cnt++;
1481 (void)SoftBusMutexUnlock(&(g_retryList->lock));
1482 TRANS_LOGI(TRANS_SVC, "[br_proxy] the uid is exist!, cnt:%{public}d", *cnt);
1483 return SOFTBUS_OK;
1484 }
1485 (void)SoftBusMutexUnlock(&(g_retryList->lock));
1486 return SOFTBUS_NOT_FIND;
1487 }
1488
ClearCountInRetryList(pid_t uid)1489 static void ClearCountInRetryList(pid_t uid)
1490 {
1491 if (g_retryList == NULL) {
1492 TRANS_LOGI(TRANS_SVC, "[br_proxy] no need clear cnt!");
1493 return;
1494 }
1495
1496 if (SoftBusMutexLock(&(g_retryList->lock)) != SOFTBUS_OK) {
1497 TRANS_LOGE(TRANS_SVC, "[br_proxy] lock failed");
1498 return;
1499 }
1500 RetryInfo *nodeInfo = NULL;
1501 LIST_FOR_EACH_ENTRY(nodeInfo, &(g_retryList->list), RetryInfo, node) {
1502 if (nodeInfo->uid != uid) {
1503 continue;
1504 }
1505 nodeInfo->cnt = 0;
1506 (void)SoftBusMutexUnlock(&(g_retryList->lock));
1507 TRANS_LOGI(TRANS_SVC, "[br_proxy] the cnt is clear!");
1508 return;
1509 }
1510 (void)SoftBusMutexUnlock(&(g_retryList->lock));
1511 return;
1512 }
1513
TransIsProxyChannelEnabled(pid_t uid)1514 bool TransIsProxyChannelEnabled(pid_t uid)
1515 {
1516 #define PUSH_MAX_RETRY_TIME 3
1517 if (CheckSessionExistByUid(uid)) {
1518 return true;
1519 }
1520 int32_t ret = RetryListInit();
1521 if (ret != SOFTBUS_OK) {
1522 return false;
1523 }
1524 ret = AddToRetryList(uid);
1525 if (ret != SOFTBUS_OK) {
1526 return false;
1527 }
1528 uint32_t cnt = 0;
1529 ret = GetCountFromRetryList(uid, &cnt);
1530 if (ret != SOFTBUS_OK) {
1531 return false;
1532 }
1533 if (cnt < PUSH_MAX_RETRY_TIME) {
1534 return true;
1535 }
1536 return false;
1537 }
1538
TransRegisterPushHook()1539 int32_t TransRegisterPushHook()
1540 {
1541 return CheckPushPermission();
1542 }