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