• 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 <ctype.h>
17 #include <securec.h>
18 #include <unistd.h>
19 
20 #include "br_proxy.h"
21 #include "softbus_adapter_mem.h"
22 #include "softbus_client_stub_interface.h"
23 #include "softbus_error_code.h"
24 #include "softbus_utils.h"
25 #include "trans_server_proxy.h"
26 
27 typedef struct {
28     ListNode node;
29     char peerBRMacAddr[BR_MAC_LEN];
30     char peerBRUuid[UUID_LEN];
31     int32_t channelId;
32     int32_t sessionId;
33     IBrProxyListener listener;
34     bool enableDataRecv;
35     bool enableStateChange;
36 } ClientBrProxyChannelInfo;
37 
38 static SoftBusList *g_clientList = NULL;
39 
40 // MAC地址格式常量定义
41 #define MAC_ADDRESS_BYTES 6           // MAC地址字节数
42 #define MAC_VALID_CHARS 12            // 有效十六进制字符数
43 #define MAC_MAX_SEPARATORS 5          // 最大分隔符数量
44 
45 // 分隔符定义
46 #define MAC_SEPARATOR_COLON ':'       // 冒号分隔符
47 #define MAC_SEPARATOR_HYPHEN '-'      // 连字符分隔符
48 #define MAC_SEPARATOR_DOT '.'         // 点分隔符
49 
50 // UUID格式常量定义
51 #define UUID_HYPHEN_COUNT 4       // 标准格式中的连字符数量
52 #define UUID_GROUP_COUNT 5        // UUID分组数量
53 
54 // 连字符位置定义(0-based索引)
55 #define UUID_HYPHEN_POS1 8  // 第一个连字符位置
56 #define UUID_HYPHEN_POS2 13 // 第二个连字符位置
57 #define UUID_HYPHEN_POS3 18 // 第三个连字符位置
58 #define UUID_HYPHEN_POS4 23 // 第四个连字符位置
59 
60 /**
61  * @brief 检查字符是否为MAC地址分隔符
62  */
IsMacSeparator(char c)63 static bool IsMacSeparator(char c)
64 {
65     return c == MAC_SEPARATOR_COLON ||
66            c == MAC_SEPARATOR_HYPHEN ||
67            c == MAC_SEPARATOR_DOT;
68 }
69 
70 /**
71  * @brief 检查MAC地址的基本格式和字符有效性
72  */
CheckMacFormat(const char * macAddr,int32_t len,int32_t * validChars,int32_t * sepCount)73 static bool CheckMacFormat(const char *macAddr, int32_t len, int32_t *validChars, int32_t *sepCount)
74 {
75     char prevChar = '\0';
76     for (int32_t i = 0; i < len; i++) {
77         char c = macAddr[i];
78         if (IsMacSeparator(c)) {
79             // 分隔符不能在首尾或连续出现
80             if (i == 0 || i == len - 1 || prevChar == c) {
81                 return false;
82             }
83             (*sepCount)++;
84             prevChar = c;
85             continue;
86         }
87         if (!isxdigit((unsigned char)c)) {
88             return false; // 非十六进制字符
89         }
90         (*validChars)++;
91         prevChar = c;
92     }
93     return true;
94 }
95 
96 /**
97  * @brief 检查分隔符一致性
98  */
CheckSeparatorConsistency(const char * macAddr,int32_t len)99 static bool CheckSeparatorConsistency(const char *macAddr, int32_t len)
100 {
101     char firstSep = '\0';
102     for (int32_t i = 0; i < len; i++) {
103         char c = macAddr[i];
104 
105         if (IsMacSeparator(c)) {
106             if (firstSep == '\0') {
107                 firstSep = c; // 记录第一个分隔符
108             } else if (c != firstSep) {
109                 return false; // 分隔符不一致
110             }
111         }
112     }
113     return true;
114 }
115 
116 /**
117  * @brief 校验蓝牙MAC地址格式是否合法
118  */
IsMacValid(const char * macAddr)119 static bool IsMacValid(const char *macAddr)
120 {
121     if (macAddr == NULL) {
122         return false;
123     }
124 
125     int32_t len = strlen(macAddr);
126     // 快速检查长度
127     if (len < MAC_MIN_LENGTH || len > MAC_MAX_LENGTH) {
128         return false;
129     }
130     int32_t validChars = 0;
131     int32_t sepCount = 0;
132     // 检查基本格式
133     if (!CheckMacFormat(macAddr, len, &validChars, &sepCount)) {
134         return false;
135     }
136     // 检查字符数量
137     if (validChars != MAC_VALID_CHARS) {
138         return false;
139     }
140     // 检查分隔符数量
141     if (sepCount != 0 && sepCount != MAC_MAX_SEPARATORS) {
142         return false;
143     }
144     // 检查分隔符一致性(如果有分隔符)
145     if (sepCount == MAC_MAX_SEPARATORS && !CheckSeparatorConsistency(macAddr, len)) {
146         return false;
147     }
148     return true;
149 }
150 
IsHexChar(char c)151 static bool IsHexChar(char c)
152 {
153     return (c >= '0' && c <= '9') ||
154            (c >= 'a' && c <= 'f') ||
155            (c >= 'A' && c <= 'F');
156 }
157 
IsValidSha256(const char * str)158 static bool IsValidSha256(const char *str)
159 {
160     if (str == NULL) {
161         return false;
162     }
163     int32_t len = strlen(str);
164     if (len != MAC_SHA256_LEN) {
165         return false;
166     }
167     for (int32_t i = 0; i < len; i++) {
168         if (!IsHexChar(str[i])) {
169             return false;
170         }
171     }
172     return true;
173 }
174 
IsPeerDevAddrValid(const char * addr)175 static bool IsPeerDevAddrValid(const char *addr)
176 {
177     if (addr == NULL) {
178         return false;
179     }
180 
181     if (IsValidSha256(addr)) {
182         return true;
183     } else if (IsMacValid(addr)) {
184         return true;
185     }
186 
187     return false;
188 }
189 
IsUuidValid(const char * uuid)190 static bool IsUuidValid(const char *uuid)
191 {
192     if (uuid == NULL) {
193         return false;
194     }
195     int32_t len = strlen(uuid);
196     int32_t validCchars = 0; // 记录有效的十六进制字符数
197     int32_t hyphenCount = 0; // 记录连字符(-)数量
198     char prevChar = '\0'; // 记录前一个字符(用于连续连字符校验)
199 
200     // 检查长度是否符合标准格式或无分隔符格式
201     if (len != UUID_STD_LENGTH && len != UUID_NO_HYPHEN_LENGTH) {
202         return false;
203     }
204     // 存储连字符位置的数组
205     static const int hyphenPositions[UUID_HYPHEN_COUNT] = {
206         UUID_HYPHEN_POS1, UUID_HYPHEN_POS2, UUID_HYPHEN_POS3, UUID_HYPHEN_POS4
207     };
208     for (int32_t i = 0; i < len; i++) {
209         char c = uuid[i];
210         // 处理连字符(仅标准格式允许连字符)
211         if (c == '-') {
212             if (len != UUID_STD_LENGTH) {
213                 return false;
214             } // 非标准格式不允许连字符
215 
216             // 连字符位置必须符合8-4-4-4-12模式
217             if (i != hyphenPositions[hyphenCount]) {
218                 return false;
219             }
220             hyphenCount++;
221             prevChar = c;
222             continue;
223         }
224         // 校验十六进制字符(0-9/A-F/a-f
225         if (!isxdigit((unsigned char)c)) {
226             return false; // 包含非法字符
227         }
228         validCchars++;
229         prevChar = c;
230     }
231     // 标准格式必须包含4个连字符
232     if (len == UUID_STD_LENGTH && hyphenCount != UUID_HYPHEN_COUNT) {
233         return false;
234     }
235     // 无分隔符格式必须无连字符
236     if (len == UUID_NO_HYPHEN_LENGTH && hyphenCount != 0) {
237         return false;
238     }
239     return true; // 所有校验通过
240 }
241 
TransClientInit(void)242 static int32_t TransClientInit(void)
243 {
244     if (g_clientList != NULL) {
245         return SOFTBUS_OK;
246     }
247     g_clientList = CreateSoftBusList();
248     if (g_clientList == NULL) {
249         TRANS_LOGE(TRANS_SDK, "[br_proxy] init list failed");
250         return SOFTBUS_CREATE_LIST_ERR;
251     }
252     TRANS_LOGI(TRANS_SDK, "[br_proxy] init trans client success");
253     return SOFTBUS_OK;
254 }
255 
ClientAddChannelToList(int32_t sessionId,BrProxyChannelInfo * channelInfo,IBrProxyListener * listener)256 static int32_t ClientAddChannelToList(int32_t sessionId, BrProxyChannelInfo *channelInfo, IBrProxyListener *listener)
257 {
258     if (channelInfo == NULL || listener == NULL) {
259         TRANS_LOGE(TRANS_SDK, "[br_proxy] Invalid param");
260         return SOFTBUS_INVALID_PARAM;
261     }
262     int32_t ret = SOFTBUS_OK;
263     ClientBrProxyChannelInfo *info = (ClientBrProxyChannelInfo *)SoftBusCalloc(sizeof(ClientBrProxyChannelInfo));
264     if (info == NULL) {
265         TRANS_LOGE(TRANS_SDK, "[br_proxy] calloc failed");
266         return SOFTBUS_MALLOC_ERR;
267     }
268     info->sessionId = sessionId;
269     if (strcpy_s(info->peerBRMacAddr, sizeof(info->peerBRMacAddr), channelInfo->peerBRMacAddr) != EOK ||
270         strcpy_s(info->peerBRUuid, sizeof(info->peerBRUuid), channelInfo->peerBRUuid) != EOK) {
271         TRANS_LOGE(TRANS_SDK, "[br_proxy] copy brMac or uuid failed");
272         ret = SOFTBUS_STRCPY_ERR;
273         goto EXIT_ERR;
274     }
275     ret = memcpy_s(&info->listener, sizeof(IBrProxyListener), listener, sizeof(IBrProxyListener));
276     if (ret != SOFTBUS_OK) {
277         TRANS_LOGE(TRANS_SDK, "[br_proxy] memcpy failed! ret=%{public}d", ret);
278         ret = SOFTBUS_MEM_ERR;
279         goto EXIT_ERR;
280     }
281     ListInit(&info->node);
282     if (SoftBusMutexLock(&(g_clientList->lock)) != SOFTBUS_OK) {
283         TRANS_LOGE(TRANS_SDK, "[br_proxy] lock failed");
284         ret = SOFTBUS_LOCK_ERR;
285         goto EXIT_ERR;
286     }
287     ListAdd(&g_clientList->list, &info->node);
288     g_clientList->cnt++;
289     TRANS_LOGI(TRANS_SDK, "[br_proxy] add node success, cnt:%{public}d", g_clientList->cnt);
290     (void)SoftBusMutexUnlock(&g_clientList->lock);
291     return SOFTBUS_OK;
292 
293 EXIT_ERR:
294     SoftBusFree(info);
295     return ret;
296 }
297 
ClientDeleteChannelFromList(int32_t channelId,const char * brMac,const char * uuid)298 static int32_t ClientDeleteChannelFromList(int32_t channelId, const char *brMac, const char *uuid)
299 {
300     if (g_clientList == NULL) {
301         TRANS_LOGE(TRANS_SDK, "[br_proxy] not init");
302         return SOFTBUS_NO_INIT;
303     }
304     if (SoftBusMutexLock(&(g_clientList->lock)) != SOFTBUS_OK) {
305         TRANS_LOGE(TRANS_SDK, "[br_proxy] lock failed");
306         return SOFTBUS_LOCK_ERR;
307     }
308     ClientBrProxyChannelInfo *channelNode = NULL;
309     ClientBrProxyChannelInfo *channelNodeNext = NULL;
310     LIST_FOR_EACH_ENTRY_SAFE(channelNode, channelNodeNext, &(g_clientList->list), ClientBrProxyChannelInfo, node) {
311         if (brMac == NULL) {
312             if (channelNode->channelId != channelId) {
313                 continue;
314             }
315         } else {
316             if (strcmp(brMac, channelNode->peerBRMacAddr) != 0 || strcmp(uuid, channelNode->peerBRUuid) != 0) {
317                 continue;
318             }
319         }
320         TRANS_LOGI(TRANS_SDK, "[br_proxy] by channelId:%{public}d delete node success, cnt:%{public}d",
321             channelNode->channelId, g_clientList->cnt);
322         ListDelete(&channelNode->node);
323         SoftBusFree(channelNode);
324         g_clientList->cnt--;
325         (void)SoftBusMutexUnlock(&(g_clientList->lock));
326         return SOFTBUS_OK;
327     }
328     (void)SoftBusMutexUnlock(&(g_clientList->lock));
329     return SOFTBUS_NOT_FIND;
330 }
331 
ClientUpdateList(const char * mac,const char * uuid,int32_t channelId)332 static int32_t ClientUpdateList(const char *mac, const char *uuid, int32_t channelId)
333 {
334     if (g_clientList == NULL) {
335         TRANS_LOGE(TRANS_SDK, "[br_proxy] not init");
336         return SOFTBUS_NO_INIT;
337     }
338     if (SoftBusMutexLock(&(g_clientList->lock)) != SOFTBUS_OK) {
339         TRANS_LOGE(TRANS_SDK, "[br_proxy] lock failed");
340         return SOFTBUS_LOCK_ERR;
341     }
342     ClientBrProxyChannelInfo *nodeInfo = NULL;
343     LIST_FOR_EACH_ENTRY(nodeInfo, &(g_clientList->list), ClientBrProxyChannelInfo, node) {
344         if (strcmp(nodeInfo->peerBRMacAddr, mac) != 0 || strcmp(nodeInfo->peerBRUuid, uuid) != 0) {
345             continue;
346         }
347         nodeInfo->channelId = channelId;
348         (void)SoftBusMutexUnlock(&(g_clientList->lock));
349         return SOFTBUS_OK;
350     }
351     char *brMactmpName = NULL;
352     Anonymize(mac, &brMactmpName);
353     TRANS_LOGE(TRANS_SDK, "[br_proxy] not find brMac:%{public}s", brMactmpName);
354     AnonymizeFree(brMactmpName);
355     (void)SoftBusMutexUnlock(&(g_clientList->lock));
356     return SOFTBUS_NOT_FIND;
357 }
358 
ClientQueryList(int32_t channelId,const char * peerBRMacAddr,const char * uuid,ClientBrProxyChannelInfo * info)359 static int32_t ClientQueryList(int32_t channelId, const char *peerBRMacAddr, const char *uuid,
360     ClientBrProxyChannelInfo *info)
361 {
362     if (g_clientList == NULL) {
363         TRANS_LOGE(TRANS_SDK, "[br_proxy] not init");
364         return SOFTBUS_NO_INIT;
365     }
366     if ((channelId == DEFAULT_CHANNEL_ID && peerBRMacAddr == NULL) || info == NULL) {
367         TRANS_LOGE(TRANS_SDK, "[br_proxy] Invalid param");
368         return SOFTBUS_INVALID_PARAM;
369     }
370 
371     if (SoftBusMutexLock(&(g_clientList->lock)) != SOFTBUS_OK) {
372         TRANS_LOGE(TRANS_SDK, "[br_proxy] lock failed");
373         return SOFTBUS_LOCK_ERR;
374     }
375     int32_t ret = SOFTBUS_NOT_FIND;
376     ClientBrProxyChannelInfo *nodeInfo = NULL;
377     LIST_FOR_EACH_ENTRY(nodeInfo, &(g_clientList->list), ClientBrProxyChannelInfo, node) {
378         if (channelId != DEFAULT_CHANNEL_ID) {
379             if (nodeInfo->channelId != channelId) {
380                 continue;
381             }
382         } else {
383             if (strcmp(nodeInfo->peerBRMacAddr, peerBRMacAddr) != 0 || strcmp(nodeInfo->peerBRUuid, uuid) != 0) {
384                 continue;
385             }
386         }
387         ret = memcpy_s(info, sizeof(ClientBrProxyChannelInfo), nodeInfo, sizeof(ClientBrProxyChannelInfo));
388         if (ret != EOK) {
389             ret = SOFTBUS_MEM_ERR;
390             goto EXIT;
391         }
392         (void)SoftBusMutexUnlock(&(g_clientList->lock));
393         return SOFTBUS_OK;
394     }
395 EXIT:
396     (void)SoftBusMutexUnlock(&(g_clientList->lock));
397     TRANS_LOGE(TRANS_SDK, "[br_proxy] failed! channelId=%{public}d", channelId);
398     return ret;
399 }
400 
ClientRecordListenerState(int32_t channelId,ListenerType type,bool isEnable)401 static int32_t ClientRecordListenerState(int32_t channelId, ListenerType type, bool isEnable)
402 {
403     if (g_clientList == NULL) {
404         TRANS_LOGE(TRANS_SDK, "[br_proxy] not init");
405         return SOFTBUS_NO_INIT;
406     }
407     if (type != DATA_RECEIVE && type != CHANNEL_STATE) {
408         TRANS_LOGE(TRANS_SDK, "[br_proxy] ListenerType is wrong, type=%{public}d", type);
409         return SOFTBUS_INVALID_PARAM;
410     }
411 
412     if (SoftBusMutexLock(&(g_clientList->lock)) != SOFTBUS_OK) {
413         TRANS_LOGE(TRANS_SDK, "[br_proxy] lock failed");
414         return SOFTBUS_LOCK_ERR;
415     }
416     ClientBrProxyChannelInfo *nodeInfo = NULL;
417     LIST_FOR_EACH_ENTRY(nodeInfo, &(g_clientList->list), ClientBrProxyChannelInfo, node) {
418         if (nodeInfo->channelId != channelId) {
419             continue;
420         }
421         switch (type) {
422             case DATA_RECEIVE:
423                 nodeInfo->enableDataRecv = isEnable;
424                 break;
425             case CHANNEL_STATE:
426                 nodeInfo->enableStateChange = isEnable;
427                 break;
428             default:
429                 break;
430         }
431         (void)SoftBusMutexUnlock(&(g_clientList->lock));
432         return SOFTBUS_OK;
433     }
434     TRANS_LOGE(TRANS_SDK, "[br_proxy] not find channelId=%{public}d", channelId);
435     (void)SoftBusMutexUnlock(&(g_clientList->lock));
436     return SOFTBUS_NOT_FIND;
437 }
438 
IsChannelValid(int32_t channelId)439 static bool IsChannelValid(int32_t channelId)
440 {
441     if (channelId <= 0) {
442         return false;
443     }
444     bool isValid = false;
445     if (g_clientList == NULL) {
446         TRANS_LOGE(TRANS_SDK, "[br_proxy] not init");
447         return isValid;
448     }
449     if (SoftBusMutexLock(&(g_clientList->lock)) != SOFTBUS_OK) {
450         TRANS_LOGE(TRANS_SDK, "[br_proxy] lock failed");
451         return isValid;
452     }
453     ClientBrProxyChannelInfo *nodeInfo = NULL;
454     LIST_FOR_EACH_ENTRY(nodeInfo, &(g_clientList->list), ClientBrProxyChannelInfo, node) {
455         if (nodeInfo->channelId == channelId) {
456             isValid = true;
457             break;
458         }
459     }
460     (void)SoftBusMutexUnlock(&(g_clientList->lock));
461     return isValid;
462 }
463 
CheckOpenParm(BrProxyChannelInfo * channelInfo,IBrProxyListener * listener)464 static int32_t CheckOpenParm(BrProxyChannelInfo *channelInfo, IBrProxyListener *listener)
465 {
466     if (channelInfo == NULL || listener == NULL) {
467         TRANS_LOGE(TRANS_SDK, "[br_proxy] channelInfo or listener is NULL");
468         return SOFTBUS_INVALID_PARAM;
469     }
470 
471     if (!IsPeerDevAddrValid(channelInfo->peerBRMacAddr)) {
472         TRANS_LOGE(TRANS_SDK, "[br_proxy] mac is invalid!");
473         return SOFTBUS_TRANS_BR_PROXY_INVALID_PARAM;
474     }
475     if (!IsUuidValid(channelInfo->peerBRUuid)) {
476         TRANS_LOGE(TRANS_SDK, "[br_proxy] uuid is invalid!");
477         return SOFTBUS_TRANS_BR_PROXY_INVALID_PARAM;
478     }
479     return SOFTBUS_OK;
480 }
481 
OpenBrProxy(int32_t sessionId,BrProxyChannelInfo * channelInfo,IBrProxyListener * listener)482 int32_t OpenBrProxy(int32_t sessionId, BrProxyChannelInfo *channelInfo, IBrProxyListener *listener)
483 {
484     TRANS_LOGI(TRANS_SDK, "[br_proxy] enter");
485     int32_t ret = CheckOpenParm(channelInfo, listener);
486     if (ret != SOFTBUS_OK) {
487         return ret;
488     }
489     ret = TransClientInit();
490     if (ret != SOFTBUS_OK) {
491         return ret;
492     }
493     ret = ClientStubInit();
494     if (ret != SOFTBUS_OK) {
495         TRANS_LOGE(TRANS_SDK, "[br_proxy] client stub init failed! ret:%{public}d", ret);
496         return ret;
497     }
498     ret = ClientRegisterBrProxyService(COMM_PKGNAME_BRPROXY);
499     if (ret != SOFTBUS_OK) {
500         TRANS_LOGE(TRANS_SDK, "[br_proxy] client register service failed! ret:%{public}d", ret);
501         return ret;
502     }
503 
504     ret = ClientAddChannelToList(sessionId, channelInfo, listener);
505     if (ret != SOFTBUS_OK) {
506         TRANS_LOGE(TRANS_SDK, "[br_proxy] add to list failed! ret=%{public}d", ret);
507         return ret;
508     }
509 
510     ret = ServerIpcOpenBrProxy(channelInfo->peerBRMacAddr, channelInfo->peerBRUuid);
511     if (ret != SOFTBUS_OK && ret != SOFTBUS_TRANS_SESSION_OPENING) {
512         TRANS_LOGE(TRANS_SDK, "[br_proxy] ipc open brproxy failed! ret=%{public}d", ret);
513         return ret;
514     }
515     if (ret == SOFTBUS_TRANS_SESSION_OPENING) {
516         int32_t res = ClientDeleteChannelFromList(DEFAULT_CHANNEL_ID,
517             channelInfo->peerBRMacAddr, channelInfo->peerBRUuid);
518         if (res != SOFTBUS_OK) {
519             TRANS_LOGE(TRANS_SDK, "[br_proxy] add to list failed! ret=%{public}d", res);
520             return ret;
521         }
522         TRANS_LOGI(TRANS_SDK, "[br_proxy] sdk reopen");
523     }
524     TRANS_LOGE(TRANS_SDK, "[br_proxy] ret=%{public}d", ret);
525     return ret;
526 }
527 
CloseBrProxy(int32_t channelId)528 int32_t CloseBrProxy(int32_t channelId)
529 {
530     TRANS_LOGI(TRANS_SDK, "[br_proxy] enter! channelId:%{public}d", channelId);
531     if (!IsChannelValid(channelId)) {
532         return SOFTBUS_TRANS_INVALID_CHANNEL_ID;
533     }
534     (void)ClientRecordListenerState(channelId, DATA_RECEIVE, false);
535     (void)ClientRecordListenerState(channelId, CHANNEL_STATE, false);
536     int32_t ret = ServerIpcCloseBrProxy(channelId);
537     if (ret != SOFTBUS_OK && ret != SOFTBUS_TRANS_INVALID_CHANNEL_ID) {
538         TRANS_LOGE(TRANS_SDK, "[br_proxy] ipc close brproxy failed! ret:%{public}d", ret);
539         return ret;
540     }
541     ClientDeleteChannelFromList(channelId, NULL, NULL);
542     return SOFTBUS_OK;
543 }
544 
SendBrProxyData(int32_t channelId,char * data,uint32_t dataLen)545 int32_t SendBrProxyData(int32_t channelId, char* data, uint32_t dataLen)
546 {
547     if (!IsChannelValid(channelId)) {
548         return SOFTBUS_TRANS_INVALID_CHANNEL_ID;
549     }
550     if (dataLen > BR_PROXY_SEND_MAX_LEN) {
551         TRANS_LOGE(TRANS_SDK, "[br_proxy] data too long! datalen:%{public}d", dataLen);
552         return SOFTBUS_TRANS_BR_PROXY_DATA_TOO_LONG;
553     }
554     int32_t ret = ServerIpcSendBrProxyData(channelId, data, dataLen);
555     if (ret != SOFTBUS_OK) {
556         TRANS_LOGE(TRANS_SDK, "[br_proxy] ipc brproxy send failed! ret:%{public}d, channelId:%{public}d",
557             ret, channelId);
558         return ret;
559     }
560     return SOFTBUS_OK;
561 }
562 
SetListenerState(int32_t channelId,ListenerType type,bool isEnable)563 int32_t SetListenerState(int32_t channelId, ListenerType type, bool isEnable)
564 {
565     if (!IsChannelValid(channelId)) {
566         return SOFTBUS_TRANS_INVALID_CHANNEL_ID;
567     }
568     TRANS_LOGI(TRANS_SDK,
569         "[br_proxy] enter! channelId:%{public}d, type:%{public}d, type_desc:%{public}s, isEnable:%{public}s",
570         channelId, type, type == DATA_RECEIVE ? "receiveData":"receiveChannelStatus", isEnable ? "on":"off");
571     int32_t ret = ServerIpcSetListenerState(channelId, type, isEnable);
572     if (ret != SOFTBUS_OK) {
573         TRANS_LOGE(TRANS_SDK, "[br_proxy] set listener state failed! ret=%{public}d", ret);
574         return ret;
575     }
576     return ClientRecordListenerState(channelId, type, isEnable);
577 }
578 
ClientTransBrProxyDataReceived(int32_t channelId,const uint8_t * data,uint32_t len)579 int32_t ClientTransBrProxyDataReceived(int32_t channelId, const uint8_t *data, uint32_t len)
580 {
581     TRANS_LOGI(TRANS_SDK, "[br_proxy] client recv brproxy data! channelId:%{public}d", channelId);
582     ClientBrProxyChannelInfo info;
583     int32_t ret = ClientQueryList(channelId, NULL, NULL, &info);
584     if (ret != SOFTBUS_OK) {
585         return ret;
586     }
587     if (info.enableDataRecv && info.listener.onDataReceived != NULL) {
588         info.listener.onDataReceived(channelId, (const char *)data, len);
589     } else {
590         TRANS_LOGE(TRANS_SDK, "[br_proxy] receiveData is off, listener is null");
591     }
592     return SOFTBUS_OK;
593 }
594 
595 typedef struct {
596     int32_t softbusErrCode;
597     int32_t channelState;
598 } SoftBusCodeToStateMap;
599 
600 const SoftBusCodeToStateMap G_CODE_MAP[] = {
601     { SOFTBUS_CONN_BR_UNDERLAY_SOCKET_CLOSED,   CHANNEL_WAIT_RESUME },
602     { SOFTBUS_OK,                               CHANNEL_RESUME      },
603     { SOFTBUS_CONN_BR_UNPAIRED,                 CHANNEL_BR_NO_PAIRED},
604 };
605 
SoftbusErrConvertChannelState(int32_t err)606 static int32_t SoftbusErrConvertChannelState(int32_t err)
607 {
608     size_t mapSize = sizeof(G_CODE_MAP) / sizeof(G_CODE_MAP[0]);
609     for (size_t i = 0; i < mapSize; ++i) {
610         if (err == G_CODE_MAP[i].softbusErrCode) {
611             return G_CODE_MAP[i].channelState;
612         }
613     }
614     return CHANNEL_EXCEPTION_SOFTWARE_FAILED;
615 }
616 
ClientTransBrProxyChannelChange(int32_t channelId,int32_t errCode)617 int32_t ClientTransBrProxyChannelChange(int32_t channelId, int32_t errCode)
618 {
619     TRANS_LOGI(TRANS_SDK, "[br_proxy] channelId:%{public}d, errCode:%{public}d", channelId, errCode);
620     ClientBrProxyChannelInfo info;
621     int32_t ret = ClientQueryList(channelId, NULL, NULL, &info);
622     if (ret != SOFTBUS_OK) {
623         return ret;
624     }
625     if (info.enableStateChange && info.listener.onChannelStatusChanged != NULL) {
626         info.listener.onChannelStatusChanged(channelId, SoftbusErrConvertChannelState(errCode));
627     } else {
628         TRANS_LOGE(TRANS_SDK, "[br_proxy] receiveChannelStatus is off, listener is null");
629     }
630     return SOFTBUS_OK;
631 }
632 
ClientTransOnBrProxyOpened(int32_t channelId,const char * brMac,const char * uuid,int32_t result)633 int32_t ClientTransOnBrProxyOpened(int32_t channelId, const char *brMac, const char *uuid, int32_t result)
634 {
635     TRANS_LOGI(TRANS_SDK, "[br_proxy] channelId:%{public}d, result:%{public}d.", channelId, result);
636     if (brMac == NULL || uuid == NULL) {
637         TRANS_LOGE(TRANS_SDK, "[br_proxy] brMac is NULL");
638         return SOFTBUS_INVALID_PARAM;
639     }
640     ClientBrProxyChannelInfo info;
641     int32_t ret = ClientQueryList(DEFAULT_CHANNEL_ID, brMac, uuid, &info);
642     if (ret != SOFTBUS_OK) {
643         TRANS_LOGI(TRANS_SDK, "[br_proxy] query list failed! ret:%{public}d", ret);
644         return ret;
645     }
646     if (result == SOFTBUS_OK) {
647         ret = ClientUpdateList(brMac, uuid, channelId);
648         if (ret != SOFTBUS_OK) {
649             return ret;
650         }
651     } else {
652         ClientDeleteChannelFromList(DEFAULT_CHANNEL_ID, brMac, uuid);
653     }
654     TRANS_LOGI(TRANS_SDK, "[br_proxy] sessionId:%{public}d.", info.sessionId);
655     if (info.listener.onChannelOpened != NULL) {
656         info.listener.onChannelOpened(info.sessionId, channelId, result);
657     }
658     return SOFTBUS_OK;
659 }
660 
IsProxyChannelEnabled(int32_t uid)661 bool IsProxyChannelEnabled(int32_t uid)
662 {
663     int32_t ret = ClientStubInit();
664     if (ret != SOFTBUS_OK) {
665         TRANS_LOGE(TRANS_SDK, "[br_proxy] client stub init failed! ret:%{public}d", ret);
666         return false;
667     }
668     TRANS_LOGI(TRANS_SVC, "[br_proxy] enter uid:%{public}d", uid);
669     ret = ClientRegisterService(COMM_PKGNAME_PUSH);
670     if (ret != SOFTBUS_OK) {
671         TRANS_LOGE(TRANS_SDK, "[br_proxy] client register service failed! ret:%{public}d", ret);
672         return false;
673     }
674     bool isEnable = false;
675     ret = ServerIpcIsProxyChannelEnabled(uid, &isEnable);
676     if (ret != SOFTBUS_OK) {
677         TRANS_LOGE(TRANS_SDK, "[br_proxy] ipc get brproxy channel state failed! ret:%{public}d", ret);
678     }
679 
680     return isEnable;
681 }
682 
683 static PermissonHookCb g_pushCb;
RegisterAccessHook(PermissonHookCb * cb)684 int32_t RegisterAccessHook(PermissonHookCb *cb)
685 {
686     if (cb == NULL) {
687         TRANS_LOGE(TRANS_SDK, "[br_proxy] cb is NULL");
688         return SOFTBUS_INVALID_PARAM;
689     }
690     int32_t ret = ClientStubInit();
691     if (ret != SOFTBUS_OK) {
692         TRANS_LOGE(TRANS_SDK, "[br_proxy] client stub init failed! ret:%{public}d", ret);
693         return ret;
694     }
695     TRANS_LOGI(TRANS_SVC, "[br_proxy] enter");
696     ret = ClientRegisterService(COMM_PKGNAME_PUSH);
697     if (ret != SOFTBUS_OK) {
698         TRANS_LOGE(TRANS_SDK, "[br_proxy] client register service failed! ret:%{public}d", ret);
699         return ret;
700     }
701     ret = ServerIpcRegisterPushHook();
702     if (ret != SOFTBUS_OK) {
703         TRANS_LOGE(TRANS_SDK, "[br_proxy] client register push hook failed! ret:%{public}d", ret);
704         return ret;
705     }
706     ret = memcpy_s(&g_pushCb, sizeof(PermissonHookCb), cb, sizeof(PermissonHookCb));
707     if (ret != EOK) {
708         TRANS_LOGE(TRANS_SDK, "[br_proxy] memcpy failed! ret:%{public}d", ret);
709         return SOFTBUS_MEM_ERR;
710     }
711     return SOFTBUS_OK;
712 }
713 
ClientTransBrProxyQueryPermission(const char * bundleName,bool * isEmpowered)714 int32_t ClientTransBrProxyQueryPermission(const char *bundleName, bool *isEmpowered)
715 {
716     if (bundleName == NULL || isEmpowered == NULL) {
717         return SOFTBUS_INVALID_PARAM;
718     }
719     if (g_pushCb.queryPermission == NULL) {
720         return SOFTBUS_NO_INIT;
721     }
722 
723     int32_t ret = g_pushCb.queryPermission(bundleName, isEmpowered);
724     if (ret != SOFTBUS_OK) {
725         TRANS_LOGE(TRANS_SDK, "[br_proxy] client query permission failed! ret:%{public}d", ret);
726     }
727 
728     return ret;
729 }