1 /*
2 * Copyright (c) 2021-2024 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 "client_trans_proxy_manager.h"
17
18 #include <securec.h>
19 #include <unistd.h>
20
21 #include "anonymizer.h"
22 #include "client_trans_assemble_tlv.h"
23 #include "client_trans_proxy_file_manager.h"
24 #include "client_trans_session_manager.h"
25 #include "client_trans_socket_manager.h"
26 #include "client_trans_tcp_direct_message.h"
27 #include "softbus_adapter_crypto.h"
28 #include "softbus_adapter_mem.h"
29 #include "softbus_adapter_socket.h"
30 #include "softbus_def.h"
31 #include "softbus_error_code.h"
32 #include "softbus_feature_config.h"
33 #include "softbus_utils.h"
34 #include "trans_log.h"
35 #include "trans_pending_pkt.h"
36 #include "trans_server_proxy.h"
37
38 #define SLICE_LEN (4 * 1024)
39 #define PROXY_ACK_SIZE 4
40 #define OH_TYPE 10
41 #define PROXY_TLV_ELEMENT 5
42 #define TLV_TYPE_AND_LENTH 2
43 #define PROXY_TLV_PKT_HEAD 32
44 #define MAGICNUM_SIZE sizeof(uint32_t)
45 #define TLVCOUNT_SIZE sizeof(uint8_t)
46
47 static IClientSessionCallBack g_sessionCb;
48 static uint32_t g_proxyMaxByteBufSize;
49 static uint32_t g_proxyMaxMessageBufSize;
50
51 static SoftBusList *g_proxyChannelInfoList = NULL;
52 static SoftBusList *g_channelSliceProcessorList = NULL;
53
54 typedef struct {
55 int32_t priority;
56 int32_t sliceNum;
57 int32_t sliceSeq;
58 int32_t reserved;
59 } SliceHead;
60
61 typedef struct {
62 int32_t magicNumber;
63 int32_t seq;
64 int32_t flags;
65 int32_t dataLen;
66 } PacketHead;
67
68 typedef struct {
69 uint32_t magicNumber;
70 uint8_t tlvCount;
71 int32_t seq;
72 uint32_t dataSeq;
73 uint32_t flags;
74 uint32_t dataLen;
75 bool needAck;
76 } DataHeadTlvPacketHead;
77
78 typedef struct {
79 uint8_t *inData;
80 uint32_t inLen;
81 uint8_t *outData;
82 uint32_t outLen;
83 } ClientProxyDataInfo;
84
ProxyBuildNeedAckTlvData(DataHead * pktHead,bool needAck,uint32_t dataSeqs,int32_t * tlvBufferSize)85 static int32_t ProxyBuildNeedAckTlvData(DataHead *pktHead, bool needAck, uint32_t dataSeqs, int32_t *tlvBufferSize)
86 {
87 if (pktHead == NULL) {
88 TRANS_LOGE(TRANS_SDK, "param invalid, pktHead is null");
89 return SOFTBUS_INVALID_PARAM;
90 }
91 uint32_t dataSeq = SoftBusHtoLl(dataSeqs);
92 int32_t ret = TransAssembleTlvData(pktHead, TLV_TYPE_NEED_ACK, (uint8_t *)&needAck, sizeof(needAck), tlvBufferSize);
93 if (ret != SOFTBUS_OK) {
94 TRANS_LOGE(TRANS_SDK, "assemble needAck tlv failed, ret=%{public}d", ret);
95 ReleaseTlvValueBuffer(pktHead);
96 SoftBusFree(pktHead->tlvElement);
97 return ret;
98 }
99 ret = TransAssembleTlvData(pktHead, TLV_TYPE_DATA_SEQ, (uint8_t *)&dataSeq, sizeof(dataSeq), tlvBufferSize);
100 if (ret != SOFTBUS_OK) {
101 TRANS_LOGE(TRANS_SDK, "assemble dataSeq tlv failed, ret=%{public}d", ret);
102 ReleaseTlvValueBuffer(pktHead);
103 SoftBusFree(pktHead->tlvElement);
104 return ret;
105 }
106 pktHead->tlvElement -= (PROXY_TLV_ELEMENT * sizeof(TlvElement));
107 return SOFTBUS_OK;
108 }
109
ProxyBuildTlvDataHead(DataHead * pktHead,int32_t finalSeq,int32_t flag,uint32_t dataLen,int32_t * tlvBufferSize)110 static int32_t ProxyBuildTlvDataHead(DataHead *pktHead, int32_t finalSeq, int32_t flag, uint32_t dataLen,
111 int32_t *tlvBufferSize)
112 {
113 if (pktHead == NULL) {
114 TRANS_LOGE(TRANS_SDK, "param invalid.");
115 return SOFTBUS_INVALID_PARAM;
116 }
117 pktHead->tlvElement = (uint8_t *)SoftBusCalloc(PROXY_TLV_ELEMENT * sizeof(TlvElement));
118 if (pktHead->tlvElement == NULL) {
119 TRANS_LOGE(TRANS_SDK, "malloc tlvElement failed");
120 return SOFTBUS_MALLOC_ERR;
121 }
122 pktHead->magicNum = SoftBusHtoLl(MAGIC_NUMBER);
123 uint32_t seq = SoftBusHtoLl((uint32_t)finalSeq);
124 uint32_t flags = SoftBusHtoLl((uint32_t)flag);
125 uint32_t dataLens = SoftBusHtoLl(dataLen);
126 int32_t ret = TransAssembleTlvData(pktHead, TLV_TYPE_INNER_SEQ, (uint8_t *)&seq, sizeof(seq), tlvBufferSize);
127 if (ret != SOFTBUS_OK) {
128 TRANS_LOGE(TRANS_SDK, "assemble seq tlv failed, ret=%{public}d", ret);
129 ReleaseTlvValueBuffer(pktHead);
130 SoftBusFree(pktHead->tlvElement);
131 return ret;
132 }
133 ret = TransAssembleTlvData(pktHead, TLV_TYPE_FLAG, (uint8_t *)&flags, sizeof(flags), tlvBufferSize);
134 if (ret != SOFTBUS_OK) {
135 TRANS_LOGE(TRANS_SDK, "assemble flag tlv failed, ret=%{public}d", ret);
136 ReleaseTlvValueBuffer(pktHead);
137 SoftBusFree(pktHead->tlvElement);
138 return ret;
139 }
140 ret = TransAssembleTlvData(pktHead, TLV_TYPE_DATA_LEN, (uint8_t *)&dataLens, sizeof(dataLens), tlvBufferSize);
141 if (ret != SOFTBUS_OK) {
142 TRANS_LOGE(TRANS_SDK, "assemble dataLen tlv failed, ret=%{public}d", ret);
143 ReleaseTlvValueBuffer(pktHead);
144 SoftBusFree(pktHead->tlvElement);
145 return ret;
146 }
147 return SOFTBUS_OK;
148 }
149
CheckLenAndCopyData(uint32_t len,uint32_t headSize,const char * data,DataHeadTlvPacketHead * head)150 static int32_t CheckLenAndCopyData(uint32_t len, uint32_t headSize, const char *data, DataHeadTlvPacketHead *head)
151 {
152 if (len < headSize) {
153 TRANS_LOGE(TRANS_SDK, "data len not enough, bufLen Less than headSize. len=%{public}u", len);
154 return SOFTBUS_DATA_NOT_ENOUGH;
155 }
156 if (memcpy_s(&head->magicNumber, MAGICNUM_SIZE, data, MAGICNUM_SIZE) != EOK) {
157 TRANS_LOGE(TRANS_SDK, "memcpy magicNumber failed.");
158 return SOFTBUS_MEM_ERR;
159 }
160 if (memcpy_s(&head->tlvCount, TLVCOUNT_SIZE, data + MAGICNUM_SIZE, TLVCOUNT_SIZE) != EOK) {
161 TRANS_LOGE(TRANS_SDK, "memcpy tlvCount failed.");
162 return SOFTBUS_MEM_ERR;
163 }
164 return SOFTBUS_OK;
165 }
166
TransProxyParseTlv(uint32_t len,const char * data,DataHeadTlvPacketHead * head,uint32_t * headSize)167 static int32_t TransProxyParseTlv(uint32_t len, const char *data, DataHeadTlvPacketHead *head, uint32_t *headSize)
168 {
169 if (data == NULL || head == NULL) {
170 TRANS_LOGE(TRANS_SDK, "param invalid.");
171 return SOFTBUS_INVALID_PARAM;
172 }
173 *headSize += (MAGICNUM_SIZE + TLVCOUNT_SIZE);
174 int32_t res = CheckLenAndCopyData(len, *headSize, data, head);
175 TRANS_CHECK_AND_RETURN_RET_LOGE(res == SOFTBUS_OK, res, TRANS_SDK, "CheckLenAndCopyData failed");
176 errno_t ret = EOK;
177 char *temp = (char *)data + MAGICNUM_SIZE + TLVCOUNT_SIZE;
178 for (uint8_t index = 0; index < head->tlvCount; index++) {
179 uint8_t *type = (uint8_t *)temp;
180 if (len < (*headSize + (TLV_TYPE_AND_LENTH * sizeof(uint8_t)))) {
181 TRANS_LOGE(TRANS_SDK, "check len contains tlv segment data fail, len=%{public}u", len);
182 return SOFTBUS_DATA_NOT_ENOUGH;
183 }
184 uint8_t *length = (uint8_t *)(temp + sizeof(uint8_t));
185 if (len < (*headSize + (TLV_TYPE_AND_LENTH * sizeof(uint8_t)) + *length)) {
186 TRANS_LOGE(TRANS_SDK, "data len not enough. len=%{public}u", len);
187 return SOFTBUS_DATA_NOT_ENOUGH;
188 }
189 temp += (TLV_TYPE_AND_LENTH * sizeof(uint8_t));
190 switch (*type) {
191 case TLV_TYPE_INNER_SEQ:
192 ret = memcpy_s(&head->seq, sizeof(head->seq), temp, *length);
193 break;
194 case TLV_TYPE_DATA_SEQ:
195 ret = memcpy_s(&head->dataSeq, sizeof(head->dataSeq), temp, *length);
196 break;
197 case TLV_TYPE_FLAG:
198 ret = memcpy_s(&head->flags, sizeof(head->flags), temp, *length);
199 break;
200 case TLV_TYPE_NEED_ACK:
201 ret = memcpy_s(&head->needAck, sizeof(head->needAck), temp, *length);
202 break;
203 case TLV_TYPE_DATA_LEN:
204 ret = memcpy_s(&head->dataLen, sizeof(head->dataLen), temp, *length);
205 break;
206 default:
207 TRANS_LOGE(TRANS_SDK, "unknown trans tdc tlv skip, tlvType=%{public}d", *type);
208 continue;
209 }
210 temp += *length;
211 *headSize += (TLV_TYPE_AND_LENTH * sizeof(uint8_t) + *length);
212 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == EOK, SOFTBUS_MEM_ERR, TRANS_SDK,
213 "parse tlv memcpy failed, tlvType=%{public}d, ret=%{public}d", *type, ret);
214 }
215 return SOFTBUS_OK;
216 }
217
ClientPackSliceHead(SliceHead * data)218 void ClientPackSliceHead(SliceHead *data)
219 {
220 data->priority = (int32_t)SoftBusHtoLl((uint32_t)data->priority);
221 data->sliceNum = (int32_t)SoftBusHtoLl((uint32_t)data->sliceNum);
222 data->sliceSeq = (int32_t)SoftBusHtoLl((uint32_t)data->sliceSeq);
223 data->reserved = (int32_t)SoftBusHtoLl((uint32_t)data->reserved);
224 }
225
ClientUnPackSliceHead(SliceHead * data)226 void ClientUnPackSliceHead(SliceHead *data)
227 {
228 data->priority = (int32_t)SoftBusLtoHl((uint32_t)data->priority);
229 data->sliceNum = (int32_t)SoftBusLtoHl((uint32_t)data->sliceNum);
230 data->sliceSeq = (int32_t)SoftBusLtoHl((uint32_t)data->sliceSeq);
231 data->reserved = (int32_t)SoftBusLtoHl((uint32_t)data->reserved);
232 }
233
ClientPackPacketHead(PacketHead * data)234 void ClientPackPacketHead(PacketHead *data)
235 {
236 data->magicNumber = (int32_t)SoftBusHtoLl((uint32_t)data->magicNumber);
237 data->seq = (int32_t)SoftBusHtoLl((uint32_t)data->seq);
238 data->flags = (int32_t)SoftBusHtoLl((uint32_t)data->flags);
239 data->dataLen = (int32_t)SoftBusHtoLl((uint32_t)data->dataLen);
240 }
241
ClientUnPackPacketHead(PacketHead * data)242 void ClientUnPackPacketHead(PacketHead *data)
243 {
244 data->magicNumber = (int32_t)SoftBusLtoHl((uint32_t)data->magicNumber);
245 data->seq = (int32_t)SoftBusLtoHl((uint32_t)data->seq);
246 data->flags = (int32_t)SoftBusLtoHl((uint32_t)data->flags);
247 data->dataLen = (int32_t)SoftBusLtoHl((uint32_t)data->dataLen);
248 }
249
ClientUnPackTlvPackHead(DataHeadTlvPacketHead * data)250 void ClientUnPackTlvPackHead(DataHeadTlvPacketHead *data)
251 {
252 if (data == NULL) {
253 TRANS_LOGE(TRANS_SDK, "invalid data.");
254 return;
255 }
256 data->magicNumber = SoftBusLtoHl(data->magicNumber);
257 data->seq = (int32_t)SoftBusLtoHl((uint32_t)data->seq);
258 data->dataSeq = SoftBusLtoHl(data->dataSeq);
259 data->flags = SoftBusLtoHl(data->flags);
260 data->dataLen = SoftBusLtoHl(data->dataLen);
261 }
262
263 static void ClientTransProxySliceTimerProc(void);
264
ClientTransProxyListInit()265 static int32_t ClientTransProxyListInit()
266 {
267 g_proxyChannelInfoList = CreateSoftBusList();
268 if (g_proxyChannelInfoList == NULL) {
269 return SOFTBUS_NO_INIT;
270 }
271 g_channelSliceProcessorList = CreateSoftBusList();
272 if (g_channelSliceProcessorList == NULL) {
273 DestroySoftBusList(g_proxyChannelInfoList);
274 return SOFTBUS_NO_INIT;
275 }
276 if (RegisterTimeoutCallback(SOFTBUS_PROXYSLICE_TIMER_FUN, ClientTransProxySliceTimerProc) != SOFTBUS_OK) {
277 TRANS_LOGE(TRANS_INIT, "register timeout fail");
278 DestroySoftBusList(g_proxyChannelInfoList);
279 DestroySoftBusList(g_channelSliceProcessorList);
280 return SOFTBUS_TIMOUT;
281 }
282 return SOFTBUS_OK;
283 }
284
ClientTransProxyListDeinit(void)285 static void ClientTransProxyListDeinit(void)
286 {
287 (void)RegisterTimeoutCallback(SOFTBUS_PROXYSLICE_TIMER_FUN, NULL);
288 if (g_proxyChannelInfoList != NULL) {
289 DestroySoftBusList(g_proxyChannelInfoList);
290 g_proxyChannelInfoList = NULL;
291 }
292 if (g_channelSliceProcessorList != NULL) {
293 DestroySoftBusList(g_channelSliceProcessorList);
294 g_channelSliceProcessorList = NULL;
295 }
296 }
297
ClientTransProxyInit(const IClientSessionCallBack * cb)298 int32_t ClientTransProxyInit(const IClientSessionCallBack *cb)
299 {
300 if (cb == NULL) {
301 TRANS_LOGE(TRANS_INIT, "param is null!");
302 return SOFTBUS_INVALID_PARAM;
303 }
304
305 g_sessionCb = *cb;
306 if (ClinetTransProxyFileManagerInit() != SOFTBUS_OK) {
307 TRANS_LOGE(TRANS_INIT, "ClinetTransProxyFileManagerInit init fail!");
308 return SOFTBUS_NO_INIT;
309 }
310 if (ClientTransProxyListInit() != SOFTBUS_OK) {
311 TRANS_LOGE(TRANS_INIT, "ClinetTransProxyListInit init fail!");
312 return SOFTBUS_NO_INIT;
313 }
314
315 if (PendingInit(PENDING_TYPE_PROXY) != SOFTBUS_OK) {
316 TRANS_LOGE(TRANS_INIT, "trans proxy pending init failed.");
317 return SOFTBUS_NO_INIT;
318 }
319
320 if (SoftbusGetConfig(SOFTBUS_INT_MAX_BYTES_NEW_LENGTH, (unsigned char *)&g_proxyMaxByteBufSize,
321 sizeof(g_proxyMaxByteBufSize)) != SOFTBUS_OK) {
322 TRANS_LOGW(TRANS_INIT, "get auth proxy channel max bytes length fail");
323 }
324 if (SoftbusGetConfig(SOFTBUS_INT_MAX_MESSAGE_NEW_LENGTH, (unsigned char *)&g_proxyMaxMessageBufSize,
325 sizeof(g_proxyMaxMessageBufSize)) != SOFTBUS_OK) {
326 TRANS_LOGW(TRANS_INIT, "get auth proxy channel max message length fail");
327 }
328 TRANS_LOGI(TRANS_INIT, "proxy auth byteSize=%{public}u, messageSize=%{public}u",
329 g_proxyMaxByteBufSize, g_proxyMaxMessageBufSize);
330 return SOFTBUS_OK;
331 }
332
ClientTransProxyDeinit(void)333 void ClientTransProxyDeinit(void)
334 {
335 ClinetTransProxyFileManagerDeinit();
336 PendingDeinit(PENDING_TYPE_PROXY);
337 ClientTransProxyListDeinit();
338 }
339
ClientTransProxyGetInfoByChannelId(int32_t channelId,ProxyChannelInfoDetail * info)340 int32_t ClientTransProxyGetInfoByChannelId(int32_t channelId, ProxyChannelInfoDetail *info)
341 {
342 if (info == NULL) {
343 TRANS_LOGE(TRANS_SDK, "param invalid.");
344 return SOFTBUS_INVALID_PARAM;
345 }
346 if (SoftBusMutexLock(&g_proxyChannelInfoList->lock) != SOFTBUS_OK) {
347 TRANS_LOGE(TRANS_SDK, "lock failed");
348 return SOFTBUS_LOCK_ERR;
349 }
350
351 ClientProxyChannelInfo *item = NULL;
352 LIST_FOR_EACH_ENTRY(item, &(g_proxyChannelInfoList->list), ClientProxyChannelInfo, node) {
353 if (item->channelId == channelId) {
354 (void)memcpy_s(info, sizeof(ProxyChannelInfoDetail), &item->detail, sizeof(ProxyChannelInfoDetail));
355 item->detail.sequence++;
356 (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
357 return SOFTBUS_OK;
358 }
359 }
360
361 (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
362 TRANS_LOGE(TRANS_SDK, "can not find proxy channel by channelId=%{public}d", channelId);
363 return SOFTBUS_TRANS_PROXY_CHANNEL_NOT_FOUND;
364 }
365
ClientTransProxyGetOsTypeByChannelId(int32_t channelId,int32_t * osType)366 int32_t ClientTransProxyGetOsTypeByChannelId(int32_t channelId, int32_t *osType)
367 {
368 if (osType == NULL || g_proxyChannelInfoList == NULL) {
369 TRANS_LOGE(TRANS_SDK, "param invalid channelId=%{public}d", channelId);
370 return SOFTBUS_INVALID_PARAM;
371 }
372 if (SoftBusMutexLock(&g_proxyChannelInfoList->lock) != SOFTBUS_OK) {
373 TRANS_LOGE(TRANS_SDK, "lock failed");
374 return SOFTBUS_LOCK_ERR;
375 }
376 ClientProxyChannelInfo *item = NULL;
377 LIST_FOR_EACH_ENTRY(item, &(g_proxyChannelInfoList->list), ClientProxyChannelInfo, node) {
378 if (item->channelId == channelId) {
379 *osType = item->detail.osType;
380 (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
381 return SOFTBUS_OK;
382 }
383 }
384
385 (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
386 TRANS_LOGE(TRANS_SDK, "can not find proxy channelId=%{public}d", channelId);
387 return SOFTBUS_NOT_FIND;
388 }
389
ClientTransProxyGetLinkTypeByChannelId(int32_t channelId,int32_t * linkType)390 int32_t ClientTransProxyGetLinkTypeByChannelId(int32_t channelId, int32_t *linkType)
391 {
392 if (linkType == NULL) {
393 TRANS_LOGE(TRANS_SDK, "param invalid.");
394 return SOFTBUS_INVALID_PARAM;
395 }
396 if (SoftBusMutexLock(&g_proxyChannelInfoList->lock) != SOFTBUS_OK) {
397 TRANS_LOGE(TRANS_SDK, "lock failed");
398 return SOFTBUS_LOCK_ERR;
399 }
400 ClientProxyChannelInfo *item = NULL;
401 LIST_FOR_EACH_ENTRY(item, &(g_proxyChannelInfoList->list), ClientProxyChannelInfo, node) {
402 if (item->channelId == channelId) {
403 *linkType = item->detail.linkType;
404 (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
405 return SOFTBUS_OK;
406 }
407 }
408
409 (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
410 TRANS_LOGE(TRANS_SDK, "can not find proxy channelId=%{public}d", channelId);
411 return SOFTBUS_NOT_FIND;
412 }
413
ClientTransProxyAddChannelInfo(ClientProxyChannelInfo * info)414 int32_t ClientTransProxyAddChannelInfo(ClientProxyChannelInfo *info)
415 {
416 if (info == NULL) {
417 TRANS_LOGE(TRANS_SDK, "param invalid.");
418 return SOFTBUS_INVALID_PARAM;
419 }
420 if (SoftBusMutexLock(&g_proxyChannelInfoList->lock) != SOFTBUS_OK) {
421 TRANS_LOGE(TRANS_SDK, "lock failed");
422 return SOFTBUS_LOCK_ERR;
423 }
424
425 ClientProxyChannelInfo *item = NULL;
426 LIST_FOR_EACH_ENTRY(item, &(g_proxyChannelInfoList->list), ClientProxyChannelInfo, node) {
427 if (item->channelId == info->channelId) {
428 TRANS_LOGE(TRANS_SDK, "client is existed. channelId=%{public}d", item->channelId);
429 (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
430 return SOFTBUS_ALREADY_EXISTED;
431 }
432 }
433
434 ListAdd(&g_proxyChannelInfoList->list, &info->node);
435 TRANS_LOGI(TRANS_SDK, "add channelId=%{public}d", info->channelId);
436 (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
437 return SOFTBUS_OK;
438 }
439
ClientTransProxyDelChannelInfo(int32_t channelId)440 int32_t ClientTransProxyDelChannelInfo(int32_t channelId)
441 {
442 if (SoftBusMutexLock(&g_proxyChannelInfoList->lock) != SOFTBUS_OK) {
443 TRANS_LOGE(TRANS_SDK, "lock failed");
444 return SOFTBUS_LOCK_ERR;
445 }
446
447 ClientProxyChannelInfo *item = NULL;
448 LIST_FOR_EACH_ENTRY(item, &(g_proxyChannelInfoList->list), ClientProxyChannelInfo, node) {
449 if (item->channelId == channelId) {
450 ListDelete(&item->node);
451 TRANS_LOGI(TRANS_SDK, "delete channelId=%{public}d", channelId);
452 SoftBusFree(item);
453 DelPendingPacket(channelId, PENDING_TYPE_PROXY);
454 (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
455 return SOFTBUS_OK;
456 }
457 }
458
459 (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
460 TRANS_LOGE(TRANS_SDK, "can not find proxy channel by channelId=%{public}d", channelId);
461 return SOFTBUS_TRANS_PROXY_CHANNEL_NOT_FOUND;
462 }
463
ClientTransProxyCreateChannelInfo(const ChannelInfo * channel)464 static ClientProxyChannelInfo *ClientTransProxyCreateChannelInfo(const ChannelInfo *channel)
465 {
466 ClientProxyChannelInfo *info = (ClientProxyChannelInfo *)SoftBusCalloc(sizeof(ClientProxyChannelInfo));
467 if (info == NULL) {
468 TRANS_LOGE(TRANS_SDK, "info is null");
469 return NULL;
470 }
471 if (memcpy_s(info->detail.sessionKey, SESSION_KEY_LENGTH, channel->sessionKey, SESSION_KEY_LENGTH) != EOK) {
472 SoftBusFree(info);
473 TRANS_LOGE(TRANS_SDK, "sessionKey memcpy fail");
474 return NULL;
475 }
476 info->channelId = channel->channelId;
477 info->detail.isEncrypted = channel->isEncrypt;
478 info->detail.sequence = 0;
479 info->detail.linkType = channel->linkType;
480 info->detail.osType = channel->osType;
481 return info;
482 }
483
ClientTransProxyOnChannelOpened(const char * sessionName,const ChannelInfo * channel)484 int32_t ClientTransProxyOnChannelOpened(const char *sessionName, const ChannelInfo *channel)
485 {
486 if (sessionName == NULL || channel == NULL) {
487 TRANS_LOGW(TRANS_SDK, "invalid param.");
488 return SOFTBUS_INVALID_PARAM;
489 }
490
491 ClientProxyChannelInfo *info = ClientTransProxyCreateChannelInfo(channel);
492 if (info == NULL) {
493 TRANS_LOGE(TRANS_SDK, "create channel info fail, channelId=%{public}d", channel->channelId);
494 return SOFTBUS_MEM_ERR;
495 }
496
497 int32_t ret = ClientTransProxyAddChannelInfo(info);
498 if (ret != SOFTBUS_OK) {
499 TRANS_LOGE(TRANS_SDK, "ClientTransProxyAddChannelInfo fail channelId=%{public}d", channel->channelId);
500 (void)memset_s(info->detail.sessionKey, SESSION_KEY_LENGTH, 0, SESSION_KEY_LENGTH);
501 SoftBusFree(info);
502 return ret;
503 }
504
505 SessionType type = TYPE_BUTT;
506 switch (channel->businessType) {
507 case BUSINESS_TYPE_BYTE:
508 type = TYPE_BYTES;
509 break;
510 case BUSINESS_TYPE_FILE:
511 type = TYPE_FILE;
512 break;
513 default:
514 type = TYPE_MESSAGE;
515 break;
516 }
517
518 ret = g_sessionCb.OnSessionOpened(sessionName, channel, type);
519 if (ret != SOFTBUS_OK) {
520 (void)ClientTransProxyDelChannelInfo(channel->channelId);
521 char *tmpName = NULL;
522 Anonymize(sessionName, &tmpName);
523 TRANS_LOGE(TRANS_SDK, "notify session open fail, sessionName=%{public}s.", AnonymizeWrapper(tmpName));
524 AnonymizeFree(tmpName);
525 return ret;
526 }
527 return SOFTBUS_OK;
528 }
529
530 int32_t TransProxyDelSliceProcessorByChannelId(int32_t channelId);
531
ClientTransProxyOnChannelClosed(int32_t channelId,ShutdownReason reason)532 int32_t ClientTransProxyOnChannelClosed(int32_t channelId, ShutdownReason reason)
533 {
534 (void)ClientTransProxyDelChannelInfo(channelId);
535 (void)TransProxyDelSliceProcessorByChannelId(channelId);
536
537 int ret = g_sessionCb.OnSessionClosed(channelId, CHANNEL_TYPE_PROXY, reason);
538 if (ret != SOFTBUS_OK) {
539 TRANS_LOGE(TRANS_SDK, "notify session closed errCode=%{public}d, channelId=%{public}d.", ret, channelId);
540 return ret;
541 }
542 return SOFTBUS_OK;
543 }
544
ClientTransProxyOnChannelOpenFailed(int32_t channelId,int32_t errCode)545 int32_t ClientTransProxyOnChannelOpenFailed(int32_t channelId, int32_t errCode)
546 {
547 int ret = g_sessionCb.OnSessionOpenFailed(channelId, CHANNEL_TYPE_PROXY, errCode);
548 if (ret != SOFTBUS_OK) {
549 TRANS_LOGE(TRANS_SDK, "notify session openfail errCode=%{public}d, channelId=%{public}d.", errCode, channelId);
550 return ret;
551 }
552
553 return SOFTBUS_OK;
554 }
555
ClientTransProxySessionDataLenCheck(uint32_t dataLen,SessionPktType type)556 int32_t ClientTransProxySessionDataLenCheck(uint32_t dataLen, SessionPktType type)
557 {
558 switch (type) {
559 case TRANS_SESSION_MESSAGE:
560 case TRANS_SESSION_ASYNC_MESSAGE: {
561 if (dataLen > g_proxyMaxMessageBufSize) {
562 return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
563 }
564 break;
565 }
566 case TRANS_SESSION_BYTES: {
567 if (dataLen > g_proxyMaxByteBufSize) {
568 return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
569 }
570 break;
571 }
572 default: {
573 return SOFTBUS_OK;
574 }
575 }
576 return SOFTBUS_OK;
577 }
578
ClientTransProxyDecryptPacketData(int32_t channelId,int32_t seq,ClientProxyDataInfo * dataInfo)579 static int32_t ClientTransProxyDecryptPacketData(int32_t channelId, int32_t seq, ClientProxyDataInfo *dataInfo)
580 {
581 ProxyChannelInfoDetail info;
582 int32_t ret = ClientTransProxyGetInfoByChannelId(channelId, &info);
583 if (ret != SOFTBUS_OK) {
584 TRANS_LOGE(TRANS_SDK, "get channel Info by channelId=%{public}d failed, ret=%{public}d", channelId, ret);
585 return ret;
586 }
587 AesGcmCipherKey cipherKey = { 0 };
588 cipherKey.keyLen = SESSION_KEY_LENGTH;
589 if (memcpy_s(cipherKey.key, SESSION_KEY_LENGTH, info.sessionKey, SESSION_KEY_LENGTH) != EOK) {
590 TRANS_LOGE(TRANS_SDK, "memcpy key error.");
591 return SOFTBUS_MEM_ERR;
592 }
593 ret = SoftBusDecryptDataWithSeq(
594 &cipherKey, dataInfo->inData, dataInfo->inLen, dataInfo->outData, &(dataInfo->outLen), seq);
595 (void)memset_s(&cipherKey, sizeof(AesGcmCipherKey), 0, sizeof(AesGcmCipherKey));
596 if (ret != SOFTBUS_OK) {
597 TRANS_LOGE(TRANS_SDK, "trans proxy Decrypt Data fail. ret=%{public}d ", ret);
598 return SOFTBUS_DECRYPT_ERR;
599 }
600
601 return SOFTBUS_OK;
602 }
603
ClientTransProxyCheckSliceHead(const SliceHead * head)604 static int32_t ClientTransProxyCheckSliceHead(const SliceHead *head)
605 {
606 if (head == NULL) {
607 TRANS_LOGW(TRANS_SDK, "invalid param.");
608 return SOFTBUS_INVALID_PARAM;
609 }
610 if (head->priority < 0 || head->priority >= PROXY_CHANNEL_PRORITY_BUTT) {
611 TRANS_LOGE(TRANS_SDK, "invalid index=%{public}d", head->priority);
612 return SOFTBUS_INVALID_DATA_HEAD;
613 }
614
615 if (head->sliceNum != 1 && head->sliceSeq >= head->sliceNum) {
616 TRANS_LOGE(TRANS_SDK, "sliceNum=%{public}d, sliceSeq=%{public}d", head->sliceNum, head->sliceSeq);
617 return SOFTBUS_INVALID_DATA_HEAD;
618 }
619
620 return SOFTBUS_OK;
621 }
622
623 int32_t TransProxyPackAndSendData(
624 int32_t channelId, const void *data, uint32_t len, ProxyChannelInfoDetail *info, SessionPktType pktType);
625
ClientTransProxySendSessionAck(int32_t channelId,int32_t seq)626 static void ClientTransProxySendSessionAck(int32_t channelId, int32_t seq)
627 {
628 unsigned char ack[PROXY_ACK_SIZE] = { 0 };
629 int32_t tmpSeq = 0;
630 ProxyChannelInfoDetail info;
631 if (ClientTransProxyGetInfoByChannelId(channelId, &info) != SOFTBUS_OK) {
632 TRANS_LOGE(TRANS_SDK, "get proxy info err, channelId=%{public}d", channelId);
633 return;
634 }
635 if (info.osType == OH_TYPE) {
636 tmpSeq = (int32_t)SoftBusHtoLl((uint32_t)seq);
637 } else {
638 tmpSeq = (int32_t)SoftBusHtoNl((uint32_t)seq); // convet host order to net order
639 }
640 if (memcpy_s(ack, PROXY_ACK_SIZE, &tmpSeq, sizeof(int32_t)) != EOK) {
641 TRANS_LOGE(TRANS_SDK, "memcpy seq err");
642 return;
643 }
644 info.sequence = seq;
645 if (TransProxyPackAndSendData(channelId, ack, PROXY_ACK_SIZE, &info, TRANS_SESSION_ACK) != SOFTBUS_OK) {
646 TRANS_LOGE(TRANS_SDK, "send ack err, seq=%{public}d", seq);
647 }
648 }
649
ClientTransProxyProcSendMsgAck(int32_t channelId,const char * data,int32_t len,int32_t dataHeadSeq,uint32_t dataSeq)650 static int32_t ClientTransProxyProcSendMsgAck(int32_t channelId, const char *data, int32_t len,
651 int32_t dataHeadSeq, uint32_t dataSeq)
652 {
653 if (len != PROXY_ACK_SIZE) {
654 return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
655 }
656 if (data == NULL) {
657 return SOFTBUS_TRANS_PROXY_ASSEMBLE_PACK_DATA_NULL;
658 }
659 int32_t seq = *(int32_t *)data;
660 int32_t hostSeq = (int32_t)SoftBusNtoHl(*(uint32_t *)data);
661 TRANS_LOGI(TRANS_SDK, "channelId=%{public}d, dataHeadSeq=%{public}d, seq=%{public}d, hostSeq=%{public}d",
662 channelId, dataHeadSeq, seq, hostSeq);
663 if (dataSeq != 0) { // this async process
664 int32_t socketId = INVALID_SESSION_ID;
665 SessionListenerAdapter sessionCallback;
666 bool isServer = false;
667 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
668 int32_t ret = ClientGetSessionIdByChannelId(channelId, CHANNEL_TYPE_PROXY, &socketId, false);
669 if (ret != SOFTBUS_OK) {
670 TRANS_LOGE(TRANS_SDK, "get socketId failed, channelId=%{public}d", channelId);
671 return ret;
672 }
673 ret = ClientGetSessionCallbackAdapterById(socketId, &sessionCallback, &isServer);
674 if (ret != SOFTBUS_OK) {
675 TRANS_LOGE(TRANS_SDK, "get session callback failed, channelId=%{public}d", channelId);
676 return ret;
677 }
678 ret = DeleteDataSeqInfoList(dataSeq, channelId);
679 if (ret != SOFTBUS_OK) {
680 TRANS_LOGE(TRANS_SDK, "proxychannel delete dataSeqInfoList failed, channelId=%{public}d", channelId);
681 return ret;
682 }
683 sessionCallback.socketClient.OnBytesSent(socketId, dataSeq, SOFTBUS_OK);
684 return SOFTBUS_OK;
685 }
686 int32_t ret = SetPendingPacket(channelId, seq, PENDING_TYPE_PROXY);
687 if (ret != SOFTBUS_OK) {
688 ret = SetPendingPacket(channelId, hostSeq, PENDING_TYPE_PROXY);
689 if (ret == SOFTBUS_OK) {
690 TRANS_LOGI(TRANS_SDK, "set pending packet by hostSeq=%{public}d success", hostSeq);
691 }
692 }
693 return ret;
694 }
695
ClientTransProxySendBytesAck(int32_t channelId,int32_t seq,uint32_t dataSeq,bool needAck)696 static void ClientTransProxySendBytesAck(int32_t channelId, int32_t seq, uint32_t dataSeq, bool needAck)
697 {
698 if (needAck) {
699 TRANS_LOGI(TRANS_SDK, "proxy channel server send ack to client");
700 unsigned char ack[PROXY_ACK_SIZE] = { 0 };
701 int32_t tmpSeq = 0;
702 ProxyChannelInfoDetail info;
703 if (ClientTransProxyGetInfoByChannelId(channelId, &info) != SOFTBUS_OK) {
704 TRANS_LOGE(TRANS_SDK, "get proxy info err, channelId=%{public}d", channelId);
705 return;
706 }
707 if (info.osType == OH_TYPE) {
708 tmpSeq = (int32_t)SoftBusHtoLl((uint32_t)seq);
709 } else {
710 tmpSeq = (int32_t)SoftBusHtoNl((uint32_t)seq);
711 }
712 if (memcpy_s(ack, PROXY_ACK_SIZE, &tmpSeq, sizeof(int32_t)) != EOK) {
713 TRANS_LOGE(TRANS_SDK, "memcpy seq err");
714 return;
715 }
716 info.sequence = seq;
717 if (TransProxyAsyncPackAndSendData(channelId, ack, PROXY_ACK_SIZE, dataSeq, TRANS_SESSION_ACK) != SOFTBUS_OK) {
718 TRANS_LOGE(TRANS_SDK, "send ack err, seq=%{public}d", seq);
719 return;
720 }
721 }
722 }
723
ClientTransProxyBytesNotifySession(int32_t channelId,const DataHeadTlvPacketHead * dataHead,const char * data,uint32_t len)724 static int32_t ClientTransProxyBytesNotifySession(int32_t channelId, const DataHeadTlvPacketHead *dataHead,
725 const char *data, uint32_t len)
726 {
727 SessionPktType flags = (SessionPktType)dataHead->flags;
728 int32_t seq = dataHead->seq;
729 uint32_t dataSeq = dataHead->dataSeq;
730 bool needAck = dataHead->needAck;
731 switch (flags) {
732 case TRANS_SESSION_MESSAGE:
733 ClientTransProxySendSessionAck(channelId, seq);
734 return g_sessionCb.OnDataReceived(channelId, CHANNEL_TYPE_PROXY, data, len, flags);
735 case TRANS_SESSION_ACK:
736 return ClientTransProxyProcSendMsgAck(channelId, data, len, seq, dataSeq);
737 case TRANS_SESSION_BYTES:
738 ClientTransProxySendBytesAck(channelId, seq, dataSeq, needAck);
739 return g_sessionCb.OnDataReceived(channelId, CHANNEL_TYPE_PROXY, data, len, flags);
740 case TRANS_SESSION_FILE_FIRST_FRAME:
741 case TRANS_SESSION_FILE_ONGOINE_FRAME:
742 case TRANS_SESSION_FILE_LAST_FRAME:
743 case TRANS_SESSION_FILE_ONLYONE_FRAME:
744 case TRANS_SESSION_FILE_ALLFILE_SENT:
745 case TRANS_SESSION_FILE_CRC_CHECK_FRAME:
746 case TRANS_SESSION_FILE_RESULT_FRAME:
747 case TRANS_SESSION_FILE_ACK_REQUEST_SENT:
748 case TRANS_SESSION_FILE_ACK_RESPONSE_SENT:
749 case TRANS_SESSION_ASYNC_MESSAGE:
750 return g_sessionCb.OnDataReceived(channelId, CHANNEL_TYPE_PROXY, data, len, flags);
751 default:
752 TRANS_LOGE(TRANS_SDK, "invalid flags=%{public}d", flags);
753 return SOFTBUS_INVALID_PARAM;
754 }
755 }
756
ClientTransProxyNotifySession(int32_t channelId,SessionPktType flags,int32_t seq,const char * data,uint32_t len)757 static int32_t ClientTransProxyNotifySession(
758 int32_t channelId, SessionPktType flags, int32_t seq, const char *data, uint32_t len)
759 {
760 switch (flags) {
761 case TRANS_SESSION_MESSAGE:
762 ClientTransProxySendSessionAck(channelId, seq);
763 return g_sessionCb.OnDataReceived(channelId, CHANNEL_TYPE_PROXY, data, len, flags);
764 case TRANS_SESSION_ACK:
765 return ClientTransProxyProcSendMsgAck(channelId, data, len, seq, 0);
766 case TRANS_SESSION_BYTES:
767 case TRANS_SESSION_FILE_FIRST_FRAME:
768 case TRANS_SESSION_FILE_ONGOINE_FRAME:
769 case TRANS_SESSION_FILE_LAST_FRAME:
770 case TRANS_SESSION_FILE_ONLYONE_FRAME:
771 case TRANS_SESSION_FILE_ALLFILE_SENT:
772 case TRANS_SESSION_FILE_CRC_CHECK_FRAME:
773 case TRANS_SESSION_FILE_RESULT_FRAME:
774 case TRANS_SESSION_FILE_ACK_REQUEST_SENT:
775 case TRANS_SESSION_FILE_ACK_RESPONSE_SENT:
776 case TRANS_SESSION_ASYNC_MESSAGE:
777 return g_sessionCb.OnDataReceived(channelId, CHANNEL_TYPE_PROXY, data, len, flags);
778 default:
779 TRANS_LOGE(TRANS_SDK, "invalid flags=%{public}d", flags);
780 return SOFTBUS_INVALID_PARAM;
781 }
782 }
783
ClientTransProxyProcessSessionData(int32_t channelId,const PacketHead * dataHead,const char * data)784 static int32_t ClientTransProxyProcessSessionData(int32_t channelId, const PacketHead *dataHead, const char *data)
785 {
786 ClientProxyDataInfo dataInfo = { 0 };
787 uint32_t outLen = 0;
788
789 if (dataHead->dataLen <= OVERHEAD_LEN) {
790 TRANS_LOGE(TRANS_SDK, "invalid data head dataLen=%{public}d", dataHead->dataLen);
791 return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
792 }
793
794 outLen = dataHead->dataLen - OVERHEAD_LEN;
795 dataInfo.outData = (unsigned char *)SoftBusCalloc(outLen);
796 if (dataInfo.outData == NULL) {
797 TRANS_LOGE(TRANS_SDK, "malloc fail when process session out data.");
798 return SOFTBUS_MALLOC_ERR;
799 }
800 dataInfo.inData = (unsigned char *)data;
801 dataInfo.inLen = dataHead->dataLen;
802 dataInfo.outLen = outLen;
803
804 int32_t ret = ClientTransProxyDecryptPacketData(channelId, dataHead->seq, &dataInfo);
805 if (ret != SOFTBUS_OK) {
806 TRANS_LOGE(TRANS_SDK, "decrypt err");
807 SoftBusFree(dataInfo.outData);
808 return SOFTBUS_DECRYPT_ERR;
809 }
810
811 if (ClientTransProxySessionDataLenCheck(dataInfo.outLen, (SessionPktType)(dataHead->flags)) != SOFTBUS_OK) {
812 TRANS_LOGE(
813 TRANS_SDK, "data len is too large outlen=%{public}d, flags=%{public}d", dataInfo.outLen, dataHead->flags);
814 SoftBusFree(dataInfo.outData);
815 return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
816 }
817
818 TRANS_LOGD(TRANS_SDK, "ProcessData debug: outlen=%{public}d", dataInfo.outLen);
819 if (ClientTransProxyNotifySession(channelId, (SessionPktType)dataHead->flags, dataHead->seq,
820 (const char *)dataInfo.outData, dataInfo.outLen) != SOFTBUS_OK) {
821 TRANS_LOGE(TRANS_SDK, "process data err");
822 SoftBusFree(dataInfo.outData);
823 return SOFTBUS_INVALID_DATA_HEAD;
824 }
825 SoftBusFree(dataInfo.outData);
826 return SOFTBUS_OK;
827 }
828
ClientTransProxyProcData(int32_t channelId,const DataHeadTlvPacketHead * dataHead,const char * data)829 static int32_t ClientTransProxyProcData(int32_t channelId, const DataHeadTlvPacketHead *dataHead, const char *data)
830 {
831 ClientProxyDataInfo dataInfo = { 0 };
832 uint32_t outLen = 0;
833
834 if (dataHead->dataLen <= OVERHEAD_LEN) {
835 TRANS_LOGE(TRANS_SDK, "invalid data head dataLen=%{public}d", dataHead->dataLen);
836 return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
837 }
838
839 outLen = dataHead->dataLen - OVERHEAD_LEN;
840 dataInfo.outData = (unsigned char *)SoftBusCalloc(outLen);
841 if (dataInfo.outData == NULL) {
842 TRANS_LOGE(TRANS_SDK, "malloc fail when process session out data.");
843 return SOFTBUS_MALLOC_ERR;
844 }
845 dataInfo.inData = (unsigned char *)data;
846 dataInfo.inLen = dataHead->dataLen;
847 dataInfo.outLen = outLen;
848
849 int32_t ret = ClientTransProxyDecryptPacketData(channelId, dataHead->seq, &dataInfo);
850 if (ret != SOFTBUS_OK) {
851 TRANS_LOGE(TRANS_SDK, "decrypt err");
852 SoftBusFree(dataInfo.outData);
853 return SOFTBUS_DECRYPT_ERR;
854 }
855
856 if (ClientTransProxySessionDataLenCheck(dataInfo.outLen, (SessionPktType)(dataHead->flags)) != SOFTBUS_OK) {
857 TRANS_LOGE(
858 TRANS_SDK, "data len is too large outlen=%{public}d, flags=%{public}d", dataInfo.outLen, dataHead->flags);
859 SoftBusFree(dataInfo.outData);
860 return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
861 }
862
863 TRANS_LOGD(TRANS_SDK, "ProcessData debug: outlen=%{public}d", dataInfo.outLen);
864 if (ClientTransProxyBytesNotifySession(channelId, dataHead, (const char *)dataInfo.outData,
865 dataInfo.outLen) != SOFTBUS_OK) {
866 TRANS_LOGE(TRANS_SDK, "process data err");
867 SoftBusFree(dataInfo.outData);
868 return SOFTBUS_INVALID_DATA_HEAD;
869 }
870 SoftBusFree(dataInfo.outData);
871 return SOFTBUS_OK;
872 }
873
ClientTransProxyNoSubPacketTlvProc(int32_t channelId,const char * data,uint32_t len)874 static int32_t ClientTransProxyNoSubPacketTlvProc(int32_t channelId, const char *data, uint32_t len)
875 {
876 DataHeadTlvPacketHead pktHead;
877 uint32_t newPktHeadSize = 0;
878 int32_t ret = TransProxyParseTlv(len, data, &pktHead, &newPktHeadSize);
879 if (ret != SOFTBUS_OK) {
880 TRANS_LOGE(TRANS_SDK, "proxy channel parse tlv failed, ret=%{public}d", ret);
881 return ret;
882 }
883 ClientUnPackTlvPackHead(&pktHead);
884 TRANS_LOGI(TRANS_SDK, "proxy channel parse tlv newPktHeadSize=%{public}d", newPktHeadSize);
885
886 if (pktHead.magicNumber != MAGIC_NUMBER) {
887 TRANS_LOGE(TRANS_SDK, "invalid magicNumber=%{public}x, channelId=%{public}d, len=%{public}u",
888 pktHead.magicNumber, channelId, len);
889 return SOFTBUS_INVALID_DATA_HEAD;
890 }
891 if (pktHead.dataLen == 0) {
892 TRANS_LOGE(TRANS_SDK, "invalid dataLen=%{public}u, channelId=%{public}d, len=%{public}u",
893 pktHead.dataLen, channelId, len);
894 return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
895 }
896 TRANS_LOGD(TRANS_SDK, "NoSubPacketProc dataLen=%{public}u, inputLen=%{public}u", pktHead.dataLen, len);
897 if (len <= newPktHeadSize || (pktHead.dataLen != (len - newPktHeadSize))) {
898 TRANS_LOGE(TRANS_SDK, "dataLen error, channelId=%{public}d, len=%{public}u, dataLen=%{public}u",
899 channelId, len, pktHead.dataLen);
900 return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
901 }
902 ret = ClientTransProxyProcData(channelId, &pktHead, data + newPktHeadSize);
903 if (ret != SOFTBUS_OK) {
904 TRANS_LOGE(TRANS_SDK, "process data err, channelId=%{public}d, len=%{public}u", channelId, len);
905 return ret;
906 }
907 return SOFTBUS_OK;
908 }
909
ClientTransProxyNoSubPacketProc(int32_t channelId,const char * data,uint32_t len)910 static int32_t ClientTransProxyNoSubPacketProc(int32_t channelId, const char *data, uint32_t len)
911 {
912 bool supportTlv = false;
913 int32_t res = GetSupportTlvAndNeedAckById(channelId, CHANNEL_TYPE_PROXY, &supportTlv, NULL);
914 if (res != SOFTBUS_OK) {
915 TRANS_LOGE(TRANS_SDK, "get support tlv failed, channelId=%{public}d", channelId);
916 return res;
917 }
918 if (supportTlv) {
919 return ClientTransProxyNoSubPacketTlvProc(channelId, data, len);
920 }
921 PacketHead head;
922 if (len < sizeof(PacketHead)) {
923 TRANS_LOGE(TRANS_SDK, "check len failed, len=%{public}d", len);
924 return SOFTBUS_INVALID_PARAM;
925 }
926 if (memcpy_s(&head, sizeof(PacketHead), data, sizeof(PacketHead)) != EOK) {
927 TRANS_LOGE(TRANS_SDK, "memcpy packetHead failed");
928 return SOFTBUS_MEM_ERR;
929 }
930 ClientUnPackPacketHead(&head);
931 if ((uint32_t)head.magicNumber != MAGIC_NUMBER) {
932 TRANS_LOGE(TRANS_SDK, "invalid magicNumber=%{public}x, channelId=%{public}d, len=%{public}d",
933 head.magicNumber, channelId, len);
934 return SOFTBUS_INVALID_DATA_HEAD;
935 }
936 if (head.dataLen <= 0) {
937 TRANS_LOGE(TRANS_SDK, "invalid dataLen=%{public}d, channelId=%{public}d, len=%{public}d",
938 head.dataLen, channelId, len);
939 return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
940 }
941 TRANS_LOGD(TRANS_SDK, "NoSubPacketProc dataLen=%{public}d, inputLen=%{public}d", head.dataLen, len);
942 if (len <= sizeof(PacketHead) || (head.dataLen != (int32_t)(len - sizeof(PacketHead)))) {
943 TRANS_LOGE(TRANS_SDK, "dataLen error, channelId=%{public}d, len=%{public}d, dataLen=%{public}d",
944 channelId, len, head.dataLen);
945 return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
946 }
947 int32_t ret = ClientTransProxyProcessSessionData(channelId, &head, data + sizeof(PacketHead));
948 if (ret != SOFTBUS_OK) {
949 TRANS_LOGE(TRANS_SDK, "process data err, channelId=%{public}d, len=%{public}d", channelId, len);
950 return ret;
951 }
952 return SOFTBUS_OK;
953 }
954
ClientTransProxyGetChannelSliceProcessor(int32_t channelId)955 static ChannelSliceProcessor *ClientTransProxyGetChannelSliceProcessor(int32_t channelId)
956 {
957 ChannelSliceProcessor *processor = NULL;
958 LIST_FOR_EACH_ENTRY(processor, &g_channelSliceProcessorList->list, ChannelSliceProcessor, head) {
959 if (processor->channelId == channelId) {
960 return processor;
961 }
962 }
963
964 ChannelSliceProcessor *node = (ChannelSliceProcessor *)SoftBusCalloc(sizeof(ChannelSliceProcessor));
965 if (node == NULL) {
966 TRANS_LOGE(TRANS_SDK, "calloc err");
967 return NULL;
968 }
969 node->channelId = channelId;
970 ListInit(&(node->head));
971 ListAdd(&(g_channelSliceProcessorList->list), &(node->head));
972 g_channelSliceProcessorList->cnt++;
973 TRANS_LOGI(TRANS_SDK, "add new node, channelId=%{public}d", channelId);
974 return node;
975 }
976
ClientTransProxyClearProcessor(SliceProcessor * processor)977 static void ClientTransProxyClearProcessor(SliceProcessor *processor)
978 {
979 if (processor->data != NULL) {
980 SoftBusFree(processor->data);
981 processor->data = NULL;
982 }
983 processor->active = false;
984 processor->bufLen = 0;
985 processor->dataLen = 0;
986 processor->expectedSeq = 0;
987 processor->sliceNumber = 0;
988 processor->timeout = 0;
989 }
990
TransProxyDelSliceProcessorByChannelId(int32_t channelId)991 int32_t TransProxyDelSliceProcessorByChannelId(int32_t channelId)
992 {
993 ChannelSliceProcessor *node = NULL;
994 ChannelSliceProcessor *next = NULL;
995
996 if (g_channelSliceProcessorList == NULL) {
997 TRANS_LOGE(TRANS_INIT, "not init");
998 return SOFTBUS_NO_INIT;
999 }
1000 if (SoftBusMutexLock(&g_channelSliceProcessorList->lock) != SOFTBUS_OK) {
1001 TRANS_LOGE(TRANS_SDK, "lock err");
1002 return SOFTBUS_LOCK_ERR;
1003 }
1004 LIST_FOR_EACH_ENTRY_SAFE(node, next, &g_channelSliceProcessorList->list, ChannelSliceProcessor, head) {
1005 if (node->channelId == channelId) {
1006 for (int i = PROXY_CHANNEL_PRORITY_MESSAGE; i < PROXY_CHANNEL_PRORITY_BUTT; i++) {
1007 ClientTransProxyClearProcessor(&(node->processor[i]));
1008 }
1009 ListDelete(&(node->head));
1010 TRANS_LOGI(TRANS_SDK, "delete channelId=%{public}d", channelId);
1011 SoftBusFree(node);
1012 g_channelSliceProcessorList->cnt--;
1013 (void)SoftBusMutexUnlock(&g_channelSliceProcessorList->lock);
1014 return SOFTBUS_OK;
1015 }
1016 }
1017 (void)SoftBusMutexUnlock(&g_channelSliceProcessorList->lock);
1018 return SOFTBUS_OK;
1019 }
1020
ClientTransProxySliceProcessChkPkgIsValid(const SliceProcessor * processor,const SliceHead * head,const char * data,uint32_t len)1021 static int32_t ClientTransProxySliceProcessChkPkgIsValid(
1022 const SliceProcessor *processor, const SliceHead *head, const char *data, uint32_t len)
1023 {
1024 (void)data;
1025 if (head->sliceNum != processor->sliceNumber || head->sliceSeq != processor->expectedSeq) {
1026 TRANS_LOGE(TRANS_SDK, "unmatched normal slice received, head sliceNum=%{public}d, sliceSeq=%{public}d,\
1027 processor sliceNumber=%{public}d, expectedSeq=%{public}d", head->sliceNum,
1028 head->sliceSeq, processor->sliceNumber, processor->expectedSeq);
1029 return SOFTBUS_TRANS_PROXY_ASSEMBLE_PACK_NO_INVALID;
1030 }
1031 if (processor->dataLen > processor->bufLen || (int32_t)len > processor->bufLen - processor->dataLen) {
1032 TRANS_LOGE(TRANS_SDK, "data len invalid %{public}u, %{public}d", len, processor->dataLen);
1033 return SOFTBUS_TRANS_PROXY_ASSEMBLE_PACK_EXCEED_LENGTH;
1034 }
1035 if (processor->data == NULL) {
1036 TRANS_LOGE(TRANS_SDK, "data NULL");
1037 return SOFTBUS_TRANS_PROXY_ASSEMBLE_PACK_DATA_NULL;
1038 }
1039 return SOFTBUS_OK;
1040 }
1041
ClientGetActualDataLen(const SliceHead * head,uint32_t * actualDataLen)1042 static int32_t ClientGetActualDataLen(const SliceHead *head, uint32_t *actualDataLen)
1043 {
1044 uint32_t maxDataLen =
1045 (head->priority == PROXY_CHANNEL_PRORITY_MESSAGE) ? g_proxyMaxMessageBufSize : g_proxyMaxByteBufSize;
1046 // The encrypted data length is longer than the actual data length
1047 maxDataLen += SLICE_LEN;
1048
1049 if ((head->sliceNum < 0) || ((uint32_t)head->sliceNum > (maxDataLen / SLICE_LEN))) {
1050 TRANS_LOGE(TRANS_SDK, "invalid sliceNum=%{public}d", head->sliceNum);
1051 return SOFTBUS_INVALID_DATA_HEAD;
1052 }
1053
1054 *actualDataLen = head->sliceNum * SLICE_LEN;
1055 return SOFTBUS_OK;
1056 }
1057
ClientTransProxyFirstSliceProcess(SliceProcessor * processor,const SliceHead * head,const char * data,uint32_t len,int32_t channelId)1058 static int32_t ClientTransProxyFirstSliceProcess(
1059 SliceProcessor *processor, const SliceHead *head, const char *data, uint32_t len, int32_t channelId)
1060 {
1061 ClientTransProxyClearProcessor(processor);
1062
1063 uint32_t actualDataLen = 0;
1064 int32_t ret = ClientGetActualDataLen(head, &actualDataLen);
1065 if (ret != SOFTBUS_OK) {
1066 return ret;
1067 }
1068 uint32_t maxLen = 0;
1069 bool supportTlv = false;
1070 ret = GetSupportTlvAndNeedAckById(channelId, CHANNEL_TYPE_PROXY, &supportTlv, NULL);
1071 if (ret != SOFTBUS_OK) {
1072 TRANS_LOGE(TRANS_SDK, "get support tlv failed, channelId=%{public}d", channelId);
1073 return ret;
1074 }
1075 if (supportTlv) {
1076 maxLen = actualDataLen + PROXY_TLV_PKT_HEAD + OVERHEAD_LEN;
1077 } else {
1078 maxLen = actualDataLen + sizeof(PacketHead) + OVERHEAD_LEN;
1079 }
1080 processor->data = (char *)SoftBusCalloc(maxLen);
1081 if (processor->data == NULL) {
1082 TRANS_LOGE(TRANS_SDK, "malloc fail when proc first slice package");
1083 return SOFTBUS_MALLOC_ERR;
1084 }
1085 processor->bufLen = (int32_t)maxLen;
1086 if (memcpy_s(processor->data, maxLen, data, len) != EOK) {
1087 TRANS_LOGE(TRANS_SDK, "memcpy fail when proc first slice package");
1088 SoftBusFree(processor->data);
1089 processor->data = NULL;
1090 return SOFTBUS_MEM_ERR;
1091 }
1092 processor->sliceNumber = head->sliceNum;
1093 processor->expectedSeq = 1;
1094 processor->dataLen = (int32_t)len;
1095 processor->active = true;
1096 processor->timeout = 0;
1097
1098 TRANS_LOGI(TRANS_SDK, "FirstSliceProcess ok");
1099 return SOFTBUS_OK;
1100 }
1101
IsValidCheckoutProcess(int32_t channelId)1102 static bool IsValidCheckoutProcess(int32_t channelId)
1103 {
1104 ChannelSliceProcessor *processor = NULL;
1105 LIST_FOR_EACH_ENTRY(processor, &g_channelSliceProcessorList->list, ChannelSliceProcessor, head) {
1106 if (processor->channelId == channelId) {
1107 return true;
1108 }
1109 }
1110
1111 TRANS_LOGE(TRANS_SDK, "Process not exist.");
1112 return false;
1113 }
1114
ClientTransProxyLastSliceProcess(SliceProcessor * processor,const SliceHead * head,const char * data,uint32_t len,int32_t channelId)1115 static int32_t ClientTransProxyLastSliceProcess(
1116 SliceProcessor *processor, const SliceHead *head, const char *data, uint32_t len, int32_t channelId)
1117 {
1118 int32_t ret = ClientTransProxySliceProcessChkPkgIsValid(processor, head, data, len);
1119 if (ret != SOFTBUS_OK) {
1120 return ret;
1121 }
1122 if (memcpy_s(processor->data + processor->dataLen, (uint32_t)(processor->bufLen - processor->dataLen), data, len) !=
1123 EOK) {
1124 TRANS_LOGE(TRANS_SDK, "memcpy fail when proc last slice");
1125 return SOFTBUS_MEM_ERR;
1126 }
1127 processor->expectedSeq++;
1128 processor->dataLen += (int32_t)len;
1129
1130 ret = ClientTransProxyNoSubPacketProc(channelId, processor->data, (uint32_t)processor->dataLen);
1131 if (ret != SOFTBUS_OK) {
1132 TRANS_LOGE(TRANS_SDK, "process packets err");
1133 return ret;
1134 }
1135
1136 if (IsValidCheckoutProcess(channelId)) {
1137 ClientTransProxyClearProcessor(processor);
1138 }
1139
1140 TRANS_LOGI(TRANS_SDK, "LastSliceProcess ok");
1141 return ret;
1142 }
1143
ClientTransProxyNormalSliceProcess(SliceProcessor * processor,const SliceHead * head,const char * data,uint32_t len)1144 static int32_t ClientTransProxyNormalSliceProcess(
1145 SliceProcessor *processor, const SliceHead *head, const char *data, uint32_t len)
1146 {
1147 int32_t ret = ClientTransProxySliceProcessChkPkgIsValid(processor, head, data, len);
1148 if (ret != SOFTBUS_OK) {
1149 return ret;
1150 }
1151 if (memcpy_s(processor->data + processor->dataLen,
1152 (uint32_t)(processor->bufLen - processor->dataLen), data, len) != EOK) {
1153 TRANS_LOGE(TRANS_SDK, "memcpy fail when proc normal slice");
1154 return SOFTBUS_MEM_ERR;
1155 }
1156 processor->expectedSeq++;
1157 processor->dataLen += (int32_t)len;
1158 processor->timeout = 0;
1159 TRANS_LOGI(TRANS_SDK, "NormalSliceProcess ok");
1160 return ret;
1161 }
1162
ClientTransProxySubPacketProc(int32_t channelId,const SliceHead * head,const char * data,uint32_t len)1163 static int ClientTransProxySubPacketProc(int32_t channelId, const SliceHead *head, const char *data, uint32_t len)
1164 {
1165 if (g_channelSliceProcessorList == NULL) {
1166 TRANS_LOGE(TRANS_SDK, "TransProxySubPacketProc not init");
1167 return SOFTBUS_NO_INIT;
1168 }
1169 if (SoftBusMutexLock(&g_channelSliceProcessorList->lock) != SOFTBUS_OK) {
1170 TRANS_LOGE(TRANS_SDK, "lock err");
1171 return SOFTBUS_LOCK_ERR;
1172 }
1173
1174 ChannelSliceProcessor *channelProcessor = ClientTransProxyGetChannelSliceProcessor(channelId);
1175 if (channelProcessor == NULL) {
1176 SoftBusMutexUnlock(&g_channelSliceProcessorList->lock);
1177 return SOFTBUS_TRANS_GET_CLIENT_PROXY_NULL;
1178 }
1179
1180 int ret;
1181 int32_t index = head->priority;
1182 SliceProcessor *processor = &(channelProcessor->processor[index]);
1183 if (head->sliceSeq == 0) {
1184 ret = ClientTransProxyFirstSliceProcess(processor, head, data, len, channelId);
1185 } else if (head->sliceNum == head->sliceSeq + 1) {
1186 ret = ClientTransProxyLastSliceProcess(processor, head, data, len, channelId);
1187 } else {
1188 ret = ClientTransProxyNormalSliceProcess(processor, head, data, len);
1189 }
1190
1191 SoftBusMutexUnlock(&g_channelSliceProcessorList->lock);
1192 if (ret != SOFTBUS_OK) {
1193 ClientTransProxyClearProcessor(processor);
1194 }
1195 return ret;
1196 }
1197
ClientTransProxySliceProc(int32_t channelId,const char * data,uint32_t len)1198 static int32_t ClientTransProxySliceProc(int32_t channelId, const char *data, uint32_t len)
1199 {
1200 if (data == NULL || len <= sizeof(SliceHead)) {
1201 TRANS_LOGE(TRANS_SDK, "data null or len error. len=%{public}d", len);
1202 return SOFTBUS_INVALID_PARAM;
1203 }
1204
1205 SliceHead headSlice = *(SliceHead *)data;
1206 ClientUnPackSliceHead(&headSlice);
1207 if (ClientTransProxyCheckSliceHead(&headSlice) != SOFTBUS_OK) {
1208 TRANS_LOGE(TRANS_SDK, "invalid slihead");
1209 return SOFTBUS_TRANS_PROXY_INVALID_SLICE_HEAD;
1210 }
1211
1212 uint32_t dataLen = len - sizeof(SliceHead);
1213 if (headSlice.sliceNum == 1) { // no sub packets
1214 TRANS_LOGD(TRANS_SDK, "no sub packets proc, channelId=%{public}d", channelId);
1215 return ClientTransProxyNoSubPacketProc(channelId, data + sizeof(SliceHead), dataLen);
1216 } else {
1217 TRANS_LOGI(TRANS_SDK, "sub packets proc sliceNum=%{public}d", headSlice.sliceNum);
1218 return ClientTransProxySubPacketProc(channelId, &headSlice, data + sizeof(SliceHead), dataLen);
1219 }
1220 }
1221
ClientTransProxySliceTimerProc(void)1222 static void ClientTransProxySliceTimerProc(void)
1223 {
1224 #define SLICE_PACKET_TIMEOUT 10 // 10s
1225 ChannelSliceProcessor *removeNode = NULL;
1226 ChannelSliceProcessor *nextNode = NULL;
1227
1228 if (g_channelSliceProcessorList == NULL || g_channelSliceProcessorList->cnt == 0) {
1229 return;
1230 }
1231 if (SoftBusMutexLock(&g_channelSliceProcessorList->lock) != SOFTBUS_OK) {
1232 TRANS_LOGE(TRANS_SDK, "TransProxySliceTimerProc lock mutex fail!");
1233 return;
1234 }
1235
1236 LIST_FOR_EACH_ENTRY_SAFE(removeNode, nextNode, &g_channelSliceProcessorList->list, ChannelSliceProcessor, head) {
1237 for (int i = PROXY_CHANNEL_PRORITY_MESSAGE; i < PROXY_CHANNEL_PRORITY_BUTT; i++) {
1238 if (removeNode->processor[i].active == true) {
1239 removeNode->processor[i].timeout++;
1240 if (removeNode->processor[i].timeout >= SLICE_PACKET_TIMEOUT) {
1241 TRANS_LOGE(TRANS_SDK, "timeout=%{public}d", removeNode->processor[i].timeout);
1242 ClientTransProxyClearProcessor(&removeNode->processor[i]);
1243 }
1244 }
1245 }
1246 }
1247 (void)SoftBusMutexUnlock(&g_channelSliceProcessorList->lock);
1248 return;
1249 }
1250
ClientTransProxyOnDataReceived(int32_t channelId,const void * data,uint32_t len,SessionPktType type)1251 int32_t ClientTransProxyOnDataReceived(int32_t channelId, const void *data, uint32_t len, SessionPktType type)
1252 {
1253 (void)type;
1254 if (data == NULL) {
1255 TRANS_LOGE(TRANS_SDK, "ClientTransProxyOnDataReceived data null. channelId=%{public}d", channelId);
1256 return SOFTBUS_INVALID_PARAM;
1257 }
1258
1259 ProxyChannelInfoDetail info;
1260 if (ClientTransProxyGetInfoByChannelId(channelId, &info) != SOFTBUS_OK) {
1261 return SOFTBUS_TRANS_PROXY_INVALID_CHANNEL_ID;
1262 }
1263 if (!info.isEncrypted) {
1264 return g_sessionCb.OnDataReceived(channelId, CHANNEL_TYPE_PROXY, data, len, TRANS_SESSION_BYTES);
1265 }
1266
1267 return ClientTransProxySliceProc(channelId, (char *)data, len);
1268 }
1269
ClientTransProxyCloseChannel(int32_t channelId)1270 void ClientTransProxyCloseChannel(int32_t channelId)
1271 {
1272 (void)ClientTransProxyDelChannelInfo(channelId);
1273 (void)TransProxyDelSliceProcessorByChannelId(channelId);
1274 TRANS_LOGI(TRANS_SDK, "TransCloseProxyChannel, channelId=%{public}d", channelId);
1275 if (ServerIpcCloseChannel(NULL, channelId, CHANNEL_TYPE_PROXY) != SOFTBUS_OK) {
1276 TRANS_LOGE(TRANS_SDK, "server close err. channelId=%{public}d", channelId);
1277 }
1278 }
1279
TransProxyPackTlvData(DataHead * pktHead,int32_t tlvBufferSize,uint32_t dataLen)1280 static uint8_t *TransProxyPackTlvData(DataHead *pktHead, int32_t tlvBufferSize, uint32_t dataLen)
1281 {
1282 int32_t newDataHeadSize = MAGICNUM_SIZE + TLVCOUNT_SIZE + tlvBufferSize;
1283 uint8_t *buf = (uint8_t *)SoftBusCalloc(dataLen + newDataHeadSize);
1284 if (buf == NULL) {
1285 TRANS_LOGE(TRANS_SDK, "malloc buf failed");
1286 return NULL;
1287 }
1288 if (memcpy_s(buf, dataLen + newDataHeadSize, &pktHead->magicNum, MAGICNUM_SIZE) != EOK) {
1289 SoftBusFree(buf);
1290 TRANS_LOGE(TRANS_SDK, "memcpy magicNum failed");
1291 return NULL;
1292 }
1293
1294 if (memcpy_s(buf + MAGICNUM_SIZE, dataLen + newDataHeadSize, &pktHead->tlvCount,
1295 TLVCOUNT_SIZE) != EOK) {
1296 SoftBusFree(buf);
1297 TRANS_LOGE(TRANS_SDK, "memcpy tlvCount failed");
1298 return NULL;
1299 }
1300
1301 uint8_t *temp = buf + MAGICNUM_SIZE + TLVCOUNT_SIZE;
1302 for (int index = 0; index < pktHead->tlvCount; index++) {
1303 TlvElement *ement = (TlvElement *)pktHead->tlvElement;
1304 if (memcpy_s(temp, dataLen + newDataHeadSize, &ement->type, sizeof(ement->type)) != EOK) {
1305 SoftBusFree(buf);
1306 TRANS_LOGE(TRANS_SDK, "memcpy tlvEment type failed");
1307 return NULL;
1308 }
1309
1310 temp += sizeof(ement->type);
1311 if (memcpy_s(temp, dataLen + newDataHeadSize, &ement->length, sizeof(ement->length)) != EOK) {
1312 SoftBusFree(buf);
1313 TRANS_LOGE(TRANS_SDK, "memcpy tlvEment length failed");
1314 return NULL;
1315 }
1316
1317 temp += sizeof(ement->length);
1318 if (memcpy_s(temp, dataLen + newDataHeadSize, ement->value, ement->length) != EOK) {
1319 SoftBusFree(buf);
1320 TRANS_LOGE(TRANS_SDK, "memcpy tlvEment value failed");
1321 return NULL;
1322 }
1323
1324 temp += ement->length;
1325 pktHead->tlvElement += sizeof(TlvElement);
1326 }
1327 return buf;
1328 }
1329
ClientTransProxyPackTlvBytes(int32_t channelId,ClientProxyDataInfo * dataInfo,ProxyChannelInfoDetail * info,uint32_t dataSeq,SessionPktType flag)1330 static int32_t ClientTransProxyPackTlvBytes(int32_t channelId, ClientProxyDataInfo *dataInfo,
1331 ProxyChannelInfoDetail *info, uint32_t dataSeq, SessionPktType flag)
1332 {
1333 if (dataInfo == NULL || info == NULL) {
1334 return SOFTBUS_INVALID_PARAM;
1335 }
1336 int32_t seq = info->sequence;
1337 char *sessionKey = info->sessionKey;
1338 uint32_t dataLen = dataInfo->inLen + OVERHEAD_LEN;
1339 bool needAck = false;
1340 int32_t ret = GetSupportTlvAndNeedAckById(channelId, CHANNEL_TYPE_PROXY, NULL, &needAck);
1341 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "get need ack fail");
1342 DataHead pktHead;
1343 int32_t tlvBufferSize = 0;
1344 ret = ProxyBuildTlvDataHead(&pktHead, seq, flag, dataLen, &tlvBufferSize);
1345 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "build tlv dataHead fail");
1346 ret = ProxyBuildNeedAckTlvData(&pktHead, needAck, dataSeq, &tlvBufferSize);
1347 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "build tlv needAck fail");
1348 dataInfo->outData = TransProxyPackTlvData(&pktHead, tlvBufferSize, dataLen);
1349 if (dataInfo->outData == NULL) {
1350 TRANS_LOGE(TRANS_SDK, "TransProxyPackTlvData error");
1351 ReleaseTlvValueBuffer(&pktHead);
1352 SoftBusFree(pktHead.tlvElement);
1353 return SOFTBUS_TRANS_PACK_TLV_DATA_FAILED;
1354 }
1355 ReleaseTlvValueBuffer(&pktHead);
1356 SoftBusFree(pktHead.tlvElement);
1357 int32_t newDataHeadSize = MAGICNUM_SIZE + TLVCOUNT_SIZE + tlvBufferSize;
1358 dataInfo->outLen = dataInfo->inLen + OVERHEAD_LEN + (uint32_t)newDataHeadSize;
1359
1360 uint32_t outLen = 0;
1361 AesGcmCipherKey cipherKey = { 0 };
1362 cipherKey.keyLen = SESSION_KEY_LENGTH;
1363 if (memcpy_s(cipherKey.key, SESSION_KEY_LENGTH, sessionKey, SESSION_KEY_LENGTH) != EOK) {
1364 TRANS_LOGE(TRANS_SDK, "memcpy key error.");
1365 SoftBusFree(dataInfo->outData);
1366 return SOFTBUS_MEM_ERR;
1367 }
1368 char *outData = (char *)dataInfo->outData + newDataHeadSize;
1369 ret = SoftBusEncryptDataWithSeq(&cipherKey, (const unsigned char *)dataInfo->inData,
1370 dataInfo->inLen, (unsigned char *)outData, &outLen, seq);
1371 (void)memset_s(cipherKey.key, SESSION_KEY_LENGTH, 0, SESSION_KEY_LENGTH);
1372
1373 if (ret != SOFTBUS_OK || outLen != dataInfo->inLen + OVERHEAD_LEN) {
1374 TRANS_LOGE(TRANS_SDK, "encrypt error, ret=%{public}d", ret);
1375 outData = NULL;
1376 TRANS_LOGE(TRANS_SDK, "ClientTransProxyEncryptWithSeq channelId=%{public}d", channelId);
1377 SoftBusFree(dataInfo->outData);
1378 dataInfo->outData = NULL;
1379 return SOFTBUS_TRANS_PROXY_SESS_ENCRYPT_ERR;
1380 }
1381 return SOFTBUS_OK;
1382 }
1383
ClientTransProxyPackBytes(int32_t channelId,ClientProxyDataInfo * dataInfo,ProxyChannelInfoDetail * info,uint32_t dataSeq,SessionPktType flag)1384 static int32_t ClientTransProxyPackBytes(int32_t channelId, ClientProxyDataInfo *dataInfo, ProxyChannelInfoDetail *info,
1385 uint32_t dataSeq, SessionPktType flag)
1386 {
1387 #define MAGIC_NUMBER 0xBABEFACE
1388 if (dataInfo == NULL || info == NULL) {
1389 return SOFTBUS_INVALID_PARAM;
1390 }
1391 bool supportTlv = false;
1392 int32_t res = GetSupportTlvAndNeedAckById(channelId, CHANNEL_TYPE_PROXY, &supportTlv, NULL);
1393 TRANS_CHECK_AND_RETURN_RET_LOGE(res == SOFTBUS_OK, res, TRANS_SDK, "get support tlv fail");
1394 if (supportTlv) {
1395 return ClientTransProxyPackTlvBytes(channelId, dataInfo, info, dataSeq, flag);
1396 }
1397 int32_t seq = info->sequence;
1398 char *sessionKey = info->sessionKey;
1399 dataInfo->outLen = dataInfo->inLen + OVERHEAD_LEN + sizeof(PacketHead);
1400 dataInfo->outData = (uint8_t *)SoftBusCalloc(dataInfo->outLen);
1401 if (dataInfo->outData == NULL) {
1402 TRANS_LOGE(TRANS_SDK, "calloc error");
1403 return SOFTBUS_MEM_ERR;
1404 }
1405
1406 uint32_t outLen = 0;
1407 AesGcmCipherKey cipherKey = { 0 };
1408 cipherKey.keyLen = SESSION_KEY_LENGTH;
1409 if (memcpy_s(cipherKey.key, SESSION_KEY_LENGTH, sessionKey, SESSION_KEY_LENGTH) != EOK) {
1410 TRANS_LOGE(TRANS_SDK, "memcpy key error.");
1411 SoftBusFree(dataInfo->outData);
1412 return SOFTBUS_MEM_ERR;
1413 }
1414 char *outData = (char *)dataInfo->outData + sizeof(PacketHead);
1415 int32_t ret = SoftBusEncryptDataWithSeq(&cipherKey, (const unsigned char *)dataInfo->inData,
1416 dataInfo->inLen, (unsigned char *)outData, &outLen, seq);
1417 (void)memset_s(cipherKey.key, SESSION_KEY_LENGTH, 0, SESSION_KEY_LENGTH);
1418
1419 if (ret != SOFTBUS_OK || outLen != dataInfo->inLen + OVERHEAD_LEN) {
1420 TRANS_LOGE(TRANS_SDK, "encrypt error, ret=%{public}d", ret);
1421 outData = NULL;
1422 SoftBusFree(dataInfo->outData);
1423 TRANS_LOGE(TRANS_SDK, "ClientTransProxyEncryptWithSeq channelId=%{public}d", channelId);
1424 return SOFTBUS_TRANS_PROXY_SESS_ENCRYPT_ERR;
1425 }
1426 PacketHead *pktHead = (PacketHead *)dataInfo->outData;
1427 pktHead->magicNumber = MAGIC_NUMBER;
1428 pktHead->seq = seq;
1429 pktHead->flags = flag;
1430 pktHead->dataLen = (int32_t)((int32_t)dataInfo->outLen - sizeof(PacketHead));
1431 ClientPackPacketHead(pktHead);
1432
1433 return SOFTBUS_OK;
1434 }
1435
SessionPktTypeToProxyIndex(SessionPktType packetType)1436 static int32_t SessionPktTypeToProxyIndex(SessionPktType packetType)
1437 {
1438 switch (packetType) {
1439 case TRANS_SESSION_MESSAGE:
1440 case TRANS_SESSION_ASYNC_MESSAGE:
1441 case TRANS_SESSION_ACK:
1442 return PROXY_CHANNEL_PRORITY_MESSAGE;
1443 case TRANS_SESSION_BYTES:
1444 return PROXY_CHANNEL_PRORITY_BYTES;
1445 default:
1446 return PROXY_CHANNEL_PRORITY_FILE;
1447 }
1448 }
1449
TransProxyPackAndSendData(int32_t channelId,const void * data,uint32_t len,ProxyChannelInfoDetail * info,SessionPktType pktType)1450 int32_t TransProxyPackAndSendData(
1451 int32_t channelId, const void *data, uint32_t len, ProxyChannelInfoDetail *info, SessionPktType pktType)
1452 {
1453 if (data == NULL || info == NULL) {
1454 return SOFTBUS_INVALID_PARAM;
1455 }
1456 ClientProxyDataInfo dataInfo = { (uint8_t *)data, len, (uint8_t *)data, len };
1457 uint32_t dataSeq = 0;
1458 int32_t ret = ClientTransProxyPackBytes(channelId, &dataInfo, info, dataSeq, pktType);
1459 if (ret != SOFTBUS_OK) {
1460 TRANS_LOGE(TRANS_SDK, "ClientTransProxyPackBytes error, channelId=%{public}d", channelId);
1461 return ret;
1462 }
1463
1464 uint32_t sliceNum = (dataInfo.outLen + (uint32_t)(SLICE_LEN - 1)) / (uint32_t)SLICE_LEN;
1465 if (sliceNum > INT32_MAX) {
1466 TRANS_LOGE(TRANS_FILE, "Data overflow");
1467 SoftBusFree(dataInfo.outData);
1468 return SOFTBUS_INVALID_NUM;
1469 }
1470 for (uint32_t i = 0; i < sliceNum; i++) {
1471 uint32_t dataLen = (i == (sliceNum - 1U)) ? (dataInfo.outLen - i * SLICE_LEN) : SLICE_LEN;
1472 int32_t offset = (int32_t)(i * SLICE_LEN);
1473
1474 uint8_t *sliceData = (uint8_t *)SoftBusCalloc(dataLen + sizeof(SliceHead));
1475 if (sliceData == NULL) {
1476 TRANS_LOGE(TRANS_SDK, "malloc slice data error, channelId=%{public}d", channelId);
1477 SoftBusFree(dataInfo.outData);
1478 return SOFTBUS_MALLOC_ERR;
1479 }
1480 SliceHead *slicehead = (SliceHead *)sliceData;
1481 slicehead->priority = SessionPktTypeToProxyIndex(pktType);
1482 slicehead->sliceNum = (int32_t)sliceNum;
1483 slicehead->sliceSeq = (int32_t)i;
1484 ClientPackSliceHead(slicehead);
1485 if (memcpy_s(sliceData + sizeof(SliceHead), dataLen, dataInfo.outData + offset, dataLen) != EOK) {
1486 TRANS_LOGE(TRANS_SDK, "memcpy_s error, channelId=%{public}d", channelId);
1487 SoftBusFree(sliceData);
1488 SoftBusFree(dataInfo.outData);
1489 return SOFTBUS_MEM_ERR;
1490 }
1491
1492 int ret = ServerIpcSendMessage(channelId, CHANNEL_TYPE_PROXY, sliceData, dataLen + sizeof(SliceHead), pktType);
1493 if (ret != SOFTBUS_OK) {
1494 TRANS_LOGE(TRANS_SDK, "ServerIpcSendMessage error, channelId=%{public}d, ret=%{public}d", channelId, ret);
1495 SoftBusFree(sliceData);
1496 SoftBusFree(dataInfo.outData);
1497 return ret;
1498 }
1499
1500 SoftBusFree(sliceData);
1501 }
1502 SoftBusFree(dataInfo.outData);
1503
1504 TRANS_LOGI(TRANS_SDK, "TransProxyPackAndSendData success, channelId=%{public}d", channelId);
1505 return SOFTBUS_OK;
1506 }
1507
TransProxyChannelSendBytes(int32_t channelId,const void * data,uint32_t len,bool needAck)1508 int32_t TransProxyChannelSendBytes(int32_t channelId, const void *data, uint32_t len, bool needAck)
1509 {
1510 if (data == NULL) {
1511 return SOFTBUS_INVALID_PARAM;
1512 }
1513 ProxyChannelInfoDetail info;
1514 int32_t ret = ClientTransProxyGetInfoByChannelId(channelId, &info);
1515 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "get info fail!");
1516
1517 if (!info.isEncrypted) {
1518 ret = ServerIpcSendMessage(channelId, CHANNEL_TYPE_PROXY, data, len, TRANS_SESSION_BYTES);
1519 TRANS_LOGI(TRANS_SDK, "send bytes: channelId=%{public}d, ret=%{public}d", channelId, ret);
1520 return ret;
1521 }
1522 if (needAck) {
1523 ret = AddPendingPacket(channelId, info.sequence, PENDING_TYPE_PROXY);
1524 if (ret != SOFTBUS_OK) {
1525 TRANS_LOGE(TRANS_SDK, "add pending packet failed, channelId=%{public}d.", channelId);
1526 return ret;
1527 }
1528 ret = TransProxyPackAndSendData(channelId, data, len, &info, TRANS_SESSION_BYTES);
1529 if (ret != SOFTBUS_OK) {
1530 DelPendingPacketbyChannelId(channelId, info.sequence, PENDING_TYPE_PROXY);
1531 return ret;
1532 }
1533 TRANS_LOGI(TRANS_SDK, "send msg: channelId=%{public}d, seq=%{public}d", channelId, info.sequence);
1534 return ProcPendingPacket(channelId, info.sequence, PENDING_TYPE_PROXY);
1535 }
1536 return TransProxyPackAndSendData(channelId, data, len, &info, TRANS_SESSION_BYTES);
1537 }
1538
TransProxyAsyncPackAndSendData(int32_t channelId,const void * data,uint32_t len,uint32_t dataSeq,SessionPktType pktType)1539 int32_t TransProxyAsyncPackAndSendData(
1540 int32_t channelId, const void *data, uint32_t len, uint32_t dataSeq, SessionPktType pktType)
1541 {
1542 if (data == NULL) {
1543 return SOFTBUS_INVALID_PARAM;
1544 }
1545 ProxyChannelInfoDetail info;
1546 int32_t ret = ClientTransProxyGetInfoByChannelId(channelId, &info);
1547 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "get info fail");
1548
1549 ClientProxyDataInfo dataInfo = { (uint8_t *)data, len, (uint8_t *)data, len };
1550 ret = ClientTransProxyPackTlvBytes(channelId, &dataInfo, &info, dataSeq, pktType);
1551 if (ret != SOFTBUS_OK) {
1552 TRANS_LOGE(TRANS_SDK, "ClientTransProxyPackTlvBytes error, channelId=%{public}d", channelId);
1553 return ret;
1554 }
1555
1556 uint32_t sliceNum = (dataInfo.outLen + (uint32_t)(SLICE_LEN - 1)) / (uint32_t)SLICE_LEN;
1557 if (sliceNum > INT32_MAX) {
1558 TRANS_LOGE(TRANS_FILE, "Data overflow, sliceNum=%{public}u, channelId=%{public}d", sliceNum, channelId);
1559 return SOFTBUS_INVALID_NUM;
1560 }
1561 for (uint32_t i = 0; i < sliceNum; i++) {
1562 uint32_t dataLen = (i == (sliceNum - 1U)) ? (dataInfo.outLen - i * SLICE_LEN) : SLICE_LEN;
1563 int32_t offset = (int32_t)(i * SLICE_LEN);
1564
1565 uint8_t *sliceData = (uint8_t *)SoftBusCalloc(dataLen + sizeof(SliceHead));
1566 if (sliceData == NULL) {
1567 TRANS_LOGE(TRANS_SDK, "malloc slice data error, channelId=%{public}d", channelId);
1568 return SOFTBUS_MALLOC_ERR;
1569 }
1570 SliceHead *slicehead = (SliceHead *)sliceData;
1571 slicehead->priority = SessionPktTypeToProxyIndex(pktType);
1572 slicehead->sliceNum = (int32_t)sliceNum;
1573 slicehead->sliceSeq = (int32_t)i;
1574 ClientPackSliceHead(slicehead);
1575 if (memcpy_s(sliceData + sizeof(SliceHead), dataLen, dataInfo.outData + offset, dataLen) != EOK) {
1576 TRANS_LOGE(TRANS_SDK, "memcpy_s error, channelId=%{public}d", channelId);
1577 SoftBusFree(sliceData);
1578 return SOFTBUS_MEM_ERR;
1579 }
1580
1581 int ret = ServerIpcSendMessage(channelId, CHANNEL_TYPE_PROXY, sliceData, dataLen + sizeof(SliceHead), pktType);
1582 if (ret != SOFTBUS_OK) {
1583 TRANS_LOGE(TRANS_SDK, "ServerIpcSendMessage error, channelId=%{public}d, ret=%{public}d", channelId, ret);
1584 SoftBusFree(sliceData);
1585 return ret;
1586 }
1587
1588 SoftBusFree(sliceData);
1589 }
1590 TRANS_LOGI(TRANS_SDK, "TransProxyAsyncPackAndSendData success, channelId=%{public}d", channelId);
1591 return SOFTBUS_OK;
1592 }
1593
TransProxyChannelAsyncSendBytes(int32_t channelId,const void * data,uint32_t len,uint32_t dataSeq)1594 int32_t TransProxyChannelAsyncSendBytes(int32_t channelId, const void *data, uint32_t len, uint32_t dataSeq)
1595 {
1596 if (data == NULL) {
1597 return SOFTBUS_INVALID_PARAM;
1598 }
1599 ProxyChannelInfoDetail info;
1600 int32_t ret = ClientTransProxyGetInfoByChannelId(channelId, &info);
1601 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "get info fail!");
1602
1603 if (!info.isEncrypted) {
1604 ret = ServerIpcSendMessage(channelId, CHANNEL_TYPE_PROXY, data, len, TRANS_SESSION_BYTES);
1605 TRANS_LOGI(TRANS_SDK, "send bytes: channelId=%{public}d, ret=%{public}d", channelId, ret);
1606 return ret;
1607 }
1608
1609 ret = TransProxyAsyncPackAndSendData(channelId, data, len, dataSeq, TRANS_SESSION_BYTES);
1610 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "proxy async send data fail!");
1611 int32_t socketId = 0;
1612 ret = ClientGetSessionIdByChannelId(channelId, CHANNEL_TYPE_PROXY, &socketId, false);
1613 if (ret != SOFTBUS_OK) {
1614 TRANS_LOGE(TRANS_SDK, "get sessionId fail, ret=%{public}d", ret);
1615 return ret;
1616 }
1617 ret = DataSeqInfoListAddItem(dataSeq, channelId, socketId, CHANNEL_TYPE_PROXY);
1618 if (ret != SOFTBUS_OK) {
1619 TRANS_LOGE(TRANS_SDK, "add dataSeqInfoList fail, ret=%{public}d", ret);
1620 return ret;
1621 }
1622 return SOFTBUS_OK;
1623 }
1624
TransProxyChannelSendMessage(int32_t channelId,const void * data,uint32_t len)1625 int32_t TransProxyChannelSendMessage(int32_t channelId, const void *data, uint32_t len)
1626 {
1627 ProxyChannelInfoDetail info;
1628 int32_t ret = ClientTransProxyGetInfoByChannelId(channelId, &info);
1629 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "get info fail!");
1630
1631 if (!info.isEncrypted) {
1632 // auth channel only can send bytes
1633 ret = ServerIpcSendMessage(channelId, CHANNEL_TYPE_PROXY, data, len, TRANS_SESSION_BYTES);
1634 TRANS_LOGI(TRANS_SDK, "send msg: channelId=%{public}d, ret=%{public}d", channelId, ret);
1635 return ret;
1636 }
1637
1638 ret = AddPendingPacket(channelId, info.sequence, PENDING_TYPE_PROXY);
1639 if (ret != SOFTBUS_OK) {
1640 TRANS_LOGE(TRANS_SDK, "add pending packet failed, channelId=%{public}d.", channelId);
1641 return ret;
1642 }
1643 ret = TransProxyPackAndSendData(channelId, data, len, &info, TRANS_SESSION_MESSAGE);
1644 if (ret != SOFTBUS_OK) {
1645 DelPendingPacketbyChannelId(channelId, info.sequence, PENDING_TYPE_PROXY);
1646 return ret;
1647 }
1648 TRANS_LOGI(TRANS_SDK, "send msg: channelId=%{public}d, seq=%{public}d", channelId, info.sequence);
1649 return ProcPendingPacket(channelId, info.sequence, PENDING_TYPE_PROXY);
1650 }
1651
ClientTransProxyOnChannelBind(int32_t channelId,int32_t channelType)1652 int32_t ClientTransProxyOnChannelBind(int32_t channelId, int32_t channelType)
1653 {
1654 if (g_sessionCb.OnChannelBind == NULL) {
1655 TRANS_LOGE(TRANS_SDK, "OnChannelBind is null, channelId=%{public}d.", channelId);
1656 return SOFTBUS_INVALID_PARAM;
1657 }
1658 int32_t ret = g_sessionCb.OnChannelBind(channelId, channelType);
1659 if (ret == SOFTBUS_NOT_NEED_UPDATE) {
1660 return SOFTBUS_OK;
1661 }
1662 if (ret != SOFTBUS_OK) {
1663 TRANS_LOGE(TRANS_SDK, "notify OnChannelBind openfail channelId=%{public}d.", channelId);
1664 return ret;
1665 }
1666
1667 return SOFTBUS_OK;
1668 }
1669