• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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(&param, &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 }