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