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