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