• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "trans_tcp_direct_message.h"
17 
18 #include <securec.h>
19 #include <string.h>
20 
21 #include "access_control.h"
22 #include "anonymizer.h"
23 #include "auth_interface.h"
24 #include "bus_center_manager.h"
25 #include "cJSON.h"
26 #include "softbus_app_info.h"
27 #include "softbus_adapter_crypto.h"
28 #include "softbus_adapter_mem.h"
29 #include "softbus_adapter_thread.h"
30 #include "softbus_adapter_socket.h"
31 #include "softbus_errcode.h"
32 #include "softbus_feature_config.h"
33 #include "softbus_hisysevt_transreporter.h"
34 #include "softbus_message_open_channel.h"
35 #include "softbus_socket.h"
36 #include "softbus_tcp_socket.h"
37 #include "trans_channel_common.h"
38 #include "trans_event.h"
39 #include "trans_lane_manager.h"
40 #include "trans_log.h"
41 #include "trans_tcp_direct_callback.h"
42 #include "trans_tcp_direct_manager.h"
43 #include "trans_tcp_direct_sessionconn.h"
44 #include "wifi_direct_manager.h"
45 #include "data_bus_native.h"
46 #include "lnn_distributed_net_ledger.h"
47 #include "lnn_lane_link.h"
48 #include "lnn_net_builder.h"
49 
50 #define MAX_PACKET_SIZE (64 * 1024)
51 #define MIN_META_LEN 6
52 #define META_SESSION "IShare"
53 #define MAX_ERRDESC_LEN 128
54 
55 typedef struct {
56     ListNode node;
57     int32_t channelId;
58     int32_t fd;
59     uint32_t size;
60     char *data;
61     char *w;
62 } ServerDataBuf;
63 
64 typedef struct {
65     int32_t channelType;
66     int32_t businessType;
67     ConfigType configType;
68 } ConfigTypeMap;
69 
70 static SoftBusList *g_tcpSrvDataList = NULL;
71 
PackTdcPacketHead(TdcPacketHead * data)72 static void PackTdcPacketHead(TdcPacketHead *data)
73 {
74     data->magicNumber = SoftBusHtoLl(data->magicNumber);
75     data->module = SoftBusHtoLl(data->module);
76     data->seq = SoftBusHtoLll(data->seq);
77     data->flags = SoftBusHtoLl(data->flags);
78     data->dataLen = SoftBusHtoLl(data->dataLen);
79 }
80 
UnpackTdcPacketHead(TdcPacketHead * data)81 static void UnpackTdcPacketHead(TdcPacketHead *data)
82 {
83     data->magicNumber = SoftBusLtoHl(data->magicNumber);
84     data->module = SoftBusLtoHl(data->module);
85     data->seq = SoftBusLtoHll(data->seq);
86     data->flags = SoftBusLtoHl(data->flags);
87     data->dataLen = SoftBusLtoHl(data->dataLen);
88 }
89 
TransSrvDataListInit(void)90 int32_t TransSrvDataListInit(void)
91 {
92     if (g_tcpSrvDataList != NULL) {
93         return SOFTBUS_OK;
94     }
95     g_tcpSrvDataList = CreateSoftBusList();
96     if (g_tcpSrvDataList == NULL) {
97         TRANS_LOGE(TRANS_CTRL, "creat list failed");
98         return SOFTBUS_MALLOC_ERR;
99     }
100     return SOFTBUS_OK;
101 }
102 
TransSrvDestroyDataBuf(void)103 static void TransSrvDestroyDataBuf(void)
104 {
105     if (g_tcpSrvDataList ==  NULL) {
106         return;
107     }
108 
109     ServerDataBuf *item = NULL;
110     ServerDataBuf *next = NULL;
111     if (SoftBusMutexLock(&g_tcpSrvDataList->lock) != SOFTBUS_OK) {
112         return;
113     }
114     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_tcpSrvDataList->list, ServerDataBuf, node) {
115         ListDelete(&item->node);
116         SoftBusFree(item->data);
117         SoftBusFree(item);
118         g_tcpSrvDataList->cnt--;
119     }
120     SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
121 
122     return;
123 }
124 
TransSrvDataListDeinit(void)125 void TransSrvDataListDeinit(void)
126 {
127     if (g_tcpSrvDataList == NULL) {
128         return;
129     }
130     TransSrvDestroyDataBuf();
131     DestroySoftBusList(g_tcpSrvDataList);
132     g_tcpSrvDataList = NULL;
133 }
134 
TransSrvAddDataBufNode(int32_t channelId,int32_t fd)135 int32_t TransSrvAddDataBufNode(int32_t channelId, int32_t fd)
136 {
137     #define MAX_DATA_BUF 4096
138     ServerDataBuf *node = (ServerDataBuf *)SoftBusCalloc(sizeof(ServerDataBuf));
139     if (node == NULL) {
140         TRANS_LOGE(TRANS_CTRL, "create server data buf node fail.");
141         return SOFTBUS_MALLOC_ERR;
142     }
143     node->channelId = channelId;
144     node->fd = fd;
145     node->size = MAX_DATA_BUF;
146     node->data = (char *)SoftBusCalloc(MAX_DATA_BUF);
147     if (node->data == NULL) {
148         TRANS_LOGE(TRANS_CTRL, "create server data buf fail.");
149         SoftBusFree(node);
150         return SOFTBUS_MALLOC_ERR;
151     }
152     node->w = node->data;
153 
154     if (SoftBusMutexLock(&(g_tcpSrvDataList->lock)) != SOFTBUS_OK) {
155         SoftBusFree(node->data);
156         SoftBusFree(node);
157         return SOFTBUS_LOCK_ERR;
158     }
159     ListInit(&node->node);
160     ListTailInsert(&g_tcpSrvDataList->list, &node->node);
161     g_tcpSrvDataList->cnt++;
162     SoftBusMutexUnlock(&(g_tcpSrvDataList->lock));
163 
164     return SOFTBUS_OK;
165 }
166 
TransSrvDelDataBufNode(int32_t channelId)167 void TransSrvDelDataBufNode(int32_t channelId)
168 {
169     if (g_tcpSrvDataList ==  NULL) {
170         return;
171     }
172 
173     ServerDataBuf *item = NULL;
174     ServerDataBuf *next = NULL;
175     if (SoftBusMutexLock(&g_tcpSrvDataList->lock) != SOFTBUS_OK) {
176         return;
177     }
178     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_tcpSrvDataList->list, ServerDataBuf, node) {
179         if (item->channelId == channelId) {
180             ListDelete(&item->node);
181             TRANS_LOGI(TRANS_BYTES, "delete channelId=%{public}d", item->channelId);
182             SoftBusFree(item->data);
183             SoftBusFree(item);
184             g_tcpSrvDataList->cnt--;
185             break;
186         }
187     }
188     SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
189 }
190 
SwitchCipherTypeToAuthLinkType(uint32_t cipherFlag)191 static AuthLinkType SwitchCipherTypeToAuthLinkType(uint32_t cipherFlag)
192 {
193     if (cipherFlag & FLAG_BR) {
194         return AUTH_LINK_TYPE_BR;
195     }
196 
197     if (cipherFlag & FLAG_BLE) {
198         return AUTH_LINK_TYPE_BLE;
199     }
200 
201     if (cipherFlag & FLAG_P2P) {
202         return AUTH_LINK_TYPE_P2P;
203     }
204     if (cipherFlag & FLAG_ENHANCE_P2P) {
205         return AUTH_LINK_TYPE_ENHANCED_P2P;
206     }
207     return AUTH_LINK_TYPE_WIFI;
208 }
209 
PackBytes(int32_t channelId,const char * data,TdcPacketHead * packetHead,char * buffer,uint32_t bufLen)210 static int32_t PackBytes(int32_t channelId, const char *data, TdcPacketHead *packetHead,
211     char *buffer, uint32_t bufLen)
212 {
213     AuthHandle authHandle = { 0 };
214     if (GetAuthHandleByChanId(channelId, &authHandle) != SOFTBUS_OK ||
215         authHandle.authId == AUTH_INVALID_ID) {
216         TRANS_LOGE(TRANS_BYTES, "PackBytes get auth id fail");
217         return SOFTBUS_NOT_FIND;
218     }
219 
220     uint8_t *encData = (uint8_t *)buffer + DC_MSG_PACKET_HEAD_SIZE;
221     uint32_t encDataLen = bufLen - DC_MSG_PACKET_HEAD_SIZE;
222     if (AuthEncrypt(&authHandle, (const uint8_t *)data, packetHead->dataLen, encData, &encDataLen) != SOFTBUS_OK) {
223         TRANS_LOGE(TRANS_BYTES, "PackBytes encrypt fail");
224         return SOFTBUS_ENCRYPT_ERR;
225     }
226     packetHead->dataLen = encDataLen;
227 
228     TRANS_LOGI(TRANS_BYTES, "PackBytes: flag=%{public}u, seq=%{public}" PRIu64,
229         packetHead->flags, packetHead->seq);
230     PackTdcPacketHead(packetHead);
231     if (memcpy_s(buffer, bufLen, packetHead, sizeof(TdcPacketHead)) != EOK) {
232         TRANS_LOGE(TRANS_BYTES, "memcpy_s buffer fail");
233         return SOFTBUS_MEM_ERR;
234     }
235     return SOFTBUS_OK;
236 }
237 
SendFailToFlushDevice(SessionConn * conn)238 static void SendFailToFlushDevice(SessionConn *conn)
239 {
240     if (conn->appInfo.routeType == WIFI_STA) {
241         char *tmpId = NULL;
242         Anonymize(conn->appInfo.peerData.deviceId, &tmpId);
243         TRANS_LOGE(TRANS_CTRL, "send data fail, do Authflushdevice deviceId=%{public}s", tmpId);
244         AnonymizeFree(tmpId);
245         if (AuthFlushDevice(conn->appInfo.peerData.deviceId) != SOFTBUS_OK) {
246             TRANS_LOGE(TRANS_CTRL, "tcp flush failed, wifi will offline");
247             LnnRequestLeaveSpecific(conn->appInfo.peerNetWorkId, CONNECTION_ADDR_WLAN);
248         }
249     }
250 }
251 
TransTdcPostBytes(int32_t channelId,TdcPacketHead * packetHead,const char * data)252 int32_t TransTdcPostBytes(int32_t channelId, TdcPacketHead *packetHead, const char *data)
253 {
254     if (data == NULL || packetHead == NULL || packetHead->dataLen == 0) {
255         TRANS_LOGE(TRANS_BYTES, "Invalid para.");
256         return SOFTBUS_INVALID_PARAM;
257     }
258     AuthHandle authHandle = { 0 };
259     if (GetAuthHandleByChanId(channelId, &authHandle) != SOFTBUS_OK ||
260         authHandle.authId == AUTH_INVALID_ID) {
261         TRANS_LOGE(TRANS_BYTES, "get auth id fail, channelId=%{public}d", channelId);
262         return SOFTBUS_TRANS_TCP_GET_AUTHID_FAILED;
263     }
264     uint32_t bufferLen = AuthGetEncryptSize(authHandle.authId, packetHead->dataLen) + DC_MSG_PACKET_HEAD_SIZE;
265     char *buffer = (char *)SoftBusCalloc(bufferLen);
266     if (buffer == NULL) {
267         TRANS_LOGE(TRANS_BYTES, "buffer malloc error.");
268         return SOFTBUS_MALLOC_ERR;
269     }
270     if (PackBytes(channelId, data, packetHead, buffer, bufferLen) != SOFTBUS_OK) {
271         TRANS_LOGE(TRANS_BYTES, "Pack Bytes error.");
272         SoftBusFree(buffer);
273         return SOFTBUS_ENCRYPT_ERR;
274     }
275     SessionConn *conn = (SessionConn *)SoftBusCalloc(sizeof(SessionConn));
276     if (conn == NULL) {
277         TRANS_LOGE(TRANS_BYTES, "malloc conn fail");
278         SoftBusFree(buffer);
279         return SOFTBUS_MALLOC_ERR;
280     }
281     if (GetSessionConnById(channelId, conn) != SOFTBUS_OK) {
282         TRANS_LOGE(TRANS_BYTES, "Get SessionConn fail");
283         SoftBusFree(buffer);
284         SoftBusFree(conn);
285         return SOFTBUS_TRANS_GET_SESSION_CONN_FAILED;
286     }
287     (void)memset_s(conn->appInfo.sessionKey, sizeof(conn->appInfo.sessionKey), 0, sizeof(conn->appInfo.sessionKey));
288     int fd = conn->appInfo.fd;
289     SetIpTos(fd, FAST_MESSAGE_TOS);
290     if (ConnSendSocketData(fd, buffer, bufferLen, 0) != (int)bufferLen) {
291         SendFailToFlushDevice(conn);
292         SoftBusFree(buffer);
293         SoftBusFree(conn);
294         return SOFTBUS_TCP_SOCKET_ERR;
295     }
296     SoftBusFree(conn);
297     SoftBusFree(buffer);
298     return SOFTBUS_OK;
299 }
300 
GetChannelInfoFromConn(ChannelInfo * info,SessionConn * conn,int32_t channelId)301 static void GetChannelInfoFromConn(ChannelInfo *info, SessionConn *conn, int32_t channelId)
302 {
303     info->channelId = channelId;
304     info->channelType = CHANNEL_TYPE_TCP_DIRECT;
305     info->isServer = conn->serverSide;
306     info->isEnabled = true;
307     info->fd = conn->appInfo.fd;
308     info->sessionKey = conn->appInfo.sessionKey;
309     info->myHandleId = conn->appInfo.myHandleId;
310     info->peerHandleId = conn->appInfo.peerHandleId;
311     info->peerSessionName = conn->appInfo.peerData.sessionName;
312     info->groupId = conn->appInfo.groupId;
313     info->isEncrypt = true;
314     info->keyLen = SESSION_KEY_LENGTH;
315     info->peerUid = conn->appInfo.peerData.uid;
316     info->peerPid = conn->appInfo.peerData.pid;
317     info->routeType = conn->appInfo.routeType;
318     info->businessType = conn->appInfo.businessType;
319     info->autoCloseTime = conn->appInfo.autoCloseTime;
320     info->peerIp = conn->appInfo.peerData.addr;
321     info->peerPort = conn->appInfo.peerData.port;
322     info->linkType = conn->appInfo.linkType;
323     info->dataConfig = conn->appInfo.myData.dataConfig;
324 }
325 
GetServerSideIpInfo(const AppInfo * appInfo,char * ip,uint32_t len)326 static int32_t GetServerSideIpInfo(const AppInfo *appInfo, char *ip, uint32_t len)
327 {
328     char myIp[IP_LEN] = { 0 };
329     if (appInfo->routeType == WIFI_STA) {
330         if (LnnGetLocalStrInfo(STRING_KEY_WLAN_IP, myIp, sizeof(myIp)) != SOFTBUS_OK) {
331             TRANS_LOGE(TRANS_CTRL, "NotifyChannelOpened get local ip fail");
332             return SOFTBUS_TRANS_GET_LOCAL_IP_FAILED;
333         }
334     } else if (appInfo->routeType == WIFI_P2P) {
335         struct WifiDirectManager *mgr = GetWifiDirectManager();
336         if (mgr == NULL || mgr->getLocalIpByRemoteIp == NULL) {
337             TRANS_LOGE(TRANS_CTRL, "GetWifiDirectManager failed");
338             return SOFTBUS_WIFI_DIRECT_INIT_FAILED;
339         }
340 
341         int32_t ret = mgr->getLocalIpByRemoteIp(appInfo->peerData.addr, myIp, sizeof(myIp));
342         if (ret != SOFTBUS_OK) {
343             TRANS_LOGE(TRANS_CTRL, "get Local Ip fail, ret=%{public}d", ret);
344             return SOFTBUS_TRANS_GET_P2P_INFO_FAILED;
345         }
346 
347         if (LnnSetLocalStrInfo(STRING_KEY_P2P_IP, myIp) != SOFTBUS_OK) {
348             TRANS_LOGW(TRANS_CTRL, "ServerSide set local p2p ip fail");
349         }
350         if (LnnSetDLP2pIp(appInfo->peerData.deviceId, CATEGORY_UUID, appInfo->peerData.addr) != SOFTBUS_OK) {
351             TRANS_LOGW(TRANS_CTRL, "ServerSide set peer p2p ip fail");
352         }
353     }
354     if (strcpy_s(ip, len, myIp) != EOK) {
355         TRANS_LOGE(TRANS_CTRL, "copy str failed");
356         return SOFTBUS_STRCPY_ERR;
357     }
358     return SOFTBUS_OK;
359 }
360 
GetClientSideIpInfo(const AppInfo * appInfo,char * ip,uint32_t len)361 static int32_t GetClientSideIpInfo(const AppInfo *appInfo, char *ip, uint32_t len)
362 {
363     if (appInfo->routeType == WIFI_P2P) {
364         if (LnnSetLocalStrInfo(STRING_KEY_P2P_IP, appInfo->myData.addr) != SOFTBUS_OK) {
365             TRANS_LOGW(TRANS_CTRL, "Client set local p2p ip fail");
366         }
367         if (LnnSetDLP2pIp(appInfo->peerData.deviceId, CATEGORY_UUID, appInfo->peerData.addr) != SOFTBUS_OK) {
368             TRANS_LOGW(TRANS_CTRL, "Client set peer p2p ip fail");
369         }
370     }
371     if (strcpy_s(ip, len, appInfo->myData.addr) != EOK) {
372         TRANS_LOGE(TRANS_CTRL, "copy str failed");
373         return SOFTBUS_STRCPY_ERR;
374     }
375     return SOFTBUS_OK;
376 }
377 
NotifyChannelOpened(int32_t channelId)378 static int32_t NotifyChannelOpened(int32_t channelId)
379 {
380     SessionConn conn;
381     if (GetSessionConnById(channelId, &conn) != SOFTBUS_OK) {
382         TRANS_LOGE(TRANS_CTRL, "notify channel open failed, get tdcInfo is null");
383         return SOFTBUS_TRANS_GET_SESSION_CONN_FAILED;
384     }
385     ChannelInfo info = { 0 };
386     GetChannelInfoFromConn(&info, &conn, channelId);
387     char myIp[IP_LEN] = { 0 };
388     int32_t ret = conn.serverSide ? GetServerSideIpInfo(&conn.appInfo, myIp, IP_LEN)
389                                   : GetClientSideIpInfo(&conn.appInfo, myIp, IP_LEN);
390     if (ret != SOFTBUS_OK) {
391         TRANS_LOGE(TRANS_CTRL, "get ip failed, ret = %{public}d.", ret);
392         (void)memset_s(conn.appInfo.sessionKey, sizeof(conn.appInfo.sessionKey), 0, sizeof(conn.appInfo.sessionKey));
393         return ret;
394     }
395     info.myIp = myIp;
396 
397     char buf[NETWORK_ID_BUF_LEN] = { 0 };
398     ret = LnnGetNetworkIdByUuid(conn.appInfo.peerData.deviceId, buf, NETWORK_ID_BUF_LEN);
399     if (ret != SOFTBUS_OK) {
400         TRANS_LOGE(TRANS_CTRL, "get networkId failed, ret = %{public}d", ret);
401         (void)memset_s(conn.appInfo.sessionKey, sizeof(conn.appInfo.sessionKey), 0, sizeof(conn.appInfo.sessionKey));
402         return ret;
403     }
404     info.peerDeviceId = buf;
405     info.timeStart = conn.appInfo.timeStart;
406     info.linkType = conn.appInfo.linkType;
407     info.connectType = conn.appInfo.connectType;
408     info.osType = conn.appInfo.osType;
409     char pkgName[PKG_NAME_SIZE_MAX] = { 0 };
410     ret = TransTdcGetPkgName(conn.appInfo.myData.sessionName, pkgName, PKG_NAME_SIZE_MAX);
411     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_CTRL, "get pkg name fail.");
412 
413     int32_t uid = 0;
414     int32_t pid = 0;
415     if (TransTdcGetUidAndPid(conn.appInfo.myData.sessionName, &uid, &pid) != SOFTBUS_OK) {
416         TRANS_LOGE(TRANS_CTRL, "get uid and pid fail.");
417         (void)memset_s(conn.appInfo.sessionKey, sizeof(conn.appInfo.sessionKey), 0, sizeof(conn.appInfo.sessionKey));
418         return SOFTBUS_TRANS_GET_PID_FAILED;
419     }
420     if (conn.appInfo.fastTransDataSize > 0) {
421         info.isFastData = true;
422     }
423     TransGetLaneIdByChannelId(channelId, &info.laneId);
424     ret = TransTdcOnChannelOpened(pkgName, pid, conn.appInfo.myData.sessionName, &info);
425     (void)memset_s(conn.appInfo.sessionKey, sizeof(conn.appInfo.sessionKey), 0, sizeof(conn.appInfo.sessionKey));
426     conn.status = TCP_DIRECT_CHANNEL_STATUS_CONNECTED;
427     SetSessionConnStatusById(channelId, conn.status);
428     return ret;
429 }
430 
NotifyChannelBind(int32_t channelId)431 static int32_t NotifyChannelBind(int32_t channelId)
432 {
433     SessionConn conn;
434     if (GetSessionConnById(channelId, &conn) != SOFTBUS_OK) {
435         TRANS_LOGE(TRANS_CTRL, "notify channel bind, get tdcInfo is null channelId=%{public}d", channelId);
436         return SOFTBUS_TRANS_GET_SESSION_CONN_FAILED;
437     }
438     (void)memset_s(&conn.appInfo.sessionKey, sizeof(conn.appInfo.sessionKey), 0, sizeof(conn.appInfo.sessionKey));
439 
440     char pkgName[PKG_NAME_SIZE_MAX] = {0};
441     int32_t ret = TransTdcGetPkgName(conn.appInfo.myData.sessionName, pkgName, PKG_NAME_SIZE_MAX);
442     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_CTRL, "get pkg name fail.");
443 
444     ret = TransTdcOnChannelBind(pkgName, conn.appInfo.myData.pid, channelId);
445     TRANS_LOGI(TRANS_CTRL, "channelId=%{public}d, ret=%{public}d", channelId, ret);
446     return ret;
447 }
448 
NotifyChannelClosed(const AppInfo * appInfo,int32_t channelId)449 static int32_t NotifyChannelClosed(const AppInfo *appInfo, int32_t channelId)
450 {
451     AppInfoData myData = appInfo->myData;
452     char pkgName[PKG_NAME_SIZE_MAX] = { 0 };
453     int32_t ret = TransTdcGetPkgName(myData.sessionName, pkgName, PKG_NAME_SIZE_MAX);
454     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_CTRL, "get pkg name fail.");
455     ret = TransTdcOnChannelClosed(pkgName, myData.pid, channelId);
456     TRANS_LOGI(TRANS_CTRL, "channelId=%{public}d, ret=%{public}d", channelId, ret);
457     return ret;
458 }
459 
NotifyChannelOpenFailedBySessionConn(const SessionConn * conn,int32_t errCode)460 int32_t NotifyChannelOpenFailedBySessionConn(const SessionConn *conn, int32_t errCode)
461 {
462     TRANS_CHECK_AND_RETURN_RET_LOGE(conn != NULL, SOFTBUS_INVALID_PARAM, TRANS_CTRL, "invalid param.");
463     int64_t timeStart = conn->appInfo.timeStart;
464     int64_t timeDiff = GetSoftbusRecordTimeMillis() - timeStart;
465     char localUdid[UDID_BUF_LEN] = { 0 };
466     (void)LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, localUdid, sizeof(localUdid));
467     TransEventExtra extra = {
468         .calleePkg = NULL,
469         .callerPkg = conn->appInfo.myData.pkgName,
470         .channelId = conn->channelId,
471         .peerNetworkId = conn->appInfo.peerNetWorkId,
472         .socketName = conn->appInfo.myData.sessionName,
473         .linkType = conn->appInfo.connectType,
474         .costTime = timeDiff,
475         .errcode = errCode,
476         .osType = (conn->appInfo.osType < 0) ? UNKNOW_OS_TYPE : (conn->appInfo.osType),
477         .localUdid = localUdid,
478         .peerUdid = conn->appInfo.peerUdid,
479         .peerDevVer = conn->appInfo.peerVersion,
480         .result = EVENT_STAGE_RESULT_FAILED
481     };
482     extra.deviceState = TransGetDeviceState(conn->appInfo.peerNetWorkId);
483     int32_t sceneCommand = conn->serverSide ? EVENT_SCENE_OPEN_CHANNEL_SERVER : EVENT_SCENE_OPEN_CHANNEL;
484     TRANS_EVENT(sceneCommand, EVENT_STAGE_OPEN_CHANNEL_END, extra);
485     TransAlarmExtra extraAlarm = {
486         .conflictName = NULL,
487         .conflictedName = NULL,
488         .occupyedName = NULL,
489         .permissionName = NULL,
490         .linkType = conn->appInfo.linkType,
491         .errcode = errCode,
492         .sessionName = conn->appInfo.myData.sessionName,
493     };
494     TRANS_ALARM(OPEN_SESSION_FAIL_ALARM, CONTROL_ALARM_TYPE, extraAlarm);
495     SoftbusRecordOpenSessionKpi(conn->appInfo.myData.pkgName,
496         conn->appInfo.linkType, SOFTBUS_EVT_OPEN_SESSION_FAIL, timeDiff);
497     char pkgName[PKG_NAME_SIZE_MAX] = { 0 };
498     int32_t ret = TransTdcGetPkgName(conn->appInfo.myData.sessionName, pkgName, PKG_NAME_SIZE_MAX);
499     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_CTRL, "get pkg name fail.");
500     if (!(conn->serverSide)) {
501         ret = TransTdcOnChannelOpenFailed(
502             conn->appInfo.myData.pkgName, conn->appInfo.myData.pid, conn->channelId, errCode);
503         TRANS_LOGW(TRANS_CTRL, "channelId=%{public}d, ret=%{public}d", conn->channelId, ret);
504         return ret;
505     }
506     return SOFTBUS_OK;
507 }
508 
NotifyChannelOpenFailed(int32_t channelId,int32_t errCode)509 int32_t NotifyChannelOpenFailed(int32_t channelId, int32_t errCode)
510 {
511     SessionConn conn;
512     if (GetSessionConnById(channelId, &conn) != SOFTBUS_OK) {
513         TRANS_LOGE(TRANS_CTRL, "notify channel open failed, get tdcInfo is null");
514         return SOFTBUS_TRANS_GET_SESSION_CONN_FAILED;
515     }
516 
517     (void)memset_s(conn.appInfo.sessionKey, sizeof(conn.appInfo.sessionKey), 0, sizeof(conn.appInfo.sessionKey));
518     return NotifyChannelOpenFailedBySessionConn(&conn, errCode);
519 }
520 
TransTdcPostFastData(SessionConn * conn)521 static int32_t TransTdcPostFastData(SessionConn *conn)
522 {
523     TRANS_LOGI(TRANS_CTRL, "enter.");
524     uint32_t outLen;
525     char *buf = TransTdcPackFastData(&(conn->appInfo), &outLen);
526     if (buf == NULL) {
527         TRANS_LOGE(TRANS_CTRL, "failed to pack bytes.");
528         return SOFTBUS_ENCRYPT_ERR;
529     }
530     if (outLen != conn->appInfo.fastTransDataSize + FAST_TDC_EXT_DATA_SIZE) {
531         TRANS_LOGE(TRANS_CTRL, "pack bytes len error, outLen=%{public}d", outLen);
532         SoftBusFree(buf);
533         return SOFTBUS_ENCRYPT_ERR;
534     }
535     uint32_t tos = (conn->appInfo.businessType == BUSINESS_TYPE_BYTE) ? FAST_BYTE_TOS : FAST_MESSAGE_TOS;
536     if (SetIpTos(conn->appInfo.fd, tos) != SOFTBUS_OK) {
537         SoftBusFree(buf);
538         return SOFTBUS_TCP_SOCKET_ERR;
539     }
540     ssize_t ret = ConnSendSocketData(conn->appInfo.fd, buf, outLen, 0);
541     if (ret != (ssize_t)outLen) {
542         TRANS_LOGE(TRANS_CTRL, "failed to send tcp data. ret=%{public}zd", ret);
543         SoftBusFree(buf);
544         return SOFTBUS_TRANS_SEND_TCP_DATA_FAILED;
545     }
546     SoftBusFree(buf);
547     buf = NULL;
548     return SOFTBUS_OK;
549 }
550 
551 static const ConfigTypeMap g_configTypeMap[] = {
552     {CHANNEL_TYPE_TCP_DIRECT, BUSINESS_TYPE_BYTE, SOFTBUS_INT_MAX_BYTES_NEW_LENGTH},
553     {CHANNEL_TYPE_TCP_DIRECT, BUSINESS_TYPE_MESSAGE, SOFTBUS_INT_MAX_MESSAGE_NEW_LENGTH},
554 };
555 
FindConfigType(int32_t channelType,int32_t businessType)556 static int32_t FindConfigType(int32_t channelType, int32_t businessType)
557 {
558     for (uint32_t i = 0; i < sizeof(g_configTypeMap) / sizeof(ConfigTypeMap); i++) {
559         if ((g_configTypeMap[i].channelType == channelType) &&
560             (g_configTypeMap[i].businessType == businessType)) {
561             return g_configTypeMap[i].configType;
562         }
563     }
564     return SOFTBUS_CONFIG_TYPE_MAX;
565 }
566 
TransGetLocalConfig(int32_t channelType,int32_t businessType,uint32_t * len)567 static int32_t TransGetLocalConfig(int32_t channelType, int32_t businessType, uint32_t *len)
568 {
569     ConfigType configType = (ConfigType)FindConfigType(channelType, businessType);
570     if (configType == SOFTBUS_CONFIG_TYPE_MAX) {
571         TRANS_LOGE(TRANS_CTRL, "Invalid channelType=%{public}d, businessType=%{public}d",
572             channelType, businessType);
573         return SOFTBUS_INVALID_PARAM;
574     }
575     uint32_t maxLen;
576     if (SoftbusGetConfig(configType, (unsigned char *)&maxLen, sizeof(maxLen)) != SOFTBUS_OK) {
577         TRANS_LOGE(TRANS_CTRL, "get config failed, configType=%{public}d.", configType);
578         return SOFTBUS_GET_CONFIG_VAL_ERR;
579     }
580 
581     *len = maxLen;
582     TRANS_LOGI(TRANS_CTRL, "get local config len=%{public}d.", *len);
583     return SOFTBUS_OK;
584 }
585 
TransTdcProcessDataConfig(AppInfo * appInfo)586 static int32_t TransTdcProcessDataConfig(AppInfo *appInfo)
587 {
588     if (appInfo == NULL) {
589         TRANS_LOGE(TRANS_CTRL, "appInfo is null");
590         return SOFTBUS_INVALID_PARAM;
591     }
592     if (appInfo->businessType != BUSINESS_TYPE_MESSAGE && appInfo->businessType != BUSINESS_TYPE_BYTE) {
593         TRANS_LOGI(TRANS_CTRL, "invalid businessType=%{public}d", appInfo->businessType);
594         return SOFTBUS_OK;
595     }
596     if (appInfo->peerData.dataConfig != 0) {
597         appInfo->myData.dataConfig = MIN(appInfo->myData.dataConfig, appInfo->peerData.dataConfig);
598         TRANS_LOGI(TRANS_CTRL, "process dataConfig succ. dataConfig=%{public}u", appInfo->myData.dataConfig);
599         return SOFTBUS_OK;
600     }
601     ConfigType configType = appInfo->businessType == BUSINESS_TYPE_BYTE ?
602         SOFTBUS_INT_MAX_BYTES_LENGTH : SOFTBUS_INT_MAX_MESSAGE_LENGTH;
603     int32_t ret = SoftbusGetConfig(configType, (unsigned char *)&appInfo->myData.dataConfig,
604         sizeof(appInfo->myData.dataConfig));
605     if (ret != SOFTBUS_OK) {
606         TRANS_LOGE(TRANS_CTRL, "get config failed, configType=%{public}d", configType);
607         return ret;
608     }
609     TRANS_LOGI(TRANS_CTRL, "process dataConfig=%{public}d", appInfo->myData.dataConfig);
610     return SOFTBUS_OK;
611 }
612 
613 // the channel open failed while be notified when function OpenDataBusReply return ERR
OpenDataBusReply(int32_t channelId,uint64_t seq,const cJSON * reply)614 static int32_t OpenDataBusReply(int32_t channelId, uint64_t seq, const cJSON *reply)
615 {
616     (void)seq;
617     TRANS_LOGI(TRANS_CTRL, "channelId=%{public}d, seq=%{public}" PRIu64, channelId, seq);
618     SessionConn conn;
619     (void)memset_s(&conn, sizeof(SessionConn), 0, sizeof(SessionConn));
620     TRANS_CHECK_AND_RETURN_RET_LOGE(GetSessionConnById(channelId, &conn) == SOFTBUS_OK,
621         SOFTBUS_TRANS_GET_SESSION_CONN_FAILED, TRANS_CTRL, "notify channel open failed, get tdcInfo is null");
622     int32_t errCode = SOFTBUS_OK;
623     if (UnpackReplyErrCode(reply, &errCode) == SOFTBUS_OK) {
624         TRANS_LOGE(TRANS_CTRL,
625             "receive err reply msg channelId=%{public}d, errCode=%{public}d, seq=%{public}" PRIu64,
626             channelId, errCode, seq);
627         return errCode;
628     }
629 
630     uint16_t fastDataSize = 0;
631     TRANS_CHECK_AND_RETURN_RET_LOGE(UnpackReply(reply, &conn.appInfo, &fastDataSize) == SOFTBUS_OK,
632         SOFTBUS_TRANS_UNPACK_REPLY_FAILED, TRANS_CTRL, "UnpackReply failed");
633 
634     int32_t ret = TransTdcProcessDataConfig(&conn.appInfo);
635     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_CTRL, "Trans Tdc process data config failed.");
636 
637     ret = SetAppInfoById(channelId, &conn.appInfo);
638     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_CTRL, "set app info by id failed.");
639 
640     if ((fastDataSize > 0 && (conn.appInfo.fastTransDataSize == fastDataSize)) || conn.appInfo.fastTransDataSize == 0) {
641         ret = NotifyChannelOpened(channelId);
642         (void)memset_s(conn.appInfo.sessionKey, sizeof(conn.appInfo.sessionKey), 0, sizeof(conn.appInfo.sessionKey));
643         TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_CTRL, "notify channel open failed");
644     } else {
645         ret = TransTdcPostFastData(&conn);
646         (void)memset_s(conn.appInfo.sessionKey, sizeof(conn.appInfo.sessionKey), 0, sizeof(conn.appInfo.sessionKey));
647         TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_CTRL, "tdc send fast data failed");
648         ret = NotifyChannelOpened(channelId);
649         TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_CTRL, "notify channel open failed");
650     }
651     TransEventExtra extra = {
652         .socketName = NULL,
653         .peerNetworkId = NULL,
654         .calleePkg = NULL,
655         .callerPkg = NULL,
656         .channelId = channelId,
657         .result = EVENT_STAGE_RESULT_OK
658     };
659     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL, EVENT_STAGE_HANDSHAKE_REPLY, extra);
660     TRANS_LOGD(TRANS_CTRL, "ok");
661     return SOFTBUS_OK;
662 }
663 
TransTdcPostReplyMsg(int32_t channelId,uint64_t seq,uint32_t flags,char * reply)664 static inline int32_t TransTdcPostReplyMsg(int32_t channelId, uint64_t seq, uint32_t flags, char *reply)
665 {
666     TdcPacketHead packetHead = {
667         .magicNumber = MAGIC_NUMBER,
668         .module = MODULE_SESSION,
669         .seq = seq,
670         .flags = (FLAG_REPLY | flags),
671         .dataLen = strlen(reply),
672     };
673     return TransTdcPostBytes(channelId, &packetHead, reply);
674 }
675 
OpenDataBusRequestReply(const AppInfo * appInfo,int32_t channelId,uint64_t seq,uint32_t flags)676 static int32_t OpenDataBusRequestReply(const AppInfo *appInfo, int32_t channelId, uint64_t seq, uint32_t flags)
677 {
678     char *reply = PackReply(appInfo);
679     if (reply == NULL) {
680         TRANS_LOGE(TRANS_CTRL, "get pack reply err");
681         return SOFTBUS_TRANS_GET_PACK_REPLY_FAILED;
682     }
683 
684     int32_t ret = TransTdcPostReplyMsg(channelId, seq, flags, reply);
685     cJSON_free(reply);
686     return ret;
687 }
688 
OpenDataBusRequestError(int32_t channelId,uint64_t seq,char * errDesc,int32_t errCode,uint32_t flags)689 static int32_t OpenDataBusRequestError(int32_t channelId, uint64_t seq, char *errDesc, int32_t errCode, uint32_t flags)
690 {
691     char *reply = PackError(errCode, errDesc);
692     if (reply == NULL) {
693         TRANS_LOGE(TRANS_CTRL, "get pack reply err");
694         return SOFTBUS_TRANS_GET_PACK_REPLY_FAILED;
695     }
696 
697     int32_t ret = TransTdcPostReplyMsg(channelId, seq, flags, reply);
698     cJSON_free(reply);
699     return ret;
700 }
701 
GetUuidByChanId(int32_t channelId,char * uuid,uint32_t len)702 static int32_t GetUuidByChanId(int32_t channelId, char *uuid, uint32_t len)
703 {
704     int64_t authId = GetAuthIdByChanId(channelId);
705     if (authId == AUTH_INVALID_ID) {
706         TRANS_LOGE(TRANS_CTRL, "get authId fail");
707         return SOFTBUS_TRANS_GET_AUTH_ID_FAILED;
708     }
709     return AuthGetDeviceUuid(authId, uuid, len);
710 }
711 
OpenDataBusRequestOutSessionName(const char * mySessionName,const char * peerSessionName)712 static void OpenDataBusRequestOutSessionName(const char *mySessionName, const char *peerSessionName)
713 {
714     char *tmpMyName = NULL;
715     char *tmpPeerName = NULL;
716     Anonymize(mySessionName, &tmpMyName);
717     Anonymize(peerSessionName, &tmpPeerName);
718     TRANS_LOGI(TRANS_CTRL, "OpenDataBusRequest: mySessionName=%{public}s, peerSessionName=%{public}s",
719         tmpMyName, tmpPeerName);
720     AnonymizeFree(tmpMyName);
721     AnonymizeFree(tmpPeerName);
722 }
723 
GetSessionConnFromDataBusRequest(int32_t channelId,const cJSON * request)724 static SessionConn* GetSessionConnFromDataBusRequest(int32_t channelId, const cJSON *request)
725 {
726     SessionConn *conn = (SessionConn *)SoftBusCalloc(sizeof(SessionConn));
727     if (conn == NULL) {
728         return NULL;
729     }
730     if (GetSessionConnById(channelId, conn) != SOFTBUS_OK) {
731         SoftBusFree(conn);
732         return NULL;
733     }
734     if (UnpackRequest(request, &conn->appInfo) != SOFTBUS_OK) {
735         (void)memset_s(conn->appInfo.sessionKey, sizeof(conn->appInfo.sessionKey), 0, sizeof(conn->appInfo.sessionKey));
736         SoftBusFree(conn);
737         TRANS_LOGE(TRANS_CTRL, "UnpackRequest error");
738         return NULL;
739     }
740     return conn;
741 }
742 
NotifyFastDataRecv(SessionConn * conn,int32_t channelId)743 static void NotifyFastDataRecv(SessionConn *conn, int32_t channelId)
744 {
745     TRANS_LOGI(TRANS_CTRL, "enter.");
746     TransReceiveData receiveData;
747     receiveData.data = (void*)conn->appInfo.fastTransData;
748     receiveData.dataLen = conn->appInfo.fastTransDataSize + FAST_TDC_EXT_DATA_SIZE;
749     if (conn->appInfo.businessType == BUSINESS_TYPE_MESSAGE) {
750         receiveData.dataType = TRANS_SESSION_MESSAGE;
751     } else {
752         receiveData.dataType = TRANS_SESSION_BYTES;
753     }
754     if (TransTdcOnMsgReceived(conn->appInfo.myData.pkgName, conn->appInfo.myData.pid,
755         channelId, &receiveData) != SOFTBUS_OK) {
756         conn->appInfo.fastTransDataSize = 0;
757         TRANS_LOGE(TRANS_CTRL, "err");
758         return;
759     }
760     TRANS_LOGD(TRANS_CTRL, "ok");
761     return;
762 }
763 
TransTdcFillDataConfig(AppInfo * appInfo)764 static int32_t TransTdcFillDataConfig(AppInfo *appInfo)
765 {
766     if (appInfo == NULL) {
767         TRANS_LOGE(TRANS_CTRL, "appInfo is null");
768         return SOFTBUS_INVALID_PARAM;
769     }
770     if (appInfo->businessType != BUSINESS_TYPE_BYTE && appInfo->businessType != BUSINESS_TYPE_MESSAGE) {
771         TRANS_LOGI(TRANS_CTRL, "invalid businessType=%{public}d", appInfo->businessType);
772         return SOFTBUS_OK;
773     }
774     if (appInfo->peerData.dataConfig != 0) {
775         uint32_t localDataConfig = 0;
776         int32_t ret = TransGetLocalConfig(CHANNEL_TYPE_TCP_DIRECT, appInfo->businessType, &localDataConfig);
777         TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_CTRL, "get local config fail");
778         appInfo->myData.dataConfig = MIN(localDataConfig, appInfo->peerData.dataConfig);
779         TRANS_LOGI(TRANS_CTRL, "fill dataConfig succ. dataConfig=%{public}u", appInfo->myData.dataConfig);
780         return SOFTBUS_OK;
781     }
782     ConfigType configType = appInfo->businessType == BUSINESS_TYPE_BYTE ?
783         SOFTBUS_INT_MAX_BYTES_LENGTH : SOFTBUS_INT_MAX_MESSAGE_LENGTH;
784     int32_t ret = SoftbusGetConfig(configType, (unsigned char *)&appInfo->myData.dataConfig,
785         sizeof(appInfo->myData.dataConfig));
786     if (ret != SOFTBUS_OK) {
787         TRANS_LOGE(TRANS_CTRL, "get config failed, configType=%{public}d", configType);
788         return ret;
789     }
790     TRANS_LOGI(TRANS_CTRL, "fill dataConfig=%{public}d", appInfo->myData.dataConfig);
791     return SOFTBUS_OK;
792 }
793 
IsMetaSession(const char * sessionName)794 static bool IsMetaSession(const char *sessionName)
795 {
796     if (strlen(sessionName) < MIN_META_LEN || strncmp(sessionName, META_SESSION, MIN_META_LEN)) {
797         return false;
798     }
799     return true;
800 }
801 
ReleaseSessionConn(SessionConn * chan)802 static void ReleaseSessionConn(SessionConn *chan)
803 {
804     if (chan == NULL) {
805         return;
806     }
807     if (chan->appInfo.fastTransData != NULL) {
808         SoftBusFree((void*)chan->appInfo.fastTransData);
809     }
810     SoftBusFree(chan);
811 }
812 
ReportTransEventExtra(TransEventExtra * extra,int32_t channelId,SessionConn * conn,NodeInfo * nodeInfo,char * peerUuid)813 static void ReportTransEventExtra(
814     TransEventExtra *extra, int32_t channelId, SessionConn *conn, NodeInfo *nodeInfo, char *peerUuid)
815 {
816     extra->socketName = conn->appInfo.myData.sessionName;
817     extra->calleePkg = NULL;
818     extra->callerPkg = NULL;
819     extra->channelId = channelId;
820     extra->peerChannelId = conn->appInfo.peerData.channelId;
821     extra->socketFd = conn->appInfo.fd;
822     extra->result = EVENT_STAGE_RESULT_OK;
823     bool peerRet = GetUuidByChanId(channelId, peerUuid, DEVICE_ID_SIZE_MAX) == SOFTBUS_OK &&
824         LnnGetRemoteNodeInfoById(peerUuid, CATEGORY_UUID, nodeInfo) == SOFTBUS_OK;
825     if (peerRet) {
826         extra->peerUdid = nodeInfo->deviceInfo.deviceUdid;
827         extra->peerDevVer = nodeInfo->deviceInfo.deviceVersion;
828     }
829     if (LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, nodeInfo->masterUdid, UDID_BUF_LEN) == SOFTBUS_OK) {
830         extra->localUdid = nodeInfo->masterUdid;
831     }
832     TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL_SERVER, EVENT_STAGE_HANDSHAKE_START, *extra);
833 }
834 
CheckServerPermission(AppInfo * appInfo,char * ret)835 static int32_t CheckServerPermission(AppInfo *appInfo, char *ret)
836 {
837     if (appInfo->callingTokenId != TOKENID_NOT_SET &&
838         TransCheckServerAccessControl(appInfo->callingTokenId) != SOFTBUS_OK) {
839         ret = (char *)"Server check acl failed";
840         return SOFTBUS_TRANS_CHECK_ACL_FAILED;
841     }
842 
843     if (CheckSecLevelPublic(appInfo->myData.sessionName, appInfo->peerData.sessionName) != SOFTBUS_OK) {
844         ret = (char *)"Server check session name failed";
845         return SOFTBUS_PERMISSION_SERVER_DENIED;
846     }
847 
848     return SOFTBUS_OK;
849 }
850 
TransTdcFillAppInfoAndNotifyChannel(AppInfo * appInfo,int32_t channelId,char * errDesc)851 static int32_t TransTdcFillAppInfoAndNotifyChannel(AppInfo *appInfo, int32_t channelId, char *errDesc)
852 {
853     char *ret = NULL;
854     int32_t errCode = SOFTBUS_OK;
855     errCode = CheckServerPermission(appInfo, ret);
856     if (errCode != SOFTBUS_OK) {
857         goto ERR_EXIT;
858     }
859 
860     if (TransTdcGetUidAndPid(appInfo->myData.sessionName, &appInfo->myData.uid, &appInfo->myData.pid) != SOFTBUS_OK) {
861         errCode = SOFTBUS_TRANS_PEER_SESSION_NOT_CREATED;
862         ret = (char *)"Peer Device Session Not Create";
863         goto ERR_EXIT;
864     }
865 
866     errCode = GetUuidByChanId(channelId, appInfo->peerData.deviceId, DEVICE_ID_SIZE_MAX);
867     if (errCode != SOFTBUS_OK) {
868         TRANS_LOGE(TRANS_CTRL, "Auth: Get Uuid By ChanId failed.");
869         ret = (char *)"Get Uuid By ChanId failed";
870         goto ERR_EXIT;
871     }
872 
873     errCode = TransTdcFillDataConfig(appInfo);
874     if (errCode != SOFTBUS_OK) {
875         TRANS_LOGE(TRANS_CTRL, "fill data config failed.");
876         ret = (char *)"fill data config failed";
877         goto ERR_EXIT;
878     }
879     appInfo->myHandleId = 0;
880     errCode = SetAppInfoById(channelId, appInfo);
881     if (errCode != SOFTBUS_OK) {
882         TRANS_LOGE(TRANS_CTRL, "set app info by id failed.");
883         ret = (char *)"Set App Info By Id Failed";
884         goto ERR_EXIT;
885     }
886 
887     OpenDataBusRequestOutSessionName(appInfo->myData.sessionName, appInfo->peerData.sessionName);
888     TRANS_LOGI(TRANS_CTRL, "OpenDataBusRequest: myPid=%{public}d, peerPid=%{public}d",
889         appInfo->myData.pid, appInfo->peerData.pid);
890 
891     errCode = NotifyChannelOpened(channelId);
892     if (errCode != SOFTBUS_OK) {
893         TRANS_LOGE(TRANS_CTRL, "Notify APP Channel Opened Failed");
894         ret = (char *)"Notify APP Channel Opened Failed";
895         goto ERR_EXIT;
896     }
897 
898     return SOFTBUS_OK;
899 ERR_EXIT:
900     if (strcpy_s(errDesc, MAX_ERRDESC_LEN, ret) != EOK) {
901         TRANS_LOGW(TRANS_CTRL, "strcpy failed");
902     }
903     return errCode;
904 }
905 
HandleDataBusReply(SessionConn * conn,int32_t channelId,TransEventExtra * extra,uint32_t flags,uint64_t seq)906 static int32_t HandleDataBusReply(
907     SessionConn *conn, int32_t channelId, TransEventExtra *extra, uint32_t flags, uint64_t seq)
908 {
909     int32_t ret = OpenDataBusRequestReply(&conn->appInfo, channelId, seq, flags);
910     if (ret != SOFTBUS_OK) {
911         TRANS_LOGE(TRANS_CTRL, "OpenDataBusRequest reply err");
912         (void)NotifyChannelClosed(&conn->appInfo, channelId);
913         return ret;
914     } else {
915         extra->result = EVENT_STAGE_RESULT_OK;
916         TRANS_EVENT(EVENT_SCENE_OPEN_CHANNEL_SERVER, EVENT_STAGE_HANDSHAKE_REPLY, *extra);
917     }
918 
919     if (conn->appInfo.routeType == WIFI_P2P) {
920         if (LnnGetNetworkIdByUuid(conn->appInfo.peerData.deviceId,
921             conn->appInfo.peerNetWorkId, DEVICE_ID_SIZE_MAX) == SOFTBUS_OK) {
922             LaneUpdateP2pAddressByIp(conn->appInfo.peerData.addr, conn->appInfo.peerNetWorkId);
923         }
924     }
925     return SOFTBUS_OK;
926 }
927 
OpenDataBusRequest(int32_t channelId,uint32_t flags,uint64_t seq,const cJSON * request)928 static int32_t OpenDataBusRequest(int32_t channelId, uint32_t flags, uint64_t seq, const cJSON *request)
929 {
930     TRANS_LOGI(TRANS_CTRL, "channelId=%{public}d, seq=%{public}" PRIu64, channelId, seq);
931     SessionConn *conn = GetSessionConnFromDataBusRequest(channelId, request);
932     TRANS_CHECK_AND_RETURN_RET_LOGE(conn != NULL, SOFTBUS_INVALID_PARAM, TRANS_CTRL, "conn is null");
933 
934     TransEventExtra extra;
935     char peerUuid[DEVICE_ID_SIZE_MAX] = { 0 };
936     NodeInfo nodeInfo;
937     (void)memset_s(&nodeInfo, sizeof(NodeInfo), 0, sizeof(NodeInfo));
938     ReportTransEventExtra(&extra, channelId, conn, &nodeInfo, peerUuid);
939 
940     if ((flags & FLAG_AUTH_META) != 0 && !IsMetaSession(conn->appInfo.myData.sessionName)) {
941         char *tmpName = NULL;
942         Anonymize(conn->appInfo.myData.sessionName, &tmpName);
943         TRANS_LOGI(TRANS_CTRL,
944             "Request denied: session is not a meta session. sessionName=%{public}s", tmpName);
945         AnonymizeFree(tmpName);
946         (void)memset_s(conn->appInfo.sessionKey, sizeof(conn->appInfo.sessionKey), 0, sizeof(conn->appInfo.sessionKey));
947         ReleaseSessionConn(conn);
948         return SOFTBUS_TRANS_NOT_META_SESSION;
949     }
950     char errDesc[MAX_ERRDESC_LEN] = { 0 };
951     int32_t errCode = TransTdcFillAppInfoAndNotifyChannel(&conn->appInfo, channelId, errDesc);
952     if (errCode != SOFTBUS_OK) {
953         if (OpenDataBusRequestError(channelId, seq, errDesc, errCode, flags) != SOFTBUS_OK) {
954             TRANS_LOGE(TRANS_CTRL, "OpenDataBusRequestError error");
955         }
956         (void)memset_s(conn->appInfo.sessionKey, sizeof(conn->appInfo.sessionKey), 0, sizeof(conn->appInfo.sessionKey));
957         ReleaseSessionConn(conn);
958         return errCode;
959     }
960 
961     if (conn->appInfo.fastTransDataSize > 0 && conn->appInfo.fastTransData != NULL) {
962         NotifyFastDataRecv(conn, channelId);
963     }
964 
965     errCode = HandleDataBusReply(conn, channelId, &extra, flags, seq);
966     if (errCode != SOFTBUS_OK) {
967         (void)memset_s(conn->appInfo.sessionKey, sizeof(conn->appInfo.sessionKey), 0, sizeof(conn->appInfo.sessionKey));
968         (void)TransDelTcpChannelInfoByChannelId(channelId);
969         ReleaseSessionConn(conn);
970         return errCode;
971     }
972 
973     errCode = NotifyChannelBind(channelId);
974     (void)memset_s(conn->appInfo.sessionKey, sizeof(conn->appInfo.sessionKey), 0, sizeof(conn->appInfo.sessionKey));
975     if (errCode != SOFTBUS_OK) {
976         (void)TransDelTcpChannelInfoByChannelId(channelId);
977     }
978     ReleaseSessionConn(conn);
979     return errCode;
980 }
981 
ProcessMessage(int32_t channelId,uint32_t flags,uint64_t seq,const char * msg)982 static int32_t ProcessMessage(int32_t channelId, uint32_t flags, uint64_t seq, const char *msg)
983 {
984     int32_t ret;
985     cJSON *json = cJSON_Parse(msg);
986     if (json == NULL) {
987         TRANS_LOGE(TRANS_CTRL, "json parse failed.");
988         return SOFTBUS_PARSE_JSON_ERR;
989     }
990     if (flags & FLAG_REPLY) {
991         ret = OpenDataBusReply(channelId, seq, json);
992     } else {
993         ret = OpenDataBusRequest(channelId, flags, seq, json);
994     }
995     cJSON_Delete(json);
996     AppInfo appInfo;
997     TRANS_CHECK_AND_RETURN_RET_LOGE(GetAppInfoById(channelId, &appInfo) == SOFTBUS_OK, ret,
998         TRANS_CTRL, "get appInfo fail");
999     char *tmpNetWorkId = NULL;
1000     char *tmpUdid = NULL;
1001     Anonymize(appInfo.peerNetWorkId, &tmpNetWorkId);
1002     Anonymize(appInfo.peerUdid, &tmpUdid);
1003     TRANS_LOGI(TRANS_CTRL, "channelId=%{public}d, peerNetWorkId=%{public}s, peerUdid=%{public}s, ret=%{public}d",
1004         channelId, tmpNetWorkId, tmpUdid, ret);
1005     AnonymizeFree(tmpNetWorkId);
1006     AnonymizeFree(tmpUdid);
1007     return ret;
1008 }
1009 
TransSrvGetDataBufNodeById(int32_t channelId)1010 static ServerDataBuf *TransSrvGetDataBufNodeById(int32_t channelId)
1011 {
1012     if (g_tcpSrvDataList ==  NULL) {
1013         return NULL;
1014     }
1015 
1016     ServerDataBuf *item = NULL;
1017     LIST_FOR_EACH_ENTRY(item, &(g_tcpSrvDataList->list), ServerDataBuf, node) {
1018         if (item->channelId == channelId) {
1019             return item;
1020         }
1021     }
1022     TRANS_LOGE(TRANS_CTRL, "srv tcp direct channel id not exist.");
1023     return NULL;
1024 }
1025 
GetAuthIdByChannelInfo(int32_t channelId,uint64_t seq,uint32_t cipherFlag,AuthHandle * authHandle)1026 static int32_t GetAuthIdByChannelInfo(int32_t channelId, uint64_t seq, uint32_t cipherFlag, AuthHandle *authHandle)
1027 {
1028     if (authHandle == NULL) {
1029         TRANS_LOGE(TRANS_CTRL, "authHandle is null");
1030         return SOFTBUS_INVALID_PARAM;
1031     }
1032     if (GetAuthHandleByChanId(channelId, authHandle) == SOFTBUS_OK && authHandle->authId != AUTH_INVALID_ID) {
1033         TRANS_LOGI(TRANS_CTRL, "authId=%{public}" PRId64 " is not AUTH_INVALID_ID", authHandle->authId);
1034         return SOFTBUS_OK;
1035     }
1036 
1037     AppInfo appInfo;
1038     int32_t ret = GetAppInfoById(channelId, &appInfo);
1039     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_CTRL, "get appInfo fail");
1040 
1041     bool fromAuthServer = ((seq & AUTH_CONN_SERVER_SIDE) != 0);
1042     char uuid[UUID_BUF_LEN] = {0};
1043     struct WifiDirectManager *mgr = GetWifiDirectManager();
1044     if (mgr == NULL || mgr->getRemoteUuidByIp == NULL) {
1045         TRANS_LOGE(TRANS_CTRL, "GetWifiDirectManager failed");
1046         return SOFTBUS_WIFI_DIRECT_INIT_FAILED;
1047     }
1048     ret = mgr->getRemoteUuidByIp(appInfo.peerData.addr, uuid, sizeof(uuid));
1049     (void)memset_s(appInfo.sessionKey, sizeof(appInfo.sessionKey), 0, sizeof(appInfo.sessionKey));
1050     if (ret != SOFTBUS_OK) {
1051         AuthConnInfo connInfo;
1052         connInfo.type = AUTH_LINK_TYPE_WIFI;
1053         if (strcpy_s(connInfo.info.ipInfo.ip, IP_LEN, appInfo.peerData.addr) != EOK) {
1054             TRANS_LOGE(TRANS_CTRL, "copy ip addr fail");
1055             return SOFTBUS_MEM_ERR;
1056         }
1057         char *tmpPeerIp = NULL;
1058         Anonymize(appInfo.peerData.addr, &tmpPeerIp);
1059         TRANS_LOGE(TRANS_CTRL, "channelId=%{public}d get remote uuid by Ip=%{public}s failed", channelId, tmpPeerIp);
1060         AnonymizeFree(tmpPeerIp);
1061         authHandle->type = connInfo.type;
1062         authHandle->authId = AuthGetIdByConnInfo(&connInfo, !fromAuthServer, false);
1063         return SOFTBUS_OK;
1064     }
1065 
1066     AuthLinkType linkType = SwitchCipherTypeToAuthLinkType(cipherFlag);
1067     TRANS_LOGI(TRANS_CTRL, "get auth linkType=%{public}d, flag=0x%{public}x", linkType, cipherFlag);
1068     bool isAuthMeta = (cipherFlag & FLAG_AUTH_META) ? true : false;
1069     authHandle->type = linkType;
1070     authHandle->authId = AuthGetIdByUuid(uuid, linkType, !fromAuthServer, isAuthMeta);
1071     return SOFTBUS_OK;
1072 }
1073 
DecryptMessage(int32_t channelId,const TdcPacketHead * pktHead,const uint8_t * pktData,uint8_t ** outData,uint32_t * outDataLen)1074 static int32_t DecryptMessage(int32_t channelId, const TdcPacketHead *pktHead, const uint8_t *pktData,
1075     uint8_t **outData, uint32_t *outDataLen)
1076 {
1077     AuthHandle authHandle = { .authId = AUTH_INVALID_ID };
1078     int32_t ret = GetAuthIdByChannelInfo(channelId, pktHead->seq, pktHead->flags, &authHandle);
1079     if (ret != SOFTBUS_OK || (authHandle.authId == AUTH_INVALID_ID && pktHead->flags == FLAG_P2P)) {
1080         TRANS_LOGW(TRANS_CTRL, "get p2p authId fail, peer device may be legacyOs, retry hml");
1081         // we don't know peer device is legacyOs or not, so retry hml when flag is p2p and get auth failed
1082         ret = GetAuthIdByChannelInfo(channelId, pktHead->seq, FLAG_ENHANCE_P2P, &authHandle);
1083     }
1084     if (ret != SOFTBUS_OK || authHandle.authId == AUTH_INVALID_ID) {
1085         TRANS_LOGE(TRANS_CTRL, "srv process recv data: get authId fail.");
1086         return SOFTBUS_NOT_FIND;
1087     }
1088     ret = SetAuthHandleByChanId(channelId, &authHandle);
1089     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_CTRL, "srv process recv data: set authId fail.");
1090 
1091     uint32_t decDataLen = AuthGetDecryptSize(pktHead->dataLen) + 1;
1092     uint8_t *decData = (uint8_t *)SoftBusCalloc(decDataLen);
1093     if (decData == NULL) {
1094         TRANS_LOGE(TRANS_CTRL, "srv process recv data: malloc fail.");
1095         return SOFTBUS_MALLOC_ERR;
1096     }
1097     if (AuthDecrypt(&authHandle, pktData, pktHead->dataLen, decData, &decDataLen) != SOFTBUS_OK) {
1098         TRANS_LOGE(TRANS_CTRL, "srv process recv data: decrypt fail.");
1099         SoftBusFree(decData);
1100         return SOFTBUS_DECRYPT_ERR;
1101     }
1102     *outData = decData;
1103     *outDataLen = decDataLen;
1104     return SOFTBUS_OK;
1105 }
1106 
ProcessReceivedData(int32_t channelId,int32_t type)1107 static int32_t ProcessReceivedData(int32_t channelId, int32_t type)
1108 {
1109     uint64_t seq;
1110     uint32_t flags;
1111     uint8_t *data = NULL;
1112     uint32_t dataLen = 0;
1113 
1114     if (SoftBusMutexLock(&g_tcpSrvDataList->lock) != SOFTBUS_OK) {
1115         TRANS_LOGE(TRANS_CTRL, "lock failed.");
1116         return SOFTBUS_LOCK_ERR;
1117     }
1118     ServerDataBuf *node = TransSrvGetDataBufNodeById(channelId);
1119     if (node == NULL || node->data == NULL) {
1120         TRANS_LOGE(TRANS_CTRL, "node is null.");
1121         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1122         return SOFTBUS_TRANS_NODE_IS_NULL;
1123     }
1124     TdcPacketHead *pktHead = (TdcPacketHead *)(node->data);
1125     uint8_t *pktData = (uint8_t *)(node->data + sizeof(TdcPacketHead));
1126     if (pktHead->module != MODULE_SESSION) {
1127         TRANS_LOGE(TRANS_CTRL, "srv process recv data: illegal module.");
1128         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1129         return SOFTBUS_TRANS_ILLEGAL_MODULE;
1130     }
1131     seq = pktHead->seq;
1132     flags = pktHead->flags;
1133 
1134     TRANS_LOGI(TRANS_CTRL,
1135         "recv tdc packet. channelId=%{public}d, flags=%{public}d, seq=%{public}" PRIu64,
1136         channelId, flags, seq);
1137     if (DecryptMessage(channelId, pktHead, pktData, &data, &dataLen) != SOFTBUS_OK) {
1138         TRANS_LOGE(TRANS_CTRL, "srv process recv data: decrypt fail.");
1139         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1140         return SOFTBUS_DECRYPT_ERR;
1141     }
1142 
1143     char *end = node->data + sizeof(TdcPacketHead) + pktHead->dataLen;
1144     if (memmove_s(node->data, node->size, end, node->w - end) != EOK) {
1145         SoftBusFree(data);
1146         TRANS_LOGE(TRANS_CTRL, "memmove fail.");
1147         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1148         return SOFTBUS_MEM_ERR;
1149     }
1150     node->w = node->w - sizeof(TdcPacketHead) - pktHead->dataLen;
1151     SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1152 
1153     int32_t ret = ProcessMessage(channelId, flags, seq, (char *)data);
1154     SoftBusFree(data);
1155     return ret;
1156 }
1157 
TransTdcSrvProcData(ListenerModule module,int32_t channelId,int32_t type)1158 static int32_t TransTdcSrvProcData(ListenerModule module, int32_t channelId, int32_t type)
1159 {
1160     TRANS_CHECK_AND_RETURN_RET_LOGE(g_tcpSrvDataList != NULL, SOFTBUS_NO_INIT, TRANS_CTRL, "g_tcpSrvDataList is NULL");
1161     int32_t ret = SoftBusMutexLock(&g_tcpSrvDataList->lock);
1162     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, SOFTBUS_LOCK_ERR, TRANS_CTRL, "lock failed.");
1163 
1164     ServerDataBuf *node = TransSrvGetDataBufNodeById(channelId);
1165     if (node == NULL) {
1166         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1167         TRANS_LOGE(TRANS_CTRL,
1168             "srv can not get buf node. listenerModule=%{public}d, "
1169             "channelId=%{public}d, type=%{public}d", (int32_t)module, channelId, type);
1170         return SOFTBUS_TRANS_TCP_GET_SRV_DATA_FAILED;
1171     }
1172 
1173     uint32_t bufLen = node->w - node->data;
1174     if (bufLen < DC_MSG_PACKET_HEAD_SIZE) {
1175         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1176         TRANS_LOGE(TRANS_CTRL,
1177             "srv head not enough, recv next time. listenerModule=%{public}d, bufLen=%{public}u "
1178             "channelId=%{public}d, type=%{public}d", (int32_t)module, bufLen, channelId, type);
1179         return SOFTBUS_DATA_NOT_ENOUGH;
1180     }
1181 
1182     TdcPacketHead *pktHead = (TdcPacketHead *)(node->data);
1183     UnpackTdcPacketHead(pktHead);
1184     if (pktHead->magicNumber != MAGIC_NUMBER) {
1185         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1186         TRANS_LOGE(TRANS_CTRL,
1187             "srv recv invalid packet head listenerModule=%{public}d, "
1188             "channelId=%{public}d, type=%{public}d", (int32_t)module, channelId, type);
1189         return SOFTBUS_TRANS_UNPACK_PACKAGE_HEAD_FAILED;
1190     }
1191 
1192     uint32_t dataLen = pktHead->dataLen;
1193     if (dataLen > node->size - DC_MSG_PACKET_HEAD_SIZE) {
1194         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1195         TRANS_LOGE(TRANS_CTRL,
1196             "srv out of recv dataLen=%{public}u, listenerModule=%{public}d, "
1197             "channelId=%{public}d, type=%{public}d", dataLen, (int32_t)module, channelId, type);
1198         return SOFTBUS_TRANS_UNPACK_PACKAGE_HEAD_FAILED;
1199     }
1200 
1201     if (bufLen < dataLen + DC_MSG_PACKET_HEAD_SIZE) {
1202         SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1203         TRANS_LOGE(TRANS_CTRL,
1204             "srv data not enough, recv next time. bufLen=%{public}u, dataLen=%{public}u, headLen=%{public}d "
1205             "listenerModule=%{public}d, channelId=%{public}d, type=%{public}d",
1206             bufLen, dataLen, (int32_t)DC_MSG_PACKET_HEAD_SIZE, (int32_t)module, channelId, type);
1207         return SOFTBUS_DATA_NOT_ENOUGH;
1208     }
1209     DelTrigger(module, node->fd, READ_TRIGGER);
1210     SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1211     return ProcessReceivedData(channelId, type);
1212 }
1213 
TransTdcGetDataBufInfoByChannelId(int32_t channelId,int32_t * fd,size_t * len)1214 static int32_t TransTdcGetDataBufInfoByChannelId(int32_t channelId, int32_t *fd, size_t *len)
1215 {
1216     if (fd == NULL || len == NULL) {
1217         TRANS_LOGW(TRANS_CTRL, "invalid param.");
1218         return SOFTBUS_INVALID_PARAM;
1219     }
1220 
1221     if (g_tcpSrvDataList == NULL) {
1222         TRANS_LOGE(TRANS_CTRL, "tcp srv data list empty.");
1223         return SOFTBUS_NO_INIT;
1224     }
1225 
1226     if (SoftBusMutexLock(&g_tcpSrvDataList->lock) != SOFTBUS_OK) {
1227         TRANS_LOGE(TRANS_CTRL, "lock failed.");
1228         return SOFTBUS_LOCK_ERR;
1229     }
1230     ServerDataBuf *item = NULL;
1231     LIST_FOR_EACH_ENTRY(item, &(g_tcpSrvDataList->list), ServerDataBuf, node) {
1232         if (item->channelId == channelId) {
1233             *fd = item->fd;
1234             *len = item->size - (item->w - item->data);
1235             (void)SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1236             return SOFTBUS_OK;
1237         }
1238     }
1239     (void)SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1240     TRANS_LOGI(TRANS_CTRL, "trans tdc data buf not found. channelId=%{public}d", channelId);
1241     return SOFTBUS_TRANS_TCP_DATABUF_NOT_FOUND;
1242 }
1243 
TransTdcUpdateDataBufWInfo(int32_t channelId,char * recvBuf,int32_t recvLen)1244 static int32_t TransTdcUpdateDataBufWInfo(int32_t channelId, char *recvBuf, int32_t recvLen)
1245 {
1246     if (recvBuf == NULL) {
1247         TRANS_LOGW(TRANS_CTRL, "invalid param.");
1248         return SOFTBUS_INVALID_PARAM;
1249     }
1250     if (g_tcpSrvDataList == NULL) {
1251         TRANS_LOGE(TRANS_CTRL, "srv data list empty.");
1252         return SOFTBUS_NO_INIT;
1253     }
1254     if (SoftBusMutexLock(&g_tcpSrvDataList->lock) != SOFTBUS_OK) {
1255         TRANS_LOGE(TRANS_CTRL, "lock failed.");
1256         return SOFTBUS_LOCK_ERR;
1257     }
1258 
1259     ServerDataBuf *item = NULL;
1260     ServerDataBuf *nextItem = NULL;
1261     LIST_FOR_EACH_ENTRY_SAFE(item, nextItem, &(g_tcpSrvDataList->list), ServerDataBuf, node) {
1262         if (item->channelId != channelId) {
1263             continue;
1264         }
1265         int32_t freeLen = (int32_t)(item->size) - (item->w - item->data);
1266         if (recvLen > freeLen) {
1267             (void)SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1268             TRANS_LOGE(TRANS_CTRL,
1269                 "trans tdc. recvLen=%{public}d, freeLen=%{public}d.", recvLen, freeLen);
1270             return SOFTBUS_TRANS_RECV_DATA_OVER_LEN;
1271         }
1272         if (memcpy_s(item->w, recvLen, recvBuf, recvLen) != EOK) {
1273             (void)SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1274             TRANS_LOGE(TRANS_CTRL, "memcpy_s trans tdc failed. channelId=%{public}d", channelId);
1275             return SOFTBUS_MEM_ERR;
1276         }
1277         item->w += recvLen;
1278         (void)SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1279         return SOFTBUS_OK;
1280     }
1281     (void)SoftBusMutexUnlock(&g_tcpSrvDataList->lock);
1282     TRANS_LOGE(TRANS_CTRL, "trans update tdc databuf not found. channelId=%{public}d", channelId);
1283     return SOFTBUS_TRANS_TCP_DATABUF_NOT_FOUND;
1284 }
1285 
TransRecvTdcSocketData(int32_t channelId,char * buffer,int32_t bufferSize)1286 static int32_t TransRecvTdcSocketData(int32_t channelId, char *buffer, int32_t bufferSize)
1287 {
1288     int32_t fd = -1;
1289     size_t len = 0;
1290     int32_t ret = TransTdcGetDataBufInfoByChannelId(channelId, &fd, &len);
1291     TRANS_CHECK_AND_RETURN_RET_LOGE(
1292         ret == SOFTBUS_OK, SOFTBUS_TRANS_TCP_GET_SRV_DATA_FAILED, TRANS_CTRL, "get info failed, ret=%{public}d", ret);
1293     TRANS_CHECK_AND_RETURN_RET_LOGE(len >= (size_t)bufferSize, SOFTBUS_TRANS_TCP_GET_SRV_DATA_FAILED, TRANS_CTRL,
1294         "freeBufferLen=%{public}zu less than bufferSize=%{public}d. channelId=%{public}d", len, bufferSize, channelId);
1295     int32_t recvLen = ConnRecvSocketData(fd, buffer, bufferSize, 0);
1296     if (recvLen < 0) {
1297         TRANS_LOGE(TRANS_CTRL, " recv tcp data fail, channelId=%{public}d, retLen=%{public}d.", channelId, recvLen);
1298         return SOFTBUS_TRANS_TCP_GET_SRV_DATA_FAILED;
1299     } else if (recvLen == 0) {
1300         TRANS_LOGE(TRANS_CTRL, "recv tcp data fail, retLen=0, channelId=%{public}d", channelId);
1301         return SOFTBUS_DATA_NOT_ENOUGH;
1302     }
1303     if (TransTdcUpdateDataBufWInfo(channelId, buffer, bufferSize) != SOFTBUS_OK) {
1304         TRANS_LOGE(TRANS_CTRL, "update channel data buf failed. channelId=%{public}d", channelId);
1305         return SOFTBUS_TRANS_UPDATE_DATA_BUF_FAILED;
1306     }
1307 
1308     return SOFTBUS_OK;
1309 }
1310 
TransTdcSrvRecvData(ListenerModule module,int32_t channelId,int32_t type)1311 int32_t TransTdcSrvRecvData(ListenerModule module, int32_t channelId, int32_t type)
1312 {
1313     int32_t headSize = sizeof(TdcPacketHead);
1314     char *headBuf = (char *)SoftBusCalloc(headSize);
1315     if (headBuf == NULL) {
1316         TRANS_LOGE(TRANS_CTRL, "malloc failed. channelId=%{public}d, len=%{public}d", channelId, headSize);
1317         return SOFTBUS_MALLOC_ERR;
1318     }
1319     int32_t ret = TransRecvTdcSocketData(channelId, headBuf, headSize);
1320     if (ret != SOFTBUS_OK) {
1321         SoftBusFree(headBuf);
1322         return ret;
1323     }
1324     TdcPacketHead *pktHead = (TdcPacketHead *)headBuf;
1325     UnpackTdcPacketHead(pktHead);
1326     if (pktHead->magicNumber != MAGIC_NUMBER) {
1327         TRANS_LOGE(TRANS_CTRL,
1328             "srv recv invalid packet head listenerModule=%{public}d, channelId=%{public}d, type=%{public}d",
1329             (int32_t)module, channelId, type);
1330         SoftBusFree(headBuf);
1331         return SOFTBUS_TRANS_UNPACK_PACKAGE_HEAD_FAILED;
1332     }
1333     int32_t dataSize = (int32_t)pktHead->dataLen;
1334     SoftBusFree(headBuf);
1335 
1336     char *dataBuffer = (char *)SoftBusCalloc(dataSize);
1337     if (dataBuffer == NULL) {
1338         TRANS_LOGE(TRANS_CTRL, "malloc failed. channelId=%{public}d, len=%{public}d", channelId, dataSize);
1339         return SOFTBUS_MALLOC_ERR;
1340     }
1341     ret = TransRecvTdcSocketData(channelId, dataBuffer, dataSize);
1342     if (ret != SOFTBUS_OK) {
1343         SoftBusFree(dataBuffer);
1344         return ret;
1345     }
1346     SoftBusFree(dataBuffer);
1347 
1348     return TransTdcSrvProcData(module, channelId, type);
1349 }
1350