• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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