1 /*
2 * Copyright (c) 2021-2025 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_udp_manager.h"
17
18 #include <stdbool.h>
19 #include "client_trans_file.h"
20 #include "client_trans_file_listener.h"
21 #include "client_trans_socket_manager.h"
22 #include "client_trans_stream.h"
23 #include "g_enhance_sdk_func.h"
24 #include "nstackx_dfile.h"
25 #include "securec.h"
26 #include "softbus_access_token_adapter.h"
27 #include "softbus_adapter_mem.h"
28 #include "softbus_error_code.h"
29 #include "softbus_utils.h"
30 #include "trans_log.h"
31 #include "trans_pending_pkt.h"
32 #include "trans_server_proxy.h"
33
34 #define LIMIT_CHANGE_INFO_NUM 2
35
36 static SoftBusList *g_udpChannelMgr = NULL;
37 static IClientSessionCallBack *g_sessionCb = NULL;
38
ClientTransAddUdpChannel(UdpChannel * channel)39 static int32_t ClientTransAddUdpChannel(UdpChannel *channel)
40 {
41 if (g_udpChannelMgr == NULL) {
42 TRANS_LOGE(TRANS_INIT, "udp channel manager hasn't been initialized.");
43 return SOFTBUS_NO_INIT;
44 }
45
46 if (channel == NULL) {
47 TRANS_LOGW(TRANS_SDK, "invalid param.");
48 return SOFTBUS_INVALID_PARAM;
49 }
50 if (SoftBusMutexLock(&(g_udpChannelMgr->lock)) != SOFTBUS_OK) {
51 TRANS_LOGE(TRANS_SDK, "lock failed");
52 return SOFTBUS_LOCK_ERR;
53 }
54
55 UdpChannel *channelNode = NULL;
56 LIST_FOR_EACH_ENTRY(channelNode, &(g_udpChannelMgr->list), UdpChannel, node) {
57 if (channelNode->channelId == channel->channelId) {
58 TRANS_LOGE(TRANS_SDK, "udp channel has exited. channelId=%{public}d.", channel->channelId);
59 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
60 return SOFTBUS_TRANS_UDP_CHANNEL_ALREADY_EXIST;
61 }
62 }
63 ListInit(&(channel->node));
64 ListAdd(&(g_udpChannelMgr->list), &(channel->node));
65 TRANS_LOGI(TRANS_SDK, "add channelId=%{public}d", channel->channelId);
66 g_udpChannelMgr->cnt++;
67
68 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
69 return SOFTBUS_OK;
70 }
71
TransDeleteUdpChannel(int32_t channelId)72 int32_t TransDeleteUdpChannel(int32_t channelId)
73 {
74 if (g_udpChannelMgr == NULL) {
75 TRANS_LOGE(TRANS_INIT, "udp channel manager hasn't init.");
76 return SOFTBUS_NO_INIT;
77 }
78 if (SoftBusMutexLock(&(g_udpChannelMgr->lock)) != SOFTBUS_OK) {
79 TRANS_LOGE(TRANS_SDK, "lock failed");
80 return SOFTBUS_LOCK_ERR;
81 }
82
83 UdpChannel *channelNode = NULL;
84 LIST_FOR_EACH_ENTRY(channelNode, &(g_udpChannelMgr->list), UdpChannel, node) {
85 if (channelNode->channelId == channelId) {
86 ListDelete(&(channelNode->node));
87 TRANS_LOGI(TRANS_SDK, "delete channelId=%{public}d", channelId);
88 SoftBusFree(channelNode);
89 g_udpChannelMgr->cnt--;
90 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
91 return SOFTBUS_OK;
92 }
93 }
94 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
95 TRANS_LOGE(TRANS_SDK, "udp channel not found, channelId=%{public}d.", channelId);
96 return SOFTBUS_TRANS_UDP_CHANNEL_NOT_FOUND;
97 }
98
TransGetUdpChannel(int32_t channelId,UdpChannel * channel)99 int32_t TransGetUdpChannel(int32_t channelId, UdpChannel *channel)
100 {
101 if (g_udpChannelMgr == NULL) {
102 TRANS_LOGE(TRANS_INIT, "udp channel manager hasn't init.");
103 return SOFTBUS_NO_INIT;
104 }
105 if (channel == NULL) {
106 TRANS_LOGE(TRANS_INIT, "param invalid");
107 return SOFTBUS_INVALID_PARAM;
108 }
109 if (SoftBusMutexLock(&(g_udpChannelMgr->lock)) != SOFTBUS_OK) {
110 TRANS_LOGE(TRANS_SDK, "lock failed");
111 return SOFTBUS_LOCK_ERR;
112 }
113
114 UdpChannel *channelNode = NULL;
115 LIST_FOR_EACH_ENTRY(channelNode, &(g_udpChannelMgr->list), UdpChannel, node) {
116 if (channelNode->channelId == channelId) {
117 if (memcpy_s(channel, sizeof(UdpChannel), channelNode, sizeof(UdpChannel)) != EOK) {
118 TRANS_LOGE(TRANS_SDK, "get udp channel memcpy_s failed.");
119 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
120 return SOFTBUS_MEM_ERR;
121 }
122 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
123 return SOFTBUS_OK;
124 }
125 }
126 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
127 TRANS_LOGE(TRANS_SDK, "udp channel not found, channelId=%{public}d.", channelId);
128 return SOFTBUS_TRANS_UDP_CHANNEL_NOT_FOUND;
129 }
130
TransSetUdpChannelEnable(int32_t channelId,bool isEnable)131 static int32_t TransSetUdpChannelEnable(int32_t channelId, bool isEnable)
132 {
133 if (g_udpChannelMgr == NULL) {
134 TRANS_LOGE(TRANS_SDK, "udp channel manager hasn't init.");
135 return SOFTBUS_NO_INIT;
136 }
137
138 if (SoftBusMutexLock(&(g_udpChannelMgr->lock)) != SOFTBUS_OK) {
139 TRANS_LOGE(TRANS_SDK, "lock failed");
140 return SOFTBUS_LOCK_ERR;
141 }
142
143 UdpChannel *channelNode = NULL;
144 LIST_FOR_EACH_ENTRY(channelNode, &(g_udpChannelMgr->list), UdpChannel, node) {
145 if (channelNode->channelId == channelId) {
146 channelNode->isEnable = isEnable;
147 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
148 return SOFTBUS_OK;
149 }
150 }
151 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
152 TRANS_LOGE(TRANS_SDK, "udp channel not found, channelId=%{public}d.", channelId);
153 return SOFTBUS_TRANS_UDP_CHANNEL_NOT_FOUND;
154 }
155
OnUdpChannelOpened(int32_t channelId,SocketAccessInfo * accessInfo)156 static int32_t OnUdpChannelOpened(int32_t channelId, SocketAccessInfo *accessInfo)
157 {
158 UdpChannel channel;
159 if (memset_s(&channel, sizeof(UdpChannel), 0, sizeof(UdpChannel)) != EOK) {
160 TRANS_LOGE(TRANS_SDK, "on udp channel opened memset failed.");
161 return SOFTBUS_MEM_ERR;
162 }
163 int32_t ret = TransGetUdpChannel(channelId, &channel);
164 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, SOFTBUS_TRANS_UDP_GET_CHANNEL_FAILED, TRANS_SDK,
165 "get udp failed. channelId=%{public}d, ret=%{public}d", channelId, ret);
166 ret = TransSetUdpChannelEnable(channelId, true);
167 if (ret != SOFTBUS_OK) {
168 TRANS_LOGE(TRANS_SDK, "set udp enable failed. channelId=%{public}d, ret=%{public}d", channelId, ret);
169 return SOFTBUS_TRANS_UDP_SET_CHANNEL_FAILED;
170 }
171 SessionType type = TYPE_BUTT;
172 switch (channel.businessType) {
173 case BUSINESS_TYPE_STREAM:
174 type = TYPE_STREAM;
175 break;
176 case BUSINESS_TYPE_FILE:
177 type = TYPE_FILE;
178 break;
179 default:
180 TRANS_LOGE(TRANS_SDK, "unsupport businessType=%{public}d.", channel.businessType);
181 return SOFTBUS_TRANS_BUSINESS_TYPE_NOT_MATCH;
182 }
183 ChannelInfo info = { 0 };
184 info.channelId = channel.channelId;
185 info.channelType = CHANNEL_TYPE_UDP;
186 info.isServer = channel.info.isServer;
187 info.peerPid = channel.info.peerPid;
188 info.peerUid = channel.info.peerUid;
189 info.groupId = channel.info.groupId;
190 info.peerDeviceId = channel.info.peerDeviceId;
191 info.peerSessionName = channel.info.peerSessionName;
192 info.routeType = channel.routeType;
193 info.businessType = channel.businessType;
194 info.tokenType = channel.tokenType;
195 if (channel.tokenType > ACCESS_TOKEN_TYPE_HAP && channel.info.isServer) {
196 info.peerUserId = channel.peerUserId;
197 info.peerTokenId = channel.peerTokenId;
198 info.peerBusinessAccountId = channel.peerAccountId;
199 info.peerExtraAccessInfo = channel.extraAccessInfo;
200 }
201 if ((g_sessionCb != NULL) && (g_sessionCb->OnSessionOpened != NULL)) {
202 return g_sessionCb->OnSessionOpened(channel.info.mySessionName, &info, type, accessInfo);
203 }
204 return SOFTBUS_NO_INIT;
205 }
206
ConvertChannelInfoToUdpChannel(const char * sessionName,const ChannelInfo * channel)207 static UdpChannel *ConvertChannelInfoToUdpChannel(const char *sessionName, const ChannelInfo *channel)
208 {
209 UdpChannel *newChannel = (UdpChannel *)SoftBusCalloc(sizeof(UdpChannel));
210 if (newChannel == NULL) {
211 TRANS_LOGE(TRANS_SDK, "new udp channel failed.");
212 return NULL;
213 }
214 newChannel->businessType = channel->businessType;
215 newChannel->channelId = channel->channelId;
216 newChannel->dfileId = -1;
217 newChannel->isEnable = false;
218 newChannel->info.isServer = channel->isServer;
219 newChannel->info.peerPid = channel->peerPid;
220 newChannel->info.peerUid = channel->peerUid;
221 newChannel->routeType = channel->routeType;
222 newChannel->tokenType = channel->tokenType;
223 if (strcpy_s(newChannel->info.peerSessionName, SESSION_NAME_SIZE_MAX, channel->peerSessionName) != EOK ||
224 strcpy_s(newChannel->info.mySessionName, SESSION_NAME_SIZE_MAX, sessionName) != EOK ||
225 strcpy_s(newChannel->info.peerDeviceId, DEVICE_ID_SIZE_MAX, channel->peerDeviceId) != EOK ||
226 strcpy_s(newChannel->info.groupId, GROUP_ID_SIZE_MAX, channel->groupId) != EOK ||
227 strcpy_s(newChannel->info.myIp, sizeof(newChannel->info.myIp), channel->myIp) != EOK) {
228 TRANS_LOGE(TRANS_SDK, "udp channel or peer session name, device id, group id, myIp failed");
229 SoftBusFree(newChannel);
230 return NULL;
231 }
232 if (channel->tokenType > ACCESS_TOKEN_TYPE_HAP && channel->isServer) {
233 newChannel->peerUserId = channel->peerUserId;
234 newChannel->peerTokenId = channel->peerTokenId;
235 if (channel->peerBusinessAccountId != NULL &&
236 strcpy_s(newChannel->peerAccountId, ACCOUNT_UID_LEN_MAX, channel->peerBusinessAccountId) != EOK) {
237 TRANS_LOGE(TRANS_SDK, "copy peerAccountId failed");
238 SoftBusFree(newChannel);
239 return NULL;
240 }
241 if (channel->peerExtraAccessInfo != NULL &&
242 strcpy_s(newChannel->extraAccessInfo, EXTRA_ACCESS_INFO_LEN_MAX, channel->peerExtraAccessInfo) != EOK) {
243 TRANS_LOGE(TRANS_SDK, "copy extraAccessInfo failed");
244 SoftBusFree(newChannel);
245 return NULL;
246 }
247 }
248 return newChannel;
249 }
250
TransSetdFileIdByChannelId(int32_t channelId,int32_t value)251 static int32_t TransSetdFileIdByChannelId(int32_t channelId, int32_t value)
252 {
253 if (g_udpChannelMgr == NULL) {
254 TRANS_LOGE(TRANS_SDK, "udp channel manager hasn't init.");
255 return SOFTBUS_NO_INIT;
256 }
257
258 if (SoftBusMutexLock(&(g_udpChannelMgr->lock)) != SOFTBUS_OK) {
259 TRANS_LOGE(TRANS_SDK, "lock failed");
260 return SOFTBUS_LOCK_ERR;
261 }
262
263 UdpChannel *channelNode = NULL;
264 LIST_FOR_EACH_ENTRY(channelNode, &(g_udpChannelMgr->list), UdpChannel, node) {
265 if (channelNode->channelId == channelId) {
266 channelNode->dfileId = value;
267 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
268 return SOFTBUS_OK;
269 }
270 }
271 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
272 TRANS_LOGE(TRANS_SDK, "udp channel not found, channelId=%{public}d.", channelId);
273 return SOFTBUS_TRANS_UDP_CHANNEL_NOT_FOUND;
274 }
275
TransOnUdpChannelOpened(const char * sessionName,const ChannelInfo * channel,int32_t * udpPort,SocketAccessInfo * accessInfo)276 int32_t TransOnUdpChannelOpened(
277 const char *sessionName, const ChannelInfo *channel, int32_t *udpPort, SocketAccessInfo *accessInfo)
278 {
279 TRANS_LOGD(TRANS_SDK, "TransOnUdpChannelOpened enter");
280 if (channel == NULL || udpPort == NULL || sessionName == NULL || accessInfo == NULL) {
281 TRANS_LOGW(TRANS_SDK, "invalid param.");
282 return SOFTBUS_INVALID_PARAM;
283 }
284 UdpChannel *newChannel = ConvertChannelInfoToUdpChannel(sessionName, channel);
285 if (newChannel == NULL) {
286 TRANS_LOGE(TRANS_SDK, "convert channel info to udp channel failed.");
287 return SOFTBUS_MEM_ERR;
288 }
289 if (ClientTransAddUdpChannel(newChannel) != SOFTBUS_OK) {
290 TRANS_LOGE(TRANS_SDK, "add udp channel failed.");
291 SoftBusFree(newChannel);
292 return SOFTBUS_TRANS_UDP_CLIENT_ADD_CHANNEL_FAILED;
293 }
294 TRANS_LOGI(TRANS_SDK, "add new udp channel success, channelId=%{public}d, businessType=%{public}d",
295 channel->channelId, channel->businessType);
296
297 int32_t ret = SOFTBUS_TRANS_BUSINESS_TYPE_NOT_MATCH;
298 switch (channel->businessType) {
299 case BUSINESS_TYPE_STREAM:
300 ret = TransOnstreamChannelOpened(channel, udpPort, accessInfo);
301 if (ret != SOFTBUS_OK) {
302 (void)TransDeleteUdpChannel(channel->channelId);
303 TRANS_LOGE(TRANS_SDK, "on stream channel opened failed.");
304 }
305 break;
306 case BUSINESS_TYPE_FILE:
307 ret = TransOnFileChannelOpened(sessionName, channel, udpPort, accessInfo);
308 if (ret < SOFTBUS_OK) {
309 (void)TransDeleteUdpChannel(channel->channelId);
310 TRANS_LOGE(TRANS_SDK, "on file channel open failed.");
311 return ret;
312 }
313 ret = TransSetdFileIdByChannelId(channel->channelId, ret);
314 if (ret != SOFTBUS_OK) {
315 TRANS_LOGE(TRANS_SDK, "set dfileId failed, ret = %{public}d", ret);
316 return ret;
317 }
318 ret = SOFTBUS_OK;
319 break;
320 default:
321 (void)TransDeleteUdpChannel(channel->channelId);
322 TRANS_LOGE(TRANS_SDK, "unsupport businessType=%{public}d.", channel->businessType);
323 break;
324 }
325 return ret;
326 }
327
TransDeleteBusinnessChannel(UdpChannel * channel)328 static int32_t TransDeleteBusinnessChannel(UdpChannel *channel)
329 {
330 switch (channel->businessType) {
331 case BUSINESS_TYPE_STREAM:
332 if (TransCloseStreamChannel(channel->channelId) != SOFTBUS_OK) {
333 TRANS_LOGE(TRANS_SDK, "trans close udp channel failed.");
334 return SOFTBUS_TRANS_CLOSE_UDP_CHANNEL_FAILED;
335 }
336 break;
337 case BUSINESS_TYPE_FILE:
338 TransCloseFileChannel(channel->dfileId);
339 break;
340 default:
341 TRANS_LOGE(TRANS_SDK, "unsupport businessType=%{public}d.", channel->businessType);
342 return SOFTBUS_TRANS_BUSINESS_TYPE_NOT_MATCH;
343 }
344 return SOFTBUS_OK;
345 }
346
TransOnUdpChannelOpenFailed(int32_t channelId,int32_t errCode)347 int32_t TransOnUdpChannelOpenFailed(int32_t channelId, int32_t errCode)
348 {
349 UdpChannel channel;
350 bool isFind = true;
351 if (TransGetUdpChannel(channelId, &channel) != SOFTBUS_OK) {
352 TRANS_LOGE(TRANS_SDK, "get udp channel by channelId=%{public}d failed.", channelId);
353 isFind = false;
354 }
355 if (TransDeleteUdpChannel(channelId) != SOFTBUS_OK) {
356 TRANS_LOGE(TRANS_SDK, "del channelId failed. channelId=%{public}d", channelId);
357 }
358 if ((isFind) && (channel.isEnable)) {
359 int32_t ret = TransDeleteBusinnessChannel(&channel);
360 if (ret != SOFTBUS_OK) {
361 TRANS_LOGE(TRANS_SDK, "del business channel failed. channelId=%{public}d", channelId);
362 return ret;
363 }
364 }
365 if ((g_sessionCb == NULL) || (g_sessionCb->OnSessionOpenFailed == NULL)) {
366 TRANS_LOGE(TRANS_SDK, "client trans udp manager seesion callback is null");
367 return SOFTBUS_NO_INIT;
368 }
369
370 return g_sessionCb->OnSessionOpenFailed(channelId, CHANNEL_TYPE_UDP, errCode);
371 }
372
TransOnUdpChannelBind(int32_t channelId,int32_t channelType)373 int32_t TransOnUdpChannelBind(int32_t channelId, int32_t channelType)
374 {
375 if ((g_sessionCb == NULL) || (g_sessionCb->OnChannelBind == NULL)) {
376 TRANS_LOGE(TRANS_SDK, "client trans udp manager OnChannelBind is null channelId=%{public}d", channelId);
377 return SOFTBUS_NO_INIT;
378 }
379
380 int32_t ret = g_sessionCb->OnChannelBind(channelId, CHANNEL_TYPE_UDP);
381 if (ret == SOFTBUS_NOT_NEED_UPDATE) {
382 ret = SOFTBUS_OK;
383 }
384 return ret;
385 }
386
ClosePeerUdpChannel(int32_t channelId)387 static int32_t ClosePeerUdpChannel(int32_t channelId)
388 {
389 return ServerIpcCloseChannel(NULL, channelId, CHANNEL_TYPE_UDP);
390 }
391
RleaseUdpResources(int32_t channelId)392 static int32_t RleaseUdpResources(int32_t channelId)
393 {
394 return ServerIpcReleaseResources(channelId);
395 }
396
NotifyCallback(UdpChannel * channel,int32_t channelId,ShutdownReason reason)397 static void NotifyCallback(UdpChannel *channel, int32_t channelId, ShutdownReason reason)
398 {
399 if (channel != NULL && (!channel->isEnable) && g_sessionCb != NULL && g_sessionCb->OnSessionOpenFailed != NULL) {
400 SessionState sessionState = SESSION_STATE_INIT;
401 if (ClientGetSessionStateByChannelId(channelId, CHANNEL_TYPE_UDP, &sessionState) == SOFTBUS_OK &&
402 (sessionState == SESSION_STATE_OPENED || sessionState == SESSION_STATE_CALLBACK_FINISHED)) {
403 if (ClosePeerUdpChannel(channelId) != SOFTBUS_OK) {
404 TRANS_LOGW(TRANS_SDK, "trans close peer udp channel failed. channelId=%{public}d", channelId);
405 }
406 }
407 g_sessionCb->OnSessionOpenFailed(channelId, CHANNEL_TYPE_UDP, SOFTBUS_TRANS_STOP_BIND_BY_TIMEOUT);
408 return;
409 }
410 if (g_sessionCb != NULL && g_sessionCb->OnSessionClosed != NULL) {
411 g_sessionCb->OnSessionClosed(channelId, CHANNEL_TYPE_UDP, reason);
412 return;
413 }
414 }
415
CloseUdpChannelProc(UdpChannel * channel,int32_t channelId,ShutdownReason reason)416 static int32_t CloseUdpChannelProc(UdpChannel *channel, int32_t channelId, ShutdownReason reason)
417 {
418 int32_t ret;
419 if (channel != NULL) {
420 int32_t sessionId = channel->sessionId;
421 (void)ClientSetStatusClosingBySocket(sessionId, true);
422 }
423 if (TransDeleteUdpChannel(channelId) != SOFTBUS_OK) {
424 TRANS_LOGW(TRANS_SDK, "trans del udp channel failed. channelId=%{public}d", channelId);
425 }
426 switch (reason) {
427 case SHUTDOWN_REASON_PEER:
428 break;
429 case SHUTDOWN_REASON_SEND_FILE_ERR:
430 case SHUTDOWN_REASON_RECV_FILE_ERR:
431 if (RleaseUdpResources(channelId) != SOFTBUS_OK) {
432 TRANS_LOGW(TRANS_SDK, "trans release udp resources failed. channelId=%{public}d", channelId);
433 }
434 break;
435 case SHUTDOWN_REASON_LOCAL:
436 if (ClosePeerUdpChannel(channelId) != SOFTBUS_OK) {
437 TRANS_LOGW(TRANS_SDK, "trans close peer udp channel failed. channelId=%{public}d", channelId);
438 }
439 break;
440 default:
441 TRANS_LOGW(TRANS_SDK, "there's no reson to match. channelId=%{public}d, reason=%{public}d",
442 channelId, (int32_t)reason);
443 break;
444 }
445
446 if (channel != NULL) {
447 ret = TransDeleteBusinnessChannel(channel);
448 if (ret != SOFTBUS_OK) {
449 TRANS_LOGE(TRANS_SDK, "del business channel failed. channelId=%{public}d", channelId);
450 return ret;
451 }
452 }
453
454 if (reason != SHUTDOWN_REASON_LOCAL) {
455 NotifyCallback(channel, channelId, reason);
456 }
457 return SOFTBUS_OK;
458 }
459
CloseUdpChannel(int32_t channelId,ShutdownReason reason)460 static int32_t CloseUdpChannel(int32_t channelId, ShutdownReason reason)
461 {
462 UdpChannel channel;
463 (void)memset_s(&channel, sizeof(UdpChannel), 0, sizeof(UdpChannel));
464 TRANS_LOGI(TRANS_SDK, "close udp channelId=%{public}d, reason=%{public}d", channelId, reason);
465 if (TransGetUdpChannel(channelId, &channel) != SOFTBUS_OK) {
466 TRANS_LOGE(TRANS_SDK, "get udp channel by channelId=%{public}d failed.", channelId);
467 CloseUdpChannelProc(NULL, channelId, reason);
468 return SOFTBUS_TRANS_UDP_GET_CHANNEL_FAILED;
469 }
470 if (channel.businessType == BUSINESS_TYPE_FILE) {
471 TRANS_LOGD(TRANS_SDK, "close udp channel get file list start");
472 int32_t ret = NSTACKX_DFileSessionGetFileList(channel.dfileId);
473 if (ret != SOFTBUS_OK) {
474 TRANS_LOGE(TRANS_SDK, "close udp channel to get file list failed. channelId=%{public}d, ret=%{public}d",
475 channelId, ret);
476 }
477 }
478 return CloseUdpChannelProc(&channel, channelId, reason);
479 }
480
TransOnUdpChannelClosed(int32_t channelId,ShutdownReason reason)481 int32_t TransOnUdpChannelClosed(int32_t channelId, ShutdownReason reason)
482 {
483 return CloseUdpChannel(channelId, reason);
484 }
485
TransOnUdpChannelQosEvent(int32_t channelId,int32_t eventId,int32_t tvCount,const QosTv * tvList)486 int32_t TransOnUdpChannelQosEvent(int32_t channelId, int32_t eventId, int32_t tvCount, const QosTv *tvList)
487 {
488 UdpChannel channel;
489 (void)memset_s(&channel, sizeof(UdpChannel), 0, sizeof(UdpChannel));
490 if (TransGetUdpChannel(channelId, &channel) != SOFTBUS_OK) {
491 TRANS_LOGE(TRANS_QOS, "get channel by channelId=%{public}d failed.", channelId);
492 return SOFTBUS_TRANS_UDP_GET_CHANNEL_FAILED;
493 }
494 if (g_sessionCb->OnQosEvent != NULL) {
495 g_sessionCb->OnQosEvent(channelId, CHANNEL_TYPE_UDP, eventId, tvCount, tvList);
496 }
497 return SOFTBUS_OK;
498 }
499
ClientTransCloseUdpChannel(int32_t channelId,ShutdownReason reason)500 int32_t ClientTransCloseUdpChannel(int32_t channelId, ShutdownReason reason)
501 {
502 int32_t ret = AddPendingPacket(channelId, 0, PENDING_TYPE_UDP);
503 if (ret != SOFTBUS_OK) {
504 TRANS_LOGE(TRANS_SDK, "add pending packet failed, channelId=%{public}d.", channelId);
505 return ret;
506 }
507 ret = CloseUdpChannel(channelId, reason);
508 if (ret != SOFTBUS_OK) {
509 DelPendingPacketbyChannelId(channelId, 0, PENDING_TYPE_UDP);
510 TRANS_LOGE(TRANS_SDK, "close udp channel failed, ret=%{public}d", ret);
511 return ret;
512 }
513 ret = ProcPendingPacket(channelId, 0, PENDING_TYPE_UDP);
514 DelSessionStateClosing();
515 return ret;
516 }
517
TransUdpChannelSendStream(int32_t channelId,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)518 int32_t TransUdpChannelSendStream(int32_t channelId, const StreamData *data, const StreamData *ext,
519 const StreamFrameInfo *param)
520 {
521 UdpChannel channel;
522 (void)memset_s(&channel, sizeof(UdpChannel), 0, sizeof(UdpChannel));
523 if (TransGetUdpChannel(channelId, &channel) != SOFTBUS_OK) {
524 TRANS_LOGE(TRANS_STREAM, "get channel by channelId=%{public}d failed.", channelId);
525 return SOFTBUS_TRANS_UDP_GET_CHANNEL_FAILED;
526 }
527 if (!channel.isEnable) {
528 TRANS_LOGE(TRANS_STREAM, "udp channel is not enable channelId=%{public}d.", channelId);
529 return SOFTBUS_TRANS_UDP_CHANNEL_DISABLE;
530 }
531 return TransSendStream(channelId, data, ext, param);
532 }
533
TransUdpChannelSetStreamMultiLayer(int32_t channelId,const void * optValue)534 int32_t TransUdpChannelSetStreamMultiLayer(int32_t channelId, const void *optValue)
535 {
536 UdpChannel channel;
537 (void)memset_s(&channel, sizeof(UdpChannel), 0, sizeof(UdpChannel));
538 if (TransGetUdpChannel(channelId, &channel) != SOFTBUS_OK) {
539 TRANS_LOGE(TRANS_STREAM, "get channel by channelId=%{public}d failed.", channelId);
540 return SOFTBUS_TRANS_UDP_GET_CHANNEL_FAILED;
541 }
542 if (!channel.isEnable) {
543 TRANS_LOGE(TRANS_STREAM, "udp channel %{public}d is not enable.", channelId);
544 return SOFTBUS_TRANS_UDP_CHANNEL_DISABLE;
545 }
546 return TransSetStreamMultiLayer(channelId, optValue);
547 }
548
OnUdpChannelClosed(int32_t channelId,ShutdownReason reason)549 static void OnUdpChannelClosed(int32_t channelId, ShutdownReason reason)
550 {
551 if ((g_sessionCb == NULL) || (g_sessionCb->OnSessionClosed == NULL)) {
552 return;
553 }
554 g_sessionCb->OnSessionClosed(channelId, CHANNEL_TYPE_UDP, reason);
555 if (TransDeleteUdpChannel(channelId) != SOFTBUS_OK) {
556 TRANS_LOGE(TRANS_SDK, "trans delete udp channel failed. channelId=%{public}d", channelId);
557 }
558 }
559
OnStreamReceived(int32_t channelId,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)560 static void OnStreamReceived(int32_t channelId, const StreamData *data, const StreamData *ext,
561 const StreamFrameInfo *param)
562 {
563 if ((g_sessionCb == NULL) || (g_sessionCb->OnStreamReceived == NULL)) {
564 return;
565 }
566 g_sessionCb->OnStreamReceived(channelId, CHANNEL_TYPE_UDP, data, ext, param);
567 }
568
OnFileGetSessionId(int32_t channelId,int32_t * sessionId)569 static int32_t OnFileGetSessionId(int32_t channelId, int32_t *sessionId)
570 {
571 if ((g_sessionCb == NULL) || (g_sessionCb->OnGetSessionId == NULL)) {
572 return SOFTBUS_INVALID_PARAM;
573 }
574 return g_sessionCb->OnGetSessionId(channelId, CHANNEL_TYPE_UDP, sessionId, false);
575 }
576
OnQosEvent(int channelId,int eventId,int tvCount,const QosTv * tvList)577 static void OnQosEvent(int channelId, int eventId, int tvCount, const QosTv *tvList)
578 {
579 if ((g_sessionCb == NULL) || (g_sessionCb->OnQosEvent == NULL)) {
580 return;
581 }
582 g_sessionCb->OnQosEvent(channelId, CHANNEL_TYPE_UDP, eventId, tvCount, tvList);
583 }
584
OnIdleTimeoutReset(int32_t sessionId)585 static int32_t OnIdleTimeoutReset(int32_t sessionId)
586 {
587 if ((g_sessionCb == NULL) || (g_sessionCb->OnIdleTimeoutReset == NULL)) {
588 return SOFTBUS_INVALID_PARAM;
589 }
590 return g_sessionCb->OnIdleTimeoutReset(sessionId);
591 }
592
OnRawStreamEncryptOptGet(int32_t sessionId,int32_t channelId,bool * isEncrypt)593 static int32_t OnRawStreamEncryptOptGet(int32_t sessionId, int32_t channelId, bool *isEncrypt)
594 {
595 if (channelId < 0 || isEncrypt == NULL) {
596 TRANS_LOGE(TRANS_SDK, "invalid param");
597 return SOFTBUS_INVALID_PARAM;
598 }
599
600 if (g_sessionCb == NULL) {
601 TRANS_LOGE(TRANS_SDK, "session callback is null");
602 return SOFTBUS_NO_INIT;
603 }
604
605 if (g_sessionCb->OnRawStreamEncryptOptGet == NULL) {
606 TRANS_LOGE(TRANS_SDK, "OnRawStreamEncryptOptGet of session callback is null");
607 return SOFTBUS_NO_INIT;
608 }
609
610 UdpChannel channel;
611 if (memset_s(&channel, sizeof(UdpChannel), 0, sizeof(UdpChannel)) != EOK) {
612 TRANS_LOGE(TRANS_SDK, "on udp channel opened memset failed.");
613 return SOFTBUS_MEM_ERR;
614 }
615 int32_t ret = TransGetUdpChannel(channelId, &channel);
616 if (ret != SOFTBUS_OK) {
617 TRANS_LOGE(TRANS_SDK, "get udpChannel failed. channelId=%{public}d", channelId);
618 return ret;
619 }
620
621 if (channel.info.isServer) {
622 return g_sessionCb->OnRawStreamEncryptDefOptGet(channel.info.mySessionName, isEncrypt);
623 } else {
624 return g_sessionCb->OnRawStreamEncryptOptGet(sessionId, channel.channelId, CHANNEL_TYPE_UDP, isEncrypt);
625 }
626 }
627
628 static UdpChannelMgrCb g_udpChannelCb = {
629 .OnStreamReceived = OnStreamReceived,
630 .OnFileGetSessionId = OnFileGetSessionId,
631 .OnMessageReceived = NULL,
632 .OnUdpChannelOpened = OnUdpChannelOpened,
633 .OnUdpChannelClosed = OnUdpChannelClosed,
634 .OnQosEvent = OnQosEvent,
635 .OnIdleTimeoutReset = OnIdleTimeoutReset,
636 .OnRawStreamEncryptOptGet = OnRawStreamEncryptOptGet,
637 };
638
ClientCheckFuncPointer(void * func)639 static int32_t ClientCheckFuncPointer(void *func)
640 {
641 if (func == NULL) {
642 TRANS_LOGE(TRANS_INIT, "enhance func not register");
643 return SOFTBUS_FUNC_NOT_REGISTER;
644 }
645 return SOFTBUS_OK;
646 }
647
TransFileSchemaInitPacked(void)648 static int32_t TransFileSchemaInitPacked(void)
649 {
650 ClientEnhanceFuncList *pfnClientEnhanceFuncList = ClientEnhanceFuncListGet();
651 if (ClientCheckFuncPointer((void *)pfnClientEnhanceFuncList->transFileSchemaInit) != SOFTBUS_OK) {
652 return SOFTBUS_NOT_IMPLEMENT;
653 }
654 return pfnClientEnhanceFuncList->transFileSchemaInit();
655 }
656
ClientTransUdpMgrInit(IClientSessionCallBack * callback)657 int32_t ClientTransUdpMgrInit(IClientSessionCallBack *callback)
658 {
659 if (g_udpChannelMgr != NULL) {
660 TRANS_LOGE(TRANS_INIT, "udp channel info manager has init.");
661 return SOFTBUS_OK;
662 }
663 if (callback == NULL) {
664 TRANS_LOGE(TRANS_INIT, "udp channel info manager init failed, calback is null.");
665 return SOFTBUS_INVALID_PARAM;
666 }
667 g_sessionCb = callback;
668 RegisterStreamCb(&g_udpChannelCb);
669 (void)TransFileInit();
670 (void)TransFileSchemaInitPacked();
671 if (PendingInit(PENDING_TYPE_UDP) != SOFTBUS_OK) {
672 TRANS_LOGE(TRANS_INIT, "trans udp pending init failed.");
673 return SOFTBUS_TRANS_SERVER_INIT_FAILED;
674 }
675 NSTACKX_DFileRegisterLogCallback(NstackxLogInnerImpl);
676 RegisterFileCb(&g_udpChannelCb);
677 g_udpChannelMgr = CreateSoftBusList();
678 if (g_udpChannelMgr == NULL) {
679 TRANS_LOGE(TRANS_INIT, "create udp channel manager list failed.");
680 return SOFTBUS_MALLOC_ERR;
681 }
682 TRANS_LOGI(TRANS_INIT, "trans udp channel manager init success.");
683 return SOFTBUS_OK;
684 }
685
TransFileSchemaDeinitPacked(void)686 static void TransFileSchemaDeinitPacked(void)
687 {
688 ClientEnhanceFuncList *pfnClientEnhanceFuncList = ClientEnhanceFuncListGet();
689 if (ClientCheckFuncPointer((void *)pfnClientEnhanceFuncList->transFileSchemaDeinit) != SOFTBUS_OK) {
690 return;
691 }
692 return pfnClientEnhanceFuncList->transFileSchemaDeinit();
693 }
694
ClientTransUdpMgrDeinit(void)695 void ClientTransUdpMgrDeinit(void)
696 {
697 if (g_udpChannelMgr == NULL) {
698 return;
699 }
700 UnregisterStreamCb();
701 RegisterFileCb(NULL);
702 if (SoftBusMutexLock(&g_udpChannelMgr->lock) != SOFTBUS_OK) {
703 TRANS_LOGE(TRANS_INIT, "lock failed");
704 return;
705 }
706 UdpChannel *channel = NULL;
707 UdpChannel *nextChannel = NULL;
708 LIST_FOR_EACH_ENTRY_SAFE(channel, nextChannel, &g_udpChannelMgr->list, UdpChannel, node) {
709 ListDelete(&(channel->node));
710 SoftBusFree(channel);
711 }
712 (void)SoftBusMutexUnlock(&g_udpChannelMgr->lock);
713 DestroySoftBusList(g_udpChannelMgr);
714 g_udpChannelMgr = NULL;
715 TransFileDeinit();
716 TransFileSchemaDeinitPacked();
717 PendingDeinit(PENDING_TYPE_UDP);
718 TRANS_LOGI(TRANS_INIT, "trans udp channel manager deinit success.");
719 }
720
TransUdpChannelSendFile(int32_t channelId,const char * sFileList[],const char * dFileList[],uint32_t fileCnt)721 int32_t TransUdpChannelSendFile(int32_t channelId, const char *sFileList[], const char *dFileList[], uint32_t fileCnt)
722 {
723 UdpChannel channel;
724 if (memset_s(&channel, sizeof(UdpChannel), 0, sizeof(UdpChannel)) != EOK) {
725 TRANS_LOGE(TRANS_FILE, "memset failed.");
726 return SOFTBUS_MEM_ERR;
727 }
728 if (TransGetUdpChannel(channelId, &channel) != SOFTBUS_OK) {
729 return SOFTBUS_TRANS_UDP_GET_CHANNEL_FAILED;
730 }
731 if (!channel.isEnable || channel.dfileId < 0) {
732 TRANS_LOGE(TRANS_FILE, "udp channel is not enable.");
733 return SOFTBUS_TRANS_UDP_CHANNEL_DISABLE;
734 }
735 return TransSendFile(channel.dfileId, sFileList, dFileList, fileCnt);
736 }
737
TransGetUdpChannelByFileId(int32_t dfileId,UdpChannel * udpChannel)738 int32_t TransGetUdpChannelByFileId(int32_t dfileId, UdpChannel *udpChannel)
739 {
740 if (g_udpChannelMgr == NULL) {
741 TRANS_LOGE(TRANS_INIT, "udp channel manager hasn't init.");
742 return SOFTBUS_NO_INIT;
743 }
744
745 if (SoftBusMutexLock(&(g_udpChannelMgr->lock)) != SOFTBUS_OK) {
746 TRANS_LOGE(TRANS_FILE, "lock failed");
747 return SOFTBUS_LOCK_ERR;
748 }
749
750 UdpChannel *channelNode = NULL;
751 LIST_FOR_EACH_ENTRY(channelNode, &(g_udpChannelMgr->list), UdpChannel, node) {
752 if (channelNode->dfileId == dfileId) {
753 if (memcpy_s(udpChannel, sizeof(UdpChannel), channelNode, sizeof(UdpChannel)) != EOK) {
754 TRANS_LOGE(TRANS_FILE, "memcpy_s failed.");
755 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
756 return SOFTBUS_MEM_ERR;
757 }
758 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
759 return SOFTBUS_OK;
760 }
761 }
762 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
763 return SOFTBUS_TRANS_UDP_CHANNEL_NOT_FOUND;
764 }
765
TransUdpDeleteFileListener(const char * sessionName)766 void TransUdpDeleteFileListener(const char *sessionName)
767 {
768 return TransDeleteFileListener(sessionName);
769 }
770
TransSendLimitChangeDataToCore(int32_t channelId,uint8_t tos,int32_t setTosResult)771 static int32_t TransSendLimitChangeDataToCore(int32_t channelId, uint8_t tos, int32_t setTosResult)
772 {
773 uint32_t len = sizeof(uint32_t) * LIMIT_CHANGE_INFO_NUM + sizeof(uint8_t);
774 uint8_t *buf = (uint8_t *)SoftBusCalloc(len);
775 if (buf == NULL) {
776 TRANS_LOGE(TRANS_CTRL, "malloc buf failed, channelId=%{public}d", channelId);
777 return SOFTBUS_MALLOC_ERR;
778 }
779 int32_t offSet = 0;
780 int32_t ret = SOFTBUS_OK;
781 ret = WriteInt32ToBuf(buf, len, &offSet, channelId);
782 if (ret != SOFTBUS_OK) {
783 TRANS_LOGE(TRANS_CTRL, "write channelId=%{public}d to buf failed! ret=%{public}d", channelId, ret);
784 SoftBusFree(buf);
785 return ret;
786 }
787 ret = WriteUint8ToBuf(buf, len, &offSet, tos);
788 if (ret != SOFTBUS_OK) {
789 TRANS_LOGE(TRANS_CTRL, "write tos=%{public}d to buf failed! ret=%{public}d", tos, ret);
790 SoftBusFree(buf);
791 return ret;
792 }
793 ret = WriteInt32ToBuf(buf, len, &offSet, setTosResult);
794 if (ret != SOFTBUS_OK) {
795 TRANS_LOGE(TRANS_CTRL, "write setTosResult=%{public}d to buf failed! ret=%{public}d", setTosResult, ret);
796 SoftBusFree(buf);
797 return ret;
798 }
799 ret = ServerIpcProcessInnerEvent(EVENT_TYPE_TRANS_LIMIT_CHANGE, buf, len);
800 SoftBusFree(buf);
801 return ret;
802 }
803
TransLimitChange(int32_t channelId,uint8_t tos)804 int32_t TransLimitChange(int32_t channelId, uint8_t tos)
805 {
806 if (tos != FILE_PRIORITY_BK && tos != FILE_PRIORITY_BE) {
807 TRANS_LOGE(TRANS_FILE, "invalid ip tos");
808 return SOFTBUS_INVALID_PARAM;
809 }
810 UdpChannel channel;
811 (void)memset_s(&channel, sizeof(UdpChannel), 0, sizeof(UdpChannel));
812 int32_t ret = TransGetUdpChannel(channelId, &channel);
813 if (ret != SOFTBUS_OK) {
814 return ret;
815 }
816 if (channel.info.isServer) {
817 TRANS_LOGE(TRANS_FILE, "server side no need to set ip tos");
818 return SOFTBUS_NOT_NEED_UPDATE;
819 }
820 if (channel.businessType != BUSINESS_TYPE_FILE) {
821 TRANS_LOGE(TRANS_FILE, "business type not match");
822 return SOFTBUS_NOT_NEED_UPDATE;
823 }
824 bool isTosSet = false;
825 ret = TransGetUdpChannelTos(channelId, &isTosSet);
826 if (ret != SOFTBUS_OK) {
827 TRANS_LOGE(TRANS_FILE, "get tos failed, channelId=%{public}d, ret=%{public}d", channelId, ret);
828 return ret;
829 }
830 if (isTosSet) {
831 TRANS_LOGW(TRANS_FILE, "tos has set");
832 return SOFTBUS_NOT_NEED_UPDATE;
833 }
834 uint8_t dfileTos = tos;
835 DFileOpt dfileOpt = {
836 .optType = OPT_TYPE_SOCK_PRIO,
837 .valLen = sizeof(uint8_t),
838 .value = (uint64_t)&dfileTos,
839 };
840 int32_t setTosResult = NSTACKX_DFileSetSessionOpt(channel.dfileId, &dfileOpt);
841 ret = TransSendLimitChangeDataToCore(channelId, tos, setTosResult);
842 return ret;
843 }
844
TransUdpOnCloseAckReceived(int32_t channelId)845 int32_t TransUdpOnCloseAckReceived(int32_t channelId)
846 {
847 return SetPendingPacket(channelId, 0, PENDING_TYPE_UDP);
848 }
849
850 // trigger file event FILE_EVENT_TRANS_STATUS when link down
ClientEmitFileEvent(int32_t channelId)851 int32_t ClientEmitFileEvent(int32_t channelId)
852 {
853 UdpChannel channel;
854 (void)memset_s(&channel, sizeof(UdpChannel), 0, sizeof(UdpChannel));
855 int32_t ret = TransGetUdpChannel(channelId, &channel);
856 if (ret != SOFTBUS_OK) {
857 TRANS_LOGE(TRANS_SDK, "get udp channel by channelId=%{public}d failed.", channelId);
858 return ret;
859 }
860 if (channel.businessType == BUSINESS_TYPE_FILE) {
861 TRANS_LOGD(TRANS_SDK, "linkdown trigger file event, channelId=%{public}d", channelId);
862 ret = NSTACKX_DFileSessionGetFileList(channel.dfileId);
863 if (ret != SOFTBUS_OK) {
864 TRANS_LOGE(
865 TRANS_SDK, "linkdown get file list failed. channelId=%{public}d, ret=%{public}d", channelId, ret);
866 }
867 }
868 return ret;
869 }
870
TransSetUdpChannelSessionId(int32_t channelId,int32_t sessionId)871 int32_t TransSetUdpChannelSessionId(int32_t channelId, int32_t sessionId)
872 {
873 if (g_udpChannelMgr == NULL) {
874 TRANS_LOGE(TRANS_SDK, "udp channel manager hasn't init.");
875 return SOFTBUS_NO_INIT;
876 }
877
878 if (SoftBusMutexLock(&(g_udpChannelMgr->lock)) != SOFTBUS_OK) {
879 TRANS_LOGE(TRANS_SDK, "lock failed");
880 return SOFTBUS_LOCK_ERR;
881 }
882
883 UdpChannel *channelNode = NULL;
884 LIST_FOR_EACH_ENTRY(channelNode, &(g_udpChannelMgr->list), UdpChannel, node) {
885 if (channelNode->channelId == channelId) {
886 channelNode->sessionId = sessionId;
887 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
888 return SOFTBUS_OK;
889 }
890 }
891 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
892 TRANS_LOGE(TRANS_SDK, "udp channel not found, channelId=%{public}d.", channelId);
893 return SOFTBUS_TRANS_UDP_CHANNEL_NOT_FOUND;
894 }
895
TransSetUdpChannelRenameHook(int32_t channelId,OnRenameFileCallback onRenameFile)896 int32_t TransSetUdpChannelRenameHook(int32_t channelId, OnRenameFileCallback onRenameFile)
897 {
898 if (onRenameFile == NULL) {
899 TRANS_LOGE(TRANS_SDK, "onRenameFile is null");
900 return SOFTBUS_INVALID_PARAM;
901 }
902
903 if (g_udpChannelMgr == NULL) {
904 TRANS_LOGE(TRANS_SDK, "udp channel manager hasn't init.");
905 return SOFTBUS_NO_INIT;
906 }
907
908 if (SoftBusMutexLock(&(g_udpChannelMgr->lock)) != SOFTBUS_OK) {
909 TRANS_LOGE(TRANS_SDK, "lock failed");
910 return SOFTBUS_LOCK_ERR;
911 }
912
913 UdpChannel *channelNode = NULL;
914 LIST_FOR_EACH_ENTRY(channelNode, &(g_udpChannelMgr->list), UdpChannel, node) {
915 if (channelNode->channelId == channelId && channelNode->businessType == BUSINESS_TYPE_FILE) {
916 channelNode->onRenameFile = onRenameFile;
917 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
918 return SOFTBUS_OK;
919 }
920 }
921 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
922 TRANS_LOGE(TRANS_SDK, "udp channel not found, channelId=%{public}d.", channelId);
923 return SOFTBUS_TRANS_UDP_CHANNEL_NOT_FOUND;
924 }
925
TransSetUdpChannelTos(int32_t channelId)926 int32_t TransSetUdpChannelTos(int32_t channelId)
927 {
928 if (g_udpChannelMgr == NULL) {
929 TRANS_LOGE(TRANS_SDK, "udp channel manager hasn't init.");
930 return SOFTBUS_NO_INIT;
931 }
932
933 if (SoftBusMutexLock(&(g_udpChannelMgr->lock)) != SOFTBUS_OK) {
934 TRANS_LOGE(TRANS_SDK, "lock failed");
935 return SOFTBUS_LOCK_ERR;
936 }
937
938 UdpChannel *channelNode = NULL;
939 LIST_FOR_EACH_ENTRY(channelNode, &(g_udpChannelMgr->list), UdpChannel, node) {
940 if (channelNode->channelId == channelId) {
941 channelNode->isTosSet = true;
942 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
943 return SOFTBUS_OK;
944 }
945 }
946 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
947 TRANS_LOGE(TRANS_SDK, "udp channel not found, channelId=%{public}d.", channelId);
948 return SOFTBUS_TRANS_UDP_CHANNEL_NOT_FOUND;
949 }
950
TransGetUdpChannelTos(int32_t channelId,bool * isTosSet)951 int32_t TransGetUdpChannelTos(int32_t channelId, bool *isTosSet)
952 {
953 if (isTosSet == NULL) {
954 TRANS_LOGE(TRANS_SDK, "isTosSet is null");
955 return SOFTBUS_INVALID_PARAM;
956 }
957 if (g_udpChannelMgr == NULL) {
958 TRANS_LOGE(TRANS_SDK, "udp channel manager hasn't init.");
959 return SOFTBUS_NO_INIT;
960 }
961 if (SoftBusMutexLock(&(g_udpChannelMgr->lock)) != SOFTBUS_OK) {
962 TRANS_LOGE(TRANS_SDK, "lock failed");
963 return SOFTBUS_LOCK_ERR;
964 }
965 UdpChannel *channelNode = NULL;
966 LIST_FOR_EACH_ENTRY(channelNode, &(g_udpChannelMgr->list), UdpChannel, node) {
967 if (channelNode->channelId == channelId) {
968 *isTosSet = channelNode->isTosSet;
969 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
970 return SOFTBUS_OK;
971 }
972 }
973 (void)SoftBusMutexUnlock(&(g_udpChannelMgr->lock));
974 TRANS_LOGE(TRANS_SDK, "udp channel not found, channelId=%{public}d.", channelId);
975 return SOFTBUS_TRANS_UDP_CHANNEL_NOT_FOUND;
976 }
977