• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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