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