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 }