• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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