• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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_proxy_file_manager.h"
23 #include "client_trans_tcp_direct_message.h"
24 #include "softbus_adapter_mem.h"
25 #include "softbus_def.h"
26 #include "softbus_errcode.h"
27 #include "softbus_feature_config.h"
28 #include "softbus_utils.h"
29 #include "softbus_adapter_socket.h"
30 #include "softbus_adapter_crypto.h"
31 #include "trans_log.h"
32 #include "trans_server_proxy.h"
33 #include "trans_pending_pkt.h"
34 
35 #define SLICE_LEN (4 * 1024)
36 #define PROXY_ACK_SIZE 4
37 
38 static IClientSessionCallBack g_sessionCb;
39 static uint32_t g_proxyMaxByteBufSize;
40 static uint32_t g_proxyMaxMessageBufSize;
41 
42 static SoftBusList *g_proxyChannelInfoList = NULL;
43 static SoftBusList *g_channelSliceProcessorList = NULL;
44 
45 typedef struct {
46     int32_t priority;
47     int32_t sliceNum;
48     int32_t sliceSeq;
49     int32_t reserved;
50 } SliceHead;
51 
52 typedef struct {
53     int32_t magicNumber;
54     int32_t seq;
55     int32_t flags;
56     int32_t dataLen;
57 } PacketHead;
58 
59 typedef struct {
60     uint8_t *inData;
61     uint32_t inLen;
62     uint8_t *outData;
63     uint32_t outLen;
64 } ClientProxyDataInfo;
65 
ClientPackSliceHead(SliceHead * data)66 void ClientPackSliceHead(SliceHead *data)
67 {
68     data->priority = (int32_t)SoftBusHtoLl((uint32_t)data->priority);
69     data->sliceNum = (int32_t)SoftBusHtoLl((uint32_t)data->sliceNum);
70     data->sliceSeq = (int32_t)SoftBusHtoLl((uint32_t)data->sliceSeq);
71     data->reserved = (int32_t)SoftBusHtoLl((uint32_t)data->reserved);
72 }
73 
ClientUnPackSliceHead(SliceHead * data)74 void ClientUnPackSliceHead(SliceHead *data)
75 {
76     data->priority = (int32_t)SoftBusLtoHl((uint32_t)data->priority);
77     data->sliceNum = (int32_t)SoftBusLtoHl((uint32_t)data->sliceNum);
78     data->sliceSeq = (int32_t)SoftBusLtoHl((uint32_t)data->sliceSeq);
79     data->reserved = (int32_t)SoftBusLtoHl((uint32_t)data->reserved);
80 }
81 
ClientPackPacketHead(PacketHead * data)82 void ClientPackPacketHead(PacketHead *data)
83 {
84     data->magicNumber = (int32_t)SoftBusHtoLl((uint32_t)data->magicNumber);
85     data->seq = (int32_t)SoftBusHtoLl((uint32_t)data->seq);
86     data->flags = (int32_t)SoftBusHtoLl((uint32_t)data->flags);
87     data->dataLen = (int32_t)SoftBusHtoLl((uint32_t)data->dataLen);
88 }
89 
ClientUnPackPacketHead(PacketHead * data)90 void ClientUnPackPacketHead(PacketHead *data)
91 {
92     data->magicNumber = (int32_t)SoftBusLtoHl((uint32_t)data->magicNumber);
93     data->seq = (int32_t)SoftBusLtoHl((uint32_t)data->seq);
94     data->flags = (int32_t)SoftBusLtoHl((uint32_t)data->flags);
95     data->dataLen = (int32_t)SoftBusLtoHl((uint32_t)data->dataLen);
96 }
97 
98 static void ClientTransProxySliceTimerProc(void);
99 
ClientTransProxyListInit()100 static int32_t ClientTransProxyListInit()
101 {
102     g_proxyChannelInfoList = CreateSoftBusList();
103     if (g_proxyChannelInfoList == NULL) {
104         return SOFTBUS_ERR;
105     }
106     g_channelSliceProcessorList = CreateSoftBusList();
107     if (g_channelSliceProcessorList == NULL) {
108         DestroySoftBusList(g_proxyChannelInfoList);
109         return SOFTBUS_ERR;
110     }
111     if (RegisterTimeoutCallback(SOFTBUS_PROXYSLICE_TIMER_FUN, ClientTransProxySliceTimerProc) != SOFTBUS_OK) {
112         TRANS_LOGE(TRANS_INIT, "register timeout fail");
113         DestroySoftBusList(g_proxyChannelInfoList);
114         DestroySoftBusList(g_channelSliceProcessorList);
115         return SOFTBUS_ERR;
116     }
117     return SOFTBUS_OK;
118 }
119 
ClientTransProxyListDeinit(void)120 static void ClientTransProxyListDeinit(void)
121 {
122     if (g_proxyChannelInfoList != NULL) {
123         DestroySoftBusList(g_proxyChannelInfoList);
124         g_proxyChannelInfoList = NULL;
125     }
126     if (g_channelSliceProcessorList != NULL) {
127         DestroySoftBusList(g_channelSliceProcessorList);
128         g_channelSliceProcessorList = NULL;
129     }
130 }
131 
ClientTransProxyInit(const IClientSessionCallBack * cb)132 int32_t ClientTransProxyInit(const IClientSessionCallBack *cb)
133 {
134     if (cb == NULL) {
135         TRANS_LOGE(TRANS_INIT, "param is null!");
136         return SOFTBUS_INVALID_PARAM;
137     }
138 
139     g_sessionCb = *cb;
140     if (ClinetTransProxyFileManagerInit() != SOFTBUS_OK) {
141         TRANS_LOGE(TRANS_INIT, "ClinetTransProxyFileManagerInit init fail!");
142         return SOFTBUS_ERR;
143     }
144     if (ClientTransProxyListInit() != SOFTBUS_OK) {
145         TRANS_LOGE(TRANS_INIT, "ClinetTransProxyListInit init fail!");
146         return SOFTBUS_ERR;
147     }
148 
149     if (PendingInit(PENDING_TYPE_PROXY) == SOFTBUS_ERR) {
150         TRANS_LOGE(TRANS_INIT, "trans proxy pending init failed.");
151         return SOFTBUS_ERR;
152     }
153 
154     if (SoftbusGetConfig(SOFTBUS_INT_MAX_BYTES_NEW_LENGTH,
155         (unsigned char*)&g_proxyMaxByteBufSize, sizeof(g_proxyMaxByteBufSize)) != SOFTBUS_OK) {
156         TRANS_LOGE(TRANS_INIT, "get auth proxy channel max bytes length fail");
157     }
158     if (SoftbusGetConfig(SOFTBUS_INT_MAX_MESSAGE_NEW_LENGTH,
159         (unsigned char*)&g_proxyMaxMessageBufSize, sizeof(g_proxyMaxMessageBufSize)) != SOFTBUS_OK) {
160         TRANS_LOGE(TRANS_INIT, "get auth proxy channel max message length fail");
161     }
162     TRANS_LOGI(TRANS_INIT, "proxy auth byteSize=%{public}u, messageSize=%{public}u",
163         g_proxyMaxByteBufSize, g_proxyMaxMessageBufSize);
164     return SOFTBUS_OK;
165 }
166 
ClientTransProxyDeinit(void)167 void ClientTransProxyDeinit(void)
168 {
169     ClinetTransProxyFileManagerDeinit();
170     PendingDeinit(PENDING_TYPE_PROXY);
171     ClientTransProxyListDeinit();
172 }
173 
ClientTransProxyGetInfoByChannelId(int32_t channelId,ProxyChannelInfoDetail * info)174 int32_t ClientTransProxyGetInfoByChannelId(int32_t channelId, ProxyChannelInfoDetail *info)
175 {
176     if (info == NULL) {
177         TRANS_LOGE(TRANS_SDK, "param invalid.");
178         return SOFTBUS_INVALID_PARAM;
179     }
180     if (SoftBusMutexLock(&g_proxyChannelInfoList->lock) != SOFTBUS_OK) {
181         TRANS_LOGE(TRANS_SDK, "lock failed");
182         return SOFTBUS_LOCK_ERR;
183     }
184 
185     ClientProxyChannelInfo *item = NULL;
186     LIST_FOR_EACH_ENTRY(item, &(g_proxyChannelInfoList->list), ClientProxyChannelInfo, node) {
187         if (item->channelId == channelId) {
188             (void)memcpy_s(info, sizeof(ProxyChannelInfoDetail), &item->detail, sizeof(ProxyChannelInfoDetail));
189             item->detail.sequence++;
190             (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
191             return SOFTBUS_OK;
192         }
193     }
194 
195     (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
196     TRANS_LOGE(TRANS_SDK, "can not find proxy channelId=%{public}d", channelId);
197     return SOFTBUS_ERR;
198 }
199 
ClientTransProxyAddChannelInfo(ClientProxyChannelInfo * info)200 int32_t ClientTransProxyAddChannelInfo(ClientProxyChannelInfo *info)
201 {
202     if (info == NULL) {
203         TRANS_LOGE(TRANS_SDK, "param invalid.");
204         return SOFTBUS_INVALID_PARAM;
205     }
206     if (SoftBusMutexLock(&g_proxyChannelInfoList->lock) != SOFTBUS_OK) {
207         TRANS_LOGE(TRANS_SDK, "lock failed");
208         return SOFTBUS_LOCK_ERR;
209     }
210 
211     ClientProxyChannelInfo *item = NULL;
212     LIST_FOR_EACH_ENTRY(item, &(g_proxyChannelInfoList->list), ClientProxyChannelInfo, node) {
213         if (item->channelId == info->channelId) {
214             TRANS_LOGE(TRANS_SDK, "client is existed. channelId=%{public}d", item->channelId);
215             (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
216             return SOFTBUS_ERR;
217         }
218     }
219 
220     ListAdd(&g_proxyChannelInfoList->list, &info->node);
221     TRANS_LOGI(TRANS_SDK, "add channelId=%{public}d", info->channelId);
222     (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
223     return SOFTBUS_OK;
224 }
225 
ClientTransProxyDelChannelInfo(int32_t channelId)226 int32_t ClientTransProxyDelChannelInfo(int32_t channelId)
227 {
228     if (SoftBusMutexLock(&g_proxyChannelInfoList->lock) != SOFTBUS_OK) {
229         TRANS_LOGE(TRANS_SDK, "lock failed");
230         return SOFTBUS_LOCK_ERR;
231     }
232 
233     ClientProxyChannelInfo *item = NULL;
234     LIST_FOR_EACH_ENTRY(item, &(g_proxyChannelInfoList->list), ClientProxyChannelInfo, node) {
235         if (item->channelId == channelId) {
236             ListDelete(&item->node);
237             TRANS_LOGI(TRANS_SDK, "delete channelId=%{public}d", channelId);
238             SoftBusFree(item);
239             DelPendingPacket(channelId, PENDING_TYPE_PROXY);
240             (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
241             return SOFTBUS_OK;
242         }
243     }
244 
245     (void)SoftBusMutexUnlock(&g_proxyChannelInfoList->lock);
246     TRANS_LOGE(TRANS_SDK, "can not find proxy channelId=%{public}d", channelId);
247     return SOFTBUS_ERR;
248 }
249 
ClientTransProxyCreateChannelInfo(const ChannelInfo * channel)250 static ClientProxyChannelInfo* ClientTransProxyCreateChannelInfo(const ChannelInfo *channel)
251 {
252     ClientProxyChannelInfo *info = (ClientProxyChannelInfo*)SoftBusMalloc(sizeof(ClientProxyChannelInfo));
253     if (info == NULL) {
254         TRANS_LOGE(TRANS_SDK, "info is null");
255         return NULL;
256     }
257     if (memcpy_s(info->detail.sessionKey, SESSION_KEY_LENGTH, channel->sessionKey, SESSION_KEY_LENGTH) != EOK) {
258         SoftBusFree(info);
259         TRANS_LOGE(TRANS_SDK, "sessionKey memcpy fail");
260         return NULL;
261     }
262     info->channelId = channel->channelId;
263     info->detail.isEncrypted = channel->isEncrypt;
264     info->detail.sequence = 0;
265     return info;
266 }
267 
ClientTransProxyOnChannelOpened(const char * sessionName,const ChannelInfo * channel)268 int32_t ClientTransProxyOnChannelOpened(const char *sessionName, const ChannelInfo *channel)
269 {
270     if (sessionName == NULL || channel == NULL) {
271         TRANS_LOGW(TRANS_SDK, "invalid param.");
272         return SOFTBUS_INVALID_PARAM;
273     }
274     int ret = ClientTransProxyAddChannelInfo(ClientTransProxyCreateChannelInfo(channel));
275     if (ret != SOFTBUS_OK) {
276         TRANS_LOGE(TRANS_SDK, "ClientTransProxyAddChannelInfo fail");
277         return ret;
278     }
279 
280     ret = g_sessionCb.OnSessionOpened(sessionName, channel, TYPE_MESSAGE);
281     if (ret != SOFTBUS_OK) {
282         (void)ClientTransProxyDelChannelInfo(channel->channelId);
283         char *tmpName = NULL;
284         Anonymize(sessionName, &tmpName);
285         TRANS_LOGE(TRANS_SDK, "notify session open fail, sessionName=%{public}s.", tmpName);
286         AnonymizeFree(tmpName);
287         return ret;
288     }
289     return SOFTBUS_OK;
290 }
291 
292 int32_t TransProxyDelSliceProcessorByChannelId(int32_t channelId);
293 
ClientTransProxyOnChannelClosed(int32_t channelId,ShutdownReason reason)294 int32_t ClientTransProxyOnChannelClosed(int32_t channelId, ShutdownReason reason)
295 {
296     (void)ClientTransProxyDelChannelInfo(channelId);
297     (void)TransProxyDelSliceProcessorByChannelId(channelId);
298 
299     int ret = g_sessionCb.OnSessionClosed(channelId, CHANNEL_TYPE_PROXY, reason);
300     if (ret != SOFTBUS_OK) {
301         TRANS_LOGE(TRANS_SDK, "notify session closed errCode=%{public}d, channelId=%{public}d.", ret, channelId);
302         return ret;
303     }
304     return SOFTBUS_OK;
305 }
306 
ClientTransProxyOnChannelOpenFailed(int32_t channelId,int32_t errCode)307 int32_t ClientTransProxyOnChannelOpenFailed(int32_t channelId, int32_t errCode)
308 {
309     int ret = g_sessionCb.OnSessionOpenFailed(channelId, CHANNEL_TYPE_PROXY, errCode);
310     if (ret != SOFTBUS_OK) {
311         TRANS_LOGE(TRANS_SDK,
312             "notify session openfail errCode=%{public}d, channelId=%{public}d.", errCode, channelId);
313         return ret;
314     }
315 
316     return SOFTBUS_OK;
317 }
318 
ClientTransProxySessionDataLenCheck(uint32_t dataLen,SessionPktType type)319 int32_t ClientTransProxySessionDataLenCheck(uint32_t dataLen, SessionPktType type)
320 {
321     switch (type) {
322         case TRANS_SESSION_MESSAGE:
323         case TRANS_SESSION_ASYNC_MESSAGE: {
324             if (dataLen > g_proxyMaxMessageBufSize) {
325                 return SOFTBUS_ERR;
326             }
327             break;
328         }
329         case TRANS_SESSION_BYTES: {
330             if (dataLen > g_proxyMaxByteBufSize) {
331                 return SOFTBUS_ERR;
332             }
333             break;
334         }
335         default: {
336             return SOFTBUS_OK;
337         }
338     }
339     return SOFTBUS_OK;
340 }
341 
ClientTransProxyDecryptPacketData(int32_t channelId,int32_t seq,ClientProxyDataInfo * dataInfo)342 static int32_t ClientTransProxyDecryptPacketData(int32_t channelId, int32_t seq, ClientProxyDataInfo *dataInfo)
343 {
344     ProxyChannelInfoDetail info;
345     if (ClientTransProxyGetInfoByChannelId(channelId, &info) != SOFTBUS_OK) {
346         return SOFTBUS_ERR;
347     }
348     AesGcmCipherKey cipherKey = {0};
349     cipherKey.keyLen = SESSION_KEY_LENGTH;
350     if (memcpy_s(cipherKey.key, SESSION_KEY_LENGTH, info.sessionKey, SESSION_KEY_LENGTH) != EOK) {
351         TRANS_LOGE(TRANS_SDK, "memcpy key error.");
352         return SOFTBUS_ERR;
353     }
354     int32_t ret = SOFTBUS_ERR;
355     ret = SoftBusDecryptDataWithSeq(&cipherKey, dataInfo->inData, dataInfo->inLen,
356         dataInfo->outData, &(dataInfo->outLen), seq);
357     (void)memset_s(&cipherKey, sizeof(AesGcmCipherKey), 0, sizeof(AesGcmCipherKey));
358     if (ret != SOFTBUS_OK) {
359         TRANS_LOGE(TRANS_SDK, "trans proxy Decrypt Data fail. ret=%{public}d ", ret);
360         return SOFTBUS_ERR;
361     }
362 
363     return SOFTBUS_OK;
364 }
365 
ClientTransProxyCheckSliceHead(const SliceHead * head)366 static int32_t ClientTransProxyCheckSliceHead(const SliceHead *head)
367 {
368     if (head == NULL) {
369         TRANS_LOGW(TRANS_SDK, "invalid param.");
370         return SOFTBUS_ERR;
371     }
372     if (head->priority < 0 || head->priority >= PROXY_CHANNEL_PRORITY_BUTT) {
373         TRANS_LOGE(TRANS_SDK, "invalid index=%{public}d", head->priority);
374         return SOFTBUS_ERR;
375     }
376 
377     if (head->sliceNum != 1 && head->sliceSeq >= head->sliceNum) {
378         TRANS_LOGE(TRANS_SDK, "sliceNum=%{public}d, sliceSeq=%{public}d", head->sliceNum, head->sliceSeq);
379         return SOFTBUS_ERR;
380     }
381 
382     return SOFTBUS_OK;
383 }
384 
385 int32_t TransProxyPackAndSendData(int32_t channelId, const void *data, uint32_t len,
386     ProxyChannelInfoDetail* info, SessionPktType pktType);
387 
ClientTransProxySendSessionAck(int32_t channelId,int32_t seq)388 static void ClientTransProxySendSessionAck(int32_t channelId, int32_t seq)
389 {
390     unsigned char ack[PROXY_ACK_SIZE] = {0};
391     if (memcpy_s(ack, PROXY_ACK_SIZE, &seq, sizeof(int32_t)) != EOK) {
392         TRANS_LOGE(TRANS_SDK, "memcpy seq err");
393         return;
394     }
395 
396     ProxyChannelInfoDetail info;
397     if (ClientTransProxyGetInfoByChannelId(channelId, &info) != SOFTBUS_OK) {
398         TRANS_LOGE(TRANS_SDK, "get proxy info err, channelId=%{public}d", channelId);
399         return;
400     }
401     info.sequence = seq;
402     if (TransProxyPackAndSendData(channelId, ack, PROXY_ACK_SIZE, &info, TRANS_SESSION_ACK) != SOFTBUS_OK) {
403         TRANS_LOGE(TRANS_SDK, "send ack err, seq=%{public}d", seq);
404     }
405 }
406 
ClientTransProxyProcSendMsgAck(int32_t channelId,const char * data,int32_t len)407 static int32_t ClientTransProxyProcSendMsgAck(int32_t channelId, const char *data, int32_t len)
408 {
409     if (len != PROXY_ACK_SIZE) {
410         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
411     }
412     if (data == NULL) {
413         return SOFTBUS_ERR;
414     }
415     int32_t seq = *(int32_t *)data;
416     TRANS_LOGI(TRANS_SDK, "ClientTransProxyProcSendMsgAck. channelId=%{public}d, seq=%{public}d",
417         channelId, seq);
418     return SetPendingPacket(channelId, seq, PENDING_TYPE_PROXY);
419 }
420 
ClientTransProxyNotifySession(int32_t channelId,SessionPktType flags,int32_t seq,const char * data,uint32_t len)421 int32_t ClientTransProxyNotifySession(int32_t channelId,
422     SessionPktType flags, int32_t seq, const char *data, uint32_t len)
423 {
424     switch (flags) {
425         case TRANS_SESSION_MESSAGE:
426             ClientTransProxySendSessionAck(channelId, seq);
427             return g_sessionCb.OnDataReceived(channelId, CHANNEL_TYPE_PROXY, data, len, flags);
428         case TRANS_SESSION_ACK:
429             return (int32_t)(ClientTransProxyProcSendMsgAck(channelId, data, len));
430         case TRANS_SESSION_BYTES:
431         case TRANS_SESSION_FILE_FIRST_FRAME:
432         case TRANS_SESSION_FILE_ONGOINE_FRAME:
433         case TRANS_SESSION_FILE_LAST_FRAME:
434         case TRANS_SESSION_FILE_ONLYONE_FRAME:
435         case TRANS_SESSION_FILE_ALLFILE_SENT:
436         case TRANS_SESSION_FILE_CRC_CHECK_FRAME:
437         case TRANS_SESSION_FILE_RESULT_FRAME:
438         case TRANS_SESSION_FILE_ACK_REQUEST_SENT:
439         case TRANS_SESSION_FILE_ACK_RESPONSE_SENT:
440         case TRANS_SESSION_ASYNC_MESSAGE:
441             return g_sessionCb.OnDataReceived(channelId, CHANNEL_TYPE_PROXY, data, len, flags);
442         default:
443             TRANS_LOGE(TRANS_SDK, "invalid flags=%{public}d", flags);
444             return SOFTBUS_INVALID_PARAM;
445     }
446 }
447 
ClientTransProxyProcessSessionData(int32_t channelId,const PacketHead * dataHead,const char * data)448 static int32_t ClientTransProxyProcessSessionData(int32_t channelId, const PacketHead *dataHead, const char *data)
449 {
450     ClientProxyDataInfo dataInfo = {0};
451     uint32_t outLen = 0;
452     int32_t ret = SOFTBUS_ERR;
453 
454     if (dataHead->dataLen <= OVERHEAD_LEN) {
455         TRANS_LOGE(TRANS_SDK, "invalid data head dataLen=%{public}d", dataHead->dataLen);
456         return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
457     }
458 
459     outLen = dataHead->dataLen - OVERHEAD_LEN;
460     dataInfo.outData = (unsigned char *)SoftBusCalloc(outLen);
461     if (dataInfo.outData == NULL) {
462         TRANS_LOGE(TRANS_SDK, "malloc fail when process session out data.");
463         return SOFTBUS_MALLOC_ERR;
464     }
465     dataInfo.inData = (unsigned char *)data;
466     dataInfo.inLen = dataHead->dataLen;
467     dataInfo.outLen = outLen;
468 
469     ret = ClientTransProxyDecryptPacketData(channelId, dataHead->seq, &dataInfo);
470     if (ret != SOFTBUS_OK) {
471         TRANS_LOGE(TRANS_SDK, "decrypt err");
472         SoftBusFree(dataInfo.outData);
473         return SOFTBUS_DECRYPT_ERR;
474     }
475 
476     if (ClientTransProxySessionDataLenCheck(dataInfo.outLen, (SessionPktType)(dataHead->flags)) != SOFTBUS_OK) {
477         TRANS_LOGE(TRANS_SDK, "data len is too large outlen=%{public}d, flags=%{public}d",
478             dataInfo.outLen, dataHead->flags);
479         SoftBusFree(dataInfo.outData);
480         return SOFTBUS_ERR;
481     }
482 
483     TRANS_LOGD(TRANS_SDK, "ProcessData debug: outlen=%{public}d", dataInfo.outLen);
484     if (ClientTransProxyNotifySession(channelId, (SessionPktType)dataHead->flags, dataHead->seq,
485         (const char *)dataInfo.outData, dataInfo.outLen) != SOFTBUS_OK) {
486         TRANS_LOGE(TRANS_SDK, "process data err");
487         SoftBusFree(dataInfo.outData);
488         return SOFTBUS_ERR;
489     }
490     SoftBusFree(dataInfo.outData);
491     return SOFTBUS_OK;
492 }
493 
ClientTransProxyNoSubPacketProc(int32_t channelId,const char * data,uint32_t len)494 static int32_t ClientTransProxyNoSubPacketProc(int32_t channelId, const char *data, uint32_t len)
495 {
496     PacketHead head;
497     if (memcpy_s(&head, sizeof(PacketHead), data, sizeof(PacketHead)) != EOK) {
498         TRANS_LOGE(TRANS_SDK, "memcpy packetHead failed");
499         return SOFTBUS_MEM_ERR;
500     }
501     ClientUnPackPacketHead(&head);
502     if ((uint32_t)head.magicNumber != MAGIC_NUMBER) {
503         TRANS_LOGE(TRANS_SDK, "invalid magicNumber=%{public}x", head.magicNumber);
504         return SOFTBUS_ERR;
505     }
506     if (head.dataLen <= 0) {
507         TRANS_LOGE(TRANS_SDK, "invalid dataLen=%{public}d", head.dataLen);
508         return SOFTBUS_ERR;
509     }
510     TRANS_LOGD(TRANS_SDK, "NoSubPacketProc dataLen=%{public}d, inputLen=%{public}d", head.dataLen, len);
511     if (head.dataLen + sizeof(PacketHead) != len) {
512         TRANS_LOGE(TRANS_SDK, "dataLen error");
513         return SOFTBUS_ERR;
514     }
515     int32_t ret = ClientTransProxyProcessSessionData(channelId, &head, data + sizeof(PacketHead));
516     if (ret != SOFTBUS_OK) {
517         TRANS_LOGE(TRANS_SDK, "process data err");
518         return SOFTBUS_ERR;
519     }
520     return SOFTBUS_OK;
521 }
522 
ClientTransProxyGetChannelSliceProcessor(int32_t channelId)523 static ChannelSliceProcessor *ClientTransProxyGetChannelSliceProcessor(int32_t channelId)
524 {
525     ChannelSliceProcessor *processor = NULL;
526     LIST_FOR_EACH_ENTRY(processor, &g_channelSliceProcessorList->list, ChannelSliceProcessor, head) {
527         if (processor->channelId == channelId) {
528             return processor;
529         }
530     }
531 
532     ChannelSliceProcessor *node = (ChannelSliceProcessor *)SoftBusCalloc(sizeof(ChannelSliceProcessor));
533     if (node == NULL) {
534         TRANS_LOGE(TRANS_SDK, "calloc err");
535         return NULL;
536     }
537     node->channelId = channelId;
538     ListInit(&(node->head));
539     ListAdd(&(g_channelSliceProcessorList->list), &(node->head));
540     g_channelSliceProcessorList->cnt++;
541     TRANS_LOGI(TRANS_SDK, "add new node, channelId=%{public}d", channelId);
542     return node;
543 }
544 
ClientTransProxyClearProcessor(SliceProcessor * processor)545 static void ClientTransProxyClearProcessor(SliceProcessor *processor)
546 {
547     if (processor->data != NULL) {
548         TRANS_LOGE(TRANS_SDK, "slice processor data not null");
549         SoftBusFree(processor->data);
550         processor->data = NULL;
551     }
552     processor->active = false;
553     processor->bufLen = 0;
554     processor->dataLen = 0;
555     processor->expectedSeq = 0;
556     processor->sliceNumber = 0;
557     processor->timeout = 0;
558 }
559 
TransProxyDelSliceProcessorByChannelId(int32_t channelId)560 int32_t TransProxyDelSliceProcessorByChannelId(int32_t channelId)
561 {
562     ChannelSliceProcessor *node = NULL;
563     ChannelSliceProcessor *next = NULL;
564 
565     if (g_channelSliceProcessorList == NULL) {
566         TRANS_LOGE(TRANS_INIT, "not init");
567         return SOFTBUS_NO_INIT;
568     }
569     if (SoftBusMutexLock(&g_channelSliceProcessorList->lock) != 0) {
570         TRANS_LOGE(TRANS_SDK, "lock err");
571         return SOFTBUS_ERR;
572     }
573     LIST_FOR_EACH_ENTRY_SAFE(node, next, &g_channelSliceProcessorList->list, ChannelSliceProcessor, head) {
574         if (node->channelId == channelId) {
575             for (int i = PROXY_CHANNEL_PRORITY_MESSAGE; i < PROXY_CHANNEL_PRORITY_BUTT; i++) {
576                 ClientTransProxyClearProcessor(&(node->processor[i]));
577             }
578             ListDelete(&(node->head));
579             TRANS_LOGI(TRANS_SDK, "delete channelId=%{public}d", channelId);
580             SoftBusFree(node);
581             g_channelSliceProcessorList->cnt--;
582             (void)SoftBusMutexUnlock(&g_channelSliceProcessorList->lock);
583             return SOFTBUS_OK;
584         }
585     }
586     (void)SoftBusMutexUnlock(&g_channelSliceProcessorList->lock);
587     return SOFTBUS_OK;
588 }
589 
ClientTransProxySliceProcessChkPkgIsValid(const SliceProcessor * processor,const SliceHead * head,const char * data,uint32_t len)590 static int32_t ClientTransProxySliceProcessChkPkgIsValid(const SliceProcessor *processor, const SliceHead *head,
591     const char *data, uint32_t len)
592 {
593     (void)data;
594     if (head->sliceNum != processor->sliceNumber ||
595         head->sliceSeq != processor->expectedSeq) {
596         TRANS_LOGE(TRANS_SDK, "unmatched normal slice received");
597         return SOFTBUS_TRANS_PROXY_ASSEMBLE_PACK_NO_INVALID;
598     }
599     if ((int32_t)len + processor->dataLen > processor->bufLen) {
600         TRANS_LOGE(TRANS_SDK, "data len invalid");
601         return SOFTBUS_TRANS_PROXY_ASSEMBLE_PACK_EXCEED_LENGTH;
602     }
603     if (processor->data == NULL) {
604         TRANS_LOGE(TRANS_SDK, "data NULL");
605         return SOFTBUS_TRANS_PROXY_ASSEMBLE_PACK_DATA_NULL;
606     }
607     return SOFTBUS_OK;
608 }
609 
ClientTransProxyFirstSliceProcess(SliceProcessor * processor,const SliceHead * head,const char * data,uint32_t len)610 static int32_t ClientTransProxyFirstSliceProcess(SliceProcessor *processor, const SliceHead *head,
611     const char *data, uint32_t len)
612 {
613     ClientTransProxyClearProcessor(processor);
614 
615     uint32_t maxDataLen = (head->priority == PROXY_CHANNEL_PRORITY_MESSAGE) ?
616         g_proxyMaxMessageBufSize : g_proxyMaxByteBufSize;
617     uint32_t maxLen = maxDataLen + sizeof(PacketHead) + OVERHEAD_LEN;
618     processor->data = (char *)SoftBusCalloc(maxLen);
619     if (processor->data == NULL) {
620         TRANS_LOGE(TRANS_SDK, "malloc fail when proc first slice package");
621         return SOFTBUS_MALLOC_ERR;
622     }
623     processor->bufLen = (int32_t)maxLen;
624     if (memcpy_s(processor->data, maxLen, data, len) != EOK) {
625         TRANS_LOGE(TRANS_SDK, "memcpy fail when proc first slice package");
626         SoftBusFree(processor->data);
627         processor->data = NULL;
628         return SOFTBUS_SLICE_ERROR;
629     }
630     processor->sliceNumber = head->sliceNum;
631     processor->expectedSeq = 1;
632     processor->dataLen = (int32_t)len;
633     processor->active = true;
634     processor->timeout = 0;
635 
636     TRANS_LOGI(TRANS_SDK, "FirstSliceProcess ok");
637     return SOFTBUS_OK;
638 }
639 
ClientTransProxyLastSliceProcess(SliceProcessor * processor,const SliceHead * head,const char * data,uint32_t len,int32_t channelId)640 static int32_t ClientTransProxyLastSliceProcess(SliceProcessor *processor, const SliceHead *head,
641     const char *data, uint32_t len, int32_t channelId)
642 {
643     int32_t ret = ClientTransProxySliceProcessChkPkgIsValid(processor, head, data, len);
644     if (ret != SOFTBUS_OK) {
645         return ret;
646     }
647     if (memcpy_s(processor->data + processor->dataLen,
648         (uint32_t)(processor->bufLen - processor->dataLen), data, len) != EOK) {
649         TRANS_LOGE(TRANS_SDK, "memcpy fail when proc last slice");
650         return SOFTBUS_MEM_ERR;
651     }
652     processor->expectedSeq++;
653     processor->dataLen += (int32_t)len;
654 
655     ret = ClientTransProxyNoSubPacketProc(channelId, processor->data, (uint32_t)processor->dataLen);
656     if (ret != SOFTBUS_OK) {
657         TRANS_LOGE(TRANS_SDK, "process packets err");
658         return ret;
659     }
660     ClientTransProxyClearProcessor(processor);
661     TRANS_LOGI(TRANS_SDK, "LastSliceProcess ok");
662     return ret;
663 }
664 
ClientTransProxyNormalSliceProcess(SliceProcessor * processor,const SliceHead * head,const char * data,uint32_t len)665 static int32_t ClientTransProxyNormalSliceProcess(SliceProcessor *processor, const SliceHead *head,
666     const char *data, uint32_t len)
667 {
668     int32_t ret = ClientTransProxySliceProcessChkPkgIsValid(processor, head, data, len);
669     if (ret != SOFTBUS_OK) {
670         return ret;
671     }
672     if (memcpy_s(processor->data + processor->dataLen,
673         (uint32_t)(processor->bufLen - processor->dataLen), data, len) != EOK) {
674         TRANS_LOGE(TRANS_SDK, "memcpy fail when proc normal slice");
675         return SOFTBUS_MEM_ERR;
676     }
677     processor->expectedSeq++;
678     processor->dataLen += (int32_t)len;
679     processor->timeout = 0;
680     TRANS_LOGI(TRANS_SDK, "NormalSliceProcess ok");
681     return ret;
682 }
683 
ClientTransProxySubPacketProc(int32_t channelId,const SliceHead * head,const char * data,uint32_t len)684 static int ClientTransProxySubPacketProc(int32_t channelId,
685     const SliceHead *head, const char *data, uint32_t len)
686 {
687     if (g_channelSliceProcessorList == NULL) {
688         TRANS_LOGE(TRANS_SDK, "TransProxySubPacketProc not init");
689         return SOFTBUS_NO_INIT;
690     }
691     if (SoftBusMutexLock(&g_channelSliceProcessorList->lock) != 0) {
692         TRANS_LOGE(TRANS_SDK, "lock err");
693         return SOFTBUS_ERR;
694     }
695 
696     ChannelSliceProcessor *channelProcessor = ClientTransProxyGetChannelSliceProcessor(channelId);
697     if (channelProcessor == NULL) {
698         SoftBusMutexUnlock(&g_channelSliceProcessorList->lock);
699         return SOFTBUS_ERR;
700     }
701 
702     int ret;
703     int32_t index = head->priority;
704     SliceProcessor *processor = &(channelProcessor->processor[index]);
705     if (head->sliceSeq == 0) {
706         ret = ClientTransProxyFirstSliceProcess(processor, head, data, len);
707     } else if (head->sliceNum == head->sliceSeq + 1) {
708         ret = ClientTransProxyLastSliceProcess(processor, head, data, len, channelId);
709     } else {
710         ret = ClientTransProxyNormalSliceProcess(processor, head, data, len);
711     }
712 
713     SoftBusMutexUnlock(&g_channelSliceProcessorList->lock);
714     TRANS_LOGI(TRANS_SDK, "Proxy SubPacket Proc end");
715     if (ret != SOFTBUS_OK) {
716         ClientTransProxyClearProcessor(processor);
717     }
718     return ret;
719 }
720 
ClientTransProxySliceProc(int32_t channelId,const char * data,uint32_t len)721 static int32_t ClientTransProxySliceProc(int32_t channelId, const char *data, uint32_t len)
722 {
723     if (data == NULL || len <= sizeof(SliceHead)) {
724         TRANS_LOGE(TRANS_SDK, "data null or len error. len=%{public}d", len);
725         return SOFTBUS_ERR;
726     }
727 
728     SliceHead headSlice = *(SliceHead *)data;
729     ClientUnPackSliceHead(&headSlice);
730     if (ClientTransProxyCheckSliceHead(&headSlice)) {
731         TRANS_LOGE(TRANS_SDK, "invalid slihead");
732         return SOFTBUS_TRANS_PROXY_INVALID_SLICE_HEAD;
733     }
734 
735     uint32_t dataLen = len - sizeof(SliceHead);
736     if (headSlice.sliceNum == 1) { // no sub packets
737         TRANS_LOGI(TRANS_SDK, "no sub packets proc, channelId=%{public}d", channelId);
738         return ClientTransProxyNoSubPacketProc(channelId, data + sizeof(SliceHead), dataLen);
739     } else {
740         TRANS_LOGI(TRANS_SDK, "sub packets proc sliceNum=%{public}d", headSlice.sliceNum);
741         return ClientTransProxySubPacketProc(channelId, &headSlice, data + sizeof(SliceHead), dataLen);
742     }
743 }
744 
ClientTransProxySliceTimerProc(void)745 static void ClientTransProxySliceTimerProc(void)
746 {
747 #define SLICE_PACKET_TIMEOUT 10 // 10s
748     ChannelSliceProcessor *removeNode = NULL;
749     ChannelSliceProcessor *nextNode = NULL;
750 
751     if (g_channelSliceProcessorList == NULL || g_channelSliceProcessorList->cnt == 0) {
752         return;
753     }
754     if (SoftBusMutexLock(&g_channelSliceProcessorList->lock) != 0) {
755         TRANS_LOGE(TRANS_SDK, "TransProxySliceTimerProc lock mutex fail!");
756         return;
757     }
758 
759     LIST_FOR_EACH_ENTRY_SAFE(removeNode, nextNode, &g_channelSliceProcessorList->list, ChannelSliceProcessor, head) {
760         for (int i = PROXY_CHANNEL_PRORITY_MESSAGE; i < PROXY_CHANNEL_PRORITY_BUTT; i++) {
761             if (removeNode->processor[i].active == true) {
762                 removeNode->processor[i].timeout++;
763                 if (removeNode->processor[i].timeout >= SLICE_PACKET_TIMEOUT) {
764                     TRANS_LOGE(TRANS_SDK, "timeout=%{public}d", removeNode->processor[i].timeout);
765                     ClientTransProxyClearProcessor(&removeNode->processor[i]);
766                 }
767             }
768         }
769     }
770     (void)SoftBusMutexUnlock(&g_channelSliceProcessorList->lock);
771     return;
772 }
773 
ClientTransProxyOnDataReceived(int32_t channelId,const void * data,uint32_t len,SessionPktType type)774 int32_t ClientTransProxyOnDataReceived(int32_t channelId,
775     const void *data, uint32_t len, SessionPktType type)
776 {
777     (void)type;
778     if (data == NULL) {
779         TRANS_LOGE(TRANS_SDK,
780             "ClientTransProxyOnDataReceived data null. channelId=%{public}d", channelId);
781         return SOFTBUS_INVALID_PARAM;
782     }
783 
784     ProxyChannelInfoDetail info;
785     if (ClientTransProxyGetInfoByChannelId(channelId, &info) != SOFTBUS_OK) {
786         return SOFTBUS_ERR;
787     }
788     if (!info.isEncrypted) {
789         return g_sessionCb.OnDataReceived(channelId, CHANNEL_TYPE_PROXY, data, len, TRANS_SESSION_BYTES);
790     }
791 
792     return ClientTransProxySliceProc(channelId, data, len);
793 }
794 
ClientTransProxyCloseChannel(int32_t channelId)795 void ClientTransProxyCloseChannel(int32_t channelId)
796 {
797     (void)ClientTransProxyDelChannelInfo(channelId);
798     (void)TransProxyDelSliceProcessorByChannelId(channelId);
799     TRANS_LOGI(TRANS_SDK, "TransCloseProxyChannel, channelId=%{public}d", channelId);
800     if (ServerIpcCloseChannel(channelId, CHANNEL_TYPE_PROXY) != SOFTBUS_OK) {
801         TRANS_LOGE(TRANS_SDK, "server close err. channelId=%{public}d", channelId);
802     }
803 }
804 
ClientTransProxyEncryptWithSeq(const char * sessionKey,int32_t seqNum,const char * in,uint32_t inLen,char * out,uint32_t * outLen)805 static int32_t ClientTransProxyEncryptWithSeq(const char *sessionKey, int32_t seqNum, const char *in,
806     uint32_t inLen, char *out, uint32_t *outLen)
807 {
808     AesGcmCipherKey cipherKey = {0};
809     cipherKey.keyLen = SESSION_KEY_LENGTH;
810     if (memcpy_s(cipherKey.key, SESSION_KEY_LENGTH, sessionKey, SESSION_KEY_LENGTH) != EOK) {
811         TRANS_LOGE(TRANS_SDK, "memcpy key error.");
812         return SOFTBUS_ERR;
813     }
814 
815     int ret = SoftBusEncryptDataWithSeq(&cipherKey, (unsigned char*)in, inLen, (unsigned char*)out, outLen, seqNum);
816     (void)memset_s(cipherKey.key, SESSION_KEY_LENGTH, 0, SESSION_KEY_LENGTH);
817 
818     if (ret != SOFTBUS_OK || *outLen != inLen + OVERHEAD_LEN) {
819         TRANS_LOGE(TRANS_SDK, "encrypt error.");
820         return SOFTBUS_ENCRYPT_ERR;
821     }
822     return SOFTBUS_OK;
823 }
824 
ClientTransProxyPackBytes(int32_t channelId,ClientProxyDataInfo * dataInfo,int seq,char * sessionKey,SessionPktType flag)825 static int32_t ClientTransProxyPackBytes(int32_t channelId, ClientProxyDataInfo *dataInfo, int seq,
826     char* sessionKey, SessionPktType flag)
827 {
828 #define MAGIC_NUMBER 0xBABEFACE
829     if (dataInfo == NULL) {
830         return SOFTBUS_ERR;
831     }
832     dataInfo->outLen = dataInfo->inLen + OVERHEAD_LEN + sizeof(PacketHead);
833     dataInfo->outData = SoftBusCalloc(dataInfo->outLen);
834     if (dataInfo->outData == NULL) {
835         TRANS_LOGE(TRANS_SDK, "calloc error");
836         return SOFTBUS_MEM_ERR;
837     }
838 
839     uint32_t outLen = 0;
840     if (ClientTransProxyEncryptWithSeq(sessionKey, seq, (const char*)dataInfo->inData,
841         dataInfo->inLen, (char*)dataInfo->outData + sizeof(PacketHead), &outLen) != SOFTBUS_OK) {
842         SoftBusFree(dataInfo->outData);
843         TRANS_LOGE(TRANS_SDK, "ClientTransProxyEncryptWithSeq channelId=%{public}d", channelId);
844         return SOFTBUS_TRANS_PROXY_SESS_ENCRYPT_ERR;
845     }
846     PacketHead *pktHead = (PacketHead*)dataInfo->outData;
847     pktHead->magicNumber = MAGIC_NUMBER;
848     pktHead->seq = seq;
849     pktHead->flags = flag;
850     pktHead->dataLen = (int32_t)((int32_t)dataInfo->outLen - sizeof(PacketHead));
851     ClientPackPacketHead(pktHead);
852 
853     return SOFTBUS_OK;
854 }
855 
SessionPktTypeToProxyIndex(SessionPktType packetType)856 static int32_t SessionPktTypeToProxyIndex(SessionPktType packetType)
857 {
858     switch (packetType) {
859         case TRANS_SESSION_MESSAGE:
860         case TRANS_SESSION_ASYNC_MESSAGE:
861         case TRANS_SESSION_ACK:
862             return PROXY_CHANNEL_PRORITY_MESSAGE;
863         case TRANS_SESSION_BYTES:
864             return PROXY_CHANNEL_PRORITY_BYTES;
865         default:
866             return PROXY_CHANNEL_PRORITY_FILE;
867     }
868 }
869 
TransProxyPackAndSendData(int32_t channelId,const void * data,uint32_t len,ProxyChannelInfoDetail * info,SessionPktType pktType)870 int32_t TransProxyPackAndSendData(int32_t channelId, const void *data, uint32_t len,
871     ProxyChannelInfoDetail* info, SessionPktType pktType)
872 {
873     if (data == NULL || info == NULL) {
874         return SOFTBUS_INVALID_PARAM;
875     }
876     ClientProxyDataInfo dataInfo = {(uint8_t*)data, len, (uint8_t*)data, len};
877     if (ClientTransProxyPackBytes(channelId, &dataInfo, info->sequence, info->sessionKey, pktType) != SOFTBUS_OK) {
878         TRANS_LOGE(TRANS_SDK, "ClientTransProxyPackBytes error, channelId=%{public}d", channelId);
879         return SOFTBUS_ERR;
880     }
881 
882     int32_t sliceNum = (int32_t)((dataInfo.outLen + SLICE_LEN - 1) / SLICE_LEN);
883     for (int i = 0; i < sliceNum; i++) {
884         int32_t dataLen = (int32_t)((i == (sliceNum - 1)) ? (dataInfo.outLen - i * SLICE_LEN) : SLICE_LEN);
885         int32_t offset = (int32_t)(i * SLICE_LEN);
886 
887         uint8_t* sliceData = SoftBusMalloc(dataLen + sizeof(SliceHead));
888         if (sliceData == NULL) {
889             TRANS_LOGE(TRANS_SDK, "malloc slice data error, channelId=%{public}d", channelId);
890             return SOFTBUS_ERR;
891         }
892         SliceHead *slicehead = (SliceHead*)sliceData;
893         slicehead->priority = SessionPktTypeToProxyIndex(pktType);
894         slicehead->sliceNum = sliceNum;
895         slicehead->sliceSeq = i;
896         ClientPackSliceHead(slicehead);
897         if (memcpy_s(sliceData + sizeof(SliceHead), dataLen, dataInfo.outData + offset, dataLen) != EOK) {
898             TRANS_LOGE(TRANS_SDK, "memcpy_s error, channelId=%{public}d", channelId);
899             return SOFTBUS_ERR;
900         }
901 
902         int ret = ServerIpcSendMessage(channelId, CHANNEL_TYPE_PROXY, sliceData,
903             dataLen + sizeof(SliceHead), pktType);
904         if (ret != SOFTBUS_OK) {
905             TRANS_LOGE(TRANS_SDK, "ServerIpcSendMessage error, channelId=%{public}d", channelId);
906             return SOFTBUS_ERR;
907         }
908 
909         SoftBusFree(sliceData);
910     }
911     SoftBusFree(dataInfo.outData);
912 
913     TRANS_LOGI(TRANS_SDK, "TransProxyPackAndSendData success, channelId=%{public}d", channelId);
914     return SOFTBUS_OK;
915 }
916 
TransProxyChannelSendBytes(int32_t channelId,const void * data,uint32_t len)917 int32_t TransProxyChannelSendBytes(int32_t channelId, const void *data, uint32_t len)
918 {
919     ProxyChannelInfoDetail info;
920     if (ClientTransProxyGetInfoByChannelId(channelId, &info) != SOFTBUS_OK) {
921         return SOFTBUS_ERR;
922     }
923     int ret = SOFTBUS_ERR;
924     if (!info.isEncrypted) {
925         ret = ServerIpcSendMessage(channelId, CHANNEL_TYPE_PROXY, data, len, TRANS_SESSION_BYTES);
926         TRANS_LOGI(TRANS_SDK, "send bytes: channelId=%{public}d, ret=%{public}d", channelId, ret);
927         return ret;
928     }
929 
930     return TransProxyPackAndSendData(channelId, data, len, &info, TRANS_SESSION_BYTES);
931 }
932 
TransProxyChannelSendMessage(int32_t channelId,const void * data,uint32_t len)933 int32_t TransProxyChannelSendMessage(int32_t channelId, const void *data, uint32_t len)
934 {
935     ProxyChannelInfoDetail info;
936     if (ClientTransProxyGetInfoByChannelId(channelId, &info) != SOFTBUS_OK) {
937         return SOFTBUS_ERR;
938     }
939     int ret = SOFTBUS_ERR;
940     if (!info.isEncrypted) {
941         // auth channel only can send bytes
942         ret = ServerIpcSendMessage(channelId, CHANNEL_TYPE_PROXY, data, len, TRANS_SESSION_BYTES);
943         TRANS_LOGI(TRANS_SDK, "send msg: channelId=%{public}d, ret=%{public}d", channelId, ret);
944         return ret;
945     }
946 
947     ret = TransProxyPackAndSendData(channelId, data, len, &info, TRANS_SESSION_MESSAGE);
948     if (ret != SOFTBUS_OK) {
949         return SOFTBUS_ERR;
950     }
951     return ProcPendingPacket(channelId, info.sequence, PENDING_TYPE_PROXY);
952 }
953