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 "client_trans_channel_callback.h"
17 
18 #include "client_trans_auth_manager.h"
19 #include "client_trans_proxy_manager.h"
20 #include "client_trans_session_manager.h"
21 #include "client_trans_socket_manager.h"
22 #include "client_trans_statistics.h"
23 #include "client_trans_tcp_direct_manager.h"
24 #include "client_trans_tcp_direct_callback.h"
25 #include "client_trans_udp_manager.h"
26 #include "session.h"
27 #include "softbus_errcode.h"
28 #include "trans_log.h"
29 
TransOnChannelOpened(const char * sessionName,const ChannelInfo * channel)30 int32_t TransOnChannelOpened(const char *sessionName, const ChannelInfo *channel)
31 {
32     if (sessionName == NULL || channel == NULL) {
33         TRANS_LOGW(TRANS_SDK, "[client] invalid param.");
34         return SOFTBUS_INVALID_PARAM;
35     }
36 
37     int32_t ret = SOFTBUS_NO_INIT;
38     int32_t udpPort = 0;
39     switch (channel->channelType) {
40         case CHANNEL_TYPE_AUTH:
41             ret = ClientTransAuthOnChannelOpened(sessionName, channel);
42             break;
43         case CHANNEL_TYPE_PROXY:
44             ret = ClientTransProxyOnChannelOpened(sessionName, channel);
45             break;
46         case CHANNEL_TYPE_TCP_DIRECT:
47             ret = ClientTransTdcOnChannelOpened(sessionName, channel);
48             break;
49         case CHANNEL_TYPE_UDP:
50             ret = TransOnUdpChannelOpened(sessionName, channel, &udpPort);
51             break;
52         default:
53             TRANS_LOGE(TRANS_SDK, "[client] invalid type.");
54             return SOFTBUS_TRANS_INVALID_CHANNEL_TYPE;
55     }
56 
57     AddSocketResource(sessionName, channel);
58     if (channel->channelType == CHANNEL_TYPE_UDP && channel->isServer && udpPort > 0) {
59         return udpPort;
60     }
61 
62     return ret;
63 }
64 
TransOnChannelOpenFailed(int32_t channelId,int32_t channelType,int32_t errCode)65 int32_t TransOnChannelOpenFailed(int32_t channelId, int32_t channelType, int32_t errCode)
66 {
67     TRANS_LOGE(TRANS_SDK,
68         "[client]: channelId=%{public}d, channelType=%{public}d, errCode=%{public}d",
69         channelId, channelType, errCode);
70     switch (channelType) {
71         case CHANNEL_TYPE_AUTH:
72             return ClientTransAuthOnChannelOpenFailed(channelId, errCode);
73         case CHANNEL_TYPE_PROXY:
74             return ClientTransProxyOnChannelOpenFailed(channelId, errCode);
75         case CHANNEL_TYPE_TCP_DIRECT:
76             return ClientTransTdcOnChannelOpenFailed(channelId, errCode);
77         case CHANNEL_TYPE_UDP:
78             return TransOnUdpChannelOpenFailed(channelId, errCode);
79         case CHANNEL_TYPE_UNDEFINED:
80             // channelId is sessionId
81             return GetClientSessionCb()->OnSessionOpenFailed(channelId, channelType, errCode);
82         default:
83             return SOFTBUS_TRANS_INVALID_CHANNEL_TYPE;
84     }
85 }
86 
TransOnChannelLinkDown(const char * networkId,int32_t routeType)87 int32_t TransOnChannelLinkDown(const char *networkId, int32_t routeType)
88 {
89     if (networkId == NULL) {
90         TRANS_LOGE(TRANS_SDK, "[client] network id is null.");
91         return SOFTBUS_INVALID_PARAM;
92     }
93 
94     ClientTransOnLinkDown(networkId, routeType);
95     return SOFTBUS_OK;
96 }
97 
NofifyChannelClosed(int32_t channelId,int32_t channelType,ShutdownReason reason)98 static int32_t NofifyChannelClosed(int32_t channelId, int32_t channelType, ShutdownReason reason)
99 {
100     DeleteSocketResourceByChannelId(channelId, channelType);
101     switch (channelType) {
102         case CHANNEL_TYPE_AUTH:
103             return ClientTransAuthOnChannelClosed(channelId, reason);
104         case CHANNEL_TYPE_PROXY:
105             return ClientTransProxyOnChannelClosed(channelId, reason);
106         case CHANNEL_TYPE_UDP:
107             return TransOnUdpChannelClosed(channelId, reason);
108         case CHANNEL_TYPE_TCP_DIRECT:
109             return ClientTransTdcOnSessionClosed(channelId, reason);
110         default:
111             return SOFTBUS_TRANS_INVALID_CHANNEL_TYPE;
112     }
113 }
114 
NofifyCloseAckReceived(int32_t channelId,int32_t channelType)115 static int32_t NofifyCloseAckReceived(int32_t channelId, int32_t channelType)
116 {
117     switch (channelType) {
118         case CHANNEL_TYPE_UDP:
119             return TransUdpOnCloseAckReceived(channelId);
120         case CHANNEL_TYPE_AUTH:
121         case CHANNEL_TYPE_PROXY:
122         case CHANNEL_TYPE_TCP_DIRECT:
123         default:
124             TRANS_LOGI(TRANS_SDK, "recv unsupport channelType=%{public}d", channelType);
125             return SOFTBUS_TRANS_INVALID_CHANNEL_TYPE;
126     }
127 }
128 
TransOnChannelClosed(int32_t channelId,int32_t channelType,int32_t messageType,ShutdownReason reason)129 int32_t TransOnChannelClosed(int32_t channelId, int32_t channelType, int32_t messageType, ShutdownReason reason)
130 {
131     TRANS_LOGI(TRANS_SDK,
132         "channelId=%{public}d, channelType=%{public}d, messageType=%{public}d", channelId, channelType, messageType);
133     switch (messageType) {
134         case MESSAGE_TYPE_NOMAL:
135             return NofifyChannelClosed(channelId, channelType, reason);
136         case MESSAGE_TYPE_CLOSE_ACK:
137             return NofifyCloseAckReceived(channelId, channelType);
138         default:
139             TRANS_LOGI(TRANS_SDK, "invalid messageType=%{public}d", messageType);
140             return SOFTBUS_TRANS_INVALID_MESSAGE_TYPE;
141     }
142 }
143 
TransOnChannelMsgReceived(int32_t channelId,int32_t channelType,const void * data,unsigned int len,SessionPktType type)144 int32_t TransOnChannelMsgReceived(int32_t channelId, int32_t channelType,
145     const void *data, unsigned int len, SessionPktType type)
146 {
147     if (data == NULL) {
148         TRANS_LOGE(TRANS_MSG, "param invalid");
149         return SOFTBUS_INVALID_PARAM;
150     }
151     TRANS_LOGD(TRANS_MSG,
152         "[client]: channelId=%{public}d, channelType=%{public}d", channelId, channelType);
153     switch (channelType) {
154         case CHANNEL_TYPE_AUTH:
155             return ClientTransAuthOnDataReceived(channelId, data, len, type);
156         case CHANNEL_TYPE_PROXY:
157             return ClientTransProxyOnDataReceived(channelId, data, len, type);
158         case CHANNEL_TYPE_TCP_DIRECT:
159             return ClientTransTdcOnDataReceived(channelId, data, len, type);
160         default:
161             return SOFTBUS_TRANS_INVALID_CHANNEL_TYPE;
162     }
163 }
164 
TransOnChannelQosEvent(int32_t channelId,int32_t channelType,int32_t eventId,int32_t tvCount,const QosTv * tvList)165 int32_t TransOnChannelQosEvent(int32_t channelId, int32_t channelType, int32_t eventId,
166     int32_t tvCount, const QosTv *tvList)
167 {
168     if (tvList == NULL) {
169         TRANS_LOGE(TRANS_MSG, "param invalid");
170         return SOFTBUS_INVALID_PARAM;
171     }
172     TRANS_LOGI(TRANS_QOS,
173         "[client] TransOnQosEvent: channelId=%{public}d, channelType=%{public}d, eventId=%{public}d", channelId,
174         channelType, eventId);
175     switch (channelType) {
176         case CHANNEL_TYPE_UDP:
177             return TransOnUdpChannelQosEvent(channelId, eventId, tvCount, tvList);
178         default:
179             return SOFTBUS_TRANS_INVALID_CHANNEL_TYPE;
180     }
181 }
182 
TransSetChannelInfo(const char * sessionName,int32_t sessionId,int32_t channleId,int32_t channelType)183 int32_t TransSetChannelInfo(const char* sessionName, int32_t sessionId, int32_t channleId, int32_t channelType)
184 {
185     return ClientTransSetChannelInfo(sessionName, sessionId, channleId, channelType);
186 }
187 
TransOnChannelBind(int32_t channelId,int32_t channelType)188 int32_t TransOnChannelBind(int32_t channelId, int32_t channelType)
189 {
190     TRANS_LOGI(TRANS_SDK, "channelId=%{public}d, channelType=%{public}d", channelId, channelType);
191     switch (channelType) {
192         case CHANNEL_TYPE_PROXY:
193             return ClientTransProxyOnChannelBind(channelId, channelType);
194         case CHANNEL_TYPE_TCP_DIRECT:
195             return ClientTransTdcOnChannelBind(channelId, channelType);
196         case CHANNEL_TYPE_UDP:
197             return TransOnUdpChannelBind(channelId, channelType);
198         case CHANNEL_TYPE_AUTH:
199         case CHANNEL_TYPE_UNDEFINED:
200             TRANS_LOGW(TRANS_SDK, "The channel no need OnChannelBind");
201             return SOFTBUS_OK;
202         default:
203             return SOFTBUS_TRANS_INVALID_CHANNEL_TYPE;
204     }
205     return SOFTBUS_OK;
206 }
207 
TransOnChannelOnQos(int32_t channelId,int32_t channelType,QoSEvent event,const QosTV * qos,uint32_t count)208 int32_t TransOnChannelOnQos(int32_t channelId, int32_t channelType, QoSEvent event, const QosTV *qos, uint32_t count)
209 {
210     return GetClientSessionCb()->OnQos(channelId, channelType, event, qos, count);
211 }