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 }