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