1 /*
2 * Copyright (c) 2021-2025 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_tcp_direct_message.h"
17
18 #include <securec.h>
19
20 #include "client_trans_assemble_tlv.h"
21 #include "client_trans_tcp_direct_callback.h"
22 #include "client_trans_tcp_direct_manager.h"
23 #include "client_trans_session_manager.h"
24 #include "client_trans_socket_manager.h"
25 #include "common_list.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_socket.h"
33 #include "softbus_tcp_socket.h"
34 #include "softbus_utils.h"
35 #include "trans_log.h"
36 #include "trans_pending_pkt.h"
37
38 #define ACK_SIZE 4
39 #define DATA_EXTEND_LEN (DC_DATA_HEAD_SIZE + OVERHEAD_LEN)
40 #define MIN_BUF_LEN (1024 + DATA_EXTEND_LEN)
41
42 #define BYTE_TOS 0x60
43 #define COLLABORATE_BYTE_TOS 0x80
44 #define MESSAGE_TOS 0xC0
45 #define TDC_TLV_ELEMENT 5
46 #define TLV_TYPE_AND_LENTH 2
47 #define MAGICNUM_SIZE sizeof(uint32_t)
48 #define TLVCOUNT_SIZE sizeof(uint8_t)
49
50 typedef struct {
51 ListNode node;
52 int32_t channelId;
53 int32_t fd;
54 uint32_t size;
55 char *data;
56 char *w;
57 } ClientDataBuf;
58
59 typedef struct {
60 uint32_t outLen;
61 uint32_t tlvHeadLen;
62 } DataLenInfo;
63
64 static uint32_t g_dataBufferMaxLen = 0;
65 static SoftBusList *g_tcpDataList = NULL;
66
ReleaseDataHeadResource(DataHead * pktHead)67 static void ReleaseDataHeadResource(DataHead *pktHead)
68 {
69 ReleaseTlvValueBuffer(pktHead);
70 SoftBusFree(pktHead->tlvElement);
71 }
72
BuildNeedAckTlvData(DataHead * pktHead,bool needAck,uint32_t dataSeqs,int32_t * tlvBufferSize)73 static int32_t BuildNeedAckTlvData(DataHead *pktHead, bool needAck, uint32_t dataSeqs, int32_t *tlvBufferSize)
74 {
75 if (pktHead == NULL) {
76 TRANS_LOGE(TRANS_SDK, "param invalid.");
77 return SOFTBUS_INVALID_PARAM;
78 }
79 uint32_t dataSeq = SoftBusHtoLl(dataSeqs);
80 int32_t ret = TransAssembleTlvData(pktHead, TLV_TYPE_NEED_ACK, (uint8_t *)&needAck, sizeof(needAck), tlvBufferSize);
81 if (ret != SOFTBUS_OK) {
82 TRANS_LOGE(TRANS_SDK, "tcp channel assemble needAck tlv failed, ret=%{public}d", ret);
83 ReleaseDataHeadResource(pktHead);
84 return ret;
85 }
86 ret = TransAssembleTlvData(pktHead, TLV_TYPE_DATA_SEQ, (uint8_t *)&dataSeq, sizeof(dataSeq), tlvBufferSize);
87 if (ret != SOFTBUS_OK) {
88 TRANS_LOGE(TRANS_SDK, "tcp channel assemble dataSeq tlv failed, ret=%{public}d", ret);
89 ReleaseDataHeadResource(pktHead);
90 return ret;
91 }
92 pktHead->tlvElement -= (TDC_TLV_ELEMENT * sizeof(TlvElement));
93 return SOFTBUS_OK;
94 }
95
BuildDataHead(DataHead * pktHead,int32_t finalSeq,int32_t flags,uint32_t dataLen,int32_t * tlvBufferSize)96 static int32_t BuildDataHead(DataHead *pktHead, int32_t finalSeq, int32_t flags, uint32_t dataLen,
97 int32_t *tlvBufferSize)
98 {
99 if (pktHead == NULL) {
100 TRANS_LOGE(TRANS_SDK, "param invalid.");
101 return SOFTBUS_INVALID_PARAM;
102 }
103 pktHead->tlvElement = (uint8_t *)SoftBusCalloc(TDC_TLV_ELEMENT * sizeof(TlvElement));
104 if (pktHead->tlvElement == NULL) {
105 TRANS_LOGE(TRANS_SDK, "malloc tlvElement failed");
106 return SOFTBUS_MALLOC_ERR;
107 }
108 pktHead->magicNum = SoftBusHtoLl(MAGIC_NUMBER);
109 uint32_t seq = SoftBusHtoLl((uint32_t)finalSeq);
110 uint32_t flag = SoftBusHtoLl((uint32_t)flags);
111 uint32_t dataLens = SoftBusHtoLl(dataLen);
112
113 int32_t ret = TransAssembleTlvData(pktHead, TLV_TYPE_INNER_SEQ, (uint8_t *)&seq, sizeof(seq), tlvBufferSize);
114 if (ret != SOFTBUS_OK) {
115 TRANS_LOGE(TRANS_SDK, "tcp channel assemble seq tlv failed, ret=%{public}d", ret);
116 ReleaseDataHeadResource(pktHead);
117 return ret;
118 }
119 ret = TransAssembleTlvData(pktHead, TLV_TYPE_FLAG, (uint8_t *)&flag, sizeof(flag), tlvBufferSize);
120 if (ret != SOFTBUS_OK) {
121 TRANS_LOGE(TRANS_SDK, "tcp channel assemble flag tlv failed, ret=%{public}d", ret);
122 ReleaseDataHeadResource(pktHead);
123 return ret;
124 }
125 ret = TransAssembleTlvData(pktHead, TLV_TYPE_DATA_LEN, (uint8_t *)&dataLens, sizeof(dataLens), tlvBufferSize);
126 if (ret != SOFTBUS_OK) {
127 TRANS_LOGE(TRANS_SDK, "tcp channel assemble dataLen tlv failed, ret=%{public}d", ret);
128 ReleaseDataHeadResource(pktHead);
129 return ret;
130 }
131 return SOFTBUS_OK;
132 }
133
CheckBufLenAndCopyData(uint32_t bufLen,uint32_t headSize,char * data,TcpDataTlvPacketHead * head)134 static int32_t CheckBufLenAndCopyData(uint32_t bufLen, uint32_t headSize, char *data, TcpDataTlvPacketHead *head)
135 {
136 if (bufLen < headSize) {
137 TRANS_LOGE(TRANS_SDK, "data bufLen not enough, bufLen Less than headSize. bufLen=%{public}u", bufLen);
138 return SOFTBUS_DATA_NOT_ENOUGH;
139 }
140 if (memcpy_s(&head->magicNumber, MAGICNUM_SIZE, data, MAGICNUM_SIZE) != EOK) {
141 TRANS_LOGE(TRANS_SDK, "memcpy magicNumber failed.");
142 return SOFTBUS_MEM_ERR;
143 }
144 if (memcpy_s(&head->tlvCount, TLVCOUNT_SIZE, data + MAGICNUM_SIZE, TLVCOUNT_SIZE) != EOK) {
145 TRANS_LOGE(TRANS_SDK, "memcpy tlvCount failed.");
146 return SOFTBUS_MEM_ERR;
147 }
148 return SOFTBUS_OK;
149 }
150
TransTdcParseTlv(uint32_t bufLen,char * data,TcpDataTlvPacketHead * head,uint32_t * headSize)151 static int32_t TransTdcParseTlv(uint32_t bufLen, char *data, TcpDataTlvPacketHead *head, uint32_t *headSize)
152 {
153 if (data == NULL || head == NULL) {
154 TRANS_LOGE(TRANS_SDK, "param invalid.");
155 return SOFTBUS_INVALID_PARAM;
156 }
157 errno_t ret = EOK;
158 *headSize += MAGICNUM_SIZE + TLVCOUNT_SIZE;
159 int32_t res = CheckBufLenAndCopyData(bufLen, *headSize, data, head);
160 TRANS_CHECK_AND_RETURN_RET_LOGE(res == SOFTBUS_OK, res, TRANS_SDK, "CheckBufLenAndCopyData failed");
161 char *temp = data + MAGICNUM_SIZE + TLVCOUNT_SIZE;
162 for (int index = 0; index < head->tlvCount; index++) {
163 uint8_t *type = (uint8_t *)temp;
164 if (bufLen < (*headSize + (TLV_TYPE_AND_LENTH * sizeof(uint8_t)))) {
165 TRANS_LOGE(TRANS_SDK, "check bufLen contains tlv segment data fail, bufLen=%{public}u", bufLen);
166 return SOFTBUS_DATA_NOT_ENOUGH;
167 }
168 uint8_t *length = (uint8_t *)(temp + sizeof(uint8_t));
169 if (bufLen < (*headSize + (TLV_TYPE_AND_LENTH * sizeof(uint8_t)) + *length)) {
170 TRANS_LOGE(TRANS_SDK, "data bufLen not enough. bufLen=%{public}u", bufLen);
171 return SOFTBUS_DATA_NOT_ENOUGH;
172 }
173 temp += (TLV_TYPE_AND_LENTH *sizeof(uint8_t));
174 switch (*type) {
175 case TLV_TYPE_INNER_SEQ:
176 ret = memcpy_s(&head->seq, sizeof(head->seq), temp, *length);
177 break;
178 case TLV_TYPE_DATA_SEQ:
179 ret = memcpy_s(&head->dataSeq, sizeof(head->dataSeq), temp, *length);
180 break;
181 case TLV_TYPE_FLAG:
182 ret = memcpy_s(&head->flags, sizeof(head->flags), temp, *length);
183 break;
184 case TLV_TYPE_NEED_ACK:
185 ret = memcpy_s(&head->needAck, sizeof(head->needAck), temp, *length);
186 break;
187 case TLV_TYPE_DATA_LEN:
188 ret = memcpy_s(&head->dataLen, sizeof(head->dataLen), temp, *length);
189 break;
190 default:
191 TRANS_LOGE(TRANS_SDK, "unknown trans tdc tlv skip, tlvType=%{public}d", *type);
192 break;
193 }
194 temp += *length;
195 *headSize += (TLV_TYPE_AND_LENTH * sizeof(uint8_t) + *length);
196 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == EOK, SOFTBUS_MEM_ERR, TRANS_SDK,
197 "parse tlv memcpy failed, tlvType=%{public}d, ret%{public}d", *type, ret);
198 }
199 return SOFTBUS_OK;
200 }
201
PackTcpDataPacketHead(TcpDataPacketHead * data)202 static void PackTcpDataPacketHead(TcpDataPacketHead *data)
203 {
204 data->magicNumber = SoftBusHtoLl(data->magicNumber);
205 data->seq = (int32_t)SoftBusHtoLl((uint32_t)data->seq);
206 data->flags = SoftBusHtoLl(data->flags);
207 data->dataLen = SoftBusHtoLl(data->dataLen);
208 }
209
TransTcpDataTlvUnpack(TcpDataTlvPacketHead * data)210 static void TransTcpDataTlvUnpack(TcpDataTlvPacketHead *data)
211 {
212 data->magicNumber = SoftBusLtoHl(data->magicNumber);
213 data->seq = (int32_t)SoftBusLtoHl((uint32_t)data->seq);
214 data->flags = SoftBusLtoHl(data->flags);
215 data->dataLen = SoftBusLtoHl(data->dataLen);
216 data->dataSeq = SoftBusLtoHl(data->dataSeq);
217 }
218
UnpackTcpDataPacketHead(TcpDataPacketHead * data)219 static void UnpackTcpDataPacketHead(TcpDataPacketHead *data)
220 {
221 data->magicNumber = SoftBusLtoHl(data->magicNumber);
222 data->seq = (int32_t)SoftBusLtoHl((uint32_t)data->seq);
223 data->flags = SoftBusLtoHl(data->flags);
224 data->dataLen = SoftBusLtoHl(data->dataLen);
225 }
226
TransTdcDecrypt(const char * sessionKey,const char * in,uint32_t inLen,char * out,uint32_t * outLen)227 static int32_t TransTdcDecrypt(const char *sessionKey, const char *in, uint32_t inLen, char *out, uint32_t *outLen)
228 {
229 AesGcmCipherKey cipherKey = {0};
230 cipherKey.keyLen = SESSION_KEY_LENGTH; // 256 bit encryption
231 if (memcpy_s(cipherKey.key, SESSION_KEY_LENGTH, sessionKey, SESSION_KEY_LENGTH) != EOK) {
232 TRANS_LOGE(TRANS_SDK, "memcpy key error.");
233 return SOFTBUS_MEM_ERR;
234 }
235 int32_t ret = SoftBusDecryptData(&cipherKey, (unsigned char*)in, inLen, (unsigned char*)out, outLen);
236 (void)memset_s(&cipherKey, sizeof(AesGcmCipherKey), 0, sizeof(AesGcmCipherKey));
237 if (ret != SOFTBUS_OK) {
238 TRANS_LOGE(TRANS_SDK, "SoftBusDecryptData fail ret=%{public}d.", ret);
239 return SOFTBUS_DECRYPT_ERR;
240 }
241 return SOFTBUS_OK;
242 }
243
TransTdcEncryptWithSeq(const char * sessionKey,int32_t seqNum,const char * in,uint32_t inLen,char * out,uint32_t * outLen)244 static int32_t TransTdcEncryptWithSeq(const char *sessionKey, int32_t seqNum, const char *in, uint32_t inLen,
245 char *out, uint32_t *outLen)
246 {
247 AesGcmCipherKey cipherKey = {0};
248 cipherKey.keyLen = SESSION_KEY_LENGTH;
249 if (memcpy_s(cipherKey.key, SESSION_KEY_LENGTH, sessionKey, SESSION_KEY_LENGTH) != EOK) {
250 TRANS_LOGE(TRANS_SDK, "memcpy key error.");
251 return SOFTBUS_MEM_ERR;
252 }
253 int ret = SoftBusEncryptDataWithSeq(&cipherKey, (unsigned char*)in, inLen, (unsigned char*)out, outLen, seqNum);
254 if (memset_s(&cipherKey, sizeof(AesGcmCipherKey), 0, sizeof(AesGcmCipherKey)) != EOK) {
255 TRANS_LOGE(TRANS_SDK, "memset cipherKey failed.");
256 return SOFTBUS_MEM_ERR;
257 }
258 if (ret != SOFTBUS_OK || *outLen != inLen + OVERHEAD_LEN) {
259 TRANS_LOGE(TRANS_SDK, "encrypt error, ret=%{public}d", ret);
260 return SOFTBUS_ENCRYPT_ERR;
261 }
262 return SOFTBUS_OK;
263 }
264
TransTdcSetPendingPacket(int32_t channelId,const char * data,uint32_t len,uint32_t dataSeq)265 static int32_t TransTdcSetPendingPacket(int32_t channelId, const char *data, uint32_t len, uint32_t dataSeq)
266 {
267 if (len != ACK_SIZE) {
268 TRANS_LOGE(TRANS_SDK, "recv invalid seq.");
269 return SOFTBUS_INVALID_PARAM;
270 }
271 if (dataSeq != 0) { // A non-zero value indicates asynchronous. PendingPacket does not need to be set.
272 int32_t socketId = INVALID_SESSION_ID;
273 SessionListenerAdapter sessionCallback;
274 bool isServer = false;
275 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
276 int32_t ret = ClientGetSessionIdByChannelId(channelId, CHANNEL_TYPE_TCP_DIRECT, &socketId, false);
277 if (ret != SOFTBUS_OK) {
278 TRANS_LOGE(TRANS_SDK, "get socketId failed, channelId=%{public}d", channelId);
279 return ret;
280 }
281 ret = ClientGetSessionCallbackAdapterById(socketId, &sessionCallback, &isServer);
282 if (ret != SOFTBUS_OK) {
283 TRANS_LOGE(TRANS_SDK, "get session callback failed, channelId=%{public}d", channelId);
284 return ret;
285 }
286 ret = DeleteDataSeqInfoList(dataSeq, channelId);
287 if (ret != SOFTBUS_OK) {
288 TRANS_LOGE(TRANS_SDK, "tcp delete dataSeqInfoList failed, channelId=%{public}d", channelId);
289 return ret;
290 }
291 sessionCallback.socketClient.OnBytesSent(socketId, dataSeq, SOFTBUS_OK);
292 return SOFTBUS_OK;
293 }
294 int32_t seq = (int32_t)SoftBusNtoHl(*(uint32_t *)data);
295 int32_t ret = SetPendingPacket(channelId, seq, PENDING_TYPE_DIRECT);
296 if (ret != SOFTBUS_OK) {
297 TRANS_LOGE(TRANS_SDK, "can not match seq=%{public}d", seq);
298 return ret;
299 }
300 return SOFTBUS_OK;
301 }
302
TransTdcPackTlvData(DataHead * pktHead,int32_t tlvBufferSize,uint32_t dataLen)303 static char *TransTdcPackTlvData(DataHead *pktHead, int32_t tlvBufferSize, uint32_t dataLen)
304 {
305 int32_t headSize = MAGICNUM_SIZE + TLVCOUNT_SIZE + tlvBufferSize;
306 char *buf = (char *)SoftBusCalloc(dataLen + headSize);
307 if (buf == NULL) {
308 TRANS_LOGE(TRANS_SDK, "malloc buf failed");
309 return NULL;
310 }
311 if (memcpy_s(buf, dataLen + headSize, &pktHead->magicNum, MAGICNUM_SIZE) != EOK) {
312 SoftBusFree(buf);
313 TRANS_LOGE(TRANS_SDK, "memcpy magicNum failed");
314 return NULL;
315 }
316
317 if (memcpy_s(buf + MAGICNUM_SIZE, dataLen + headSize, &pktHead->tlvCount,
318 TLVCOUNT_SIZE) != EOK) {
319 SoftBusFree(buf);
320 TRANS_LOGE(TRANS_SDK, "memcpy tlvCount failed");
321 return NULL;
322 }
323
324 char *temp = buf + MAGICNUM_SIZE + TLVCOUNT_SIZE;
325 for (int index = 0; index < pktHead->tlvCount; index++) {
326 TlvElement *ement = (TlvElement *)pktHead->tlvElement;
327
328 if (memcpy_s(temp, dataLen + headSize, &ement->type, sizeof(ement->type)) != EOK) {
329 SoftBusFree(buf);
330 TRANS_LOGE(TRANS_SDK, "memcpy tlvEment type failed");
331 return NULL;
332 }
333
334 temp += sizeof(ement->type);
335 if (memcpy_s(temp, dataLen + headSize, &ement->length, sizeof(ement->length)) != EOK) {
336 SoftBusFree(buf);
337 TRANS_LOGE(TRANS_SDK, "memcpy tlvEment length failed");
338 return NULL;
339 }
340
341 temp += sizeof(ement->length);
342 if (memcpy_s(temp, dataLen + headSize, ement->value, ement->length) != EOK) {
343 SoftBusFree(buf);
344 TRANS_LOGE(TRANS_SDK, "memcpy tlvEment value failed");
345 return NULL;
346 }
347 temp += ement->length;
348 pktHead->tlvElement += sizeof(TlvElement);
349 }
350 return buf;
351 }
352
TransPackData(uint32_t dataLen,TcpDataPacketHead pktHead)353 static char *TransPackData(uint32_t dataLen, TcpDataPacketHead pktHead)
354 {
355 char *buf = (char *)SoftBusMalloc(dataLen + DC_DATA_HEAD_SIZE);
356 TRANS_CHECK_AND_RETURN_RET_LOGE(buf != NULL, NULL, TRANS_SDK, "malloc failed");
357 PackTcpDataPacketHead(&pktHead);
358 if (memcpy_s(buf, DC_DATA_HEAD_SIZE, &pktHead, sizeof(TcpDataPacketHead)) != EOK) {
359 SoftBusFree(buf);
360 TRANS_LOGE(TRANS_SDK, "memcpy_s error");
361 return NULL;
362 }
363 return buf;
364 }
365
TransTdcPackData(const TcpDirectChannelInfo * channel,const char * data,uint32_t len,int flags,DataLenInfo * lenInfo)366 static char *TransTdcPackData(const TcpDirectChannelInfo *channel, const char *data, uint32_t len, int flags,
367 DataLenInfo *lenInfo)
368 {
369 uint32_t dataLen = len + OVERHEAD_LEN;
370 char *finalData = (char *)data;
371 int32_t finalSeq = channel->detail.sequence;
372 uint32_t tmpSeq;
373 if (flags == FLAG_ACK) {
374 finalSeq = *((int32_t *)data);
375 tmpSeq = SoftBusHtoNl((uint32_t)finalSeq);
376 finalData = (char *)(&tmpSeq);
377 }
378 bool needAck = false;
379 bool supportTlv = false;
380 int32_t ret = GetSupportTlvAndNeedAckById(channel->channelId, CHANNEL_TYPE_TCP_DIRECT, &supportTlv, &needAck);
381 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, NULL, TRANS_SDK, "get need ack failed by channelId");
382 if (supportTlv) {
383 DataHead pktHead;
384 int32_t tlvBufferSize = 0;
385 int32_t ret = BuildDataHead(&pktHead, finalSeq, flags, dataLen, &tlvBufferSize);
386 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, NULL, TRANS_SDK, "build tlv dataHead failed");
387 ret = BuildNeedAckTlvData(&pktHead, needAck, 0, &tlvBufferSize); // sync process dataSeq must be zero.
388 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, NULL, TRANS_SDK, "build tlv needack failed");
389 char *buf = TransTdcPackTlvData(&pktHead, tlvBufferSize, dataLen);
390 if (buf == NULL) {
391 ReleaseDataHeadResource(&pktHead);
392 TRANS_LOGE(TRANS_SDK, "TransTdcPackTlvData fail");
393 return NULL;
394 }
395 ReleaseDataHeadResource(&pktHead);
396 lenInfo->tlvHeadLen = (uint32_t)(MAGICNUM_SIZE + TLVCOUNT_SIZE + tlvBufferSize);
397 ret = TransTdcEncryptWithSeq(channel->detail.sessionKey, finalSeq, finalData, len, buf + lenInfo->tlvHeadLen,
398 &lenInfo->outLen);
399 if (ret != SOFTBUS_OK) {
400 TRANS_LOGE(TRANS_SDK, "encrypt error");
401 return NULL;
402 }
403 return buf;
404 }
405 TcpDataPacketHead pktHead = {
406 .magicNumber = MAGIC_NUMBER,
407 .seq = finalSeq,
408 .flags = (uint32_t)flags,
409 .dataLen = dataLen,
410 };
411 char *buf = TransPackData(dataLen, pktHead);
412 TRANS_CHECK_AND_RETURN_RET_LOGE(buf != NULL, NULL, TRANS_SDK, "TransPackData fail");
413 ret = TransTdcEncryptWithSeq(channel->detail.sessionKey, finalSeq, finalData, len, buf + DC_DATA_HEAD_SIZE,
414 &lenInfo->outLen);
415 if (ret != SOFTBUS_OK) {
416 TRANS_LOGE(TRANS_SDK, "encrypt error");
417 SoftBusFree(buf);
418 return NULL;
419 }
420 return buf;
421 }
422
CheckCollaborationSessionName(const char * sessionName)423 static bool CheckCollaborationSessionName(const char *sessionName)
424 {
425 if (strstr(sessionName, "ohos.collaborationcenter") != NULL) {
426 return true;
427 }
428 return false;
429 }
430
TransTcpSetTos(TcpDirectChannelInfo * channel,int32_t flags)431 static int32_t TransTcpSetTos(TcpDirectChannelInfo *channel, int32_t flags)
432 {
433 if (channel == NULL) {
434 return SOFTBUS_INVALID_PARAM;
435 }
436 char sessionName[SESSION_NAME_SIZE_MAX + 1] = { 0 };
437 if (ClientGetSessionNameByChannelId(channel->channelId, channel->detail.channelType,
438 sessionName, SESSION_NAME_SIZE_MAX) != SOFTBUS_OK) {
439 TRANS_LOGE(TRANS_SDK, "failed to get sessionName, channelId=%{public}d", channel->channelId);
440 return SOFTBUS_TRANS_SESSION_NAME_NO_EXIST;
441 }
442 uint32_t tos = (flags == FLAG_BYTES) ? BYTE_TOS : MESSAGE_TOS;
443 if (CheckCollaborationSessionName(sessionName)) {
444 tos = (flags == FLAG_BYTES) ? COLLABORATE_BYTE_TOS : MESSAGE_TOS;
445 }
446 if (SetIpTos(channel->detail.fd, tos) != SOFTBUS_OK) {
447 return SOFTBUS_TCP_SOCKET_ERR;
448 }
449 return SOFTBUS_OK;
450 }
451
TransTdcProcessPostData(TcpDirectChannelInfo * channel,const char * data,uint32_t len,int32_t flags)452 static int32_t TransTdcProcessPostData(TcpDirectChannelInfo *channel, const char *data, uint32_t len, int32_t flags)
453 {
454 DataLenInfo lenInfo = { 0 };
455 char *buf = TransTdcPackData(channel, data, len, flags, &lenInfo);
456 TRANS_CHECK_AND_RETURN_RET_LOGE(buf != NULL, SOFTBUS_ENCRYPT_ERR, TRANS_SDK, "failed to pack bytes.");
457 uint32_t outLen = lenInfo.outLen;
458 if (outLen != len + OVERHEAD_LEN) {
459 TRANS_LOGE(TRANS_SDK, "pack bytes len error, outLen=%{public}d", outLen);
460 SoftBusFree(buf);
461 return SOFTBUS_ENCRYPT_ERR;
462 }
463 int32_t res = TransTcpSetTos(channel, flags);
464 if (res != SOFTBUS_OK) {
465 TRANS_LOGE(TRANS_SDK, "failed to set tos. channelId=%{public}d", channel->channelId);
466 SoftBusFree(buf);
467 return res;
468 }
469 if (SoftBusMutexLock(&(channel->detail.fdLock)) != SOFTBUS_OK) {
470 TRANS_LOGE(TRANS_SDK, "failed to lock fd. channelId=%{public}d", channel->channelId);
471 SoftBusFree(buf);
472 return SOFTBUS_LOCK_ERR;
473 }
474 bool supportTlv = false;
475 res = GetSupportTlvAndNeedAckById(channel->channelId, channel->detail.channelType, &supportTlv, NULL);
476 if (res != SOFTBUS_OK) {
477 TRANS_LOGE(TRANS_SDK, "failed to get supportTlv. channelId=%{public}d", channel->channelId);
478 SoftBusFree(buf);
479 (void)SoftBusMutexUnlock(&(channel->detail.fdLock));
480 return res;
481 }
482 uint32_t tmpHeadLen = DC_DATA_HEAD_SIZE;
483 if (supportTlv) {
484 TRANS_LOGI(TRANS_SDK, "supportTlv is true");
485 tmpHeadLen = lenInfo.tlvHeadLen;
486 }
487 ssize_t ret = ConnSendSocketData(channel->detail.fd, buf, outLen + tmpHeadLen, 0);
488 if (ret != (ssize_t)outLen + (ssize_t)tmpHeadLen) {
489 TRANS_LOGE(TRANS_SDK, "send bytes failed to send tcp data. channelId=%{public}d, ret=%{public}zd",
490 channel->channelId, ret);
491 SoftBusFree(buf);
492 (void)SoftBusMutexUnlock(&(channel->detail.fdLock));
493 return GetErrCodeBySocketErr(SOFTBUS_TRANS_SEND_LEN_BEYOND_LIMIT);
494 }
495 (void)SoftBusMutexUnlock(&(channel->detail.fdLock));
496 SoftBusFree(buf);
497 buf = NULL;
498 return SOFTBUS_OK;
499 }
500
TransTdcSendBytes(int32_t channelId,const char * data,uint32_t len,bool needAck)501 int32_t TransTdcSendBytes(int32_t channelId, const char *data, uint32_t len, bool needAck)
502 {
503 if (data == NULL || len == 0) {
504 TRANS_LOGE(TRANS_SDK, "param invalid. channelId=%{public}d", channelId);
505 return SOFTBUS_INVALID_PARAM;
506 }
507 TcpDirectChannelInfo channel;
508 (void)memset_s(&channel, sizeof(TcpDirectChannelInfo), 0, sizeof(TcpDirectChannelInfo));
509 if (TransTdcGetInfoIncFdRefById(channelId, &channel, true) == NULL) {
510 TRANS_LOGE(TRANS_SDK, "TransTdcGetInfoIncFdRefById failed, channelId=%{public}d.", channelId);
511 return SOFTBUS_TRANS_TDC_GET_INFO_FAILED;
512 }
513 if (needAck) {
514 int32_t sequence = channel.detail.sequence;
515 int32_t ret = AddPendingPacket(channelId, sequence, PENDING_TYPE_DIRECT);
516 if (ret != SOFTBUS_OK) {
517 TRANS_LOGE(TRANS_SDK, "add pending packet failed, channelId=%{public}d.", channelId);
518 return ret;
519 }
520 if (channel.detail.needRelease) {
521 TRANS_LOGE(TRANS_SDK, "trans tdc channel need release, cancel sendBytes, channelId=%{public}d.", channelId);
522 return SOFTBUS_TRANS_TDC_CHANNEL_CLOSED_BY_ANOTHER_THREAD;
523 }
524 ret = TransTdcProcessPostData(&channel, data, len, FLAG_BYTES);
525 TransUpdateFdState(channel.channelId);
526 (void)memset_s(&channel, sizeof(TcpDirectChannelInfo), 0, sizeof(TcpDirectChannelInfo));
527 if (ret != SOFTBUS_OK) {
528 DelPendingPacketbyChannelId(channelId, sequence, PENDING_TYPE_DIRECT);
529 TRANS_LOGE(TRANS_SDK, "tdc send bytes failed, channelId=%{public}d, ret=%{public}d.", channelId, ret);
530 return ret;
531 }
532 return ProcPendingPacket(channelId, sequence, PENDING_TYPE_DIRECT);
533 }
534 if (channel.detail.needRelease) {
535 TRANS_LOGE(TRANS_SDK, "trans tdc channel need release, cancel sendBytes, channelId=%{public}d.", channelId);
536 return SOFTBUS_TRANS_TDC_CHANNEL_CLOSED_BY_ANOTHER_THREAD;
537 }
538 int ret = TransTdcProcessPostData(&channel, data, len, FLAG_BYTES);
539 TransUpdateFdState(channel.channelId);
540 (void)memset_s(&channel, sizeof(TcpDirectChannelInfo), 0, sizeof(TcpDirectChannelInfo));
541 if (ret != SOFTBUS_OK) {
542 TRANS_LOGE(TRANS_SDK, "tdc send bytes failed, channelId=%{public}d, ret=%{public}d.", channelId, ret);
543 return ret;
544 }
545
546 return SOFTBUS_OK;
547 }
548
TransSetTosSendData(TcpDirectChannelInfo * channel,char * buf,int32_t newPkgHeadSize,int32_t flags,uint32_t outLen)549 static int32_t TransSetTosSendData(TcpDirectChannelInfo *channel, char *buf, int32_t newPkgHeadSize,
550 int32_t flags, uint32_t outLen)
551 {
552 if (channel == NULL) {
553 return SOFTBUS_INVALID_PARAM;
554 }
555 int32_t ret = TransTcpSetTos(channel, flags);
556 if (ret != SOFTBUS_OK) {
557 TRANS_LOGE(TRANS_SDK, "failed to set tos. channelId=%{public}d", channel->channelId);
558 SoftBusFree(buf);
559 return ret;
560 }
561 if (SoftBusMutexLock(&(channel->detail.fdLock)) != SOFTBUS_OK) {
562 TRANS_LOGE(TRANS_SDK, "failed to lock fd. channelId=%{public}d", channel->channelId);
563 SoftBusFree(buf);
564 return SOFTBUS_LOCK_ERR;
565 }
566 ssize_t res = ConnSendSocketData(channel->detail.fd, buf, outLen + newPkgHeadSize, 0);
567 if (res != (ssize_t)outLen + newPkgHeadSize) {
568 TRANS_LOGE(TRANS_SDK, "failed to send tcp data. res=%{public}zd", res);
569 (void)SoftBusMutexUnlock(&(channel->detail.fdLock));
570 SoftBusFree(buf);
571 return SOFTBUS_TRANS_SEND_LEN_BEYOND_LIMIT;
572 }
573 (void)SoftBusMutexUnlock(&(channel->detail.fdLock));
574 SoftBusFree(buf);
575 return SOFTBUS_OK;
576 }
577
TransTdcNeedAckProcessPostData(TcpDirectChannelInfo * channel,const char * data,uint32_t len,int32_t flags,uint32_t dataSeq)578 static int32_t TransTdcNeedAckProcessPostData(TcpDirectChannelInfo *channel, const char *data, uint32_t len,
579 int32_t flags, uint32_t dataSeq)
580 {
581 uint32_t outLen = 0;
582 int32_t newPkgHeadSize = 0;
583 uint32_t dataLen = len + OVERHEAD_LEN;
584 char *finalData = (char *)data;
585 int32_t finalSeq = channel->detail.sequence;
586 uint32_t tmpSeq;
587 if (flags == FLAG_ACK) {
588 finalSeq = *((int32_t *)data);
589 tmpSeq = SoftBusHtoNl((uint32_t)finalSeq);
590 finalData = (char *)(&tmpSeq);
591 }
592 DataHead pktHead;
593 int32_t tlvBufferSize = 0;
594 int32_t ret = BuildDataHead(&pktHead, finalSeq, flags, dataLen, &tlvBufferSize);
595 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "build tlv dataHead error");
596 ret = BuildNeedAckTlvData(&pktHead, true, dataSeq, &tlvBufferSize); // asynchronous sendbytes must support reply ack
597 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "build tlv needAck error");
598 char *buf = TransTdcPackTlvData(&pktHead, tlvBufferSize, dataLen);
599 if (buf == NULL) {
600 ReleaseDataHeadResource(&pktHead);
601 TRANS_LOGE(TRANS_SDK, "TransTdcPackTlvData fail");
602 return SOFTBUS_TRANS_PACK_TLV_DATA_FAILED;
603 }
604 ReleaseDataHeadResource(&pktHead);
605 newPkgHeadSize = MAGICNUM_SIZE + TLVCOUNT_SIZE + tlvBufferSize;
606 ret = TransTdcEncryptWithSeq(channel->detail.sessionKey, finalSeq, finalData, len, buf + newPkgHeadSize, &outLen);
607 (void)memset_s(channel->detail.sessionKey, SESSION_KEY_LENGTH, 0, SESSION_KEY_LENGTH);
608 if (ret != SOFTBUS_OK) {
609 TRANS_LOGE(TRANS_SDK, "encrypt error");
610 SoftBusFree(buf);
611 return ret;
612 }
613 if (outLen != len + OVERHEAD_LEN) {
614 TRANS_LOGE(TRANS_SDK, "pack bytes len error, outLen=%{public}d", outLen);
615 SoftBusFree(buf);
616 return SOFTBUS_ENCRYPT_ERR;
617 }
618 ret = TransSetTosSendData(channel, buf, newPkgHeadSize, flags, outLen);
619 if (ret != SOFTBUS_OK) {
620 TRANS_LOGE(TRANS_SDK, "set tos send data error, channelId=%{public}d", channel->channelId);
621 return ret;
622 }
623 return SOFTBUS_OK;
624 }
625
TransTdcAsyncSendBytes(int32_t channelId,const char * data,uint32_t len,uint32_t dataSeq)626 int32_t TransTdcAsyncSendBytes(int32_t channelId, const char *data, uint32_t len, uint32_t dataSeq)
627 {
628 if (data == NULL || len == 0) {
629 TRANS_LOGE(TRANS_SDK, "param invalid. channelId=%{public}d", channelId);
630 return SOFTBUS_INVALID_PARAM;
631 }
632
633 TcpDirectChannelInfo channel;
634 (void)memset_s(&channel, sizeof(TcpDirectChannelInfo), 0, sizeof(TcpDirectChannelInfo));
635 if (TransTdcGetInfoIncFdRefById(channelId, &channel, true) == NULL) {
636 return SOFTBUS_TRANS_TDC_CHANNEL_NOT_FOUND;
637 }
638 if (channel.detail.needRelease) {
639 TRANS_LOGE(TRANS_SDK, "trans tdc channel need release, cancel sendBytes, channelId=%{public}d.", channelId);
640 return SOFTBUS_TRANS_TDC_CHANNEL_CLOSED_BY_ANOTHER_THREAD;
641 }
642 TransUpdateFdState(channel.channelId);
643 int32_t ret = TransTdcNeedAckProcessPostData(&channel, data, len, FLAG_BYTES, dataSeq);
644 if (ret != SOFTBUS_OK) {
645 TRANS_LOGE(TRANS_SDK, "tdc async send bytes failed, channelId=%{public}d, ret=%{public}d.", channelId, ret);
646 return ret;
647 }
648
649 int32_t socketId = 0;
650 ret = ClientGetSessionIdByChannelId(channelId, channel.detail.channelType, &socketId, false);
651 if (ret != SOFTBUS_OK) {
652 TRANS_LOGE(TRANS_SDK, "tdc get sessionId failed, channelId=%{public}d, ret=%{public}d.", channelId, ret);
653 return ret;
654 }
655 ret = DataSeqInfoListAddItem(dataSeq, channelId, socketId, channel.detail.channelType);
656 if (ret != SOFTBUS_OK) {
657 TRANS_LOGE(TRANS_SDK, "tdc add seqInfoList failed, channelId=%{public}d, ret=%{public}d.", channelId, ret);
658 return ret;
659 }
660 return SOFTBUS_OK;
661 }
662
TransTdcSendMessage(int32_t channelId,const char * data,uint32_t len)663 int32_t TransTdcSendMessage(int32_t channelId, const char *data, uint32_t len)
664 {
665 if (data == NULL || len == 0) {
666 TRANS_LOGE(TRANS_SDK, "param invalid. channelId=%{public}d", channelId);
667 return SOFTBUS_INVALID_PARAM;
668 }
669
670 TcpDirectChannelInfo channel;
671 (void)memset_s(&channel, sizeof(TcpDirectChannelInfo), 0, sizeof(TcpDirectChannelInfo));
672 if (TransTdcGetInfoIncFdRefById(channelId, &channel, true) == NULL) {
673 return SOFTBUS_TRANS_TDC_CHANNEL_NOT_FOUND;
674 }
675 int32_t sequence = channel.detail.sequence;
676 int32_t ret = AddPendingPacket(channelId, sequence, PENDING_TYPE_DIRECT);
677 if (ret != SOFTBUS_OK) {
678 TRANS_LOGE(TRANS_SDK, "add pending packet failed, channelId=%{public}d.", channelId);
679 return ret;
680 }
681 if (channel.detail.needRelease) {
682 TRANS_LOGE(TRANS_SDK, "trans tdc channel need release, cancel sendMessage, channelId=%{public}d.", channelId);
683 return SOFTBUS_TRANS_TDC_CHANNEL_CLOSED_BY_ANOTHER_THREAD;
684 }
685 ret = TransTdcProcessPostData(&channel, data, len, FLAG_MESSAGE);
686 TransUpdateFdState(channel.channelId);
687 (void)memset_s(&channel, sizeof(TcpDirectChannelInfo), 0, sizeof(TcpDirectChannelInfo));
688 if (ret != SOFTBUS_OK) {
689 DelPendingPacketbyChannelId(channelId, sequence, PENDING_TYPE_DIRECT);
690 TRANS_LOGE(TRANS_SDK, "tdc send message failed, ret=%{public}d.", ret);
691 return ret;
692 }
693 return ProcPendingPacket(channelId, sequence, PENDING_TYPE_DIRECT);
694 }
695
TransTdcSendAck(int32_t channelId,int32_t seq)696 static int32_t TransTdcSendAck(int32_t channelId, int32_t seq)
697 {
698 TcpDirectChannelInfo channel;
699 (void)memset_s(&channel, sizeof(TcpDirectChannelInfo), 0, sizeof(TcpDirectChannelInfo));
700 if (TransTdcGetInfoIncFdRefById(channelId, &channel, false) == NULL) {
701 TRANS_LOGE(TRANS_SDK, "TransTdcGetInfoIncFdRefById failed, channelId=%{public}d.", channelId);
702 return SOFTBUS_TRANS_TDC_GET_INFO_FAILED;
703 }
704 if (channel.detail.needRelease) {
705 TRANS_LOGE(TRANS_SDK, "trans tdc channel need release, cancel sendMessage, channelId=%{public}d.", channelId);
706 return SOFTBUS_TRANS_TDC_CHANNEL_CLOSED_BY_ANOTHER_THREAD;
707 }
708 int32_t ret = TransTdcProcessPostData(&channel, (char *)(&seq), ACK_SIZE, FLAG_ACK);
709 TransUpdateFdState(channel.channelId);
710 return ret;
711 }
712
TransTdcNeedSendAck(TcpDirectChannelInfo * channel,int32_t seq,uint32_t dataSeq,bool needAck)713 static int32_t TransTdcNeedSendAck(TcpDirectChannelInfo *channel, int32_t seq, uint32_t dataSeq, bool needAck)
714 {
715 if (channel == NULL) {
716 TRANS_LOGE(TRANS_SDK, "channel is null.");
717 return SOFTBUS_INVALID_PARAM;
718 }
719 if (needAck) {
720 TRANS_LOGI(TRANS_SDK, "tdc need send ack to client");
721 return TransTdcNeedAckProcessPostData(channel, (char *)(&seq), ACK_SIZE, FLAG_ACK, dataSeq);
722 }
723 return SOFTBUS_OK;
724 }
725
TransGetDataBufSize(void)726 static uint32_t TransGetDataBufSize(void)
727 {
728 return MIN_BUF_LEN;
729 }
730
731 #define SLICE_HEAD_LEN 16
TransGetDataBufMaxSize(void)732 static int32_t TransGetDataBufMaxSize(void)
733 {
734 uint32_t maxLen = 0;
735 int32_t ret = SoftbusGetConfig(SOFTBUS_INT_MAX_BYTES_NEW_LENGTH, (unsigned char *)&maxLen, sizeof(maxLen));
736 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "get config err");
737 g_dataBufferMaxLen = maxLen + DATA_EXTEND_LEN + SLICE_HEAD_LEN;
738 return SOFTBUS_OK;
739 }
740
TransAddDataBufNode(int32_t channelId,int32_t fd)741 int32_t TransAddDataBufNode(int32_t channelId, int32_t fd)
742 {
743 if (g_tcpDataList == NULL) {
744 TRANS_LOGE(TRANS_SDK, "g_tcpDataList is null.");
745 return SOFTBUS_NO_INIT;
746 }
747 ClientDataBuf *node = (ClientDataBuf *)SoftBusCalloc(sizeof(ClientDataBuf));
748 if (node == NULL) {
749 TRANS_LOGE(TRANS_SDK, "calloc failed.");
750 return SOFTBUS_MALLOC_ERR;
751 }
752 node->channelId = channelId;
753 node->fd = fd;
754 node->size = TransGetDataBufSize();
755 node->data = (char *)SoftBusCalloc(node->size);
756 if (node->data == NULL) {
757 SoftBusFree(node);
758 TRANS_LOGE(TRANS_SDK, "calloc data failed.");
759 return SOFTBUS_MALLOC_ERR;
760 }
761 node->w = node->data;
762
763 if (SoftBusMutexLock(&g_tcpDataList->lock) != SOFTBUS_OK) {
764 TRANS_LOGE(TRANS_SDK, "lock failed.");
765 SoftBusFree(node->data);
766 SoftBusFree(node);
767 return SOFTBUS_LOCK_ERR;
768 }
769 ListAdd(&g_tcpDataList->list, &node->node);
770 TRANS_LOGI(TRANS_SDK, "add channelId=%{public}d", channelId);
771 g_tcpDataList->cnt++;
772 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
773 return SOFTBUS_OK;
774 }
775
TransDelDataBufNode(int32_t channelId)776 int32_t TransDelDataBufNode(int32_t channelId)
777 {
778 if (g_tcpDataList == NULL) {
779 return SOFTBUS_NO_INIT;
780 }
781
782 if (SoftBusMutexLock(&g_tcpDataList->lock) != SOFTBUS_OK) {
783 TRANS_LOGE(TRANS_SDK, "lock failed.");
784 return SOFTBUS_LOCK_ERR;
785 }
786 ClientDataBuf *item = NULL;
787 ClientDataBuf *next = NULL;
788 LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_tcpDataList->list, ClientDataBuf, node) {
789 if (item->channelId == channelId) {
790 ListDelete(&item->node);
791 TRANS_LOGI(TRANS_SDK, "delete channelId=%{public}d", channelId);
792 SoftBusFree(item->data);
793 SoftBusFree(item);
794 g_tcpDataList->cnt--;
795 break;
796 }
797 }
798 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
799
800 return SOFTBUS_OK;
801 }
802
TransDestroyDataBuf(void)803 static int32_t TransDestroyDataBuf(void)
804 {
805 if (g_tcpDataList == NULL) {
806 return SOFTBUS_NO_INIT;
807 }
808
809 if (SoftBusMutexLock(&g_tcpDataList->lock) != SOFTBUS_OK) {
810 TRANS_LOGE(TRANS_SDK, "lock failed.");
811 return SOFTBUS_LOCK_ERR;
812 }
813 ClientDataBuf *item = NULL;
814 ClientDataBuf *next = NULL;
815 LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_tcpDataList->list, ClientDataBuf, node) {
816 ListDelete(&item->node);
817 SoftBusFree(item->data);
818 SoftBusFree(item);
819 g_tcpDataList->cnt--;
820 }
821 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
822
823 return SOFTBUS_OK;
824 }
825
TransGetDataBufNodeById(int32_t channelId)826 static ClientDataBuf *TransGetDataBufNodeById(int32_t channelId)
827 {
828 if (g_tcpDataList == NULL) {
829 return NULL;
830 }
831
832 ClientDataBuf *item = NULL;
833 LIST_FOR_EACH_ENTRY(item, &(g_tcpDataList->list), ClientDataBuf, node) {
834 if (item->channelId == channelId) {
835 return item;
836 }
837 }
838 TRANS_LOGE(TRANS_SDK, "tcp direct channel not exist. channelId=%{public}d", channelId);
839 return NULL;
840 }
841
TransTdcProcessDataByFlag(uint32_t flag,int32_t seqNum,TcpDirectChannelInfo * channel,const char * plain,uint32_t plainLen)842 static int32_t TransTdcProcessDataByFlag(
843 uint32_t flag, int32_t seqNum, TcpDirectChannelInfo *channel, const char *plain, uint32_t plainLen)
844 {
845 switch (flag) {
846 case FLAG_BYTES:
847 return ClientTransTdcOnDataReceived(channel->channelId, plain, plainLen, TRANS_SESSION_BYTES);
848 case FLAG_ACK:
849 TransTdcSetPendingPacket(channel->channelId, plain, plainLen, 0); // the old message process dataSeq is 0.
850 return SOFTBUS_OK;
851 case FLAG_MESSAGE:
852 TransTdcSendAck(channel->channelId, seqNum);
853 return ClientTransTdcOnDataReceived(channel->channelId, plain, plainLen, TRANS_SESSION_MESSAGE);
854 default:
855 TRANS_LOGE(TRANS_SDK, "unknown flag=%{public}d.", flag);
856 return SOFTBUS_INVALID_PARAM;
857 }
858 }
859
TransTdcProcessBytesDataByFlag(TcpDataTlvPacketHead * pktHead,TcpDirectChannelInfo * channel,char * plain,uint32_t plainLen)860 static int32_t TransTdcProcessBytesDataByFlag(
861 TcpDataTlvPacketHead *pktHead, TcpDirectChannelInfo *channel, char *plain, uint32_t plainLen)
862 {
863 uint32_t flag = pktHead->flags;
864 int32_t seqNum = pktHead->seq;
865 uint32_t dataSeq = pktHead->dataSeq;
866 bool needAck = pktHead->needAck;
867 switch (flag) {
868 case FLAG_BYTES:
869 TransTdcNeedSendAck(channel, seqNum, dataSeq, needAck); // this is new sync process and async process
870 return ClientTransTdcOnDataReceived(channel->channelId, plain, plainLen, TRANS_SESSION_BYTES);
871 case FLAG_ACK:
872 TransTdcSetPendingPacket(channel->channelId, plain, plainLen, dataSeq); // the async or new sync process
873 return SOFTBUS_OK;
874 case FLAG_MESSAGE:
875 TransTdcSendAck(channel->channelId, seqNum);
876 return ClientTransTdcOnDataReceived(channel->channelId, plain, plainLen, TRANS_SESSION_MESSAGE);
877 default:
878 TRANS_LOGE(TRANS_SDK, "unknown flag=%{public}u.", flag);
879 return SOFTBUS_INVALID_PARAM;
880 }
881 }
882
MoveNode(int32_t channelId,ClientDataBuf * node,uint32_t dataLen,int32_t pkgHeadSize)883 static int32_t MoveNode(int32_t channelId, ClientDataBuf *node, uint32_t dataLen, int32_t pkgHeadSize)
884 {
885 char *end = node->data + pkgHeadSize + dataLen;
886 if (memmove_s(node->data, node->size, end, node->w - end) != EOK) {
887 TRANS_LOGE(TRANS_SDK, "memmove fail, channelId=%{public}d, dataLen=%{public}u", channelId, dataLen);
888 return SOFTBUS_MEM_ERR;
889 }
890 node->w = node->w - pkgHeadSize - dataLen;
891 return SOFTBUS_OK;
892 }
893
TransTdcProcessTlvData(TcpDirectChannelInfo channel,TcpDataTlvPacketHead * pktHead,int32_t pkgHeadSize)894 static int32_t TransTdcProcessTlvData(TcpDirectChannelInfo channel, TcpDataTlvPacketHead *pktHead, int32_t pkgHeadSize)
895 {
896 if (SoftBusMutexLock(&g_tcpDataList->lock) != SOFTBUS_OK) {
897 return SOFTBUS_LOCK_ERR;
898 }
899 ClientDataBuf *node = TransGetDataBufNodeById(channel.channelId);
900 if (node == NULL) {
901 TRANS_LOGE(TRANS_SDK, "node is null. channelId=%{public}d", channel.channelId);
902 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
903 return SOFTBUS_TRANS_NODE_NOT_FOUND;
904 }
905 uint32_t dataLen = pktHead->dataLen;
906 TRANS_LOGI(TRANS_SDK, "data received, channelId=%{public}d, dataLen=%{public}u, size=%{public}d, seq=%{public}d",
907 channel.channelId, dataLen, node->size, pktHead->seq);
908 char *plain = (char *)SoftBusCalloc(dataLen - OVERHEAD_LEN);
909 if (plain == NULL) {
910 TRANS_LOGE(TRANS_SDK, "malloc fail, channelId=%{public}d, dataLen=%{public}u", channel.channelId, dataLen);
911 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
912 return SOFTBUS_MALLOC_ERR;
913 }
914
915 uint32_t plainLen;
916 int ret = TransTdcDecrypt(channel.detail.sessionKey, node->data + pkgHeadSize, dataLen, plain, &plainLen);
917 if (ret != SOFTBUS_OK) {
918 TRANS_LOGE(TRANS_SDK, "decrypt fail, channelId=%{public}d, dataLen=%{public}u", channel.channelId, dataLen);
919 SoftBusFree(plain);
920 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
921 return SOFTBUS_DECRYPT_ERR;
922 }
923 ret = MoveNode(channel.channelId, node, dataLen, pkgHeadSize);
924 if (ret != SOFTBUS_OK) {
925 SoftBusFree(plain);
926 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
927 return ret;
928 }
929 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
930 ret = TransTdcProcessBytesDataByFlag(pktHead, &channel, plain, plainLen);
931 if (ret != SOFTBUS_OK) {
932 TRANS_LOGE(TRANS_SDK, "process data fail, channelId=%{public}d, dataLen=%{public}u",
933 channel.channelId, dataLen);
934 }
935 SoftBusFree(plain);
936 return ret;
937 }
938
TransTdcProcessData(int32_t channelId)939 static int32_t TransTdcProcessData(int32_t channelId)
940 {
941 TcpDirectChannelInfo channel;
942 int32_t ret = TransTdcGetInfoById(channelId, &channel);
943 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, SOFTBUS_TRANS_TDC_CHANNEL_NOT_FOUND, TRANS_SDK,
944 "get key fail. channelId=%{public}d ", channelId);
945 ret = SoftBusMutexLock(&g_tcpDataList->lock);
946 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_SDK, "lock failed ");
947 ClientDataBuf *node = TransGetDataBufNodeById(channelId);
948 if (node == NULL) {
949 TRANS_LOGE(TRANS_SDK, "node is null. channelId=%{public}d ", channelId);
950 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
951 return SOFTBUS_TRANS_NODE_NOT_FOUND;
952 }
953 TcpDataPacketHead *pktHead = (TcpDataPacketHead *)(node->data);
954 int32_t seqNum = pktHead->seq;
955 uint32_t flag = pktHead->flags;
956 uint32_t dataLen = pktHead->dataLen;
957 TRANS_LOGI(TRANS_SDK, "data received, channelId=%{public}d, len=%{public}u, size=%{public}d, seq=%{public}d"
958 ", flags=%{public}d", channelId, dataLen, node->size, seqNum, flag);
959 char *plain = (char *)SoftBusCalloc(dataLen - OVERHEAD_LEN);
960 if (plain == NULL) {
961 TRANS_LOGE(TRANS_SDK, "malloc fail, channelId=%{public}d, dataLen=%{public}u", channelId, dataLen);
962 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
963 return SOFTBUS_MALLOC_ERR;
964 }
965
966 uint32_t plainLen;
967 ret = TransTdcDecrypt(channel.detail.sessionKey, node->data + DC_DATA_HEAD_SIZE, dataLen,
968 plain, &plainLen);
969 if (ret != SOFTBUS_OK) {
970 TRANS_LOGE(TRANS_SDK, "decrypt fail, channelId=%{public}d, dataLen=%{public}u", channelId, dataLen);
971 SoftBusFree(plain);
972 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
973 return SOFTBUS_DECRYPT_ERR;
974 }
975 ret = MoveNode(channelId, node, dataLen, DC_DATA_HEAD_SIZE);
976 if (ret != SOFTBUS_OK) {
977 SoftBusFree(plain);
978 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
979 return ret;
980 }
981 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
982 ret = TransTdcProcessDataByFlag(flag, seqNum, &channel, plain, plainLen);
983 if (ret != SOFTBUS_OK) {
984 TRANS_LOGE(TRANS_SDK, "process data fail, channelId=%{public}d, dataLen=%{public}u", channelId, dataLen);
985 }
986 SoftBusFree(plain);
987 return ret;
988 }
989
TransResizeDataBuffer(ClientDataBuf * oldBuf,uint32_t pkgLen)990 static int32_t TransResizeDataBuffer(ClientDataBuf *oldBuf, uint32_t pkgLen)
991 {
992 TRANS_LOGI(TRANS_SDK, "Resize Data Buffer channelId=%{public}d, pkgLen=%{public}d",
993 oldBuf->channelId, pkgLen);
994 char *newBuf = (char *)SoftBusCalloc(pkgLen);
995 if (newBuf == NULL) {
996 TRANS_LOGE(TRANS_SDK, "malloc err pkgLen=%{public}u", pkgLen);
997 return SOFTBUS_MALLOC_ERR;
998 }
999 uint32_t bufLen = oldBuf->w - oldBuf->data;
1000 if (memcpy_s(newBuf, pkgLen, oldBuf->data, bufLen) != EOK) {
1001 SoftBusFree(newBuf);
1002 return SOFTBUS_MEM_ERR;
1003 }
1004 SoftBusFree(oldBuf->data);
1005 oldBuf->data = NULL;
1006 oldBuf->data = newBuf;
1007 oldBuf->size = pkgLen;
1008 oldBuf->w = newBuf + bufLen;
1009 TRANS_LOGI(TRANS_SDK, "TransResizeDataBuffer ok");
1010 return SOFTBUS_OK;
1011 }
1012
TransTdcProcAllTlvData(int32_t channelId)1013 static int32_t TransTdcProcAllTlvData(int32_t channelId)
1014 {
1015 TRANS_CHECK_AND_RETURN_RET_LOGE(g_tcpDataList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_tcpSrvDataList is NULL");
1016 while (1) {
1017 SoftBusMutexLock(&g_tcpDataList->lock);
1018 ClientDataBuf *node = TransGetDataBufNodeById(channelId);
1019 if (node == NULL) {
1020 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1021 TRANS_LOGE(TRANS_SDK, "can not find data buf node. channelId=%{public}d", channelId);
1022 return SOFTBUS_TRANS_NODE_NOT_FOUND;
1023 }
1024 uint32_t bufLen = node->w - node->data;
1025 if (bufLen == 0) {
1026 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1027 return SOFTBUS_OK;
1028 }
1029 TcpDirectChannelInfo channel;
1030 if (TransTdcGetInfoById(channelId, &channel) != SOFTBUS_OK) {
1031 TRANS_LOGE(TRANS_SDK, "get channelInfo fail. channelId=%{public}d", channelId);
1032 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1033 return SOFTBUS_TRANS_TDC_CHANNEL_NOT_FOUND;
1034 }
1035 TcpDataTlvPacketHead pktHead;
1036 uint32_t headSize = 0;
1037 int32_t ret = TransTdcParseTlv(bufLen, node->data, &pktHead, &headSize);
1038 if (ret != SOFTBUS_OK) {
1039 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1040 return ret;
1041 }
1042 TransTcpDataTlvUnpack(&pktHead);
1043 if (bufLen < headSize) {
1044 TRANS_LOGE(TRANS_SDK,
1045 "data bufLen not enough, recv data next time. channelId=%{public}d, bufLen=%{public}u",
1046 channelId, bufLen);
1047 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1048 return SOFTBUS_DATA_NOT_ENOUGH;
1049 }
1050 if (pktHead.magicNumber != MAGIC_NUMBER) {
1051 TRANS_LOGE(TRANS_SDK, "invalid data packet head. channelId=%{public}d", channelId);
1052 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1053 return SOFTBUS_INVALID_DATA_HEAD;
1054 }
1055 if ((pktHead.dataLen > g_dataBufferMaxLen - headSize) || (pktHead.dataLen <= OVERHEAD_LEN)) {
1056 TRANS_LOGE(TRANS_SDK, "illegal dataLen=%{public}u", pktHead.dataLen);
1057 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1058 return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
1059 }
1060 uint32_t pkgLen = pktHead.dataLen + headSize;
1061 if (pkgLen > node->size && pkgLen <= g_dataBufferMaxLen) {
1062 int32_t res = TransResizeDataBuffer(node, pkgLen);
1063 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1064 return res;
1065 }
1066 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1067 if (bufLen < pkgLen) {
1068 TRANS_LOGE(TRANS_SDK, "data bufLen not enough, recv data next time. bufLen=%{public}u", bufLen);
1069 return SOFTBUS_DATA_NOT_ENOUGH;
1070 }
1071 ret = TransTdcProcessTlvData(channel, &pktHead, headSize);
1072 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "data received failed");
1073 }
1074 }
1075
TransTdcProcAllData(int32_t channelId)1076 static int32_t TransTdcProcAllData(int32_t channelId)
1077 {
1078 TRANS_CHECK_AND_RETURN_RET_LOGE(g_tcpDataList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_tcpSrvDataList is NULL");
1079 while (1) {
1080 SoftBusMutexLock(&g_tcpDataList->lock);
1081 ClientDataBuf *node = TransGetDataBufNodeById(channelId);
1082 if (node == NULL) {
1083 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1084 TRANS_LOGE(TRANS_SDK, "can not find data buf node. channelId=%{public}d", channelId);
1085 return SOFTBUS_TRANS_NODE_NOT_FOUND;
1086 }
1087 uint32_t bufLen = node->w - node->data;
1088 if (bufLen == 0) {
1089 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1090 return SOFTBUS_OK;
1091 }
1092 if (bufLen < DC_DATA_HEAD_SIZE) {
1093 TRANS_LOGW(TRANS_SDK,
1094 "head bufLen not enough, recv head next time. channelId=%{public}d, bufLen=%{public}u",
1095 channelId, bufLen);
1096 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1097 return SOFTBUS_DATA_NOT_ENOUGH;
1098 }
1099
1100 TcpDataPacketHead *pktHead = (TcpDataPacketHead *)(node->data);
1101 UnpackTcpDataPacketHead(pktHead);
1102 if (pktHead->magicNumber != MAGIC_NUMBER) {
1103 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1104 return SOFTBUS_INVALID_DATA_HEAD;
1105 }
1106 if ((pktHead->dataLen > g_dataBufferMaxLen - DC_DATA_HEAD_SIZE) || (pktHead->dataLen <= OVERHEAD_LEN)) {
1107 TRANS_LOGE(TRANS_SDK, "illegal dataLen=%{public}u", pktHead->dataLen);
1108 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1109 return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
1110 }
1111 uint32_t pkgLen = pktHead->dataLen + DC_DATA_HEAD_SIZE;
1112
1113 if (pkgLen > node->size && pkgLen <= g_dataBufferMaxLen) {
1114 int32_t ret = TransResizeDataBuffer(node, pkgLen);
1115 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1116 return ret;
1117 }
1118 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1119
1120 if (bufLen < pkgLen) {
1121 TRANS_LOGE(TRANS_SDK, "data bufLen not enough, recv data next time. bufLen=%{public}u", bufLen);
1122 return SOFTBUS_DATA_NOT_ENOUGH;
1123 }
1124 int32_t ret = TransTdcProcessData(channelId);
1125 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "data received failed");
1126 }
1127 }
1128
TransClientGetTdcDataBufByChannel(int32_t channelId,int32_t * fd,size_t * len)1129 static int32_t TransClientGetTdcDataBufByChannel(int32_t channelId, int32_t *fd, size_t *len)
1130 {
1131 if (fd == NULL || len == NULL) {
1132 TRANS_LOGE(TRANS_SDK, "invalid param.");
1133 return SOFTBUS_INVALID_PARAM;
1134 }
1135
1136 if (g_tcpDataList == NULL) {
1137 TRANS_LOGE(TRANS_SDK, "tdc data list empty.");
1138 return SOFTBUS_NO_INIT;
1139 }
1140
1141 if (SoftBusMutexLock(&g_tcpDataList->lock) != SOFTBUS_OK) {
1142 TRANS_LOGE(TRANS_SDK, "lock failed.");
1143 return SOFTBUS_LOCK_ERR;
1144 }
1145 ClientDataBuf *item = NULL;
1146 LIST_FOR_EACH_ENTRY(item, &(g_tcpDataList->list), ClientDataBuf, node) {
1147 if (item->channelId == channelId) {
1148 *fd = item->fd;
1149 *len = item->size - (item->w - item->data);
1150 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1151 return SOFTBUS_OK;
1152 }
1153 }
1154 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1155 TRANS_LOGE(TRANS_SDK, "client get tdc data buf not found. channelId=%{public}d", channelId);
1156 return SOFTBUS_TRANS_TDC_CHANNEL_NOT_FOUND;
1157 }
1158
TransClientUpdateTdcDataBufWInfo(int32_t channelId,char * recvBuf,int32_t recvLen)1159 static int32_t TransClientUpdateTdcDataBufWInfo(int32_t channelId, char *recvBuf, int32_t recvLen)
1160 {
1161 if (recvBuf == NULL) {
1162 TRANS_LOGE(TRANS_SDK, "invalid param.");
1163 return SOFTBUS_INVALID_PARAM;
1164 }
1165 if (g_tcpDataList == NULL) {
1166 TRANS_LOGE(TRANS_SDK, "data list empty.");
1167 return SOFTBUS_NO_INIT;
1168 }
1169 if (SoftBusMutexLock(&g_tcpDataList->lock) != SOFTBUS_OK) {
1170 TRANS_LOGE(TRANS_SDK, "lock failed.");
1171 return SOFTBUS_LOCK_ERR;
1172 }
1173
1174 ClientDataBuf *item = NULL;
1175 ClientDataBuf *nextItem = NULL;
1176 LIST_FOR_EACH_ENTRY_SAFE(item, nextItem, &(g_tcpDataList->list), ClientDataBuf, node) {
1177 if (item->channelId != channelId) {
1178 continue;
1179 }
1180 int32_t freeLen = (int32_t)(item->size) - (item->w - item->data);
1181 if (recvLen > freeLen) {
1182 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1183 TRANS_LOGE(TRANS_SDK,
1184 "client tdc recvLen override freeLen. recvLen=%{public}d, freeLen=%{public}d", recvLen, freeLen);
1185 return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
1186 }
1187 if (memcpy_s(item->w, recvLen, recvBuf, recvLen) != EOK) {
1188 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1189 TRANS_LOGE(TRANS_SDK, "client tdc memcpy failed. channelId=%{public}d", channelId);
1190 return SOFTBUS_MEM_ERR;
1191 }
1192 item->w += recvLen;
1193 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1194 TRANS_LOGD(TRANS_SDK, "client update tdc data success, channelId=%{public}d", channelId);
1195 return SOFTBUS_OK;
1196 }
1197 (void)SoftBusMutexUnlock(&g_tcpDataList->lock);
1198 TRANS_LOGE(TRANS_SDK, "client update tdc data buf not found. channelId=%{public}d", channelId);
1199 return SOFTBUS_TRANS_TDC_CHANNEL_NOT_FOUND;
1200 }
1201
TransTdcRecvData(int32_t channelId)1202 int32_t TransTdcRecvData(int32_t channelId)
1203 {
1204 int32_t fd = -1;
1205 size_t len = 0;
1206 int32_t ret = TransClientGetTdcDataBufByChannel(channelId, &fd, &len);
1207 if (ret != SOFTBUS_OK) {
1208 TRANS_LOGE(TRANS_SDK, "get Tdc data buf by channelId=%{public}d failed, ret=%{public}d", channelId, ret);
1209 return ret;
1210 }
1211 if (len == 0 || len > g_dataBufferMaxLen) {
1212 TRANS_LOGE(TRANS_SDK,
1213 "client tdc free databuf len invalid. channelId=%{public}d, len=%{public}zu", channelId, len);
1214 return SOFTBUS_TRANS_INVALID_DATA_LENGTH;
1215 }
1216
1217 char *recvBuf = (char*)SoftBusCalloc(len);
1218 if (recvBuf == NULL) {
1219 TRANS_LOGE(TRANS_SDK, "client tdc calloc failed. channelId=%{public}d, len=%{public}zu", channelId, len);
1220 return SOFTBUS_MALLOC_ERR;
1221 }
1222
1223 int32_t recvLen = ConnRecvSocketData(fd, recvBuf, len, 0);
1224 if (recvLen < 0) {
1225 SoftBusFree(recvBuf);
1226 int32_t socketErrCode = GetErrCodeBySocketErr(SOFTBUS_TRANS_TCP_GET_SRV_DATA_FAILED);
1227 TRANS_LOGE(TRANS_SDK, "client recv data failed, channelId=%{public}d, recvLen=%{public}d, errcode=%{public}d.",
1228 channelId, recvLen, socketErrCode);
1229 return socketErrCode;
1230 } else if (recvLen == 0) {
1231 SoftBusFree(recvBuf);
1232 return SOFTBUS_DATA_NOT_ENOUGH;
1233 }
1234 ret = TransClientUpdateTdcDataBufWInfo(channelId, recvBuf, recvLen);
1235 if (ret != SOFTBUS_OK) {
1236 SoftBusFree(recvBuf);
1237 TRANS_LOGE(TRANS_SDK, "client update data buf failed. channelId=%{public}d, ret=%{public}d", channelId, ret);
1238 return ret;
1239 }
1240 SoftBusFree(recvBuf);
1241 bool supportTlv = false;
1242 ret = GetSupportTlvAndNeedAckById(channelId, CHANNEL_TYPE_TCP_DIRECT, &supportTlv, NULL);
1243 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "fail to get support tlv");
1244 if (supportTlv) {
1245 return TransTdcProcAllTlvData(channelId);
1246 }
1247 return TransTdcProcAllData(channelId);
1248 }
1249
TransDataListInit(void)1250 int32_t TransDataListInit(void)
1251 {
1252 if (g_tcpDataList != NULL) {
1253 TRANS_LOGI(TRANS_SDK, "g_tcpDataList already init");
1254 return SOFTBUS_OK;
1255 }
1256 int32_t ret = TransGetDataBufMaxSize();
1257 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "TransGetDataBufMaxSize failed");
1258
1259 g_tcpDataList = CreateSoftBusList();
1260 if (g_tcpDataList == NULL) {
1261 TRANS_LOGE(TRANS_SDK, "g_tcpDataList creat list failed");
1262 return SOFTBUS_NO_INIT;
1263 }
1264 return SOFTBUS_OK;
1265 }
1266
TransDataListDeinit(void)1267 void TransDataListDeinit(void)
1268 {
1269 if (g_tcpDataList == NULL) {
1270 return;
1271 }
1272 (void)TransDestroyDataBuf();
1273 DestroySoftBusList(g_tcpDataList);
1274 g_tcpDataList = NULL;
1275 }
1276