1 /*
2 * Copyright (c) 2022 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_wifi.h"
17
18 #include <securec.h>
19
20 #include "auth_interface.h"
21 #include "lnn_network_manager.h"
22 #include "softbus_adapter_hitrace.h"
23 #include "softbus_adapter_mem.h"
24 #include "softbus_errcode.h"
25 #include "softbus_log.h"
26 #include "softbus_socket.h"
27 #include "trans_tcp_direct_message.h"
28 #include "trans_tcp_direct_sessionconn.h"
29
30 #define ID_OFFSET (1)
31
AddTcpConnAndSessionInfo(int32_t newchannelId,int32_t fd,SessionConn * newConn,ListenerModule module)32 NO_SANITIZE("cfi") static int32_t AddTcpConnAndSessionInfo(int32_t newchannelId, int32_t fd, SessionConn *newConn,
33 ListenerModule module)
34 {
35 if (TransSrvAddDataBufNode(newchannelId, fd) != SOFTBUS_OK) {
36 SoftBusFree(newConn);
37 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenTcpDirectChannel create databuf fail");
38 return SOFTBUS_MALLOC_ERR;
39 }
40
41 if (TransTdcAddSessionConn(newConn) != SOFTBUS_OK) {
42 TransSrvDelDataBufNode(newchannelId);
43 SoftBusFree(newConn);
44 return SOFTBUS_ERR;
45 }
46 if (AddTrigger(module, newConn->appInfo.fd, WRITE_TRIGGER) != SOFTBUS_OK) {
47 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenTcpDirectChannel add trigger fail");
48 TransDelSessionConnById(newConn->channelId);
49 TransSrvDelDataBufNode(newchannelId);
50 return SOFTBUS_ERR;
51 }
52 return SOFTBUS_OK;
53 }
54
OpenTcpDirectChannel(const AppInfo * appInfo,const ConnectOption * connInfo,int32_t * channelId)55 NO_SANITIZE("cfi") int32_t OpenTcpDirectChannel(const AppInfo *appInfo, const ConnectOption *connInfo,
56 int32_t *channelId)
57 {
58 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenTcpDirectChannel");
59 if (appInfo == NULL || connInfo == NULL || channelId == NULL) {
60 return SOFTBUS_INVALID_PARAM;
61 }
62
63 ListenerModule module = connInfo->type == CONNECT_P2P_REUSE ?
64 DIRECT_CHANNEL_SERVER_P2P : DIRECT_CHANNEL_SERVER_WIFI;
65 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "%s:get listener module %d!", __func__, module);
66 if (module == DIRECT_CHANNEL_SERVER_WIFI) {
67 module = LnnGetProtocolListenerModule(connInfo->socketOption.protocol, LNN_LISTENER_MODE_DIRECT);
68 if (module == UNUSE_BUTT) {
69 return SOFTBUS_INVALID_PARAM;
70 }
71 }
72
73 SessionConn *newConn = CreateNewSessinConn(module, false);
74 if (newConn == NULL) {
75 return SOFTBUS_MALLOC_ERR;
76 }
77 SoftbusHitraceStart(SOFTBUS_HITRACE_ID_VALID, (uint64_t)(newConn->channelId + ID_OFFSET));
78 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO,
79 "SoftbusHitraceChainBegin: set chainId=[%lx].", (uint64_t)(newConn->channelId + ID_OFFSET));
80 int32_t newchannelId = newConn->channelId;
81 (void)memcpy_s(&newConn->appInfo, sizeof(AppInfo), appInfo, sizeof(AppInfo));
82
83 newConn->authId = AuthGetLatestIdByUuid(newConn->appInfo.peerData.deviceId, AUTH_LINK_TYPE_WIFI, false);
84 if ((newConn->authId == AUTH_INVALID_ID) && (connInfo->type == CONNECT_P2P_REUSE)) {
85 newConn->authId = AuthGetLatestIdByUuid(newConn->appInfo.peerData.deviceId, AUTH_LINK_TYPE_BR, false);
86 }
87
88 if (newConn->authId == AUTH_INVALID_ID) {
89 SoftBusFree(newConn);
90 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenTcpDirectChannel get authId fail");
91 return SOFTBUS_ERR;
92 }
93
94 int32_t fd = ConnOpenClientSocket(connInfo, BIND_ADDR_ALL, true);
95 if (fd < 0) {
96 SoftBusFree(newConn);
97 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "OpenTcpDirectChannel connect fail");
98 return SOFTBUS_CONN_FAIL;
99 }
100 newConn->appInfo.fd = fd;
101
102 int32_t ret = AddTcpConnAndSessionInfo(newchannelId, fd, newConn, module);
103 if (ret != SOFTBUS_OK) {
104 return ret;
105 }
106 *channelId = newchannelId;
107 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "OpenTcpDirectChannel end: channelId=%d", newchannelId);
108 return SOFTBUS_OK;
109 }
110