• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 "trans_tcp_direct_message.h"
17 
18 #include <securec.h>
19 #include <string.h>
20 
21 #include "auth_interface.h"
22 #include "bus_center_manager.h"
23 #include "cJSON.h"
24 #include "softbus_app_info.h"
25 #include "softbus_adapter_crypto.h"
26 #include "softbus_adapter_mem.h"
27 #include "softbus_adapter_thread.h"
28 #include "softbus_adapter_socket.h"
29 #include "softbus_errcode.h"
30 #include "softbus_feature_config.h"
31 #include "softbus_hisysevt_transreporter.h"
32 #include "softbus_log.h"
33 #include "softbus_message_open_channel.h"
34 #include "softbus_socket.h"
35 #include "softbus_tcp_socket.h"
36 #include "trans_tcp_direct_callback.h"
37 #include "trans_tcp_direct_manager.h"
38 #include "trans_tcp_direct_sessionconn.h"
39 #include "wifi_direct_manager.h"
40 #include "data_bus_native.h"
41 #include "lnn_lane_link.h"
42 #include "lnn_net_builder.h"
43 
44 #define MAX_PACKET_SIZE (64 * 1024)
45 
46 typedef struct {
47     ListNode node;
48     int32_t channelId;
49     int32_t fd;
50     uint32_t size;
51     char *data;
52     char *w;
53 } ServerDataBuf;
54 
55 typedef struct {
56     int32_t channelType;
57     int32_t businessType;
58     ConfigType configType;
59 } ConfigTypeMap;
60 
61 static SoftBusList *g_tcpSrvDataList = NULL;
62 
PackTdcPacketHead(TdcPacketHead * data)63 static void PackTdcPacketHead(TdcPacketHead *data)
64 {
65     data->magicNumber = SoftBusHtoLl(data->magicNumber);
66     data->module = SoftBusHtoLl(data->module);
67     data->seq = SoftBusHtoLll(data->seq);
68     data->flags = SoftBusHtoLl(data->flags);
69     data->dataLen = SoftBusHtoLl(data->dataLen);
70 }
71 
UnpackTdcPacketHead(TdcPacketHead * data)72 static void UnpackTdcPacketHead(TdcPacketHead *data)
73 {
74     data->magicNumber = SoftBusLtoHl(data->magicNumber);
75     data->module = SoftBusLtoHl(data->module);
76     data->seq = SoftBusLtoHll(data->seq);
77     data->flags = SoftBusLtoHl(data->flags);
78     data->dataLen = SoftBusLtoHl(data->dataLen);
79 }
80 
TransSrvDataListInit(void)81 NO_SANITIZE("cfi") int32_t TransSrvDataListInit(void)
82 {
83     if (g_tcpSrvDataList != NULL) {
84         return SOFTBUS_OK;
85     }
86     g_tcpSrvDataList = CreateSoftBusList();
87     if (g_tcpSrvDataList == NULL) {
88         return SOFTBUS_ERR;
89     }
90     return SOFTBUS_OK;
91 }
92 
TransSrvDestroyDataBuf(void)93 static void TransSrvDestroyDataBuf(void)
94 {
95     if (g_tcpSrvDataList ==  NULL) {
96         return;
97     }
98 
99     ServerDataBuf *item = NULL;
100     ServerDataBuf *next = NULL;
101     if (SoftBusMutexLock(&g_tcpSrvDataList->lock) != SOFTBUS_OK) {
102         return;
103     }
104     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_tcpSrvDataList->list, ServerDataBuf, node) {
105         ListDelete(&item->node);
106         SoftBusFree(item->data);
107         SoftBusFree(item);
108         g_tcpSrvDataList->cnt--;
109     }
110     SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
111 
112     return;
113 }
114 
TransSrvDataListDeinit(void)115 NO_SANITIZE("cfi") void TransSrvDataListDeinit(void)
116 {
117     if (g_tcpSrvDataList == NULL) {
118         return;
119     }
120     TransSrvDestroyDataBuf();
121     DestroySoftBusList(g_tcpSrvDataList);
122     g_tcpSrvDataList = NULL;
123 }
124 
TransSrvAddDataBufNode(int32_t channelId,int32_t fd)125 NO_SANITIZE("cfi") int32_t TransSrvAddDataBufNode(int32_t channelId, int32_t fd)
126 {
127 #define MAX_DATA_BUF 4096
128     ServerDataBuf *node = (ServerDataBuf *)SoftBusCalloc(sizeof(ServerDataBuf));
129     if (node == NULL) {
130         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "create server data buf node fail.");
131         return SOFTBUS_MALLOC_ERR;
132     }
133     node->channelId = channelId;
134     node->fd = fd;
135     node->size = MAX_DATA_BUF;
136     node->data = (char*)SoftBusCalloc(MAX_DATA_BUF);
137     if (node->data == NULL) {
138         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "create server data buf fail.");
139         SoftBusFree(node);
140         return SOFTBUS_MALLOC_ERR;
141     }
142     node->w = node->data;
143 
144     if (SoftBusMutexLock(&(g_tcpSrvDataList->lock)) != SOFTBUS_OK) {
145         SoftBusFree(node->data);
146         SoftBusFree(node);
147         return SOFTBUS_ERR;
148     }
149     ListInit(&node->node);
150     ListTailInsert(&g_tcpSrvDataList->list, &node->node);
151     g_tcpSrvDataList->cnt++;
152     SoftBusMutexUnlock(&(g_tcpSrvDataList->lock));
153 
154     return SOFTBUS_OK;
155 }
156 
TransSrvDelDataBufNode(int channelId)157 NO_SANITIZE("cfi") void TransSrvDelDataBufNode(int channelId)
158 {
159     if (g_tcpSrvDataList ==  NULL) {
160         return;
161     }
162 
163     ServerDataBuf *item = NULL;
164     ServerDataBuf *next = NULL;
165     if (SoftBusMutexLock(&g_tcpSrvDataList->lock) != SOFTBUS_OK) {
166         return;
167     }
168     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_tcpSrvDataList->list, ServerDataBuf, node) {
169         if (item->channelId == channelId) {
170             ListDelete(&item->node);
171             SoftBusFree(item->data);
172             SoftBusFree(item);
173             g_tcpSrvDataList->cnt--;
174             break;
175         }
176     }
177     SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
178 }
179 
SwitchCipherTypeToAuthLinkType(uint32_t cipherFlag)180 static AuthLinkType SwitchCipherTypeToAuthLinkType(uint32_t cipherFlag)
181 {
182     if (cipherFlag & FLAG_BR) {
183         return AUTH_LINK_TYPE_BR;
184     }
185 
186     if (cipherFlag & FLAG_BLE) {
187         return AUTH_LINK_TYPE_BLE;
188     }
189 
190     if (cipherFlag & FLAG_P2P) {
191         return AUTH_LINK_TYPE_P2P;
192     }
193     return AUTH_LINK_TYPE_WIFI;
194 }
195 
PackBytes(int32_t channelId,const char * data,TdcPacketHead * packetHead,char * buffer,uint32_t bufLen)196 static int32_t PackBytes(int32_t channelId, const char *data, TdcPacketHead *packetHead,
197     char *buffer, uint32_t bufLen)
198 {
199     int64_t authId = GetAuthIdByChanId(channelId);
200     if (authId == AUTH_INVALID_ID) {
201         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "PackBytes get auth id fail");
202         return SOFTBUS_NOT_FIND;
203     }
204 
205     uint8_t *encData = (uint8_t *)buffer + DC_MSG_PACKET_HEAD_SIZE;
206     uint32_t encDataLen = bufLen - DC_MSG_PACKET_HEAD_SIZE;
207     if (AuthEncrypt(authId, (const uint8_t *)data, packetHead->dataLen, encData, &encDataLen) != SOFTBUS_OK) {
208         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "PackBytes encrypt fail");
209         return SOFTBUS_ENCRYPT_ERR;
210     }
211     packetHead->dataLen = encDataLen;
212 
213     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "PackBytes: flag=0x%x, seq=%" PRIu64,
214         packetHead->flags, packetHead->seq);
215 
216     PackTdcPacketHead(packetHead);
217     if (memcpy_s(buffer, bufLen, packetHead, sizeof(TdcPacketHead)) != EOK) {
218         return SOFTBUS_MEM_ERR;
219     }
220     return SOFTBUS_OK;
221 }
222 
SendFailToFlushDevice(SessionConn * conn)223 NO_SANITIZE("cfi") static void SendFailToFlushDevice(SessionConn *conn)
224 {
225     if (conn->appInfo.routeType == WIFI_STA) {
226         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "send data fail, do Authflushdevice uuid:%s",
227             AnonymizesNetworkID(conn->appInfo.peerData.deviceId));
228         if (AuthFlushDevice(conn->appInfo.peerData.deviceId) != SOFTBUS_OK) {
229             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "tcp flush failed, wifi will offline");
230             LnnRequestLeaveSpecific(conn->appInfo.peerNetWorkId, CONNECTION_ADDR_WLAN);
231         }
232     }
233 }
234 
TransTdcPostBytes(int32_t channelId,TdcPacketHead * packetHead,const char * data)235 NO_SANITIZE("cfi") int32_t TransTdcPostBytes(int32_t channelId, TdcPacketHead *packetHead, const char *data)
236 {
237     if (data == NULL || packetHead == NULL || packetHead->dataLen == 0) {
238         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid para.");
239         return SOFTBUS_INVALID_PARAM;
240     }
241     uint32_t bufferLen = AuthGetEncryptSize(packetHead->dataLen) + DC_MSG_PACKET_HEAD_SIZE;
242     char *buffer = (char *)SoftBusCalloc(bufferLen);
243     if (buffer == NULL) {
244         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "buffer malloc error.");
245         return SOFTBUS_MALLOC_ERR;
246     }
247     AnonyPacketPrintout(SOFTBUS_LOG_TRAN, "TransTdcPostBytes, data: ", data, packetHead->dataLen);
248     if (PackBytes(channelId, data, packetHead, buffer, bufferLen) != SOFTBUS_OK) {
249         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Pack Bytes error.");
250         SoftBusFree(buffer);
251         return SOFTBUS_ENCRYPT_ERR;
252     }
253     SessionConn *conn = (SessionConn *)SoftBusCalloc(sizeof(SessionConn));
254     if (conn == NULL) {
255         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "malloc conn fail");
256         SoftBusFree(buffer);
257         return SOFTBUS_ERR;
258     }
259 
260     if (GetSessionConnById(channelId, conn) == NULL) {
261         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Get SessionConn fail");
262         SoftBusFree(buffer);
263         SoftBusFree(conn);
264         return SOFTBUS_ERR;
265     }
266     int fd = conn->appInfo.fd;
267     if (ConnSendSocketData(fd, buffer, bufferLen, 0) != (int)bufferLen) {
268         SendFailToFlushDevice(conn);
269         SoftBusFree(buffer);
270         SoftBusFree(conn);
271         return SOFTBUS_ERR;
272     }
273     SoftBusFree(conn);
274     SoftBusFree(buffer);
275     return SOFTBUS_OK;
276 }
277 
NotifyChannelOpened(int32_t channelId)278 static int32_t NotifyChannelOpened(int32_t channelId)
279 {
280     SessionConn conn;
281     if (GetSessionConnById(channelId, &conn) == NULL) {
282         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "notify channel open failed, get tdcInfo is null");
283         return SOFTBUS_ERR;
284     }
285     ChannelInfo info = {0};
286     info.channelId = channelId;
287     info.channelType = CHANNEL_TYPE_TCP_DIRECT;
288     info.isServer = conn.serverSide;
289     info.isEnabled = true;
290     info.fd = conn.appInfo.fd;
291     info.sessionKey = conn.appInfo.sessionKey;
292     info.myHandleId = conn.appInfo.myHandleId;
293     info.peerHandleId = conn.appInfo.peerHandleId;
294     info.peerSessionName = conn.appInfo.peerData.sessionName;
295     info.groupId = conn.appInfo.groupId;
296     info.isEncrypt = true;
297     info.keyLen = SESSION_KEY_LENGTH;
298     info.peerUid = conn.appInfo.peerData.uid;
299     info.peerPid = conn.appInfo.peerData.pid;
300     info.routeType = conn.appInfo.routeType;
301     info.businessType = conn.appInfo.businessType;
302     info.autoCloseTime = conn.appInfo.autoCloseTime;
303     info.peerIp = conn.appInfo.peerData.addr;
304     info.peerPort = conn.appInfo.peerData.port;
305     info.linkType = conn.appInfo.linkType;
306     info.dataConfig = conn.appInfo.myData.dataConfig;
307     char myIp[IP_LEN] = {0};
308     if (conn.serverSide) {
309         if (conn.appInfo.routeType == WIFI_STA) {
310             if (LnnGetLocalStrInfo(STRING_KEY_WLAN_IP, myIp, sizeof(myIp)) != SOFTBUS_OK) {
311                 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "NotifyChannelOpened get local ip fail");
312                 return SOFTBUS_ERR;
313             }
314         } else if (conn.appInfo.routeType == WIFI_P2P) {
315             if (GetWifiDirectManager()->getLocalIpByUuid(conn.appInfo.peerData.deviceId, myIp,
316                 sizeof(myIp)) != SOFTBUS_OK) {
317                 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "NotifyChannelOpened get p2p ip fail");
318                 return SOFTBUS_TRANS_GET_P2P_INFO_FAILED;
319             }
320         }
321         info.myIp = myIp;
322     } else {
323         info.myIp = conn.appInfo.myData.addr;
324     }
325     char buf[NETWORK_ID_BUF_LEN] = {0};
326     int32_t ret = LnnGetNetworkIdByUuid(conn.appInfo.peerData.deviceId, buf, NETWORK_ID_BUF_LEN);
327     if (ret != SOFTBUS_OK) {
328         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get info networkId fail.");
329         return SOFTBUS_ERR;
330     }
331     info.peerDeviceId = buf;
332     info.timeStart = conn.appInfo.timeStart;
333     info.linkType = conn.appInfo.linkType;
334     char pkgName[PKG_NAME_SIZE_MAX] = {0};
335     if (TransTdcGetPkgName(conn.appInfo.myData.sessionName, pkgName, PKG_NAME_SIZE_MAX) != SOFTBUS_OK) {
336         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get pkg name fail.");
337         return SOFTBUS_ERR;
338     }
339 
340     int uid = 0;
341     int pid = 0;
342     if (TransTdcGetUidAndPid(conn.appInfo.myData.sessionName, &uid, &pid) != SOFTBUS_OK) {
343         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get uid and pid fail.");
344         return SOFTBUS_ERR;
345     }
346     if (conn.appInfo.fastTransDataSize > 0) {
347         info.isFastData = true;
348     }
349     ret = TransTdcOnChannelOpened(pkgName, pid, conn.appInfo.myData.sessionName, &info);
350     conn.status = TCP_DIRECT_CHANNEL_STATUS_CONNECTED;
351     SetSessionConnStatusById(channelId, conn.status);
352     return ret;
353 }
354 
NotifyChannelClosed(const AppInfo * appInfo,int32_t channelId)355 static int32_t NotifyChannelClosed(const AppInfo *appInfo, int32_t channelId)
356 {
357     AppInfoData myData = appInfo->myData;
358     int ret = TransTdcOnChannelClosed(myData.pkgName, myData.pid, channelId);
359     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "channelId = %d, ret = %d", channelId, ret);
360     return ret;
361 }
NotifyChannelOpenFailed(int32_t channelId,int32_t errCode)362 NO_SANITIZE("cfi") int32_t NotifyChannelOpenFailed(int32_t channelId, int32_t errCode)
363 {
364     SessionConn conn;
365     if (GetSessionConnById(channelId, &conn) == NULL) {
366         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "notify channel open failed, get tdcInfo is null");
367         return SOFTBUS_ERR;
368     }
369     int64_t timeStart = conn.appInfo.timeStart;
370     int64_t timediff = GetSoftbusRecordTimeMillis() - timeStart;
371     SoftbusRecordOpenSessionKpi(conn.appInfo.myData.pkgName,
372         conn.appInfo.linkType, SOFTBUS_EVT_OPEN_SESSION_FAIL, timediff);
373     char pkgName[PKG_NAME_SIZE_MAX] = {0};
374     if (TransTdcGetPkgName(conn.appInfo.myData.sessionName, pkgName, PKG_NAME_SIZE_MAX) != SOFTBUS_OK) {
375         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get pkg name fail.");
376         return SOFTBUS_ERR;
377     }
378 
379     if (conn.serverSide == false) {
380         AppInfoData *myData = &conn.appInfo.myData;
381         int ret = TransTdcOnChannelOpenFailed(myData->pkgName, myData->pid, channelId, errCode);
382         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "channelId = %d, ret = %d", channelId, ret);
383         return ret;
384     }
385     return SOFTBUS_OK;
386 }
387 
TransTdcPostFisrtData(SessionConn * conn)388 static int TransTdcPostFisrtData(SessionConn *conn)
389 {
390     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "begin TransTdcPostFisrtData");
391     uint32_t outLen;
392     char *buf = TransTdcPackFastData(&(conn->appInfo), &outLen);
393     if (buf == NULL) {
394         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "failed to pack bytes.");
395         return SOFTBUS_ENCRYPT_ERR;
396     }
397     if (outLen != conn->appInfo.fastTransDataSize + FAST_TDC_EXT_DATA_SIZE) {
398         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "pack bytes len error, len: %d", outLen);
399         SoftBusFree(buf);
400         return SOFTBUS_ENCRYPT_ERR;
401     }
402     uint32_t tos = (conn->appInfo.businessType == BUSINESS_TYPE_BYTE) ? FAST_BYTE_TOS : FAST_MESSAGE_TOS;
403     if (SetIpTos(conn->appInfo.fd, tos) != SOFTBUS_OK) {
404         SoftBusFree(buf);
405         return SOFTBUS_TCP_SOCKET_ERR;
406     }
407     ssize_t ret = ConnSendSocketData(conn->appInfo.fd, buf, outLen, 0);
408     if (ret != (ssize_t)outLen) {
409         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "failed to send tcp data. ret: %d", ret);
410         SoftBusFree(buf);
411         return SOFTBUS_ERR;
412     }
413     SoftBusFree(buf);
414     buf = NULL;
415     return SOFTBUS_OK;
416 }
417 
418 static const ConfigTypeMap g_configTypeMap[] = {
419     {CHANNEL_TYPE_TCP_DIRECT, BUSINESS_TYPE_BYTE, SOFTBUS_INT_MAX_BYTES_NEW_LENGTH},
420     {CHANNEL_TYPE_TCP_DIRECT, BUSINESS_TYPE_MESSAGE, SOFTBUS_INT_MAX_MESSAGE_NEW_LENGTH},
421 };
422 
FindConfigType(int32_t channelType,int32_t businessType)423 static int32_t FindConfigType(int32_t channelType, int32_t businessType)
424 {
425     for (uint32_t i = 0; i < sizeof(g_configTypeMap) / sizeof(ConfigTypeMap); i++) {
426         if ((g_configTypeMap[i].channelType == channelType) &&
427             (g_configTypeMap[i].businessType == businessType)) {
428             return g_configTypeMap[i].configType;
429         }
430     }
431     return SOFTBUS_CONFIG_TYPE_MAX;
432 }
433 
TransGetLocalConfig(int32_t channelType,int32_t businessType,uint32_t * len)434 static int32_t TransGetLocalConfig(int32_t channelType, int32_t businessType, uint32_t *len)
435 {
436     ConfigType configType = (ConfigType)FindConfigType(channelType, businessType);
437     if (configType == SOFTBUS_CONFIG_TYPE_MAX) {
438         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Invalid channelType: %d, businessType: %d",
439             channelType, businessType);
440         return SOFTBUS_INVALID_PARAM;
441     }
442     uint32_t maxLen;
443     if (SoftbusGetConfig(configType, (unsigned char *)&maxLen, sizeof(maxLen)) != SOFTBUS_OK) {
444         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get config failed, configType: %d.", configType);
445         return SOFTBUS_GET_CONFIG_VAL_ERR;
446     }
447 
448     *len = maxLen;
449     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get local config = %d.", *len);
450     return SOFTBUS_OK;
451 }
452 
TransTdcProcessDataConfig(AppInfo * appInfo)453 static int32_t TransTdcProcessDataConfig(AppInfo *appInfo)
454 {
455     if (appInfo == NULL) {
456         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "appInfo is null");
457         return SOFTBUS_ERR;
458     }
459     if (appInfo->businessType != BUSINESS_TYPE_MESSAGE && appInfo->businessType != BUSINESS_TYPE_BYTE) {
460         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "invalid businessType[%d]", appInfo->businessType);
461         return SOFTBUS_OK;
462     }
463     if (appInfo->peerData.dataConfig != 0) {
464         appInfo->myData.dataConfig = MIN(appInfo->myData.dataConfig, appInfo->peerData.dataConfig);
465         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "process dataConfig[%u] succ", appInfo->myData.dataConfig);
466         return SOFTBUS_OK;
467     }
468     ConfigType configType = appInfo->businessType == BUSINESS_TYPE_BYTE ?
469         SOFTBUS_INT_MAX_BYTES_LENGTH : SOFTBUS_INT_MAX_MESSAGE_LENGTH;
470     if (SoftbusGetConfig(configType, (unsigned char *)&appInfo->myData.dataConfig,
471         sizeof(appInfo->myData.dataConfig)) != SOFTBUS_OK) {
472         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get config failed, configType[%d]", configType);
473         return SOFTBUS_ERR;
474     }
475     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "process data config value[%d]", appInfo->myData.dataConfig);
476     return SOFTBUS_OK;
477 }
478 
OpenDataBusReply(int32_t channelId,uint64_t seq,const cJSON * reply)479 static int32_t OpenDataBusReply(int32_t channelId, uint64_t seq, const cJSON *reply)
480 {
481     (void)seq;
482     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "OpenDataBusReply: channelId=%d", channelId);
483     SessionConn conn;
484     if (GetSessionConnById(channelId, &conn) == NULL) {
485         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "notify channel open failed, get tdcInfo is null");
486         return SOFTBUS_ERR;
487     }
488 
489     int errCode = SOFTBUS_OK;
490     if (UnpackReplyErrCode(reply, &errCode) == SOFTBUS_OK) {
491         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "receive err reply msg");
492         if (NotifyChannelOpenFailed(channelId, errCode) != SOFTBUS_OK) {
493             return SOFTBUS_ERR;
494         }
495         return errCode;
496     }
497 
498     uint16_t fastDataSize = 0;
499     if (UnpackReply(reply, &conn.appInfo, &fastDataSize) != SOFTBUS_OK) {
500         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "UnpackReply failed");
501         return SOFTBUS_ERR;
502     }
503 
504     if (TransTdcProcessDataConfig(&conn.appInfo) != SOFTBUS_OK) {
505         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Trans Tdc process data config failed.");
506         return SOFTBUS_ERR;
507     }
508 
509     if (SetAppInfoById(channelId, &conn.appInfo) != SOFTBUS_OK) {
510         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "set app info by id failed.");
511         return SOFTBUS_ERR;
512     }
513     if ((fastDataSize > 0 && (conn.appInfo.fastTransDataSize == fastDataSize)) || conn.appInfo.fastTransDataSize == 0) {
514         if (NotifyChannelOpened(channelId) != SOFTBUS_OK) {
515             return SOFTBUS_ERR;
516         }
517     } else {
518         if (TransTdcPostFisrtData(&conn) != SOFTBUS_OK) {
519             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "tdc send fast data failed");
520             return SOFTBUS_ERR;
521         }
522         if (NotifyChannelOpened(channelId) != SOFTBUS_OK) {
523             return SOFTBUS_ERR;
524         }
525     }
526     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "OpenDataBusReply ok");
527     return SOFTBUS_OK;
528 }
529 
TransTdcPostReplyMsg(int32_t channelId,uint64_t seq,uint32_t flags,char * reply)530 static inline int TransTdcPostReplyMsg(int32_t channelId, uint64_t seq, uint32_t flags, char *reply)
531 
532 {
533     TdcPacketHead packetHead = {
534         .magicNumber = MAGIC_NUMBER,
535         .module = MODULE_SESSION,
536         .seq = seq,
537         .flags = (FLAG_REPLY | flags),
538         .dataLen = strlen(reply),
539     };
540     return TransTdcPostBytes(channelId, &packetHead, reply);
541 }
542 
OpenDataBusRequestReply(const AppInfo * appInfo,int32_t channelId,uint64_t seq,uint32_t flags)543 static int32_t OpenDataBusRequestReply(const AppInfo *appInfo, int32_t channelId, uint64_t seq,
544     uint32_t flags)
545 {
546     char *reply = PackReply(appInfo);
547     if (reply == NULL) {
548         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenDataBusRequestReply get pack reply err");
549         return SOFTBUS_ERR;
550     }
551 
552     int32_t ret = TransTdcPostReplyMsg(channelId, seq, flags, reply);
553     cJSON_free(reply);
554     return ret;
555 }
556 
OpenDataBusRequestError(int32_t channelId,uint64_t seq,char * errDesc,int32_t errCode,uint32_t flags)557 static int32_t OpenDataBusRequestError(int32_t channelId, uint64_t seq, char *errDesc,
558     int32_t errCode, uint32_t flags)
559 {
560     char *reply = PackError(errCode, errDesc);
561     if (reply == NULL) {
562         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenDataBusRequestError get pack reply err");
563         return SOFTBUS_ERR;
564     }
565 
566     int32_t ret = TransTdcPostReplyMsg(channelId, seq, flags, reply);
567     cJSON_free(reply);
568     return ret;
569 }
570 
GetUuidByChanId(int32_t channelId,char * uuid,uint32_t len)571 static int32_t GetUuidByChanId(int32_t channelId, char *uuid, uint32_t len)
572 {
573     int64_t authId = GetAuthIdByChanId(channelId);
574     if (authId == AUTH_INVALID_ID) {
575         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "GetUuidByChanId get authId fail");
576         return SOFTBUS_ERR;
577     }
578     return AuthGetDeviceUuid(authId, uuid, len);
579 }
580 
OpenDataBusRequestOutSessionName(const char * mySessionName,const char * peerSessionName)581 static void OpenDataBusRequestOutSessionName(const char *mySessionName, const char *peerSessionName)
582 {
583     char *anonyOutMy = NULL;
584     char *anonyOutPeer = NULL;
585     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "OpenDataBusRequest: mySessionName=%s, peerSessionName=%s",
586         AnonyDevId(&anonyOutMy, mySessionName), AnonyDevId(&anonyOutPeer, peerSessionName));
587     SoftBusFree(anonyOutMy);
588     SoftBusFree(anonyOutPeer);
589 }
590 
GetSessionConnFromDataBusRequest(int32_t channelId,const cJSON * request)591 static SessionConn* GetSessionConnFromDataBusRequest(int32_t channelId, const cJSON *request)
592 {
593     SessionConn *conn = (SessionConn *)SoftBusCalloc(sizeof(SessionConn));
594     if (conn == NULL) {
595         return NULL;
596     }
597     if (GetSessionConnById(channelId, conn) == NULL) {
598         SoftBusFree(conn);
599         return NULL;
600     }
601     if (UnpackRequest(request, &conn->appInfo) != SOFTBUS_OK) {
602         SoftBusFree(conn);
603         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "UnpackRequest error");
604         return NULL;
605     }
606     return conn;
607 }
608 
NotifyFastDataRecv(SessionConn * conn,int32_t channelId)609 static void NotifyFastDataRecv(SessionConn *conn, int32_t channelId)
610 {
611     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "NotifyFastDataRecv begin");
612     TransReceiveData receiveData;
613     receiveData.data = (void*)conn->appInfo.fastTransData;
614     receiveData.dataLen = conn->appInfo.fastTransDataSize + FAST_TDC_EXT_DATA_SIZE;
615     if (conn->appInfo.businessType == BUSINESS_TYPE_MESSAGE) {
616         receiveData.dataType = TRANS_SESSION_MESSAGE;
617     } else {
618         receiveData.dataType = TRANS_SESSION_BYTES;
619     }
620     if (TransTdcOnMsgReceived(conn->appInfo.myData.pkgName, conn->appInfo.myData.pid,
621         channelId, &receiveData) != SOFTBUS_OK) {
622         conn->appInfo.fastTransDataSize = 0;
623         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "NotifyFastDataRecv err");
624         return;
625     }
626     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "NotifyFastDataRecv end");
627     return;
628 }
629 
TransTdcFillDataConfig(AppInfo * appInfo)630 static int32_t TransTdcFillDataConfig(AppInfo *appInfo)
631 {
632     if (appInfo == NULL) {
633         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "appInfo is null");
634         return SOFTBUS_ERR;
635     }
636     if (appInfo->businessType != BUSINESS_TYPE_BYTE && appInfo->businessType != BUSINESS_TYPE_MESSAGE) {
637         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "invalid businessType[%d]", appInfo->businessType);
638         return SOFTBUS_OK;
639     }
640     if (appInfo->peerData.dataConfig != 0) {
641         uint32_t localDataConfig = 0;
642         if (TransGetLocalConfig(CHANNEL_TYPE_TCP_DIRECT, appInfo->businessType, &localDataConfig) != SOFTBUS_OK) {
643             return SOFTBUS_ERR;
644         }
645         appInfo->myData.dataConfig = MIN(localDataConfig, appInfo->peerData.dataConfig);
646         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "fill dataConfig[%u] succ", appInfo->myData.dataConfig);
647         return SOFTBUS_OK;
648     }
649     ConfigType configType = appInfo->businessType == BUSINESS_TYPE_BYTE ?
650         SOFTBUS_INT_MAX_BYTES_LENGTH : SOFTBUS_INT_MAX_MESSAGE_LENGTH;
651     if (SoftbusGetConfig(configType, (unsigned char *)&appInfo->myData.dataConfig,
652         sizeof(appInfo->myData.dataConfig)) != SOFTBUS_OK) {
653         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get config failed, configType[%d]", configType);
654         return SOFTBUS_ERR;
655     }
656     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "fill data config value[%d]", appInfo->myData.dataConfig);
657     return SOFTBUS_OK;
658 }
659 
OpenDataBusRequest(int32_t channelId,uint32_t flags,uint64_t seq,const cJSON * request)660 static int32_t OpenDataBusRequest(int32_t channelId, uint32_t flags, uint64_t seq, const cJSON *request)
661 {
662     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "OpenDataBusRequest channelId=%d, seq=%d.", channelId, seq);
663     SessionConn *conn = GetSessionConnFromDataBusRequest(channelId, request);
664     if (conn == NULL) {
665         return SOFTBUS_ERR;
666     }
667 
668     char *errDesc = NULL;
669     int32_t errCode;
670     if (TransTdcGetUidAndPid(conn->appInfo.myData.sessionName,
671         &conn->appInfo.myData.uid, &conn->appInfo.myData.pid) != SOFTBUS_OK) {
672         errCode = SOFTBUS_TRANS_PEER_SESSION_NOT_CREATED;
673         errDesc = (char *)"Peer Device Session Not Create";
674         goto ERR_EXIT;
675     }
676 
677     if (GetUuidByChanId(channelId, conn->appInfo.peerData.deviceId, DEVICE_ID_SIZE_MAX) != SOFTBUS_OK) {
678         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Get Uuid By ChanId failed.");
679         errCode = SOFTBUS_TRANS_TDC_CHANNEL_NOT_FOUND;
680         errDesc = (char *)"Get Uuid By ChanId failed";
681         goto ERR_EXIT;
682     }
683 
684     if (TransTdcFillDataConfig(&conn->appInfo) != SOFTBUS_OK) {
685         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "fill data config failed.");
686         errCode = SOFTBUS_INVALID_PARAM;
687         errDesc = (char *)"fill data config failed";
688         goto ERR_EXIT;
689     }
690 
691     if (SetAppInfoById(channelId, &conn->appInfo) != SOFTBUS_OK) {
692         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "set app info by id failed.");
693         errCode = SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
694         errDesc = (char *)"Set App Info By Id Failed";
695         goto ERR_EXIT;
696     }
697 
698     OpenDataBusRequestOutSessionName(conn->appInfo.myData.sessionName, conn->appInfo.peerData.sessionName);
699     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "OpenDataBusRequest: myPid=%d, peerPid=%d",
700         conn->appInfo.myData.pid, conn->appInfo.peerData.pid);
701 
702     if (NotifyChannelOpened(channelId) != SOFTBUS_OK) {
703         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Notify App Channel Opened Failed");
704         errCode = SOFTBUS_TRANS_UDP_SERVER_NOTIFY_APP_OPEN_FAILED;
705         errDesc = (char *)"Notify App Channel Opened Failed";
706         goto ERR_EXIT;
707     }
708     if (conn->appInfo.fastTransDataSize > 0 && conn->appInfo.fastTransData != NULL) {
709         NotifyFastDataRecv(conn, channelId);
710     }
711     int myHandleId = NotifyNearByUpdateHandleId(channelId);
712     if (myHandleId != SOFTBUS_ERR) {
713         conn->appInfo.myHandleId = myHandleId;
714     }
715     (void)SetAppInfoById(channelId, &conn->appInfo);
716 
717     if (OpenDataBusRequestReply(&conn->appInfo, channelId, seq, flags) != SOFTBUS_OK) {
718         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenDataBusRequest reply err");
719         (void)NotifyChannelClosed(&conn->appInfo, channelId);
720         SoftBusFree(conn);
721         return SOFTBUS_ERR;
722     }
723 
724     if (conn->appInfo.routeType == WIFI_P2P) {
725         if (LnnGetNetworkIdByUuid(conn->appInfo.peerData.deviceId,
726             conn->appInfo.peerNetWorkId, DEVICE_ID_SIZE_MAX) == SOFTBUS_OK) {
727             LaneUpdateP2pAddressByIp(conn->appInfo.peerData.addr, conn->appInfo.peerNetWorkId);
728         }
729     }
730 
731     SoftBusFree(conn);
732     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "OpenDataBusRequest ok");
733     return SOFTBUS_OK;
734 
735 ERR_EXIT:
736     if (OpenDataBusRequestError(channelId, seq, errDesc, errCode, flags) != SOFTBUS_OK) {
737         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "OpenDataBusRequestError error");
738     }
739     SoftBusFree(conn);
740     return SOFTBUS_ERR;
741 }
742 
ProcessMessage(int32_t channelId,uint32_t flags,uint64_t seq,const char * msg)743 static int32_t ProcessMessage(int32_t channelId, uint32_t flags, uint64_t seq, const char *msg)
744 {
745     int32_t ret = SOFTBUS_ERR;
746     cJSON *json = cJSON_Parse(msg);
747     if (json == NULL) {
748         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "ProcessMessage: json parse failed.");
749         return SOFTBUS_ERR;
750     }
751     if (flags & FLAG_REPLY) {
752         ret = OpenDataBusReply(channelId, seq, json);
753     } else {
754         ret = OpenDataBusRequest(channelId, flags, seq, json);
755     }
756     cJSON_Delete(json);
757     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "ProcessMessage: ret = [%d]", ret);
758     return ret;
759 }
760 
TransSrvGetDataBufNodeById(int32_t channelId)761 static ServerDataBuf *TransSrvGetDataBufNodeById(int32_t channelId)
762 {
763     if (g_tcpSrvDataList ==  NULL) {
764         return NULL;
765     }
766 
767     ServerDataBuf *item = NULL;
768     LIST_FOR_EACH_ENTRY(item, &(g_tcpSrvDataList->list), ServerDataBuf, node) {
769         if (item->channelId == channelId) {
770             return item;
771         }
772     }
773     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "srv tcp direct channel id not exist.");
774     return NULL;
775 }
776 
GetAuthIdByChannelInfo(int32_t channelId,uint64_t seq,uint32_t cipherFlag)777 static int64_t GetAuthIdByChannelInfo(int32_t channelId, uint64_t seq, uint32_t cipherFlag)
778 {
779     int64_t authId = GetAuthIdByChanId(channelId);
780     if (authId != AUTH_INVALID_ID) {
781         return authId;
782     }
783 
784     AppInfo appInfo;
785     if (GetAppInfoById(channelId, &appInfo) != SOFTBUS_OK) {
786         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "get appInfo fail");
787         return AUTH_INVALID_ID;
788     }
789 
790     bool fromAuthServer = ((seq & AUTH_CONN_SERVER_SIDE) != 0);
791     char uuid[UUID_BUF_LEN] = {0};
792     if (GetWifiDirectManager()->getRemoteUuidByIp(appInfo.peerData.addr, uuid, sizeof(uuid)) != SOFTBUS_OK) {
793         AuthConnInfo connInfo;
794         connInfo.type = AUTH_LINK_TYPE_WIFI;
795         if (strcpy_s(connInfo.info.ipInfo.ip, IP_LEN, appInfo.peerData.addr) != EOK) {
796             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "copy ip addr fail");
797             return AUTH_INVALID_ID;
798         }
799         return AuthGetIdByConnInfo(&connInfo, !fromAuthServer, false);
800     }
801 
802     AuthLinkType linkType = SwitchCipherTypeToAuthLinkType(cipherFlag);
803     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "get auth linktype %d flag 0x%x", linkType, cipherFlag);
804     bool isAuthMeta = (cipherFlag & FLAG_AUTH_META) ? true : false;
805     return AuthGetIdByUuid(uuid, linkType, !fromAuthServer, isAuthMeta);
806 }
807 
DecryptMessage(int32_t channelId,const TdcPacketHead * pktHead,const uint8_t * pktData,uint8_t ** outData,uint32_t * outDataLen)808 static int32_t DecryptMessage(int32_t channelId, const TdcPacketHead *pktHead, const uint8_t *pktData,
809     uint8_t **outData, uint32_t *outDataLen)
810 {
811     int64_t authId = GetAuthIdByChannelInfo(channelId, pktHead->seq, pktHead->flags);
812     if (authId == AUTH_INVALID_ID) {
813         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "srv process recv data: get authId fail.");
814         return SOFTBUS_NOT_FIND;
815     }
816     if (SetAuthIdByChanId(channelId, authId) != SOFTBUS_OK) {
817         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "srv process recv data: set authId fail.");
818         return SOFTBUS_ERR;
819     }
820 
821     uint32_t decDataLen = AuthGetDecryptSize(pktHead->dataLen) + 1;
822     uint8_t *decData = (uint8_t *)SoftBusCalloc(decDataLen);
823     if (decData == NULL) {
824         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "srv process recv data: malloc fail.");
825         return SOFTBUS_MALLOC_ERR;
826     }
827     if (AuthDecrypt(authId, pktData, pktHead->dataLen, decData, &decDataLen) != SOFTBUS_OK) {
828         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "srv process recv data: decrypt fail.");
829         SoftBusFree(decData);
830         return SOFTBUS_DECRYPT_ERR;
831     }
832     *outData = decData;
833     *outDataLen = decDataLen;
834     return SOFTBUS_OK;
835 }
836 
ProcessReceivedData(int32_t channelId)837 static int32_t ProcessReceivedData(int32_t channelId)
838 {
839     uint64_t seq;
840     uint32_t flags;
841     uint8_t *data = NULL;
842     uint32_t dataLen = 0;
843 
844     if (SoftBusMutexLock(&g_tcpSrvDataList->lock) != SOFTBUS_OK) {
845         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "[%s] lock failed.", __func__);
846         return SOFTBUS_ERR;
847     }
848     ServerDataBuf *node = TransSrvGetDataBufNodeById(channelId);
849     if (node == NULL || node->data == NULL) {
850         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "node is null.");
851         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
852         return SOFTBUS_ERR;
853     }
854     TdcPacketHead *pktHead = (TdcPacketHead *)(node->data);
855     uint8_t *pktData = (uint8_t *)(node->data + sizeof(TdcPacketHead));
856     if (pktHead->module != MODULE_SESSION) {
857         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "srv process recv data: illegal module.");
858         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
859         return SOFTBUS_ERR;
860     }
861     seq = pktHead->seq;
862     flags = pktHead->flags;
863 
864     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "rev tdc packet, flags=%d, seq=%d", flags, seq);
865     if (DecryptMessage(channelId, pktHead, pktData, &data, &dataLen) != SOFTBUS_OK) {
866         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "srv process recv data: decrypt fail.");
867         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
868         return SOFTBUS_DECRYPT_ERR;
869     }
870 
871     char *end = node->data + sizeof(TdcPacketHead) + pktHead->dataLen;
872     if (memmove_s(node->data, node->size, end, node->w - end) != EOK) {
873         SoftBusFree(data);
874         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "memmove fail.");
875         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
876         return SOFTBUS_MEM_ERR;
877     }
878     node->w = node->w - sizeof(TdcPacketHead) - pktHead->dataLen;
879     SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
880 
881     AnonyPacketPrintout(SOFTBUS_LOG_TRAN, "TdcProcessReceivedData, data: ", (char *)data, dataLen);
882     int32_t ret = ProcessMessage(channelId, flags, seq, (char *)data);
883     SoftBusFree(data);
884     return ret;
885 }
886 
TransTdcSrvProcData(ListenerModule module,int32_t channelId)887 static int32_t TransTdcSrvProcData(ListenerModule module, int32_t channelId)
888 {
889     if (SoftBusMutexLock(&g_tcpSrvDataList->lock) != SOFTBUS_OK) {
890         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "[%s] lock failed.", __func__);
891         return SOFTBUS_ERR;
892     }
893     ServerDataBuf *node = TransSrvGetDataBufNodeById(channelId);
894     if (node == NULL) {
895         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
896         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "srv can not get buf node.");
897         return SOFTBUS_ERR;
898     }
899 
900     uint32_t bufLen = node->w - node->data;
901     if (bufLen < DC_MSG_PACKET_HEAD_SIZE) {
902         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
903         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "srv head not enough, recv next time.");
904         return SOFTBUS_DATA_NOT_ENOUGH;
905     }
906 
907     TdcPacketHead *pktHead = (TdcPacketHead *)(node->data);
908     UnpackTdcPacketHead(pktHead);
909     if (pktHead->magicNumber != MAGIC_NUMBER) {
910         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
911         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "srv recv invalid packet head");
912         return SOFTBUS_ERR;
913     }
914 
915     uint32_t dataLen = pktHead->dataLen;
916     if (dataLen > node->size - DC_MSG_PACKET_HEAD_SIZE) {
917         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
918         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "srv out of recv buf size[%d]", dataLen);
919         return SOFTBUS_ERR;
920     }
921 
922     if (bufLen < dataLen + DC_MSG_PACKET_HEAD_SIZE) {
923         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
924         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "srv data not enough, recv next time.[%d][%d][%d]",
925             bufLen, dataLen, DC_MSG_PACKET_HEAD_SIZE);
926         return SOFTBUS_DATA_NOT_ENOUGH;
927     }
928     DelTrigger(module, node->fd, READ_TRIGGER);
929     SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
930     return ProcessReceivedData(channelId);
931 }
932 
TransTdcGetDataBufInfoByChannelId(int32_t channelId,int32_t * fd,size_t * len)933 static int32_t TransTdcGetDataBufInfoByChannelId(int32_t channelId, int32_t *fd, size_t *len)
934 {
935     if (fd == NULL || len == NULL) {
936         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "[%s] invalid param.", __func__);
937         return SOFTBUS_ERR;
938     }
939 
940     if (g_tcpSrvDataList == NULL) {
941         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "[%s] tcp srv data list empty.", __func__);
942         return SOFTBUS_ERR;
943     }
944 
945     if (SoftBusMutexLock(&g_tcpSrvDataList->lock) != SOFTBUS_OK) {
946         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "[%s] lock failed.", __func__);
947         return SOFTBUS_ERR;
948     }
949     ServerDataBuf *item = NULL;
950     LIST_FOR_EACH_ENTRY(item, &(g_tcpSrvDataList->list), ServerDataBuf, node) {
951         if (item->channelId == channelId) {
952             *fd = item->fd;
953             *len = item->size - (item->w - item->data);
954             (void)SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
955             return SOFTBUS_OK;
956         }
957     }
958     (void)SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
959     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "trans tdc[%d] data buf not found.", channelId);
960     return SOFTBUS_ERR;
961 }
962 
TransTdcUpdateDataBufWInfo(int32_t channelId,char * recvBuf,int32_t recvLen)963 static int32_t TransTdcUpdateDataBufWInfo(int32_t channelId, char *recvBuf, int32_t recvLen)
964 {
965     if (recvBuf == NULL) {
966         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "[%s] invalid param.", __func__);
967         return SOFTBUS_ERR;
968     }
969     if (g_tcpSrvDataList == NULL) {
970         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "[%s] srv data list empty.", __func__);
971         return SOFTBUS_ERR;
972     }
973     if (SoftBusMutexLock(&g_tcpSrvDataList->lock) != SOFTBUS_OK) {
974         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "[%s] lock failed.", __func__);
975         return SOFTBUS_ERR;
976     }
977 
978     ServerDataBuf *item = NULL;
979     ServerDataBuf *nextItem = NULL;
980     LIST_FOR_EACH_ENTRY_SAFE(item, nextItem, &(g_tcpSrvDataList->list), ServerDataBuf, node) {
981         if (item->channelId != channelId) {
982             continue;
983         }
984         int32_t freeLen = (int32_t)(item->size) - (item->w - item->data);
985         if (recvLen > freeLen) {
986             (void)SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
987             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR,
988                 "trans tdc recv=%d override free=%d.", recvLen, freeLen);
989             return SOFTBUS_ERR;
990         }
991         if (memcpy_s(item->w, recvLen, recvBuf, recvLen) != EOK) {
992             (void)SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
993             SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "trans tdc channel=%d memcpy failed.", channelId);
994             return SOFTBUS_ERR;
995         }
996         item->w += recvLen;
997         (void)SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
998         return SOFTBUS_OK;
999     }
1000     (void)SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1001     SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "trans update tdcchannel=%d databuf not found.", channelId);
1002     return SOFTBUS_ERR;
1003 }
1004 
TransTdcSrvRecvData(ListenerModule module,int32_t channelId)1005 NO_SANITIZE("cfi") int32_t TransTdcSrvRecvData(ListenerModule module, int32_t channelId)
1006 {
1007     int32_t fd = -1;
1008     size_t len = 0;
1009     if (TransTdcGetDataBufInfoByChannelId(channelId, &fd, &len) != SOFTBUS_OK) {
1010         return SOFTBUS_ERR;
1011     }
1012     if (len == 0) {
1013         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "trans channel=%d free databuf less zero.", channelId);
1014         return SOFTBUS_ERR;
1015     }
1016 
1017     char *recvBuf = (char*)SoftBusCalloc(len);
1018     if (recvBuf == NULL) {
1019         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "trans channel=%d malloc [%zu] failed..", channelId, len);
1020         return SOFTBUS_ERR;
1021     }
1022 
1023     int32_t recvLen = ConnRecvSocketData(fd, recvBuf, len, 0);
1024     if (recvLen < 0) {
1025         SoftBusFree(recvBuf);
1026         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "cId[%d] recv tcp data fail,ret=%d.", channelId, recvLen);
1027         return SOFTBUS_ERR;
1028     } else if (recvLen == 0) {
1029         SoftBusFree(recvBuf);
1030         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "recv tcp data fail, channelId=%d", channelId);
1031         return SOFTBUS_DATA_NOT_ENOUGH;
1032     }
1033 
1034     if (TransTdcUpdateDataBufWInfo(channelId, recvBuf, recvLen) != SOFTBUS_OK) {
1035         SoftBusFree(recvBuf);
1036         SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "cId[%d] update channel data buf failed.", channelId);
1037         return SOFTBUS_ERR;
1038     }
1039     SoftBusFree(recvBuf);
1040 
1041     return TransTdcSrvProcData(module, channelId);
1042 }
1043