• 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_session_manager.h"
17 
18 #include <securec.h>
19 #include <unistd.h>
20 
21 #include "anonymizer.h"
22 #include "client_bus_center_manager.h"
23 #include "client_trans_channel_manager.h"
24 #include "client_trans_file_listener.h"
25 #include "client_trans_proxy_file_manager.h"
26 #include "client_trans_socket_manager.h"
27 #include "client_trans_tcp_direct_manager.h"
28 #include "client_trans_udp_manager.h"
29 #include "session_ipc_adapter.h"
30 #include "softbus_access_token_adapter.h"
31 #include "softbus_adapter_mem.h"
32 #include "softbus_adapter_timer.h"
33 #include "softbus_app_info.h"
34 #include "softbus_def.h"
35 #include "softbus_error_code.h"
36 #include "softbus_socket.h"
37 #include "softbus_utils.h"
38 #include "trans_log.h"
39 #include "trans_server_proxy.h"
40 
41 #define CONVERSION_BASE 1000LL
42 #define CAST_SESSION "CastPlusSessionName"
43 #define D2D_FORK_NUM_MAX 5
44 static void ClientTransSessionTimerProc(void);
45 static void ClientTransAsyncSendBytesTimerProc(void);
46 
47 static int32_t g_sessionIdNum = 0;
48 static int32_t g_sessionId = 1;
49 static int32_t g_closingIdNum = 0;
50 static SoftBusList *g_clientSessionServerList = NULL;
51 
52 const char *g_rawAuthSession[] = {
53     "IShareAuthSession",
54     "ohos.distributedhardware.devicemanager.resident",
55 };
56 #define ACTION_AUTH_SESSION_NUM (sizeof(g_rawAuthSession) / sizeof(g_rawAuthSession[0]))
57 
LockClientSessionServerList()58 static int32_t LockClientSessionServerList()
59 {
60     if (g_clientSessionServerList == NULL) {
61         TRANS_LOGE(TRANS_INIT, "entry list not init");
62         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
63     }
64     int32_t ret = SoftBusMutexLock(&(g_clientSessionServerList->lock));
65     if (ret != SOFTBUS_OK) {
66         return SOFTBUS_LOCK_ERR;
67     }
68     return SOFTBUS_OK;
69 }
70 
UnlockClientSessionServerList()71 static void UnlockClientSessionServerList()
72 {
73     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
74 }
75 
CheckPermissionState(int32_t sessionId)76 int32_t CheckPermissionState(int32_t sessionId)
77 {
78     int32_t ret = LockClientSessionServerList();
79     if (ret != SOFTBUS_OK) {
80         TRANS_LOGE(TRANS_SDK, "lock failed");
81         return ret;
82     }
83     ClientSessionServer *serverNode = NULL;
84     SessionInfo *sessionNode = NULL;
85 
86     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
87         if (IsListEmpty(&serverNode->sessionList)) {
88             continue;
89         }
90         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
91             if (sessionNode->sessionId == sessionId) {
92                 bool permissionState = serverNode->permissionState;
93                 UnlockClientSessionServerList();
94                 return permissionState ? SOFTBUS_OK : SOFTBUS_PERMISSION_DENIED;
95             }
96         }
97     }
98     UnlockClientSessionServerList();
99     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
100 }
101 
PermissionStateChange(const char * pkgName,int32_t state)102 void PermissionStateChange(const char *pkgName, int32_t state)
103 {
104     if (LockClientSessionServerList() != SOFTBUS_OK) {
105         TRANS_LOGE(TRANS_SDK, "lock failed");
106         return;
107     }
108 
109     ClientSessionServer *serverNode = NULL;
110     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
111         if ((strcmp(serverNode->pkgName, pkgName) == 0)) {
112             serverNode->permissionState = state > 0 ? true : false;
113             TRANS_LOGI(TRANS_SDK, "permission change, pkgName=%{public}s, state=%{public}d", pkgName, state);
114             break;
115         }
116     }
117     UnlockClientSessionServerList();
118 }
119 
TransClientInit(void)120 int TransClientInit(void)
121 {
122     g_clientSessionServerList = CreateSoftBusList();
123     if (g_clientSessionServerList == NULL) {
124         TRANS_LOGE(TRANS_INIT, "entry list not init");
125         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
126     }
127 
128     if (TransDataSeqInfoListInit() != SOFTBUS_OK) {
129         TRANS_LOGE(TRANS_INIT, "DataSeqInfo list not init");
130         return SOFTBUS_TRANS_DATA_SEQ_INFO_NO_INIT;
131     }
132 
133     if (TransServerProxyInit() != SOFTBUS_OK) {
134         TRANS_LOGE(TRANS_INIT, "init trans ipc proxy failed");
135         return SOFTBUS_TRANS_SERVER_INIT_FAILED;
136     }
137 
138     if (ClientTransChannelInit() != SOFTBUS_OK) {
139         TRANS_LOGE(TRANS_INIT, "init trans channel failed");
140         return SOFTBUS_TRANS_SERVER_INIT_FAILED;
141     }
142 
143     if (RegisterTimeoutCallback(SOFTBUS_TRNAS_IDLE_TIMEOUT_TIMER_FUN, ClientTransSessionTimerProc) != SOFTBUS_OK) {
144         TRANS_LOGE(TRANS_INIT, "init trans idle timer failed");
145         return SOFTBUS_TRANS_SERVER_INIT_FAILED;
146     }
147 
148     if (RegisterTimeoutCallback(
149         SOFTBUS_TRANS_ASYNC_SENDBYTES_TIMER_FUN, ClientTransAsyncSendBytesTimerProc) != SOFTBUS_OK) {
150         TRANS_LOGE(TRANS_INIT, "init trans async sendbytes idle timer failed");
151         return SOFTBUS_TRANS_DATA_SEQ_INFO_INIT_FAIL;
152     }
153 
154     ClientTransRegLnnOffline();
155     TRANS_LOGI(TRANS_INIT, "init trans client success");
156     return SOFTBUS_OK;
157 }
158 
SessionIdIsAvailable(int32_t sessionId)159 static bool SessionIdIsAvailable(int32_t sessionId)
160 {
161     ClientSessionServer *serverNode = NULL;
162     SessionInfo *sessionNode = NULL;
163 
164     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
165         if (IsListEmpty(&serverNode->sessionList)) {
166             continue;
167         }
168         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
169             if (sessionNode->sessionId == sessionId) {
170                 return false;
171             }
172         }
173     }
174 
175     return true;
176 }
177 
ShowAllSessionInfo(void)178 static void ShowAllSessionInfo(void)
179 {
180     TRANS_LOGI(TRANS_SDK, "g_sessionIdNum=%{public}d, g_closingIdNum=%{public}d", g_sessionIdNum, g_closingIdNum);
181     ClientSessionServer *serverNode = NULL;
182     SessionInfo *sessionNode = NULL;
183     int count = 0;
184     char *tmpName = NULL;
185     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
186         Anonymize(serverNode->sessionName, &tmpName);
187         TRANS_LOGI(TRANS_SDK, "client session server is exist. count=%{public}d, sessionName=%{public}s",
188             count, AnonymizeWrapper(tmpName));
189         AnonymizeFree(tmpName);
190         count++;
191         if (IsListEmpty(&serverNode->sessionList)) {
192             continue;
193         }
194         int sessionCount = 0;
195         char *tmpPeerSessionName = NULL;
196         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
197             Anonymize(sessionNode->info.peerSessionName, &tmpPeerSessionName);
198             TRANS_LOGI(TRANS_SDK,
199                 "client session info is exist. sessionCount=%{public}d, peerSessionName=%{public}s, "
200                 "channelId=%{public}d, channelType=%{public}d",
201                 sessionCount, AnonymizeWrapper(tmpPeerSessionName), sessionNode->channelId, sessionNode->channelType);
202             AnonymizeFree(tmpPeerSessionName);
203             sessionCount++;
204         }
205     }
206 }
207 
GeneratePagingId(void)208 int32_t GeneratePagingId(void)
209 {
210     int32_t ret = LockClientSessionServerList();
211     if (ret != SOFTBUS_OK) {
212         TRANS_LOGE(TRANS_SDK, "lock failed");
213         return ret;
214     }
215     ret = GenerateSessionId();
216     UnlockClientSessionServerList();
217     return ret;
218 }
219 
220 // need get g_clientSessionServerList->lock before call this function
GenerateSessionId(void)221 int32_t GenerateSessionId(void)
222 {
223     if (g_sessionIdNum >= g_closingIdNum && g_sessionIdNum - g_closingIdNum >= MAX_SESSION_ID) {
224         TRANS_LOGE(TRANS_SDK, "sessionid num cross the line error");
225         return INVALID_SESSION_ID;
226     }
227     int32_t cnt = MAX_SESSION_ID + g_closingIdNum + 1;
228     int32_t id = INVALID_SESSION_ID;
229 
230     while (cnt) {
231         id = g_sessionId++;
232         if (g_sessionId < 0) {
233             g_sessionId = 1;
234         }
235         if (SessionIdIsAvailable(id)) {
236             g_sessionIdNum++;
237             return id;
238         }
239         cnt--;
240     }
241     TRANS_LOGE(TRANS_SDK, "generate id error");
242     return id;
243 }
244 
DestroyPagingId(void)245 void DestroyPagingId(void)
246 {
247     int32_t ret = LockClientSessionServerList();
248     if (ret != SOFTBUS_OK) {
249         TRANS_LOGE(TRANS_SDK, "lock failed");
250         return;
251     }
252     DestroySessionId();
253     UnlockClientSessionServerList();
254 }
255 
256 // need get g_clientSessionServerList->lock before call this function
DestroySessionId(void)257 void DestroySessionId(void)
258 {
259     if (g_sessionIdNum > 0) {
260         g_sessionIdNum--;
261     }
262 
263     if (g_closingIdNum > 0) {
264         g_closingIdNum--;
265     }
266 }
267 
TryDeleteEmptySessionServer(const char * pkgName,const char * sessionName)268 int32_t TryDeleteEmptySessionServer(const char *pkgName, const char *sessionName)
269 {
270     if (pkgName == NULL || sessionName == NULL) {
271         TRANS_LOGE(TRANS_SDK, "invalid param.");
272         return SOFTBUS_INVALID_PARAM;
273     }
274     int32_t ret = LockClientSessionServerList();
275     if (ret != SOFTBUS_OK) {
276         TRANS_LOGE(TRANS_SDK, "lock failed");
277         return ret;
278     }
279 
280     ClientSessionServer *serverNode = NULL;
281     ClientSessionServer *serverNodeNext = NULL;
282     ListNode destroyList;
283     ListInit(&destroyList);
284     LIST_FOR_EACH_ENTRY_SAFE(
285         serverNode, serverNodeNext, &(g_clientSessionServerList->list), ClientSessionServer, node) {
286         if (strcmp(serverNode->sessionName, sessionName) == 0 && IsListEmpty(&serverNode->sessionList) &&
287             serverNode->sessionAddingCnt == 0) {
288             ListDelete(&(serverNode->node));
289             SoftBusFree(serverNode);
290             g_clientSessionServerList->cnt--;
291             uint64_t timestamp = SoftBusGetSysTimeMs();
292             UnlockClientSessionServerList();
293             // calling the ipc interface by locking here may block other threads for a long time
294             char *tmpName = NULL;
295             Anonymize(sessionName, &tmpName);
296             ret = ServerIpcRemoveSessionServer(pkgName, sessionName, timestamp);
297             if (ret != SOFTBUS_OK) {
298                 TRANS_LOGE(TRANS_SDK, "remove session server failed, ret=%{public}d", ret);
299                 AnonymizeFree(tmpName);
300                 return ret;
301             }
302             TRANS_LOGI(TRANS_SDK, "delete empty session server, sessionName=%{public}s", AnonymizeWrapper(tmpName));
303             AnonymizeFree(tmpName);
304             return SOFTBUS_OK;
305         }
306     }
307     UnlockClientSessionServerList();
308     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
309 }
310 
TransClientDeinit(void)311 void TransClientDeinit(void)
312 {
313     if (LockClientSessionServerList() != SOFTBUS_OK) {
314         TRANS_LOGE(TRANS_SDK, "lock failed");
315         return;
316     }
317     if (UnRegisterTimeoutCallback(SOFTBUS_TRANS_ASYNC_SENDBYTES_TIMER_FUN) != SOFTBUS_OK) {
318         TRANS_LOGE(TRANS_CTRL, "unregister trans async sendbytes timer callback failed");
319     }
320     if (UnRegisterTimeoutCallback(SOFTBUS_TRNAS_IDLE_TIMEOUT_TIMER_FUN) != SOFTBUS_OK) {
321         TRANS_LOGE(TRANS_CTRL, "unregister trans idle timeout timer callback failed");
322     }
323     ClientSessionServer *serverNode = NULL;
324     ClientSessionServer *serverNodeNext = NULL;
325     ListNode destroyList;
326     ListInit(&destroyList);
327     LIST_FOR_EACH_ENTRY_SAFE(serverNode, serverNodeNext, &(g_clientSessionServerList->list),
328         ClientSessionServer, node) {
329         DestroyClientSessionServer(serverNode, &destroyList);
330     }
331     UnlockClientSessionServerList();
332     ClientDestroySession(&destroyList, SHUTDOWN_REASON_LOCAL);
333     DestroyRelationChecker();
334 
335     DestroySoftBusList(g_clientSessionServerList);
336     g_clientSessionServerList = NULL;
337     TransDataSeqInfoListDeinit();
338     ClientTransChannelDeinit();
339     TransServerProxyDeInit();
340 }
341 
SessionServerIsExist(const char * sessionName)342 static bool SessionServerIsExist(const char *sessionName)
343 {
344     /* need get lock before */
345     ListNode *pos = NULL;
346     ListNode *tmp = NULL;
347     ClientSessionServer *node = NULL;
348     LIST_FOR_EACH_SAFE(pos, tmp, &g_clientSessionServerList->list) {
349         node = (ClientSessionServer *)pos;
350         if (strcmp(node->sessionName, sessionName) == 0) {
351             return true;
352         }
353     }
354     return false;
355 }
356 
SocketServerIsExistAndUpdate(const char * sessionName)357 static bool SocketServerIsExistAndUpdate(const char *sessionName)
358 {
359     /* need get lock before */
360     ClientSessionServer *item = NULL;
361     LIST_FOR_EACH_ENTRY(item, &g_clientSessionServerList->list, ClientSessionServer, node) {
362         if (strcmp(item->sessionName, sessionName) == 0) {
363             /*
364              * this field indicates that a process is using a SessionServer,
365              * but the process has not yet added the session node to the sessionList.
366              * Other processes cannot perceive this intermediate state, so this field is added to identify this state;
367              * This field is cleared after adding the session node to the session list in the process
368              */
369             item->sessionAddingCnt++;
370             return true;
371         }
372     }
373     return false;
374 }
375 
SocketServerStateUpdate(const char * sessionName)376 void SocketServerStateUpdate(const char *sessionName)
377 {
378     if (sessionName == NULL) {
379         TRANS_LOGE(TRANS_SDK, "invalid param");
380         return;
381     }
382     if (LockClientSessionServerList() != SOFTBUS_OK) {
383         TRANS_LOGE(TRANS_SDK, "lock failed");
384         return;
385     }
386     ClientSessionServer *item = NULL;
387     LIST_FOR_EACH_ENTRY(item, &g_clientSessionServerList->list, ClientSessionServer, node) {
388         if (strcmp(item->sessionName, sessionName) == 0) {
389             if (item->sessionAddingCnt > 0) {
390                 item->sessionAddingCnt--;
391             }
392             UnlockClientSessionServerList();
393             return;
394         }
395     }
396     char *tmpName = NULL;
397     Anonymize(sessionName, &tmpName);
398     TRANS_LOGE(TRANS_SDK, "not found session server by sessionName=%{public}s", AnonymizeWrapper(tmpName));
399     AnonymizeFree(tmpName);
400     UnlockClientSessionServerList();
401 }
402 
ShowClientSessionServer(void)403 static void ShowClientSessionServer(void)
404 {
405     ClientSessionServer *pos = NULL;
406     ClientSessionServer *tmp = NULL;
407     int count = 0;
408     char *tmpName = NULL;
409     LIST_FOR_EACH_ENTRY_SAFE(pos, tmp, &g_clientSessionServerList->list, ClientSessionServer, node) {
410         Anonymize(pos->sessionName, &tmpName);
411         TRANS_LOGE(TRANS_SDK,
412             "client session server is exist. count=%{public}d, sessionName=%{public}s",
413                 count, AnonymizeWrapper(tmpName));
414         AnonymizeFree(tmpName);
415         count++;
416     }
417 }
418 
ClientAddSessionServer(SoftBusSecType type,const char * pkgName,const char * sessionName,const ISessionListener * listener,uint64_t * timestamp)419 int32_t ClientAddSessionServer(SoftBusSecType type, const char *pkgName, const char *sessionName,
420     const ISessionListener *listener, uint64_t *timestamp)
421 {
422     if (pkgName == NULL || sessionName == NULL || listener == NULL || timestamp == NULL) {
423         return SOFTBUS_INVALID_PARAM;
424     }
425 
426     int32_t ret = LockClientSessionServerList();
427     if (ret != SOFTBUS_OK) {
428         TRANS_LOGE(TRANS_SDK, "lock failed");
429         return ret;
430     }
431     if (SessionServerIsExist(sessionName)) {
432         *timestamp = SoftBusGetSysTimeMs();
433         UnlockClientSessionServerList();
434         return SOFTBUS_SERVER_NAME_REPEATED;
435     }
436 
437     if (g_clientSessionServerList->cnt >= MAX_SESSION_SERVER_NUMBER) {
438         ShowClientSessionServer();
439         UnlockClientSessionServerList();
440         TRANS_LOGE(TRANS_SDK, "ClientAddSessionServer: client server num reach max");
441         return SOFTBUS_INVALID_NUM;
442     }
443 
444     ClientSessionServer *server = GetNewSessionServer(type, sessionName, pkgName, listener);
445     if (server == NULL) {
446         UnlockClientSessionServerList();
447         return SOFTBUS_MEM_ERR;
448     }
449     server->permissionState = true;
450     ListAdd(&g_clientSessionServerList->list, &server->node);
451     g_clientSessionServerList->cnt++;
452     *timestamp = SoftBusGetSysTimeMs();
453 
454     UnlockClientSessionServerList();
455     char *tmpName = NULL;
456     char *tmpPkgName = NULL;
457     Anonymize(pkgName, &tmpPkgName);
458     Anonymize(sessionName, &tmpName);
459     TRANS_LOGI(TRANS_SDK, "sessionName=%{public}s, pkgName=%{public}s",
460         AnonymizeWrapper(tmpName), AnonymizeWrapper(tmpPkgName));
461     AnonymizeFree(tmpName);
462     AnonymizeFree(tmpPkgName);
463     return SOFTBUS_OK;
464 }
465 
GetExistSession(const SessionParam * param)466 static SessionInfo *GetExistSession(const SessionParam *param)
467 {
468     /* need get lock before */
469     ClientSessionServer *serverNode = NULL;
470     SessionInfo *sessionNode = NULL;
471     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
472         if ((strcmp(serverNode->sessionName, param->sessionName) != 0) || IsListEmpty(&serverNode->sessionList)) {
473             continue;
474         }
475         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
476             if (sessionNode->isServer || (strcmp(sessionNode->info.peerSessionName, param->peerSessionName) != 0) ||
477                 (strcmp(sessionNode->info.peerDeviceId, param->peerDeviceId) != 0) ||
478                 (strcmp(sessionNode->info.groupId, param->groupId) != 0) ||
479                 (memcmp(sessionNode->linkType, param->attr->linkType, sizeof(param->attr->linkType)) != 0) ||
480                 (sessionNode->info.flag != param->attr->dataType)) {
481                 continue;
482             }
483             return sessionNode;
484         }
485     }
486     return NULL;
487 }
488 
GetSessionById(int32_t sessionId,ClientSessionServer ** server,SessionInfo ** session)489 static int32_t GetSessionById(int32_t sessionId, ClientSessionServer **server, SessionInfo **session)
490 {
491     /* need get lock before */
492     ClientSessionServer *serverNode = NULL;
493     SessionInfo *sessionNode = NULL;
494 
495     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
496         if (IsListEmpty(&serverNode->sessionList)) {
497             continue;
498         }
499         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
500             if (sessionNode->sessionId == sessionId) {
501                 *server = serverNode;
502                 *session = sessionNode;
503                 return SOFTBUS_OK;
504             }
505         }
506     }
507     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
508 }
509 
GetSessionByChannelId(int32_t channelId,int32_t channelType,ClientSessionServer ** server,SessionInfo ** session)510 static int32_t GetSessionByChannelId(int32_t channelId, int32_t channelType, ClientSessionServer **server,
511     SessionInfo **session)
512 {
513     /* need get lock before */
514     ClientSessionServer *serverNode = NULL;
515     SessionInfo *sessionNode = NULL;
516 
517     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
518         if (IsListEmpty(&serverNode->sessionList)) {
519             continue;
520         }
521         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
522             if (sessionNode->channelId == channelId && (int32_t)sessionNode->channelType == channelType) {
523                 *server = serverNode;
524                 *session = sessionNode;
525                 return SOFTBUS_OK;
526             }
527         }
528     }
529     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
530 }
531 
AddSession(const char * sessionName,SessionInfo * session)532 static int32_t AddSession(const char *sessionName, SessionInfo *session)
533 {
534     /* need get lock before */
535     session->sessionId = GenerateSessionId();
536     if (session->sessionId < 0) {
537         ShowAllSessionInfo();
538         return SOFTBUS_TRANS_SESSION_CNT_EXCEEDS_LIMIT;
539     }
540     if (session->isD2D) {
541         session->isPagingRoot = false;
542     }
543     ClientSessionServer *serverNode = NULL;
544     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
545         if (strcmp(serverNode->sessionName, sessionName) != 0) {
546             continue;
547         }
548         ListAdd(&serverNode->sessionList, &session->node);
549         char *anonyDeviceId = NULL;
550         Anonymize(session->info.peerDeviceId, &anonyDeviceId);
551         TRANS_LOGI(TRANS_SDK,
552             "add, sessionId=%{public}d, channelId=%{public}d, channelType=%{public}d, routeType=%{public}d, "
553             "peerDeviceId=%{public}s",
554             session->sessionId, session->channelId, session->channelType, session->routeType,
555             AnonymizeWrapper(anonyDeviceId));
556         AnonymizeFree(anonyDeviceId);
557         return SOFTBUS_OK;
558     }
559     DestroySessionId();
560     return SOFTBUS_TRANS_SESSIONSERVER_NOT_CREATED;
561 }
562 
ClientAddNewSession(const char * sessionName,SessionInfo * session)563 int32_t ClientAddNewSession(const char *sessionName, SessionInfo *session)
564 {
565     if (session == NULL) {
566         TRANS_LOGW(TRANS_SDK, "Invalid param");
567         return SOFTBUS_INVALID_PARAM;
568     }
569 
570     int32_t ret = LockClientSessionServerList();
571     if (ret != SOFTBUS_OK) {
572         TRANS_LOGE(TRANS_SDK, "lock failed");
573         return ret;
574     }
575 
576     ret = AddSession(sessionName, session);
577     if (ret != SOFTBUS_OK) {
578         UnlockClientSessionServerList();
579         TRANS_LOGE(TRANS_SDK, "add session failed, ret=%{public}d", ret);
580         return ret;
581     }
582     UnlockClientSessionServerList();
583     return SOFTBUS_OK;
584 }
585 
ClientAddSession(const SessionParam * param,int32_t * sessionId,SessionEnableStatus * isEnabled)586 int32_t ClientAddSession(const SessionParam *param, int32_t *sessionId, SessionEnableStatus *isEnabled)
587 {
588     if (!IsValidSessionParam(param) || (sessionId == NULL) || (isEnabled == NULL)) {
589         TRANS_LOGW(TRANS_SDK, "Invalid param");
590         return SOFTBUS_INVALID_PARAM;
591     }
592 
593     int32_t ret = LockClientSessionServerList();
594     if (ret != SOFTBUS_OK) {
595         TRANS_LOGE(TRANS_SDK, "lock failed");
596         return ret;
597     }
598 
599     SessionInfo *session = GetExistSession(param);
600     if (session != NULL) {
601         *sessionId = session->sessionId;
602         *isEnabled = session->enableStatus;
603         UnlockClientSessionServerList();
604         return SOFTBUS_TRANS_SESSION_REPEATED;
605     }
606 
607     session = CreateNewSession(param);
608     if (session == NULL) {
609         UnlockClientSessionServerList();
610         TRANS_LOGE(TRANS_SDK, "create session failed");
611         return SOFTBUS_TRANS_SESSION_CREATE_FAILED;
612     }
613 
614     ret = AddSession(param->sessionName, session);
615     if (ret != SOFTBUS_OK) {
616         SoftBusFree(session);
617         UnlockClientSessionServerList();
618         TRANS_LOGE(TRANS_SDK, "Add Session failed, ret=%{public}d", ret);
619         return ret;
620     }
621 
622     *sessionId = session->sessionId;
623     UnlockClientSessionServerList();
624     return SOFTBUS_OK;
625 }
626 
ClientAddAuthSession(const char * sessionName,int32_t * sessionId)627 int32_t ClientAddAuthSession(const char *sessionName, int32_t *sessionId)
628 {
629     if (!IsValidString(sessionName, SESSION_NAME_SIZE_MAX - 1) || (sessionId == NULL)) {
630         TRANS_LOGW(TRANS_SDK, "Invalid param");
631         return SOFTBUS_INVALID_PARAM;
632     }
633     if (g_clientSessionServerList == NULL) {
634         TRANS_LOGE(TRANS_INIT, "entry list not init");
635         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
636     }
637     SessionInfo *session = CreateNonEncryptSessionInfo(sessionName);
638     if (session == NULL) {
639         return SOFTBUS_MALLOC_ERR;
640     }
641     int32_t ret = ClientAddNewSession(sessionName, session);
642     if (ret != SOFTBUS_OK) {
643         SoftBusFree(session);
644         TRANS_LOGE(TRANS_SDK, "client add new session failed, ret=%{public}d.", ret);
645         return ret;
646     }
647     *sessionId = session->sessionId;
648     return SOFTBUS_OK;
649 }
650 
ClientDeleteSessionServer(SoftBusSecType type,const char * sessionName)651 int32_t ClientDeleteSessionServer(SoftBusSecType type, const char *sessionName)
652 {
653     if ((type == SEC_TYPE_UNKNOWN) || (sessionName == NULL)) {
654         TRANS_LOGW(TRANS_SDK, "Invalid param");
655         return SOFTBUS_INVALID_PARAM;
656     }
657 
658     int32_t ret = LockClientSessionServerList();
659     if (ret != SOFTBUS_OK) {
660         TRANS_LOGE(TRANS_SDK, "lock failed");
661         return ret;
662     }
663 
664     ClientSessionServer *serverNode = NULL;
665     ListNode destroyList;
666     ListInit(&destroyList);
667     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
668         if ((strcmp(serverNode->sessionName, sessionName) == 0) && (serverNode->type == type)) {
669             DestroyClientSessionServer(serverNode, &destroyList);
670             g_clientSessionServerList->cnt--;
671             break;
672         }
673     }
674     UnlockClientSessionServerList();
675     (void)ClientDestroySession(&destroyList, SHUTDOWN_REASON_LOCAL);
676     return SOFTBUS_OK;
677 }
678 
ClientDeleteSession(int32_t sessionId)679 int32_t ClientDeleteSession(int32_t sessionId)
680 {
681     TRANS_LOGI(TRANS_SDK, "sessionId=%{public}d", sessionId);
682     if (sessionId < 0) {
683         return SOFTBUS_TRANS_INVALID_SESSION_ID;
684     }
685 
686     int32_t ret = LockClientSessionServerList();
687     if (ret != SOFTBUS_OK) {
688         TRANS_LOGE(TRANS_SDK, "lock failed");
689         return ret;
690     }
691 
692     ClientSessionServer *serverNode = NULL;
693     SessionInfo *sessionNode = NULL;
694 
695     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
696         if (IsListEmpty(&serverNode->sessionList)) {
697             continue;
698         }
699         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
700             if (sessionNode->sessionId != sessionId) {
701                 continue;
702             }
703             ListDelete(&(sessionNode->node));
704             TRANS_LOGI(TRANS_SDK, "delete session by sessionId=%{public}d success", sessionId);
705             DestroySessionId();
706             if (!sessionNode->lifecycle.condIsWaiting) {
707                 (void)SoftBusCondDestroy(&(sessionNode->lifecycle.callbackCond));
708             } else {
709                 (void)SoftBusCondSignal(&(sessionNode->lifecycle.callbackCond)); // destroy in CheckSessionEnableStatus
710                 TRANS_LOGI(TRANS_SDK, "sessionId=%{public}d condition is waiting", sessionId);
711             }
712             SoftBusFree(sessionNode);
713             UnlockClientSessionServerList();
714             return SOFTBUS_OK;
715         }
716     }
717 
718     UnlockClientSessionServerList();
719     TRANS_LOGE(TRANS_SDK, "not found session by sessionId=%{public}d", sessionId);
720     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
721 }
722 
ClientGetSessionDataById(int32_t sessionId,char * data,uint16_t len,TransSessionKey key)723 int32_t ClientGetSessionDataById(int32_t sessionId, char *data, uint16_t len, TransSessionKey key)
724 {
725     if ((sessionId < 0) || (data == NULL) || (len == 0)) {
726         TRANS_LOGW(TRANS_SDK, "Invalid param");
727         return SOFTBUS_INVALID_PARAM;
728     }
729 
730     int32_t ret = LockClientSessionServerList();
731     if (ret != SOFTBUS_OK) {
732         TRANS_LOGE(TRANS_SDK, "lock failed");
733         return ret;
734     }
735 
736     ClientSessionServer *serverNode = NULL;
737     SessionInfo *sessionNode = NULL;
738     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
739         UnlockClientSessionServerList();
740         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
741         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
742     }
743     switch (key) {
744         case KEY_SESSION_NAME:
745             ret = strcpy_s(data, len, serverNode->sessionName);
746             break;
747         case KEY_PEER_SESSION_NAME:
748             ret = strcpy_s(data, len, sessionNode->info.peerSessionName);
749             break;
750         case KEY_PEER_DEVICE_ID:
751             ret = strcpy_s(data, len, sessionNode->info.peerDeviceId);
752             break;
753         case KEY_PKG_NAME:
754             ret = strcpy_s(data, len, serverNode->pkgName);
755             break;
756         default:
757             UnlockClientSessionServerList();
758             return SOFTBUS_MEM_ERR;
759     }
760 
761     UnlockClientSessionServerList();
762     if (ret != EOK) {
763         TRANS_LOGE(TRANS_SDK, "strcpy_s data info failed, ret=%{public}d", ret);
764         return SOFTBUS_STRCPY_ERR;
765     }
766     return SOFTBUS_OK;
767 }
768 
ClientGetSessionIntegerDataById(int32_t sessionId,int * data,TransSessionKey key)769 int32_t ClientGetSessionIntegerDataById(int32_t sessionId, int *data, TransSessionKey key)
770 {
771     if ((sessionId < 0) || (data == NULL)) {
772         TRANS_LOGW(TRANS_SDK, "Invalid param");
773         return SOFTBUS_INVALID_PARAM;
774     }
775 
776     int32_t ret = LockClientSessionServerList();
777     if (ret != SOFTBUS_OK) {
778         TRANS_LOGE(TRANS_SDK, "lock failed");
779         return ret;
780     }
781 
782     ClientSessionServer *serverNode = NULL;
783     SessionInfo *sessionNode = NULL;
784     ret = GetSessionById(sessionId, &serverNode, &sessionNode);
785     if (ret != SOFTBUS_OK) {
786         UnlockClientSessionServerList();
787         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
788         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
789     }
790     switch (key) {
791         case KEY_IS_SERVER:
792             *data = sessionNode->isServer;
793             break;
794         case KEY_PEER_PID:
795             *data = sessionNode->peerPid;
796             break;
797         case KEY_PEER_UID:
798             *data = sessionNode->peerUid;
799             break;
800         case KEY_ACTION_ID:
801             *data = (int32_t)sessionNode->actionId;
802             break;
803         default:
804             UnlockClientSessionServerList();
805             return SOFTBUS_NOT_FIND;
806     }
807 
808     UnlockClientSessionServerList();
809     return SOFTBUS_OK;
810 }
811 
ClientGetChannelBySessionId(int32_t sessionId,int32_t * channelId,int32_t * type,SessionEnableStatus * enableStatus)812 int32_t ClientGetChannelBySessionId(
813     int32_t sessionId, int32_t *channelId, int32_t *type, SessionEnableStatus *enableStatus)
814 {
815     if (sessionId < 0) {
816         return SOFTBUS_TRANS_INVALID_SESSION_ID;
817     }
818     int32_t ret = LockClientSessionServerList();
819     if (ret != SOFTBUS_OK) {
820         TRANS_LOGE(TRANS_SDK, "lock failed");
821         return ret;
822     }
823 
824     ClientSessionServer *serverNode = NULL;
825     SessionInfo *sessionNode = NULL;
826     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
827         UnlockClientSessionServerList();
828         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
829         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
830     }
831 
832     if (channelId != NULL) {
833         *channelId = sessionNode->channelId;
834     }
835     if (type != NULL) {
836         *type = sessionNode->channelType;
837     }
838     if (enableStatus != NULL) {
839         *enableStatus = sessionNode->enableStatus;
840     }
841     UnlockClientSessionServerList();
842     return SOFTBUS_OK;
843 }
844 
ClientSetStatusClosingBySocket(int32_t socket,bool isClosing)845 int32_t ClientSetStatusClosingBySocket(int32_t socket, bool isClosing)
846 {
847     if (socket < 0) {
848         TRANS_LOGE(TRANS_INIT, "invalid socket=%{public}d", socket);
849         return SOFTBUS_TRANS_INVALID_SESSION_ID;
850     }
851 
852     int32_t ret = LockClientSessionServerList();
853     if (ret != SOFTBUS_OK) {
854         TRANS_LOGE(TRANS_SDK, "lock failed");
855         return ret;
856     }
857 
858     ClientSessionServer *serverNode = NULL;
859     SessionInfo *sessionNode = NULL;
860     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
861         UnlockClientSessionServerList();
862         TRANS_LOGE(TRANS_SDK, "socket not found. socket=%{public}d", socket);
863         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
864     }
865 
866     sessionNode->isClosing = isClosing;
867     UnlockClientSessionServerList();
868     return SOFTBUS_OK;
869 }
870 
ClientSetEnableStatusBySocket(int32_t socket,SessionEnableStatus enableStatus)871 int32_t ClientSetEnableStatusBySocket(int32_t socket, SessionEnableStatus enableStatus)
872 {
873     if (socket < 0) {
874         TRANS_LOGE(TRANS_INIT, "invalid socket=%{public}d", socket);
875         return SOFTBUS_TRANS_INVALID_SESSION_ID;
876     }
877 
878     int32_t ret = LockClientSessionServerList();
879     if (ret != SOFTBUS_OK) {
880         TRANS_LOGE(TRANS_SDK, "lock failed");
881         return ret;
882     }
883 
884     ClientSessionServer *serverNode = NULL;
885     SessionInfo *sessionNode = NULL;
886     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
887         UnlockClientSessionServerList();
888         TRANS_LOGE(TRANS_SDK, "socket not found. socket=%{public}d", socket);
889         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
890     }
891 
892     sessionNode->enableStatus = enableStatus;
893     UnlockClientSessionServerList();
894     return SOFTBUS_OK;
895 }
896 
ClientGetChannelBusinessTypeBySessionId(int32_t sessionId,int32_t * businessType)897 int32_t ClientGetChannelBusinessTypeBySessionId(int32_t sessionId, int32_t *businessType)
898 {
899     if ((sessionId < 0) || (businessType == NULL)) {
900         return SOFTBUS_INVALID_PARAM;
901     }
902     int32_t ret = LockClientSessionServerList();
903     if (ret != SOFTBUS_OK) {
904         TRANS_LOGE(TRANS_SDK, "lock failed");
905         return ret;
906     }
907 
908     ClientSessionServer *serverNode = NULL;
909     SessionInfo *sessionNode = NULL;
910     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
911         UnlockClientSessionServerList();
912         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
913         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
914     }
915 
916     *businessType = sessionNode->businessType;
917 
918     UnlockClientSessionServerList();
919     return SOFTBUS_OK;
920 }
921 
GetSupportTlvAndNeedAckById(int32_t channelId,int32_t channelType,bool * supportTlv,bool * needAck)922 int32_t GetSupportTlvAndNeedAckById(int32_t channelId, int32_t channelType, bool *supportTlv, bool *needAck)
923 {
924     if (channelId <= 0 || (supportTlv == NULL && needAck == NULL)) { // supportTlv and needAck is an optional param
925         TRANS_LOGE(TRANS_SDK, "Invalid param");
926         return SOFTBUS_INVALID_PARAM;
927     }
928 
929     int32_t ret = LockClientSessionServerList();
930     if (ret != SOFTBUS_OK) {
931         TRANS_LOGE(TRANS_SDK, "lock failed");
932         return ret;
933     }
934 
935     ClientSessionServer *serverNode = NULL;
936     SessionInfo *sessionNode = NULL;
937     if (GetSessionByChannelId(channelId, channelType, &serverNode, &sessionNode) != SOFTBUS_OK) {
938         UnlockClientSessionServerList();
939         TRANS_LOGE(TRANS_SDK, "channel not found. channelId=%{public}d", channelId);
940         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
941     }
942     if (supportTlv != NULL) {
943         *supportTlv = sessionNode->isSupportTlv;
944     }
945     if (needAck != NULL) {
946         *needAck = sessionNode->needAck;
947     }
948     UnlockClientSessionServerList();
949     TRANS_LOGD(TRANS_SDK, "get support tlv or needAck success by channelId=%{public}d", channelId);
950     return SOFTBUS_OK;
951 }
952 
ClientSetChannelBySessionId(int32_t sessionId,TransInfo * transInfo)953 int32_t ClientSetChannelBySessionId(int32_t sessionId, TransInfo *transInfo)
954 {
955     if ((sessionId < 0) || (transInfo->channelId < 0)) {
956         TRANS_LOGW(TRANS_SDK, "Invalid param");
957         return SOFTBUS_INVALID_PARAM;
958     }
959 
960     int32_t ret = LockClientSessionServerList();
961     if (ret != SOFTBUS_OK) {
962         TRANS_LOGE(TRANS_SDK, "lock failed");
963         return ret;
964     }
965 
966     ClientSessionServer *serverNode = NULL;
967     SessionInfo *sessionNode = NULL;
968     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
969         UnlockClientSessionServerList();
970         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
971         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
972     }
973     sessionNode->channelId = transInfo->channelId;
974     sessionNode->channelType = (ChannelType)transInfo->channelType;
975     TRANS_LOGI(TRANS_SDK, "Client set channel by sessionId success, sessionId=%{public}d, channelId=%{public}d, "
976         "channelType=%{public}d", sessionId, sessionNode->channelId, sessionNode->channelType);
977 
978     UnlockClientSessionServerList();
979     return SOFTBUS_OK;
980 }
981 
GetEncryptByChannelId(int32_t channelId,int32_t channelType,int32_t * data)982 int32_t GetEncryptByChannelId(int32_t channelId, int32_t channelType, int32_t *data)
983 {
984     if ((channelId < 0) || (data == NULL)) {
985         TRANS_LOGW(TRANS_SDK, "Invalid param");
986         return SOFTBUS_INVALID_PARAM;
987     }
988 
989     int32_t ret = LockClientSessionServerList();
990     if (ret != SOFTBUS_OK) {
991         TRANS_LOGE(TRANS_SDK, "lock failed");
992         return ret;
993     }
994 
995     ClientSessionServer *serverNode = NULL;
996     SessionInfo *sessionNode = NULL;
997 
998     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
999         if (IsListEmpty(&serverNode->sessionList)) {
1000             continue;
1001         }
1002 
1003         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1004             if (sessionNode->channelId == channelId && (int32_t)sessionNode->channelType == channelType) {
1005                 *data = (int32_t)sessionNode->isEncrypt;
1006                 UnlockClientSessionServerList();
1007                 return SOFTBUS_OK;
1008             }
1009         }
1010     }
1011 
1012     UnlockClientSessionServerList();
1013     TRANS_LOGE(TRANS_SDK, "not found session by channelId=%{public}d", channelId);
1014     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1015 }
1016 
ClientGetSessionStateByChannelId(int32_t channelId,int32_t channelType,SessionState * sessionState)1017 int32_t ClientGetSessionStateByChannelId(int32_t channelId, int32_t channelType, SessionState *sessionState)
1018 {
1019     if ((channelId < 0) || (sessionState == NULL)) {
1020         TRANS_LOGW(TRANS_SDK, "Invalid param, channelId=%{public}d, channelType=%{public}d", channelId, channelType);
1021         return SOFTBUS_INVALID_PARAM;
1022     }
1023 
1024     int32_t ret = LockClientSessionServerList();
1025     if (ret != SOFTBUS_OK) {
1026         TRANS_LOGE(TRANS_SDK, "lock failed");
1027         return ret;
1028     }
1029 
1030     ClientSessionServer *serverNode = NULL;
1031     SessionInfo *sessionNode = NULL;
1032 
1033     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1034         if (IsListEmpty(&serverNode->sessionList)) {
1035             continue;
1036         }
1037 
1038         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1039             if (sessionNode->channelId == channelId && sessionNode->channelType == (ChannelType)channelType) {
1040                 *sessionState = sessionNode->lifecycle.sessionState;
1041                 UnlockClientSessionServerList();
1042                 return SOFTBUS_OK;
1043             }
1044         }
1045     }
1046 
1047     UnlockClientSessionServerList();
1048     TRANS_LOGE(TRANS_SDK, "not found session by channelId=%{public}d", channelId);
1049     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1050 }
1051 
ClientGetSessionIdByChannelId(int32_t channelId,int32_t channelType,int32_t * sessionId,bool isClosing)1052 int32_t ClientGetSessionIdByChannelId(int32_t channelId, int32_t channelType, int32_t *sessionId, bool isClosing)
1053 {
1054     if ((channelId < 0) || (sessionId == NULL)) {
1055         TRANS_LOGW(TRANS_SDK, "Invalid param");
1056         return SOFTBUS_INVALID_PARAM;
1057     }
1058 
1059     int32_t ret = LockClientSessionServerList();
1060     if (ret != SOFTBUS_OK) {
1061         TRANS_LOGE(TRANS_SDK, "lock failed");
1062         return ret;
1063     }
1064 
1065     ClientSessionServer *serverNode = NULL;
1066     SessionInfo *sessionNode = NULL;
1067 
1068     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1069         if (IsListEmpty(&serverNode->sessionList)) {
1070             continue;
1071         }
1072 
1073         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1074             bool flag = (isClosing ? sessionNode->isClosing : true);
1075             if (sessionNode->channelId == channelId && sessionNode->channelType == (ChannelType)channelType && flag) {
1076                 *sessionId = sessionNode->sessionId;
1077                 UnlockClientSessionServerList();
1078                 return SOFTBUS_OK;
1079             }
1080         }
1081     }
1082 
1083     UnlockClientSessionServerList();
1084     TRANS_LOGE(TRANS_SDK, "not found session by channelId=%{public}d", channelId);
1085     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1086 }
1087 
ClientGetSessionIsD2DByChannelId(int32_t channelId,int32_t channelType,bool * isD2D)1088 int32_t ClientGetSessionIsD2DByChannelId(int32_t channelId, int32_t channelType, bool *isD2D)
1089 {
1090     if ((channelId < 0) || (isD2D == NULL)) {
1091         TRANS_LOGW(TRANS_SDK, "Invalid param");
1092         return SOFTBUS_INVALID_PARAM;
1093     }
1094     int32_t ret = LockClientSessionServerList();
1095     if (ret != SOFTBUS_OK) {
1096         TRANS_LOGE(TRANS_SDK, "lock failed");
1097         return ret;
1098     }
1099     ClientSessionServer *serverNode = NULL;
1100     SessionInfo *sessionNode = NULL;
1101     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1102         if (IsListEmpty(&serverNode->sessionList)) {
1103             continue;
1104         }
1105         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1106             if (sessionNode->channelId == channelId && sessionNode->channelType == (ChannelType)channelType) {
1107                 *isD2D = sessionNode->isD2D;
1108                 UnlockClientSessionServerList();
1109                 return SOFTBUS_OK;
1110             }
1111         }
1112     }
1113     UnlockClientSessionServerList();
1114     TRANS_LOGE(TRANS_SDK, "not found session by channelId=%{public}d", channelId);
1115     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1116 }
1117 
ClientGetSessionIsAsyncBySessionId(int32_t sessionId,bool * isAsync)1118 int32_t ClientGetSessionIsAsyncBySessionId(int32_t sessionId, bool *isAsync)
1119 {
1120     if ((sessionId < 0) || (isAsync == NULL)) {
1121         TRANS_LOGW(TRANS_SDK, "Invalid param");
1122         return SOFTBUS_INVALID_PARAM;
1123     }
1124 
1125     int32_t ret = LockClientSessionServerList();
1126     if (ret != SOFTBUS_OK) {
1127         TRANS_LOGE(TRANS_SDK, "lock failed");
1128         return ret;
1129     }
1130     ClientSessionServer *serverNode = NULL;
1131     SessionInfo *sessionNode = NULL;
1132     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1133         if (IsListEmpty(&serverNode->sessionList)) {
1134             continue;
1135         }
1136 
1137         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1138             if (sessionNode->sessionId == sessionId) {
1139                 *isAsync = sessionNode->isAsync;
1140                 UnlockClientSessionServerList();
1141                 return SOFTBUS_OK;
1142             }
1143         }
1144     }
1145 
1146     UnlockClientSessionServerList();
1147     TRANS_LOGE(TRANS_SDK, "not found session with sessionId=%{public}d", sessionId);
1148     return SOFTBUS_NOT_FIND;
1149 }
1150 
GetIsAsyncAndTokenTypeBySessionId(int32_t sessionId,bool * isAsync,int32_t * tokenType)1151 int32_t GetIsAsyncAndTokenTypeBySessionId(int32_t sessionId, bool *isAsync, int32_t *tokenType)
1152 {
1153     if ((sessionId < 0) || (isAsync == NULL) || (tokenType == NULL)) {
1154         TRANS_LOGW(TRANS_SDK, "Invalid param");
1155         return SOFTBUS_INVALID_PARAM;
1156     }
1157 
1158     int32_t ret = LockClientSessionServerList();
1159     if (ret != SOFTBUS_OK) {
1160         TRANS_LOGE(TRANS_SDK, "lock failed");
1161         return ret;
1162     }
1163     ClientSessionServer *serverNode = NULL;
1164     SessionInfo *sessionNode = NULL;
1165     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1166         if (IsListEmpty(&serverNode->sessionList)) {
1167             continue;
1168         }
1169 
1170         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1171             if (sessionNode->sessionId == sessionId) {
1172                 *isAsync = sessionNode->isAsync;
1173                 *tokenType = sessionNode->tokenType;
1174                 UnlockClientSessionServerList();
1175                 return SOFTBUS_OK;
1176             }
1177         }
1178     }
1179 
1180     UnlockClientSessionServerList();
1181     TRANS_LOGE(TRANS_SDK, "not found session with sessionId=%{public}d", sessionId);
1182     return SOFTBUS_NOT_FIND;
1183 }
1184 
ClientGetRouteTypeByChannelId(int32_t channelId,int32_t channelType,int32_t * routeType)1185 int32_t ClientGetRouteTypeByChannelId(int32_t channelId, int32_t channelType, int32_t *routeType)
1186 {
1187     if ((channelId < 0) || (routeType == NULL)) {
1188         TRANS_LOGW(TRANS_SDK, "Invalid param");
1189         return SOFTBUS_INVALID_PARAM;
1190     }
1191 
1192     int32_t ret = LockClientSessionServerList();
1193     if (ret != SOFTBUS_OK) {
1194         TRANS_LOGE(TRANS_SDK, "lock failed");
1195         return ret;
1196     }
1197 
1198     ClientSessionServer *serverNode = NULL;
1199     SessionInfo *sessionNode = NULL;
1200 
1201     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1202         if (IsListEmpty(&serverNode->sessionList)) {
1203             continue;
1204         }
1205 
1206         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1207             if (sessionNode->channelId == channelId && sessionNode->channelType == (ChannelType)channelType) {
1208                 *routeType = sessionNode->routeType;
1209                 UnlockClientSessionServerList();
1210                 return SOFTBUS_OK;
1211             }
1212         }
1213     }
1214 
1215     UnlockClientSessionServerList();
1216     TRANS_LOGE(TRANS_SDK, "not found session by channelId=%{public}d", channelId);
1217     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1218 }
1219 
ClientGetDataConfigByChannelId(int32_t channelId,int32_t channelType,uint32_t * dataConfig)1220 int32_t ClientGetDataConfigByChannelId(int32_t channelId, int32_t channelType, uint32_t *dataConfig)
1221 {
1222     if ((channelId < 0) || (dataConfig == NULL)) {
1223         TRANS_LOGW(TRANS_SDK, "Invalid param");
1224         return SOFTBUS_INVALID_PARAM;
1225     }
1226 
1227     int32_t ret = LockClientSessionServerList();
1228     if (ret != SOFTBUS_OK) {
1229         TRANS_LOGE(TRANS_SDK, "lock failed");
1230         return ret;
1231     }
1232 
1233     ClientSessionServer *serverNode = NULL;
1234     SessionInfo *sessionNode = NULL;
1235 
1236     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1237         if (IsListEmpty(&serverNode->sessionList)) {
1238             continue;
1239         }
1240 
1241         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1242             if (sessionNode->channelId == channelId && sessionNode->channelType == (ChannelType)channelType) {
1243                 *dataConfig = sessionNode->dataConfig;
1244                 UnlockClientSessionServerList();
1245                 return SOFTBUS_OK;
1246             }
1247         }
1248     }
1249 
1250     UnlockClientSessionServerList();
1251     TRANS_LOGE(TRANS_SDK, "not found session by channelId=%{public}d", channelId);
1252     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1253 }
1254 
1255 // Only need to operate on the action guidance ishare auth channel
ClientSetAuthSessionTimer(const ClientSessionServer * serverNode,SessionInfo * sessionNode)1256 static void ClientSetAuthSessionTimer(const ClientSessionServer *serverNode, SessionInfo *sessionNode)
1257 {
1258     if (sessionNode->channelType == CHANNEL_TYPE_AUTH && sessionNode->actionId != 0) {
1259         if (strcmp(serverNode->sessionName, ISHARE_AUTH_SESSION) == 0) {
1260             sessionNode->lifecycle.maxWaitTime = ISHARE_AUTH_SESSION_MAX_IDLE_TIME;
1261             sessionNode->lifecycle.waitTime = 0;
1262             TRANS_LOGI(TRANS_SDK, "set ISHARE auth sessionId=%{public}d waitTime success.", sessionNode->sessionId);
1263             return;
1264         } else if (strcmp(serverNode->sessionName, DM_AUTH_SESSION) == 0) {
1265             sessionNode->lifecycle.maxWaitTime = DM_AUTH_SESSION_MAX_IDLE_TIME;
1266             sessionNode->lifecycle.waitTime = 0;
1267             TRANS_LOGI(TRANS_SDK, "set DM auth sessionId=%{public}d waitTime success.", sessionNode->sessionId);
1268             return;
1269         }
1270     }
1271 }
1272 
ClientEnableSessionByChannelId(const ChannelInfo * channel,int32_t * sessionId)1273 int32_t ClientEnableSessionByChannelId(const ChannelInfo *channel, int32_t *sessionId)
1274 {
1275     TRANS_CHECK_AND_RETURN_RET_LOGE(
1276         (channel != NULL && sessionId != NULL), SOFTBUS_INVALID_PARAM, TRANS_SDK, "Invalid param");
1277 
1278     int32_t ret = LockClientSessionServerList();
1279     if (ret != SOFTBUS_OK) {
1280         TRANS_LOGE(TRANS_SDK, "lock failed");
1281         return ret;
1282     }
1283 
1284     ClientSessionServer *serverNode = NULL;
1285     SessionInfo *sessionNode = NULL;
1286 
1287     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1288         if (IsListEmpty(&serverNode->sessionList)) {
1289             continue;
1290         }
1291 
1292         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1293             if ((sessionNode->channelId == channel->channelId) &&
1294                 (sessionNode->channelType == (ChannelType)(channel->channelType))) {
1295                 sessionNode->peerPid = channel->peerPid;
1296                 sessionNode->peerUid = channel->peerUid;
1297                 sessionNode->isServer = channel->isServer;
1298                 sessionNode->enableStatus = ENABLE_STATUS_SUCCESS;
1299                 sessionNode->routeType = channel->routeType;
1300                 sessionNode->businessType = channel->businessType;
1301                 sessionNode->fileEncrypt = channel->fileEncrypt;
1302                 sessionNode->dataConfig = channel->dataConfig;
1303                 sessionNode->algorithm = channel->algorithm;
1304                 sessionNode->crc = channel->crc;
1305                 sessionNode->isEncrypt = channel->isEncrypt;
1306                 sessionNode->osType = channel->osType;
1307                 *sessionId = sessionNode->sessionId;
1308                 sessionNode->isSupportTlv = channel->isSupportTlv;
1309                 if (channel->channelType == CHANNEL_TYPE_AUTH || !sessionNode->isEncrypt || channel->isD2D) {
1310                     ClientSetAuthSessionTimer(serverNode, sessionNode);
1311                     if (memcpy_s(sessionNode->info.peerDeviceId, DEVICE_ID_SIZE_MAX,
1312                         channel->peerDeviceId, DEVICE_ID_SIZE_MAX) != EOK) {
1313                         UnlockClientSessionServerList();
1314                         return SOFTBUS_MEM_ERR;
1315                     }
1316                 }
1317                 UnlockClientSessionServerList();
1318                 return SOFTBUS_OK;
1319             }
1320         }
1321     }
1322 
1323     UnlockClientSessionServerList();
1324     TRANS_LOGE(TRANS_SDK, "not found session by channelId=%{public}d, channelType=%{public}d",
1325         channel->channelId, channel->channelType);
1326     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1327 }
1328 
ClientGetSessionCallbackById(int32_t sessionId,ISessionListener * callback)1329 int32_t ClientGetSessionCallbackById(int32_t sessionId, ISessionListener *callback)
1330 {
1331     if (sessionId < 0 || callback == NULL) {
1332         TRANS_LOGW(TRANS_SDK, "Invalid param");
1333         return SOFTBUS_INVALID_PARAM;
1334     }
1335 
1336     int32_t ret = LockClientSessionServerList();
1337     if (ret != SOFTBUS_OK) {
1338         TRANS_LOGE(TRANS_SDK, "lock failed");
1339         return ret;
1340     }
1341 
1342     ClientSessionServer *serverNode = NULL;
1343     SessionInfo *sessionNode = NULL;
1344     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
1345         UnlockClientSessionServerList();
1346         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
1347         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1348     }
1349 
1350     ret = memcpy_s(callback, sizeof(ISessionListener), &serverNode->listener.session, sizeof(ISessionListener));
1351     UnlockClientSessionServerList();
1352     if (ret != EOK) {
1353         return SOFTBUS_MEM_ERR;
1354     }
1355     return SOFTBUS_OK;
1356 }
1357 
ClientGetSessionCallbackByName(const char * sessionName,ISessionListener * callback)1358 int32_t ClientGetSessionCallbackByName(const char *sessionName, ISessionListener *callback)
1359 {
1360     if (sessionName == NULL || callback == NULL) {
1361         TRANS_LOGW(TRANS_SDK, "Invalid param");
1362         return SOFTBUS_INVALID_PARAM;
1363     }
1364 
1365     int32_t ret = LockClientSessionServerList();
1366     if (ret != SOFTBUS_OK) {
1367         TRANS_LOGE(TRANS_SDK, "lock failed");
1368         return ret;
1369     }
1370 
1371     ClientSessionServer *serverNode = NULL;
1372 
1373     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1374         if (strcmp(serverNode->sessionName, sessionName) != 0) {
1375             continue;
1376         }
1377 
1378         ret = memcpy_s(callback, sizeof(ISessionListener), &serverNode->listener.session, sizeof(ISessionListener));
1379         UnlockClientSessionServerList();
1380         if (ret != EOK) {
1381             return SOFTBUS_MEM_ERR;
1382         }
1383         return SOFTBUS_OK;
1384     }
1385 
1386     UnlockClientSessionServerList();
1387     char *tmpName = NULL;
1388     Anonymize(sessionName, &tmpName);
1389     TRANS_LOGE(TRANS_SDK, "not found session by sessionName=%{public}s", AnonymizeWrapper(tmpName));
1390     AnonymizeFree(tmpName);
1391     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1392 }
1393 
ClientGetSessionSide(int32_t sessionId)1394 int32_t ClientGetSessionSide(int32_t sessionId)
1395 {
1396     int32_t ret = LockClientSessionServerList();
1397     if (ret != SOFTBUS_OK) {
1398         TRANS_LOGE(TRANS_SDK, "lock failed");
1399         return ret;
1400     }
1401 
1402     int32_t side = -1;
1403     ClientSessionServer *serverNode = NULL;
1404     SessionInfo *sessionNode = NULL;
1405 
1406     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1407         if (IsListEmpty(&serverNode->sessionList)) {
1408             continue;
1409         }
1410         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1411             if (sessionNode->sessionId != sessionId) {
1412                 continue;
1413             }
1414             side = sessionNode->isServer ? IS_SERVER : IS_CLIENT;
1415             UnlockClientSessionServerList();
1416             return side;
1417         }
1418     }
1419     UnlockClientSessionServerList();
1420     return side;
1421 }
1422 
ClientTransLnnOfflineProc(NodeBasicInfo * info)1423 static void ClientTransLnnOfflineProc(NodeBasicInfo *info)
1424 {
1425     TRANS_LOGD(TRANS_SDK, "device offline callback enter.");
1426     if (info == NULL) {
1427         return;
1428     }
1429     if (LockClientSessionServerList() != SOFTBUS_OK) {
1430         TRANS_LOGE(TRANS_SDK, "lock failed");
1431         return;
1432     }
1433 
1434     ClientSessionServer *serverNode = NULL;
1435     ListNode destroyList;
1436     ListInit(&destroyList);
1437     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1438         DestroyClientSessionByNetworkId(serverNode, info->networkId, ROUTE_TYPE_ALL, &destroyList);
1439     }
1440     UnlockClientSessionServerList();
1441     (void)ClientDestroySession(&destroyList, SHUTDOWN_REASON_LNN_OFFLINE);
1442     return;
1443 }
1444 
1445 static INodeStateCb g_transLnnCb = {
1446     .events = EVENT_NODE_STATE_OFFLINE,
1447     .onNodeOffline = ClientTransLnnOfflineProc,
1448 };
1449 
ClientTransRegLnnOffline(void)1450 void ClientTransRegLnnOffline(void)
1451 {
1452     int32_t ret;
1453     ret = RegNodeDeviceStateCbInner("trans", &g_transLnnCb);
1454     if (ret != SOFTBUS_OK) {
1455         TRANS_LOGE(TRANS_SDK, "reg lnn offline fail");
1456     }
1457 }
1458 
ClientTransOnUserSwitch(void)1459 void ClientTransOnUserSwitch(void)
1460 {
1461     if (LockClientSessionServerList() != SOFTBUS_OK) {
1462         TRANS_LOGE(TRANS_SDK, "lock failed");
1463         return;
1464     }
1465     TRANS_LOGD(TRANS_SDK, "recv user switch event, clear all socket");
1466     ClientSessionServer *serverNode = NULL;
1467     ListNode destroyList;
1468     ListInit(&destroyList);
1469     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1470         DestroyAllClientSession(serverNode, &destroyList);
1471     }
1472     UnlockClientSessionServerList();
1473     (void)ClientDestroySession(&destroyList, SHUTDOWN_REASON_USER_SWICTH);
1474 }
1475 
ClientTransOnLinkDown(const char * networkId,int32_t routeType)1476 void ClientTransOnLinkDown(const char *networkId, int32_t routeType)
1477 {
1478     if (networkId == NULL) {
1479         return;
1480     }
1481     uint64_t tokenId = 0;
1482     int32_t ret = SoftBusGetSelfTokenId(&tokenId);
1483     if (ret != SOFTBUS_OK) {
1484         TRANS_LOGE(TRANS_SDK, "get selfTokenId failed");
1485         return;
1486     }
1487     if (LockClientSessionServerList() != SOFTBUS_OK) {
1488         TRANS_LOGE(TRANS_SDK, "lock failed");
1489         return;
1490     }
1491     char *anonyNetworkId = NULL;
1492     Anonymize(networkId, &anonyNetworkId);
1493     TRANS_LOGD(TRANS_SDK, "routeType=%{public}d, networkId=%{public}s", routeType, AnonymizeWrapper(anonyNetworkId));
1494     AnonymizeFree(anonyNetworkId);
1495 
1496     ClientSessionServer *serverNode = NULL;
1497     ListNode destroyList;
1498     ListInit(&destroyList);
1499     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1500         if (strcmp(CAST_SESSION, serverNode->sessionName) == 0 && SoftBusCheckIsSystemService(tokenId)) {
1501             TRANS_LOGD(TRANS_SDK, "cast plus sessionname is different");
1502             continue;
1503         }
1504         DestroyClientSessionByNetworkId(serverNode, networkId, routeType, &destroyList);
1505     }
1506     UnlockClientSessionServerList();
1507     (void)ClientDestroySession(&destroyList, SHUTDOWN_REASON_LINK_DOWN);
1508 }
1509 
ClientGetFileConfigInfoById(int32_t sessionId,int32_t * fileEncrypt,int32_t * algorithm,int32_t * crc)1510 int32_t ClientGetFileConfigInfoById(int32_t sessionId, int32_t *fileEncrypt, int32_t *algorithm, int32_t *crc)
1511 {
1512     if (sessionId < 0 || fileEncrypt == NULL || algorithm == NULL || crc == NULL) {
1513         TRANS_LOGW(TRANS_SDK, "Invalid param");
1514         return SOFTBUS_INVALID_PARAM;
1515     }
1516 
1517     int32_t ret = LockClientSessionServerList();
1518     if (ret != SOFTBUS_OK) {
1519         TRANS_LOGE(TRANS_SDK, "lock failed");
1520         return ret;
1521     }
1522 
1523     ClientSessionServer *serverNode = NULL;
1524     SessionInfo *sessionNode = NULL;
1525     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
1526         UnlockClientSessionServerList();
1527         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
1528         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1529     }
1530     *fileEncrypt = sessionNode->fileEncrypt;
1531     *algorithm = sessionNode->algorithm;
1532     *crc = sessionNode->crc;
1533     UnlockClientSessionServerList();
1534     return SOFTBUS_OK;
1535 }
1536 
ClientCleanAllSessionWhenServerDeath(ListNode * sessionServerInfoList)1537 void ClientCleanAllSessionWhenServerDeath(ListNode *sessionServerInfoList)
1538 {
1539     if (sessionServerInfoList == NULL) {
1540         TRANS_LOGE(TRANS_SDK, "invalid param.");
1541         return;
1542     }
1543 
1544     if (LockClientSessionServerList() != SOFTBUS_OK) {
1545         TRANS_LOGE(TRANS_SDK, "lock failed");
1546         return;
1547     }
1548     uint32_t destroyCnt = 0;
1549     ListNode destroyList;
1550     ListInit(&destroyList);
1551     ClientSessionServer *serverNode = NULL;
1552     SessionInfo *sessionNode = NULL;
1553     SessionInfo *nextSessionNode = NULL;
1554     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1555         serverNode->sessionAddingCnt = 0;
1556         SessionServerInfo *info = CreateSessionServerInfoNode(serverNode);
1557         if (info != NULL) {
1558             ListAdd(sessionServerInfoList, &info->node);
1559         }
1560         if (IsListEmpty(&serverNode->sessionList)) {
1561             continue;
1562         }
1563         LIST_FOR_EACH_ENTRY_SAFE(sessionNode, nextSessionNode, &(serverNode->sessionList), SessionInfo, node) {
1564             if (sessionNode->role == SESSION_ROLE_SERVER) {
1565                 TRANS_LOGD(TRANS_SDK, "cannot delete socket for listening, socket=%{public}d", sessionNode->sessionId);
1566                 continue;
1567             }
1568             DestroySessionInfo *destroyNode = CreateDestroySessionNode(sessionNode, serverNode);
1569             if (destroyNode == NULL) {
1570                 continue;
1571             }
1572             ListAdd(&destroyList, &(destroyNode->node));
1573             DestroySessionId();
1574             ListDelete(&sessionNode->node);
1575             SoftBusFree(sessionNode);
1576             ++destroyCnt;
1577         }
1578     }
1579     UnlockClientSessionServerList();
1580     (void)ClientDestroySession(&destroyList, SHUTDOWN_REASON_SERVICE_DIED);
1581     TRANS_LOGI(TRANS_SDK, "client destroy session cnt=%{public}d.", destroyCnt);
1582 }
1583 
ClientAddSocketServer(SoftBusSecType type,const char * pkgName,const char * sessionName,uint64_t * timestamp)1584 int32_t ClientAddSocketServer(SoftBusSecType type, const char *pkgName, const char *sessionName, uint64_t *timestamp)
1585 {
1586     if (pkgName == NULL || sessionName == NULL || timestamp == NULL) {
1587         return SOFTBUS_INVALID_PARAM;
1588     }
1589 
1590     int32_t ret = LockClientSessionServerList();
1591     if (ret != SOFTBUS_OK) {
1592         TRANS_LOGE(TRANS_SDK, "lock failed");
1593         return ret;
1594     }
1595     if (SocketServerIsExistAndUpdate(sessionName)) {
1596         *timestamp = SoftBusGetSysTimeMs();
1597         UnlockClientSessionServerList();
1598         return SOFTBUS_SERVER_NAME_REPEATED;
1599     }
1600 
1601     if (g_clientSessionServerList->cnt >= MAX_SESSION_SERVER_NUMBER) {
1602         ShowClientSessionServer();
1603         UnlockClientSessionServerList();
1604         TRANS_LOGE(TRANS_SDK, "ClientAddSocketServer: client server num reach max");
1605         return SOFTBUS_INVALID_NUM;
1606     }
1607 
1608     ClientSessionServer *server = GetNewSocketServer(type, sessionName, pkgName);
1609     if (server == NULL) {
1610         UnlockClientSessionServerList();
1611         return SOFTBUS_MEM_ERR;
1612     }
1613     server->permissionState = true;
1614     ListAdd(&g_clientSessionServerList->list, &server->node);
1615     g_clientSessionServerList->cnt++;
1616     *timestamp = SoftBusGetSysTimeMs();
1617 
1618     UnlockClientSessionServerList();
1619     char *anonymizePkgName = NULL;
1620     char *tmpName = NULL;
1621     Anonymize(pkgName, &anonymizePkgName);
1622     Anonymize(sessionName, &tmpName);
1623     TRANS_LOGE(TRANS_SDK, "sessionName=%{public}s, pkgName=%{public}s",
1624         AnonymizeWrapper(tmpName), AnonymizeWrapper(anonymizePkgName));
1625     AnonymizeFree(anonymizePkgName);
1626     AnonymizeFree(tmpName);
1627     return SOFTBUS_OK;
1628 }
1629 
DeletePagingSession(int32_t sessionId,char * pkgName,char * sessionName)1630 int32_t DeletePagingSession(int32_t sessionId, char *pkgName, char *sessionName)
1631 {
1632     int32_t ret = LockClientSessionServerList();
1633     if (ret != SOFTBUS_OK) {
1634         TRANS_LOGE(TRANS_SDK, "lock failed");
1635         return ret;
1636     }
1637     DestroySessionId();
1638     ClientSessionServer *serverNode = NULL;
1639     SessionInfo *sessionNode = NULL;
1640     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
1641         UnlockClientSessionServerList();
1642         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
1643         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1644     }
1645 
1646     if (strcpy_s(pkgName, PKG_NAME_SIZE_MAX, serverNode->pkgName) != EOK) {
1647         UnlockClientSessionServerList();
1648         TRANS_LOGE(TRANS_SDK, "strcpy pkgName failed");
1649         return SOFTBUS_STRCPY_ERR;
1650     }
1651 
1652     if (strcpy_s(sessionName, SESSION_NAME_SIZE_MAX, serverNode->sessionName) != EOK) {
1653         UnlockClientSessionServerList();
1654         TRANS_LOGE(TRANS_SDK, "strcpy sessionName failed");
1655         return SOFTBUS_STRCPY_ERR;
1656     }
1657 
1658     ListDelete(&(sessionNode->node));
1659     TRANS_LOGI(TRANS_SDK, "delete session, sessionId=%{public}d", sessionId);
1660     SoftBusFree(sessionNode);
1661     UnlockClientSessionServerList();
1662     return SOFTBUS_OK;
1663 }
1664 
1665 // need get g_clientSessionServerList->lock before call this function
ClientCheckForkIsPossible(char * socketName,char * peerDeviceId)1666 static int32_t ClientCheckForkIsPossible(char *socketName, char *peerDeviceId)
1667 {
1668     int32_t count = 0;
1669     ClientSessionServer *serverNode = NULL;
1670     SessionInfo *sessionNode = NULL;
1671     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1672         if ((strcmp(serverNode->sessionName, socketName) != EOK) || IsListEmpty(&serverNode->sessionList)) {
1673             continue;
1674         }
1675         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1676             if (sessionNode->isPagingRoot || (strcmp(sessionNode->info.peerDeviceId, peerDeviceId) != EOK)) {
1677                 continue;
1678             }
1679             count++;
1680         }
1681     }
1682     if (count > D2D_FORK_NUM_MAX) {
1683         return SOFTBUS_TRANS_PAGING_SOCKET_IS_FORKED;
1684     }
1685     return SOFTBUS_OK;
1686 }
1687 
ClientGetChannelIdAndTypeBySocketId(int32_t socketId,int32_t * type,int32_t * channelId,char * socketName)1688 int32_t ClientGetChannelIdAndTypeBySocketId(int32_t socketId, int32_t *type, int32_t *channelId, char *socketName)
1689 {
1690     if (type == NULL || channelId == NULL || socketName == NULL) {
1691         TRANS_LOGE(TRANS_SDK, "Invalid param");
1692         return SOFTBUS_INVALID_PARAM;
1693     }
1694 
1695     int32_t ret = LockClientSessionServerList();
1696     if (ret != SOFTBUS_OK) {
1697         TRANS_LOGE(TRANS_SDK, "lock failed");
1698         return ret;
1699     }
1700 
1701     bool existence = false;
1702     bool isServer = false;
1703     char peerDeviceId[DEVICE_ID_SIZE_MAX] = { 0 };
1704     ClientSessionServer *serverNode = NULL;
1705     SessionInfo *sessionNode = NULL;
1706     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1707         if (IsListEmpty(&serverNode->sessionList)) {
1708             continue;
1709         }
1710         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1711             if (sessionNode->sessionId != socketId) {
1712                 continue;
1713             }
1714             *type = sessionNode->businessType;
1715             *channelId = sessionNode->channelId;
1716             isServer = sessionNode->isServer;
1717             existence = true;
1718             if (strcpy_s(socketName, SESSION_NAME_SIZE_MAX, serverNode->sessionName) != EOK ||
1719                 strcpy_s(peerDeviceId, DEVICE_ID_SIZE_MAX, sessionNode->info.peerDeviceId) != EOK) {
1720                 UnlockClientSessionServerList();
1721                 TRANS_LOGE(TRANS_SDK, "strcpy sessionName or deviceId failed");
1722                 return SOFTBUS_STRCPY_ERR;
1723             }
1724             break;
1725         }
1726     }
1727     if (!existence) {
1728         UnlockClientSessionServerList();
1729         TRANS_LOGE(TRANS_SDK, "not found or isServer, socketId=%{public}d", socketId);
1730         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1731     }
1732     ret = ClientCheckForkIsPossible(socketName, peerDeviceId);
1733     UnlockClientSessionServerList();
1734     return ret;
1735 }
1736 
SessionTypeConvert(BusinessType type)1737 static SessionType SessionTypeConvert(BusinessType type)
1738 {
1739     switch (type) {
1740         case BUSINESS_TYPE_BYTE:
1741             return TYPE_BYTES;
1742         case BUSINESS_TYPE_FILE:
1743             return TYPE_FILE;
1744         case BUSINESS_TYPE_D2D_MESSAGE:
1745             return TYPE_D2D_MESSAGE;
1746         case BUSINESS_TYPE_D2D_VOICE:
1747             return TYPE_D2D_VOICE;
1748         default:
1749             return TYPE_MESSAGE;
1750     }
1751 }
1752 
ClientForkSocketById(int32_t socketId,BusinessType type,int32_t * newSocketId)1753 int32_t ClientForkSocketById(int32_t socketId, BusinessType type, int32_t *newSocketId)
1754 {
1755     if (newSocketId == NULL) {
1756         TRANS_LOGE(TRANS_SDK, "newSocketId is null");
1757         return SOFTBUS_INVALID_PARAM;
1758     }
1759     int32_t ret = LockClientSessionServerList();
1760     if (ret != SOFTBUS_OK) {
1761         TRANS_LOGE(TRANS_SDK, "lock failed");
1762         return ret;
1763     }
1764 
1765     ClientSessionServer *serverNode = NULL;
1766     SessionInfo *sessionNode = NULL;
1767     ret = GetSessionById(socketId, &serverNode, &sessionNode);
1768     if (ret != SOFTBUS_OK) {
1769         UnlockClientSessionServerList();
1770         TRANS_LOGE(TRANS_SDK, "session not found. socketId=%{public}d", socketId);
1771         return ret;
1772     }
1773     SessionInfo *newSocket = (SessionInfo *)SoftBusCalloc(sizeof(SessionInfo));
1774     if (newSocket == NULL) {
1775         UnlockClientSessionServerList();
1776         TRANS_LOGE(TRANS_SDK, "calloc sessionInfo failed. socketId=%{public}d", socketId);
1777         return SOFTBUS_MEM_ERR;
1778     }
1779     newSocket->channelType = sessionNode->channelType;
1780     newSocket->businessType = type;
1781     newSocket->isServer = false;
1782     newSocket->isD2D = true;
1783     newSocket->info.flag = SessionTypeConvert(type);
1784     if (strcpy_s(newSocket->info.peerDeviceId, DEVICE_ID_SIZE_MAX, sessionNode->info.peerDeviceId)) {
1785         SoftBusFree(newSocket);
1786         UnlockClientSessionServerList();
1787         TRANS_LOGE(TRANS_SDK, "cpy deviceId failed. socketId=%{public}d", socketId);
1788         return SOFTBUS_STRCPY_ERR;
1789     }
1790     ret = ClientAddNewSession(serverNode->sessionName, newSocket);
1791     if (ret != SOFTBUS_OK) {
1792         SoftBusFree(newSocket);
1793         UnlockClientSessionServerList();
1794         TRANS_LOGE(TRANS_SDK, "add session failed. socketId=%{public}d", socketId);
1795         return ret;
1796     }
1797     *newSocketId = newSocket->sessionId;
1798     UnlockClientSessionServerList();
1799     return SOFTBUS_OK;
1800 }
1801 
DeleteSocketSession(int32_t sessionId,char * pkgName,char * sessionName)1802 int32_t DeleteSocketSession(int32_t sessionId, char *pkgName, char *sessionName)
1803 {
1804     int32_t ret = LockClientSessionServerList();
1805     if (ret != SOFTBUS_OK) {
1806         TRANS_LOGE(TRANS_SDK, "lock failed");
1807         return ret;
1808     }
1809 
1810     ClientSessionServer *serverNode = NULL;
1811     SessionInfo *sessionNode = NULL;
1812     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
1813         UnlockClientSessionServerList();
1814         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
1815         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1816     }
1817 
1818     if (strcpy_s(pkgName, PKG_NAME_SIZE_MAX, serverNode->pkgName) != EOK) {
1819         UnlockClientSessionServerList();
1820         TRANS_LOGE(TRANS_SDK, "strcpy pkgName failed");
1821         return SOFTBUS_STRCPY_ERR;
1822     }
1823 
1824     if (strcpy_s(sessionName, SESSION_NAME_SIZE_MAX, serverNode->sessionName) != EOK) {
1825         UnlockClientSessionServerList();
1826         TRANS_LOGE(TRANS_SDK, "strcpy sessionName failed");
1827         return SOFTBUS_STRCPY_ERR;
1828     }
1829     ListDelete(&(sessionNode->node));
1830     TRANS_LOGI(TRANS_SDK, "delete session, sessionId=%{public}d", sessionId);
1831     DestroySessionId();
1832     if (!sessionNode->lifecycle.condIsWaiting) {
1833         (void)SoftBusCondDestroy(&(sessionNode->lifecycle.callbackCond));
1834     } else {
1835         (void)SoftBusCondSignal(&(sessionNode->lifecycle.callbackCond)); // destroy in CheckSessionEnableStatus
1836         TRANS_LOGI(TRANS_SDK, "sessionId=%{public}d condition is waiting", sessionId);
1837     }
1838     SoftBusFree(sessionNode);
1839     UnlockClientSessionServerList();
1840     return SOFTBUS_OK;
1841 }
1842 
GetSocketExistSession(const SessionParam * param,bool isEncyptedRawStream)1843 static SessionInfo *GetSocketExistSession(const SessionParam *param, bool isEncyptedRawStream)
1844 {
1845     ClientSessionServer *serverNode = NULL;
1846     SessionInfo *sessionInfo = NULL;
1847     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1848         // distributeddata module can create different socket of whether the SocketInfo is same or not
1849         if ((strcmp(serverNode->sessionName, param->sessionName) != 0) || IsListEmpty(&serverNode->sessionList) ||
1850             IsDistributedDataSession(param->sessionName)) {
1851             continue;
1852         }
1853         LIST_FOR_EACH_ENTRY(sessionInfo, &(serverNode->sessionList), SessionInfo, node) {
1854             if (sessionInfo->isServer || (strcmp(sessionInfo->info.peerSessionName, param->peerSessionName) != 0) ||
1855                 (strcmp(sessionInfo->info.peerDeviceId, param->peerDeviceId) != 0) ||
1856                 (strcmp(sessionInfo->info.groupId, param->groupId) != 0) ||
1857                 IsDifferentDataType(sessionInfo, param->attr->dataType, isEncyptedRawStream)) {
1858                 continue;
1859             }
1860             return sessionInfo;
1861         }
1862     }
1863     return NULL;
1864 }
1865 
CreatePagingSession(const char * sessionName,int32_t businessType,int32_t socketId,const ISocketListener * socketListener,bool isClient)1866 int32_t CreatePagingSession(const char *sessionName, int32_t businessType, int32_t socketId,
1867     const ISocketListener *socketListener, bool isClient)
1868 {
1869     TRANS_CHECK_AND_RETURN_RET_LOGE(
1870         (socketId > 0 && sessionName != NULL), SOFTBUS_INVALID_PARAM, TRANS_SDK, "Invalid param");
1871     int32_t ret = LockClientSessionServerList();
1872     TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "lock failed");
1873     SessionInfo *session = (SessionInfo *)SoftBusCalloc(sizeof(SessionInfo));
1874     if (session == NULL) {
1875         UnlockClientSessionServerList();
1876         TRANS_LOGE(TRANS_SDK, "calloc failed");
1877         return SOFTBUS_STRCPY_ERR;
1878     }
1879     session->businessType = businessType;
1880     session->sessionId = socketId;
1881     session->isPagingRoot = true;
1882     ClientSessionServer *serverNode = NULL;
1883     ISocketListener *pagingListen = NULL;
1884     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1885         if (strcmp(serverNode->sessionName, sessionName) != EOK) {
1886             continue;
1887         }
1888         serverNode->listener.isSocketListener = true;
1889         if (isClient) {
1890             pagingListen = &(serverNode->listener.socketClient);
1891             if (memcpy_s(pagingListen, sizeof(ISocketListener), socketListener, sizeof(ISocketListener)) != EOK) {
1892                 SoftBusFree(session);
1893                 UnlockClientSessionServerList();
1894                 return SOFTBUS_MEM_ERR;
1895             }
1896         } else {
1897             session->role = SESSION_ROLE_SERVER;
1898             pagingListen = &(serverNode->listener.socketServer);
1899             if (memcpy_s(pagingListen, sizeof(ISocketListener), socketListener, sizeof(ISocketListener)) != EOK) {
1900                 SoftBusFree(session);
1901                 UnlockClientSessionServerList();
1902                 return SOFTBUS_MEM_ERR;
1903             }
1904         }
1905         ListAdd(&serverNode->sessionList, &session->node);
1906         TRANS_LOGI(TRANS_SDK, "add paging, sessionId=%{public}d", session->sessionId);
1907         UnlockClientSessionServerList();
1908         return SOFTBUS_OK;
1909     }
1910     UnlockClientSessionServerList();
1911     SoftBusFree(session);
1912     return SOFTBUS_TRANS_PAGING_SERVER_NOT_CREATED;
1913 }
1914 
ClientAddSocketSession(const SessionParam * param,bool isEncyptedRawStream,int32_t * sessionId,SessionEnableStatus * isEnabled)1915 int32_t ClientAddSocketSession(
1916     const SessionParam *param, bool isEncyptedRawStream, int32_t *sessionId, SessionEnableStatus *isEnabled)
1917 {
1918     if (param == NULL || param->sessionName == NULL || param->groupId == NULL || param->attr == NULL ||
1919         sessionId == NULL) {
1920         TRANS_LOGE(TRANS_SDK, "Invalid param");
1921         return SOFTBUS_INVALID_PARAM;
1922     }
1923     int32_t ret = LockClientSessionServerList();
1924     if (ret != SOFTBUS_OK) {
1925         TRANS_LOGE(TRANS_SDK, "lock failed");
1926         return ret;
1927     }
1928 
1929     SessionInfo *session = GetSocketExistSession(param, isEncyptedRawStream);
1930     if (session != NULL) {
1931         if (session->lifecycle.bindErrCode != SOFTBUS_TRANS_STOP_BIND_BY_CANCEL) {
1932             *sessionId = session->sessionId;
1933             *isEnabled = session->enableStatus;
1934             UnlockClientSessionServerList();
1935             return SOFTBUS_TRANS_SESSION_REPEATED;
1936         }
1937         TRANS_LOGI(TRANS_SDK, "socket=%{public}d is shutdown", session->sessionId);
1938     }
1939 
1940     session = CreateNewSocketSession(param);
1941     if (session == NULL) {
1942         UnlockClientSessionServerList();
1943         TRANS_LOGE(TRANS_SDK, "create session failed");
1944         return SOFTBUS_TRANS_SESSION_CREATE_FAILED;
1945     }
1946     session->isEncyptedRawStream = isEncyptedRawStream;
1947     ret = AddSession(param->sessionName, session);
1948     if (ret != SOFTBUS_OK) {
1949         SoftBusFree(session);
1950         UnlockClientSessionServerList();
1951         TRANS_LOGE(TRANS_SDK, "Add Session failed, ret=%{public}d", ret);
1952         return ret;
1953     }
1954 
1955     *sessionId = session->sessionId;
1956     UnlockClientSessionServerList();
1957     return SOFTBUS_OK;
1958 }
1959 
ClientSetListenerBySessionId(int32_t sessionId,const ISocketListener * listener,bool isServer)1960 int32_t ClientSetListenerBySessionId(int32_t sessionId, const ISocketListener *listener, bool isServer)
1961 {
1962     if ((sessionId < 0) || listener == NULL) {
1963         TRANS_LOGE(TRANS_SDK, "Invalid param");
1964         return SOFTBUS_INVALID_PARAM;
1965     }
1966     int32_t ret = LockClientSessionServerList();
1967     if (ret != SOFTBUS_OK) {
1968         TRANS_LOGE(TRANS_SDK, "lock failed");
1969         return ret;
1970     }
1971 
1972     ClientSessionServer *serverNode = NULL;
1973     SessionInfo *sessionNode = NULL;
1974     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
1975         UnlockClientSessionServerList();
1976         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
1977         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1978     }
1979 
1980     if (sessionNode->role != SESSION_ROLE_INIT) {
1981         TRANS_LOGE(TRANS_SDK, "socket in use, currentRole=%{public}d", sessionNode->role);
1982         UnlockClientSessionServerList();
1983         return SOFTBUS_TRANS_SOCKET_IN_USE;
1984     }
1985     ISocketListener *socketListener = isServer ? &(serverNode->listener.socketServer) :
1986         &(serverNode->listener.socketClient);
1987     ret = memcpy_s(socketListener, sizeof(ISocketListener), listener, sizeof(ISocketListener));
1988     if (ret != EOK) {
1989         UnlockClientSessionServerList();
1990         TRANS_LOGE(TRANS_SDK, "memcpy_s socketListener failed, ret=%{public}d", ret);
1991         return SOFTBUS_MEM_ERR;
1992     }
1993     serverNode->listener.isSocketListener = true;
1994     if (socketListener->OnFile == NULL) {
1995         UnlockClientSessionServerList();
1996         return SOFTBUS_OK;
1997     }
1998     ret = TransSetSocketFileListener(serverNode->sessionName, socketListener->OnFile, isServer);
1999     if (ret != SOFTBUS_OK) {
2000         UnlockClientSessionServerList();
2001         TRANS_LOGE(TRANS_SDK, "register socket file listener failed");
2002         return ret;
2003     }
2004     UnlockClientSessionServerList();
2005     return SOFTBUS_OK;
2006 }
2007 
ClientIpcOpenSession(int32_t sessionId,const QosTV * qos,uint32_t qosCount,TransInfo * transInfo,bool isAsync)2008 int32_t ClientIpcOpenSession(int32_t sessionId, const QosTV *qos, uint32_t qosCount, TransInfo *transInfo, bool isAsync)
2009 {
2010     if (sessionId < 0 || transInfo == NULL) {
2011         TRANS_LOGE(TRANS_SDK, "Invalid param");
2012         return SOFTBUS_INVALID_PARAM;
2013     }
2014 
2015     int32_t ret = LockClientSessionServerList();
2016     if (ret != SOFTBUS_OK) {
2017         TRANS_LOGE(TRANS_SDK, "lock failed");
2018         return ret;
2019     }
2020 
2021     ClientSessionServer *serverNode = NULL;
2022     SessionInfo *sessionNode = NULL;
2023     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
2024         UnlockClientSessionServerList();
2025         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
2026         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2027     }
2028     ret = CheckBindSocketInfo(sessionNode);
2029     if (ret != SOFTBUS_OK) {
2030         UnlockClientSessionServerList();
2031         TRANS_LOGE(TRANS_SDK, "check socekt info failed, ret=%{public}d", ret);
2032         return ret;
2033     }
2034 
2035     SessionAttribute tmpAttr;
2036     (void)memset_s(&tmpAttr, sizeof(SessionAttribute), 0, sizeof(SessionAttribute));
2037     SessionParam param;
2038     FillSessionParam(&param, &tmpAttr, serverNode, sessionNode);
2039     UnlockClientSessionServerList();
2040 
2041     param.qosCount = qosCount;
2042     if (param.qosCount > 0 && memcpy_s(param.qos, sizeof(param.qos), qos, sizeof(QosTV) * qosCount) != EOK) {
2043         TRANS_LOGE(TRANS_SDK, "memcpy qos failed");
2044         return SOFTBUS_MEM_ERR;
2045     }
2046     param.isAsync = isAsync;
2047     param.sessionId = sessionId;
2048     ret = SetSessionStateBySessionId(param.sessionId, SESSION_STATE_OPENING, 0);
2049     TRANS_CHECK_AND_RETURN_RET_LOGE(
2050         ret == SOFTBUS_OK, ret, TRANS_SDK, "set session state failed, maybe cancel, ret=%{public}d", ret);
2051     ret = ServerIpcOpenSession(&param, transInfo);
2052     if (ret != SOFTBUS_OK) {
2053         ClientConvertRetVal(sessionId, &ret);
2054         TRANS_LOGE(TRANS_SDK, "open session ipc err: ret=%{public}d", ret);
2055         return ret;
2056     }
2057     return SOFTBUS_OK;
2058 }
2059 
ClientSetActionIdBySessionId(int32_t sessionId,uint32_t actionId)2060 int32_t ClientSetActionIdBySessionId(int32_t sessionId, uint32_t actionId)
2061 {
2062     if ((sessionId < 0) || actionId == 0) {
2063         TRANS_LOGE(TRANS_SDK, "Invalid param");
2064         return SOFTBUS_INVALID_PARAM;
2065     }
2066     int32_t ret = LockClientSessionServerList();
2067     if (ret != SOFTBUS_OK) {
2068         TRANS_LOGE(TRANS_SDK, "lock failed");
2069         return ret;
2070     }
2071 
2072     ClientSessionServer *serverNode = NULL;
2073     SessionInfo *sessionNode = NULL;
2074 
2075     ret = GetSessionById(sessionId, &serverNode, &sessionNode);
2076     if (ret != SOFTBUS_OK) {
2077         UnlockClientSessionServerList();
2078         TRANS_LOGE(TRANS_SDK, "not found");
2079         return ret;
2080     }
2081 
2082     if (sessionNode->role != SESSION_ROLE_INIT) {
2083         TRANS_LOGE(TRANS_SDK, "socket in use, currentRole=%{public}d", sessionNode->role);
2084         UnlockClientSessionServerList();
2085         return SOFTBUS_TRANS_SOCKET_IN_USE;
2086     }
2087 
2088     sessionNode->actionId = actionId;
2089     UnlockClientSessionServerList();
2090     return SOFTBUS_OK;
2091 }
2092 
ClientHandleBindWaitTimer(int32_t socket,uint32_t maxWaitTime,TimerAction action)2093 int32_t ClientHandleBindWaitTimer(int32_t socket, uint32_t maxWaitTime, TimerAction action)
2094 {
2095     if (socket <= 0) {
2096         TRANS_LOGE(TRANS_SDK, "Invalid socket=%{public}d", socket);
2097         return SOFTBUS_INVALID_PARAM;
2098     }
2099 
2100     if (action < TIMER_ACTION_START || action >= TIMER_ACTION_BUTT) {
2101         TRANS_LOGE(TRANS_SDK, "Invalid action=%{public}d", action);
2102         return SOFTBUS_INVALID_PARAM;
2103     }
2104 
2105     int32_t ret = LockClientSessionServerList();
2106     if (ret != SOFTBUS_OK) {
2107         TRANS_LOGE(TRANS_SDK, "lock failed");
2108         return ret;
2109     }
2110 
2111     ClientSessionServer *serverNode = NULL;
2112     SessionInfo *sessionNode = NULL;
2113     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
2114         UnlockClientSessionServerList();
2115         TRANS_LOGE(TRANS_SDK, "socket not found. socket=%{public}d", socket);
2116         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2117     }
2118     if (action == TIMER_ACTION_START) {
2119         TRANS_LOGI(TRANS_SDK,
2120             "socket=%{public}d, inputMaxWaitTime=%{public}u, maxWaitTime=%{public}u, enableStatus=%{public}d",
2121             socket, maxWaitTime, sessionNode->lifecycle.maxWaitTime, sessionNode->enableStatus);
2122         bool binding = (sessionNode->lifecycle.maxWaitTime != 0);
2123         bool bindSuccess =
2124             (sessionNode->lifecycle.maxWaitTime == 0 && sessionNode->enableStatus == ENABLE_STATUS_SUCCESS);
2125         if (binding) {
2126             UnlockClientSessionServerList();
2127             TRANS_LOGE(TRANS_SDK, "socket=%{public}d The socket is binding", socket);
2128             return SOFTBUS_TRANS_SOCKET_IN_USE;
2129         }
2130         if (bindSuccess) {
2131             UnlockClientSessionServerList();
2132             TRANS_LOGW(TRANS_SDK, "socket=%{public}d The socket was bound successfully", socket);
2133             return SOFTBUS_ALREADY_TRIGGERED;
2134         }
2135     }
2136 
2137     sessionNode->lifecycle.maxWaitTime = (action == TIMER_ACTION_START) ? maxWaitTime : 0;
2138     sessionNode->lifecycle.waitTime = 0;
2139     UnlockClientSessionServerList();
2140     return SOFTBUS_OK;
2141 }
2142 
ClientSetSocketState(int32_t socket,uint32_t maxIdleTimeout,SessionRole role)2143 int32_t ClientSetSocketState(int32_t socket, uint32_t maxIdleTimeout, SessionRole role)
2144 {
2145     if (socket < 0) {
2146         TRANS_LOGE(TRANS_SDK, "Invalid param");
2147         return SOFTBUS_INVALID_PARAM;
2148     }
2149 
2150     int32_t ret = LockClientSessionServerList();
2151     if (ret != SOFTBUS_OK) {
2152         TRANS_LOGE(TRANS_SDK, "lock failed");
2153         return ret;
2154     }
2155 
2156     ClientSessionServer *serverNode = NULL;
2157     SessionInfo *sessionNode = NULL;
2158     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
2159         UnlockClientSessionServerList();
2160         TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", socket);
2161         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2162     }
2163 
2164     sessionNode->role = role;
2165     if (sessionNode->role == SESSION_ROLE_CLIENT) {
2166         sessionNode->maxIdleTime = maxIdleTimeout;
2167     }
2168     if (sessionNode->role == SESSION_ROLE_SERVER) {
2169         serverNode->isSrvEncryptedRawStream = sessionNode->isEncyptedRawStream;
2170     }
2171     UnlockClientSessionServerList();
2172     return SOFTBUS_OK;
2173 }
2174 
ClientDfsIpcOpenSession(int32_t sessionId,TransInfo * transInfo)2175 int32_t ClientDfsIpcOpenSession(int32_t sessionId, TransInfo *transInfo)
2176 {
2177     if (sessionId < 0 || transInfo == NULL) {
2178         TRANS_LOGE(TRANS_SDK, "Invalid param");
2179         return SOFTBUS_INVALID_PARAM;
2180     }
2181 
2182     int32_t ret = LockClientSessionServerList();
2183     if (ret != SOFTBUS_OK) {
2184         TRANS_LOGE(TRANS_SDK, "lock failed");
2185         return ret;
2186     }
2187 
2188     ClientSessionServer *serverNode = NULL;
2189     SessionInfo *sessionNode = NULL;
2190     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
2191         UnlockClientSessionServerList();
2192         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
2193         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2194     }
2195     ret = CheckBindSocketInfo(sessionNode);
2196     if (ret != SOFTBUS_OK) {
2197         UnlockClientSessionServerList();
2198         TRANS_LOGE(TRANS_SDK, "check socekt info failed, ret=%{public}d", ret);
2199         return ret;
2200     }
2201 
2202     SessionAttribute tmpAttr;
2203     (void)memset_s(&tmpAttr, sizeof(SessionAttribute), 0, sizeof(SessionAttribute));
2204     SessionParam param;
2205     FillDfsSocketParam(&param, &tmpAttr, serverNode, sessionNode);
2206     UnlockClientSessionServerList();
2207 
2208     param.sessionId = sessionId;
2209     ret = SetSessionStateBySessionId(param.sessionId, SESSION_STATE_OPENING, 0);
2210     TRANS_CHECK_AND_RETURN_RET_LOGE(
2211         ret == SOFTBUS_OK, ret, TRANS_SDK, "set session state failed, maybe cancel, ret=%{public}d", ret);
2212     ret = ServerIpcOpenSession(&param, transInfo);
2213     if (ret != SOFTBUS_OK) {
2214         ClientConvertRetVal(sessionId, &ret);
2215         TRANS_LOGE(TRANS_SDK, "open session ipc err: ret=%{public}d", ret);
2216         return ret;
2217     }
2218     return SOFTBUS_OK;
2219 }
2220 
ClientGetSessionCallbackAdapterByName(const char * sessionName,SessionListenerAdapter * callbackAdapter)2221 int32_t ClientGetSessionCallbackAdapterByName(const char *sessionName, SessionListenerAdapter *callbackAdapter)
2222 {
2223     if (sessionName == NULL || callbackAdapter == NULL) {
2224         TRANS_LOGE(TRANS_SDK, "Invalid param");
2225         return SOFTBUS_INVALID_PARAM;
2226     }
2227 
2228     int32_t ret = LockClientSessionServerList();
2229     if (ret != SOFTBUS_OK) {
2230         TRANS_LOGE(TRANS_SDK, "lock failed");
2231         return ret;
2232     }
2233 
2234     ClientSessionServer *serverNode = NULL;
2235 
2236     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
2237         if (strcmp(serverNode->sessionName, sessionName) != 0) {
2238             continue;
2239         }
2240 
2241         ret = memcpy_s(callbackAdapter, sizeof(SessionListenerAdapter),
2242             &serverNode->listener, sizeof(SessionListenerAdapter));
2243         UnlockClientSessionServerList();
2244         if (ret != EOK) {
2245             char *tmpName = NULL;
2246             Anonymize(sessionName, &tmpName);
2247             TRANS_LOGE(TRANS_SDK,
2248                 "memcpy SessionListenerAdapter failed, sessionName=%{public}s, ret=%{public}d",
2249                 AnonymizeWrapper(tmpName), ret);
2250             AnonymizeFree(tmpName);
2251             return SOFTBUS_MEM_ERR;
2252         }
2253         return SOFTBUS_OK;
2254     }
2255 
2256     UnlockClientSessionServerList();
2257     char *tmpName = NULL;
2258     Anonymize(sessionName, &tmpName);
2259     TRANS_LOGE(TRANS_SDK, "SessionCallbackAdapter not found, sessionName=%{public}s", AnonymizeWrapper(tmpName));
2260     AnonymizeFree(tmpName);
2261     return SOFTBUS_NOT_FIND;
2262 }
2263 
ClientGetSessionCallbackAdapterById(int32_t sessionId,SessionListenerAdapter * callbackAdapter,bool * isServer)2264 int32_t ClientGetSessionCallbackAdapterById(int32_t sessionId, SessionListenerAdapter *callbackAdapter, bool *isServer)
2265 {
2266     if (sessionId < 0 || callbackAdapter == NULL) {
2267         TRANS_LOGE(TRANS_SDK, "Invalid param");
2268         return SOFTBUS_INVALID_PARAM;
2269     }
2270 
2271     int32_t ret = LockClientSessionServerList();
2272     if (ret != SOFTBUS_OK) {
2273         TRANS_LOGE(TRANS_SDK, "lock failed");
2274         return ret;
2275     }
2276 
2277     ClientSessionServer *serverNode = NULL;
2278     SessionInfo *sessionNode = NULL;
2279     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
2280         UnlockClientSessionServerList();
2281         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
2282         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2283     }
2284 
2285     ret = memcpy_s(callbackAdapter, sizeof(SessionListenerAdapter), &serverNode->listener,
2286         sizeof(SessionListenerAdapter));
2287     *isServer = sessionNode->isServer;
2288     UnlockClientSessionServerList();
2289     if (ret != EOK) {
2290         TRANS_LOGE(TRANS_SDK,
2291             "memcpy SessionListenerAdapter failed, socket=%{public}d, ret=%{public}d", sessionId, ret);
2292         return SOFTBUS_MEM_ERR;
2293     }
2294     return SOFTBUS_OK;
2295 }
2296 
ClientGetPeerSocketInfoById(int32_t socket,PeerSocketInfo * peerSocketInfo)2297 int32_t ClientGetPeerSocketInfoById(int32_t socket, PeerSocketInfo *peerSocketInfo)
2298 {
2299     if (socket < 0 || peerSocketInfo == NULL) {
2300         TRANS_LOGE(TRANS_SDK, "Invalid param");
2301         return SOFTBUS_INVALID_PARAM;
2302     }
2303 
2304     int32_t ret = LockClientSessionServerList();
2305     if (ret != SOFTBUS_OK) {
2306         TRANS_LOGE(TRANS_SDK, "lock failed");
2307         return ret;
2308     }
2309 
2310     ClientSessionServer *serverNode = NULL;
2311     SessionInfo *sessionNode = NULL;
2312     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
2313         UnlockClientSessionServerList();
2314         TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", socket);
2315         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2316     }
2317 
2318     peerSocketInfo->name = sessionNode->info.peerSessionName;
2319     peerSocketInfo->networkId = sessionNode->info.peerDeviceId;
2320     peerSocketInfo->pkgName = serverNode->pkgName;
2321     peerSocketInfo->dataType = (TransDataType)sessionNode->info.flag;
2322     if (sessionNode->isD2D) {
2323         peerSocketInfo->accountId = sessionNode->peerPagingAccountId;
2324         peerSocketInfo->dataLen = sessionNode->dataLen;
2325         if (sessionNode->dataLen > 0) {
2326             peerSocketInfo->extraData = (void *)sessionNode->extraData;
2327         }
2328     }
2329     UnlockClientSessionServerList();
2330     return SOFTBUS_OK;
2331 }
2332 
IsSessionExceedLimit(void)2333 bool IsSessionExceedLimit(void)
2334 {
2335     if (LockClientSessionServerList() != SOFTBUS_OK) {
2336         TRANS_LOGE(TRANS_SDK, "lock failed");
2337         return true;
2338     }
2339     if (g_sessionIdNum >= MAX_SESSION_ID) {
2340         UnlockClientSessionServerList();
2341         TRANS_LOGE(TRANS_SDK, "sessionId num exceed limit.");
2342         return true;
2343     }
2344     UnlockClientSessionServerList();
2345     return false;
2346 }
2347 
ClientTransSessionTimerProc(void)2348 static void ClientTransSessionTimerProc(void)
2349 {
2350     if (LockClientSessionServerList() != SOFTBUS_OK) {
2351         TRANS_LOGE(TRANS_SDK, "lock failed");
2352         return;
2353     }
2354 
2355     ClientSessionServer *serverNode = NULL;
2356     SessionInfo *sessionNode = NULL;
2357     SessionInfo *nextSessionNode = NULL;
2358     ListNode destroyList;
2359     ListInit(&destroyList);
2360     int32_t waitOutSocket[MAX_SESSION_ID] = { 0 };
2361     uint32_t waitOutNum = 0;
2362     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
2363         if (IsListEmpty(&serverNode->sessionList)) {
2364             continue;
2365         }
2366         LIST_FOR_EACH_ENTRY_SAFE(sessionNode, nextSessionNode, &(serverNode->sessionList), SessionInfo, node) {
2367             ClientCheckWaitTimeOut(serverNode, sessionNode, waitOutSocket, MAX_SESSION_ID, &waitOutNum);
2368             ClientUpdateIdleTimeout(serverNode, sessionNode, &destroyList);
2369         }
2370     }
2371     UnlockClientSessionServerList();
2372     (void)ClientCleanUpIdleTimeoutSocket(&destroyList);
2373     (void)ClientCleanUpWaitTimeoutSocket(waitOutSocket, waitOutNum);
2374 }
2375 
ClientTransAsyncSendBytesTimerProc(void)2376 static void ClientTransAsyncSendBytesTimerProc(void)
2377 {
2378     return TransAsyncSendBytesTimeoutProc();
2379 }
2380 
ClientResetIdleTimeoutById(int32_t sessionId)2381 int32_t ClientResetIdleTimeoutById(int32_t sessionId)
2382 {
2383     if (sessionId <= 0) {
2384         TRANS_LOGE(TRANS_SDK, "invalid sessionId");
2385         return SOFTBUS_TRANS_INVALID_SESSION_ID;
2386     }
2387 
2388     int32_t ret = LockClientSessionServerList();
2389     if (ret != SOFTBUS_OK) {
2390         TRANS_LOGE(TRANS_SDK, "lock failed");
2391         return ret;
2392     }
2393 
2394     ClientSessionServer *serverNode = NULL;
2395     SessionInfo *sessionNode = NULL;
2396     SessionInfo *nextSessionNode = NULL;
2397     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
2398         if (IsListEmpty(&serverNode->sessionList)) {
2399             continue;
2400         }
2401         LIST_FOR_EACH_ENTRY_SAFE(sessionNode, nextSessionNode, &(serverNode->sessionList), SessionInfo, node) {
2402             if (sessionNode->sessionId == sessionId) {
2403                 sessionNode->timeout = 0;
2404                 UnlockClientSessionServerList();
2405                 TRANS_LOGD(TRANS_SDK, "reset timeout of sessionId=%{public}d", sessionId);
2406                 return SOFTBUS_OK;
2407             }
2408         }
2409     }
2410     UnlockClientSessionServerList();
2411     TRANS_LOGE(TRANS_SDK, "not found session by sessionId=%{public}d", sessionId);
2412     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2413 }
2414 
ClientGetSessionNameByChannelId(int32_t channelId,int32_t channelType,char * sessionName,int32_t len)2415 int32_t ClientGetSessionNameByChannelId(int32_t channelId, int32_t channelType, char *sessionName, int32_t len)
2416 {
2417     if (channelId < 0 || sessionName == NULL || len <= 0 || len > SESSION_NAME_SIZE_MAX) {
2418         TRANS_LOGW(TRANS_SDK, "Invalid param");
2419         return SOFTBUS_INVALID_PARAM;
2420     }
2421 
2422     int32_t ret = LockClientSessionServerList();
2423     if (ret != SOFTBUS_OK) {
2424         TRANS_LOGE(TRANS_SDK, "lock failed");
2425         return ret;
2426     }
2427 
2428     ClientSessionServer *serverNode = NULL;
2429     SessionInfo *sessionNode = NULL;
2430 
2431     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
2432         if (IsListEmpty(&serverNode->sessionList)) {
2433             continue;
2434         }
2435 
2436         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
2437             if (sessionNode->channelId == channelId && sessionNode->channelType == (ChannelType)channelType) {
2438                 (void)memcpy_s(sessionName, len, serverNode->sessionName, SESSION_NAME_SIZE_MAX);
2439                 UnlockClientSessionServerList();
2440                 return SOFTBUS_OK;
2441             }
2442         }
2443     }
2444 
2445     UnlockClientSessionServerList();
2446     TRANS_LOGE(TRANS_SDK, "not found session with channelId=%{public}d", channelId);
2447     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2448 }
2449 
ClientRawStreamEncryptDefOptGet(const char * sessionName,bool * isEncrypt)2450 int32_t ClientRawStreamEncryptDefOptGet(const char *sessionName, bool *isEncrypt)
2451 {
2452     if (sessionName == NULL || isEncrypt == NULL) {
2453         TRANS_LOGE(TRANS_SDK, "Invalid param");
2454         return SOFTBUS_INVALID_PARAM;
2455     }
2456 
2457     int32_t ret = LockClientSessionServerList();
2458     if (ret != SOFTBUS_OK) {
2459         TRANS_LOGE(TRANS_SDK, "lock failed");
2460         return ret;
2461     }
2462 
2463     ClientSessionServer *serverNode = NULL;
2464     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
2465         if (strcmp(serverNode->sessionName, sessionName) == 0) {
2466             *isEncrypt = serverNode->isSrvEncryptedRawStream;
2467             UnlockClientSessionServerList();
2468             return SOFTBUS_OK;
2469         }
2470     }
2471     UnlockClientSessionServerList();
2472     char *tmpName = NULL;
2473     Anonymize(sessionName, &tmpName);
2474     TRANS_LOGE(TRANS_SDK, "not found ClientSessionServer by sessionName=%{public}s", AnonymizeWrapper(tmpName));
2475     AnonymizeFree(tmpName);
2476     return SOFTBUS_TRANS_SESSION_SERVER_NOT_FOUND;
2477 }
2478 
ClientRawStreamEncryptOptGet(int32_t sessionId,int32_t channelId,int32_t channelType,bool * isEncrypt)2479 int32_t ClientRawStreamEncryptOptGet(int32_t sessionId, int32_t channelId, int32_t channelType, bool *isEncrypt)
2480 {
2481     if (channelId < 0 || isEncrypt == NULL) {
2482         TRANS_LOGE(TRANS_SDK, "Invalid param");
2483         return SOFTBUS_INVALID_PARAM;
2484     }
2485 
2486     int32_t ret = LockClientSessionServerList();
2487     if (ret != SOFTBUS_OK) {
2488         TRANS_LOGE(TRANS_SDK, "lock failed");
2489         return ret;
2490     }
2491 
2492     ClientSessionServer *serverNode = NULL;
2493     SessionInfo *sessionNode = NULL;
2494     SessionInfo *nextSessionNode = NULL;
2495     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
2496         if (IsListEmpty(&serverNode->sessionList)) {
2497             continue;
2498         }
2499         LIST_FOR_EACH_ENTRY_SAFE(sessionNode, nextSessionNode, &(serverNode->sessionList), SessionInfo, node) {
2500             if ((sessionNode->channelId == channelId && sessionNode->channelType == (ChannelType)channelType) ||
2501                 sessionNode->sessionId == sessionId) {
2502                 *isEncrypt = sessionNode->isEncyptedRawStream;
2503                 UnlockClientSessionServerList();
2504                 return SOFTBUS_OK;
2505             }
2506         }
2507     }
2508     UnlockClientSessionServerList();
2509     TRANS_LOGE(TRANS_SDK, "not found session by channelId=%{public}d", channelId);
2510     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2511 }
2512 
SetSessionIsAsyncById(int32_t sessionId,bool isAsync)2513 int32_t SetSessionIsAsyncById(int32_t sessionId, bool isAsync)
2514 {
2515     if (sessionId <= 0) {
2516         TRANS_LOGE(TRANS_SDK, "invalid sessionId");
2517         return SOFTBUS_INVALID_PARAM;
2518     }
2519 
2520     int32_t ret = LockClientSessionServerList();
2521     if (ret != SOFTBUS_OK) {
2522         TRANS_LOGE(TRANS_SDK, "lock failed");
2523         return ret;
2524     }
2525 
2526     ClientSessionServer *serverNode = NULL;
2527     SessionInfo *sessionNode = NULL;
2528     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
2529         if (IsListEmpty(&serverNode->sessionList)) {
2530             continue;
2531         }
2532         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
2533             if (sessionNode->sessionId == sessionId) {
2534                 sessionNode->isAsync = isAsync;
2535                 UnlockClientSessionServerList();
2536                 return SOFTBUS_OK;
2537             }
2538         }
2539     }
2540     UnlockClientSessionServerList();
2541     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2542 }
2543 
SetSessionInitInfoById(int32_t sessionId)2544 int32_t SetSessionInitInfoById(int32_t sessionId)
2545 {
2546     if (sessionId <= 0) {
2547         TRANS_LOGE(TRANS_SDK, "invalid sessionId");
2548         return SOFTBUS_TRANS_INVALID_SESSION_ID;
2549     }
2550 
2551     int32_t ret = LockClientSessionServerList();
2552     if (ret != SOFTBUS_OK) {
2553         TRANS_LOGE(TRANS_SDK, "lock failed");
2554         return ret;
2555     }
2556 
2557     ClientSessionServer *serverNode = NULL;
2558     SessionInfo *sessionNode = NULL;
2559     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
2560         if (IsListEmpty(&serverNode->sessionList)) {
2561             continue;
2562         }
2563         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
2564             if (sessionNode->sessionId == sessionId) {
2565                 sessionNode->enableStatus = ENABLE_STATUS_INIT;
2566                 sessionNode->channelId = INVALID_CHANNEL_ID;
2567                 sessionNode->channelType = CHANNEL_TYPE_BUTT;
2568                 sessionNode->lifecycle.sessionState = SESSION_STATE_INIT;
2569                 UnlockClientSessionServerList();
2570                 return SOFTBUS_OK;
2571             }
2572         }
2573     }
2574     UnlockClientSessionServerList();
2575     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2576 }
2577 
ClientTransSetChannelInfo(const char * sessionName,int32_t sessionId,int32_t channelId,int32_t channelType)2578 int32_t ClientTransSetChannelInfo(const char *sessionName, int32_t sessionId, int32_t channelId, int32_t channelType)
2579 {
2580     if (sessionName == NULL || sessionId <= 0) {
2581         TRANS_LOGE(TRANS_SDK, "invalid session info");
2582         return SOFTBUS_INVALID_PARAM;
2583     }
2584 
2585     int32_t ret = LockClientSessionServerList();
2586     if (ret != SOFTBUS_OK) {
2587         TRANS_LOGE(TRANS_SDK, "lock failed");
2588         return ret;
2589     }
2590     ClientSessionServer *serverNode = NULL;
2591     SessionInfo *sessionNode = NULL;
2592     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
2593         UnlockClientSessionServerList();
2594         TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", sessionId);
2595         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2596     }
2597     if (sessionNode->lifecycle.sessionState == SESSION_STATE_CANCELLING) {
2598         TRANS_LOGW(TRANS_SDK, "this socket already in cancelling state. socketFd=%{public}d", sessionId);
2599         UnlockClientSessionServerList();
2600         return sessionNode->lifecycle.bindErrCode;
2601     }
2602     sessionNode->channelId = channelId;
2603     sessionNode->channelType = (ChannelType)channelType;
2604     sessionNode->lifecycle.sessionState = SESSION_STATE_OPENED;
2605     UnlockClientSessionServerList();
2606     return SOFTBUS_OK;
2607 }
2608 
GetSocketLifecycleAndSessionNameBySessionId(int32_t sessionId,char * sessionName,SocketLifecycleData * lifecycle)2609 int32_t GetSocketLifecycleAndSessionNameBySessionId(
2610     int32_t sessionId, char *sessionName, SocketLifecycleData *lifecycle)
2611 {
2612     if (sessionId <= 0 || lifecycle == NULL) {
2613         TRANS_LOGE(TRANS_SDK, "invalid param, sessionId =%{public}d", sessionId);
2614         return SOFTBUS_INVALID_PARAM;
2615     }
2616 
2617     int32_t ret = LockClientSessionServerList();
2618     if (ret != SOFTBUS_OK) {
2619         TRANS_LOGE(TRANS_SDK, "lock failed");
2620         return ret;
2621     }
2622 
2623     ClientSessionServer *serverNode = NULL;
2624     SessionInfo *sessionNode = NULL;
2625     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
2626         UnlockClientSessionServerList();
2627         TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", sessionId);
2628         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2629     }
2630     *lifecycle = sessionNode->lifecycle;
2631     if (sessionName != NULL && strcpy_s(sessionName, SESSION_NAME_SIZE_MAX, serverNode->sessionName) != EOK) {
2632         UnlockClientSessionServerList();
2633         return SOFTBUS_STRCPY_ERR;
2634     }
2635     UnlockClientSessionServerList();
2636     return SOFTBUS_OK;
2637 }
2638 
AddSessionStateClosing(void)2639 void AddSessionStateClosing(void)
2640 {
2641     if (LockClientSessionServerList() != SOFTBUS_OK) {
2642         TRANS_LOGE(TRANS_SDK, "lock failed");
2643         return;
2644     }
2645     g_closingIdNum++;
2646     UnlockClientSessionServerList();
2647 }
2648 
DelSessionStateClosing(void)2649 void DelSessionStateClosing(void)
2650 {
2651     if (LockClientSessionServerList() != SOFTBUS_OK) {
2652         TRANS_LOGE(TRANS_SDK, "lock failed");
2653         return;
2654     }
2655     if (g_closingIdNum > 0) {
2656         g_closingIdNum--;
2657     }
2658     UnlockClientSessionServerList();
2659 }
2660 
SetSessionStateBySessionId(int32_t sessionId,SessionState sessionState,int32_t optional)2661 int32_t SetSessionStateBySessionId(int32_t sessionId, SessionState sessionState, int32_t optional)
2662 {
2663     if (sessionId <= 0) {
2664         TRANS_LOGE(TRANS_SDK, "invalid sessionId =%{public}d", sessionId);
2665         return SOFTBUS_TRANS_INVALID_SESSION_ID;
2666     }
2667 
2668     int32_t ret = LockClientSessionServerList();
2669     if (ret != SOFTBUS_OK) {
2670         TRANS_LOGE(TRANS_SDK, "lock failed");
2671         return ret;
2672     }
2673 
2674     ClientSessionServer *serverNode = NULL;
2675     SessionInfo *sessionNode = NULL;
2676     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
2677         UnlockClientSessionServerList();
2678         TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", sessionId);
2679         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2680     }
2681 
2682     TRANS_LOGI(TRANS_SDK, "socket state change:%{public}d -> %{public}d. socket=%{public}d",
2683         sessionNode->lifecycle.sessionState, sessionState, sessionId);
2684     sessionNode->lifecycle.sessionState = sessionState;
2685     if (sessionState == SESSION_STATE_CANCELLING) {
2686         TRANS_LOGW(TRANS_SDK, "set socket to cancelling, socket=%{public}d, errCode=%{public}d", sessionId, optional);
2687         sessionNode->lifecycle.bindErrCode = optional;
2688     }
2689     UnlockClientSessionServerList();
2690     return SOFTBUS_OK;
2691 }
2692 
CheckSessionEnableStatus(int32_t socket,SoftBusCond * callbackCond)2693 static int32_t CheckSessionEnableStatus(int32_t socket, SoftBusCond *callbackCond)
2694 {
2695     int32_t ret = LockClientSessionServerList();
2696     if (ret != SOFTBUS_OK) {
2697         TRANS_LOGE(TRANS_SDK, "lock failed socket=%{public}d", socket);
2698         return ret;
2699     }
2700 
2701     ClientSessionServer *serverNode = NULL;
2702     SessionInfo *sessionNode = NULL;
2703     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
2704         UnlockClientSessionServerList();
2705         (void)SoftBusCondDestroy(callbackCond);
2706         TRANS_LOGE(TRANS_SDK, "socket=%{public}d not found, destroy condition", socket);
2707         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2708     }
2709     sessionNode->lifecycle.condIsWaiting = false;
2710     ret = sessionNode->lifecycle.bindErrCode;
2711     if (sessionNode->enableStatus != ENABLE_STATUS_SUCCESS) {
2712         UnlockClientSessionServerList();
2713         // enableStatus=false and ret=SOFTBUS_OK, is an unexpected state
2714         if (ret == SOFTBUS_OK) {
2715             TRANS_LOGE(TRANS_SDK, "invalid bindErrCode, socket=%{public}d, ret=%{public}d", socket, ret);
2716             return SOFTBUS_TRANS_SESSION_NO_ENABLE;
2717         }
2718         TRANS_LOGE(TRANS_SDK, "Bind fail, socket=%{public}d, ret=%{public}d", socket, ret);
2719         return ret;
2720     }
2721     UnlockClientSessionServerList();
2722     TRANS_LOGI(TRANS_SDK, "socket=%{public}d is enable, ret=%{public}d", socket, ret);
2723     return ret;
2724 }
2725 
ClientWaitSyncBind(int32_t socket)2726 int32_t ClientWaitSyncBind(int32_t socket)
2727 {
2728 #define EXTRA_WAIT_TIME 5 // 5s, ensure that the timeout here occurs after ClientCheckWaitTimeOut
2729     if (socket <= 0) {
2730         TRANS_LOGE(TRANS_SDK, "invalid param sessionId =%{public}d", socket);
2731         return SOFTBUS_TRANS_INVALID_SESSION_ID;
2732     }
2733 
2734     int32_t ret = LockClientSessionServerList();
2735     if (ret != SOFTBUS_OK) {
2736         TRANS_LOGE(TRANS_SDK, "lock failed");
2737         return ret;
2738     }
2739 
2740     ClientSessionServer *serverNode = NULL;
2741     SessionInfo *sessionNode = NULL;
2742     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
2743         UnlockClientSessionServerList();
2744         TRANS_LOGE(TRANS_SDK, "socket not found. socket=%{public}d", socket);
2745         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2746     }
2747 
2748     if (sessionNode->lifecycle.sessionState == SESSION_STATE_CANCELLING) {
2749         UnlockClientSessionServerList();
2750         TRANS_LOGW(TRANS_SDK, "session is cancelling socket=%{public}d", socket);
2751         return sessionNode->lifecycle.bindErrCode;
2752     }
2753     SoftBusCond callbackCond = sessionNode->lifecycle.callbackCond;
2754     if (sessionNode->enableStatus == ENABLE_STATUS_INIT) {
2755         sessionNode->lifecycle.condIsWaiting = true;
2756         SoftBusSysTime *timePtr = NULL;
2757         SoftBusSysTime absTime = { 0 };
2758         if (sessionNode->lifecycle.maxWaitTime != 0) {
2759             ret = SoftBusGetTime(&absTime);
2760             if (ret == SOFTBUS_OK) {
2761                 absTime.sec += (int64_t)((sessionNode->lifecycle.maxWaitTime / CONVERSION_BASE) + EXTRA_WAIT_TIME);
2762                 timePtr = &absTime;
2763             }
2764         }
2765         TRANS_LOGI(TRANS_SDK, "start wait bind, socket=%{public}d, waitTime=%{public}u",
2766             socket, sessionNode->lifecycle.maxWaitTime);
2767         ret = SoftBusCondWait(&callbackCond, &(g_clientSessionServerList->lock), timePtr);
2768         if (ret != SOFTBUS_OK) {
2769             UnlockClientSessionServerList();
2770             TRANS_LOGE(TRANS_SDK, "cond wait failed, socket=%{public}d", socket);
2771             return ret;
2772         }
2773     }
2774 
2775     UnlockClientSessionServerList();
2776     return CheckSessionEnableStatus(socket, &callbackCond);
2777 }
2778 
TransWaitForBindReturn(int32_t socket)2779 static void TransWaitForBindReturn(int32_t socket)
2780 {
2781 #define RETRY_GET_BIND_RESULT_TIMES 10
2782 #define RETRY_WAIT_TIME             500
2783 
2784     SocketLifecycleData lifecycle;
2785     (void)memset_s(&lifecycle, sizeof(SocketLifecycleData), 0, sizeof(SocketLifecycleData));
2786     int32_t ret;
2787 
2788     for (int32_t retryTimes = 0; retryTimes < RETRY_GET_BIND_RESULT_TIMES; ++retryTimes) {
2789         ret = GetSocketLifecycleAndSessionNameBySessionId(socket, NULL, &lifecycle);
2790         if (ret != SOFTBUS_OK) {
2791             TRANS_LOGE(TRANS_SDK, "Get session lifecycle failed, ret=%{public}d", ret);
2792             return;
2793         }
2794 
2795         if (lifecycle.maxWaitTime == 0) {
2796             return;
2797         }
2798         TRANS_LOGW(TRANS_SDK, "wait for bind return, socket=%{public}d, retryTimes=%{public}d", socket, retryTimes);
2799         usleep(RETRY_WAIT_TIME);
2800     }
2801 }
2802 
ClientSignalSyncBind(int32_t socket,int32_t errCode)2803 int32_t ClientSignalSyncBind(int32_t socket, int32_t errCode)
2804 {
2805     if (socket <= 0) {
2806         TRANS_LOGE(TRANS_SDK, "invalid param sessionId =%{public}d", socket);
2807         return SOFTBUS_TRANS_INVALID_SESSION_ID;
2808     }
2809 
2810     int32_t ret = LockClientSessionServerList();
2811     if (ret != SOFTBUS_OK) {
2812         TRANS_LOGE(TRANS_SDK, "lock failed");
2813         return ret;
2814     }
2815 
2816     ClientSessionServer *serverNode = NULL;
2817     SessionInfo *sessionNode = NULL;
2818     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
2819         UnlockClientSessionServerList();
2820         TRANS_LOGE(TRANS_SDK, "socket not found. socket=%{public}d", socket);
2821         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2822     }
2823 
2824     if (sessionNode->isAsync) {
2825         UnlockClientSessionServerList();
2826         TRANS_LOGW(TRANS_SDK, "socket is async, do not need signal. socket=%{public}d", socket);
2827         return SOFTBUS_OK;
2828     }
2829 
2830     sessionNode->lifecycle.bindErrCode = errCode;
2831     ret = SoftBusCondSignal(&(sessionNode->lifecycle.callbackCond));
2832     if (ret != SOFTBUS_OK) {
2833         UnlockClientSessionServerList();
2834         TRANS_LOGE(TRANS_SDK, "cond single failed, socket=%{public}d", socket);
2835         return ret;
2836     }
2837 
2838     UnlockClientSessionServerList();
2839     TRANS_LOGI(TRANS_SDK, "socket=%{public}d signal success", socket);
2840     TransWaitForBindReturn(socket);
2841     return SOFTBUS_OK;
2842 }
2843 
ClientUpdateAuthSessionTimer(SessionInfo * sessionNode,int32_t sessionId)2844 static int32_t ClientUpdateAuthSessionTimer(SessionInfo *sessionNode, int32_t sessionId)
2845 {
2846     // Only need to operate on the action guidance channel
2847     if (sessionNode->actionId == 0) {
2848         return SOFTBUS_OK;
2849     }
2850     if (sessionNode->lifecycle.maxWaitTime == 0) {
2851         TRANS_LOGE(TRANS_SDK, "sessionId=%{public}d is not need update.", sessionId);
2852         return SOFTBUS_NOT_NEED_UPDATE;
2853     }
2854     sessionNode->lifecycle.maxWaitTime = 0;
2855     return SOFTBUS_OK;
2856 }
2857 
ClientCancelAuthSessionTimer(int32_t sessionId)2858 int32_t ClientCancelAuthSessionTimer(int32_t sessionId)
2859 {
2860     if (sessionId <= 0) {
2861         TRANS_LOGE(TRANS_SDK, "invalid sessionId");
2862         return SOFTBUS_TRANS_INVALID_SESSION_ID;
2863     }
2864 
2865     int32_t ret = LockClientSessionServerList();
2866     if (ret != SOFTBUS_OK) {
2867         TRANS_LOGE(TRANS_SDK, "lock failed");
2868         return ret;
2869     }
2870 
2871     ClientSessionServer *serverNode = NULL;
2872     SessionInfo *sessionNode = NULL;
2873     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
2874         if (IsListEmpty(&serverNode->sessionList) || !IsRawAuthSession(serverNode->sessionName)) {
2875             continue;
2876         }
2877         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
2878             if (sessionNode->sessionId != sessionId ||
2879                 (sessionNode->channelType != CHANNEL_TYPE_PROXY && sessionNode->channelType != CHANNEL_TYPE_AUTH)) {
2880                 continue;
2881             }
2882             ret = ClientUpdateAuthSessionTimer(sessionNode, sessionId);
2883             UnlockClientSessionServerList();
2884             return ret;
2885         }
2886     }
2887     UnlockClientSessionServerList();
2888     TRANS_LOGE(TRANS_SDK, "not found ishare auth session by sessionId=%{public}d", sessionId);
2889     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2890 }
2891 
ClientGetChannelOsTypeBySessionId(int32_t sessionId,int32_t * osType)2892 int32_t ClientGetChannelOsTypeBySessionId(int32_t sessionId, int32_t *osType)
2893 {
2894     if ((sessionId < 0) || (osType == NULL)) {
2895         return SOFTBUS_INVALID_PARAM;
2896     }
2897     int32_t ret = LockClientSessionServerList();
2898     if (ret != SOFTBUS_OK) {
2899         TRANS_LOGE(TRANS_SDK, "lock failed");
2900         return ret;
2901     }
2902 
2903     ClientSessionServer *serverNode = NULL;
2904     SessionInfo *sessionNode = NULL;
2905     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
2906         UnlockClientSessionServerList();
2907         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
2908         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2909     }
2910 
2911     *osType = sessionNode->osType;
2912 
2913     UnlockClientSessionServerList();
2914     return SOFTBUS_OK;
2915 }
2916 
ClientTransOnPrivilegeClose(const char * peerNetworkId)2917 void ClientTransOnPrivilegeClose(const char *peerNetworkId)
2918 {
2919     if (LockClientSessionServerList() != SOFTBUS_OK) {
2920         TRANS_LOGE(TRANS_SDK, "lock failed");
2921         return;
2922     }
2923     TRANS_LOGD(TRANS_SDK, "recv privilege close event, clear all socket");
2924     ClientSessionServer *serverNode = NULL;
2925     ListNode destroyList;
2926     ListInit(&destroyList);
2927     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
2928         PrivilegeDestroyAllClientSession(serverNode, &destroyList, peerNetworkId);
2929     }
2930     UnlockClientSessionServerList();
2931     (void)ClientDestroySession(&destroyList, SHUTDOWN_REASON_PRIVILEGE_SHUTDOWN);
2932 }
2933 
ClientCacheQosEvent(int32_t socket,QoSEvent event,const QosTV * qos,uint32_t count)2934 int32_t ClientCacheQosEvent(int32_t socket, QoSEvent event, const QosTV *qos, uint32_t count)
2935 {
2936     if (socket <= 0 || qos == NULL || count == 0) {
2937         TRANS_LOGE(TRANS_SDK, "invalid param");
2938         return SOFTBUS_INVALID_PARAM;
2939     }
2940     int32_t ret = LockClientSessionServerList();
2941     if (ret != SOFTBUS_OK) {
2942         TRANS_LOGE(TRANS_SDK, "lock failed");
2943         return ret;
2944     }
2945 
2946     ClientSessionServer *serverNode = NULL;
2947     SessionInfo *sessionNode = NULL;
2948     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
2949         UnlockClientSessionServerList();
2950         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", socket);
2951         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2952     }
2953     if (sessionNode->lifecycle.sessionState == SESSION_STATE_CALLBACK_FINISHED) {
2954         UnlockClientSessionServerList();
2955         return SOFTBUS_TRANS_NO_NEED_CACHE_QOS_EVENT;
2956     }
2957     for (uint32_t i = 0; i < count; i++) {
2958         sessionNode->cachedQosEvent.qos[i].qos = qos[i].qos;
2959         sessionNode->cachedQosEvent.qos[i].value = qos[i].value;
2960     }
2961     sessionNode->cachedQosEvent.count = count;
2962     sessionNode->cachedQosEvent.event = event;
2963     UnlockClientSessionServerList();
2964     TRANS_LOGI(TRANS_SDK, "cache qos event success, socket=%{public}d", socket);
2965     return SOFTBUS_OK;
2966 }
2967 
ClientGetCachedQosEventBySocket(int32_t socket,CachedQosEvent * cachedQosEvent)2968 int32_t ClientGetCachedQosEventBySocket(int32_t socket, CachedQosEvent *cachedQosEvent)
2969 {
2970     if (socket <= 0 || cachedQosEvent == NULL) {
2971         TRANS_LOGE(TRANS_SDK, "invalid param");
2972         return SOFTBUS_INVALID_PARAM;
2973     }
2974     int32_t ret = LockClientSessionServerList();
2975     if (ret != SOFTBUS_OK) {
2976         TRANS_LOGE(TRANS_SDK, "lock failed");
2977         return ret;
2978     }
2979     ClientSessionServer *serverNode = NULL;
2980     SessionInfo *sessionNode = NULL;
2981     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
2982         UnlockClientSessionServerList();
2983         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", socket);
2984         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2985     }
2986     ret = memcpy_s(cachedQosEvent, sizeof(CachedQosEvent), &sessionNode->cachedQosEvent, sizeof(CachedQosEvent));
2987     if (ret != EOK) {
2988         UnlockClientSessionServerList();
2989         TRANS_LOGE(TRANS_SDK, "copy cachedQosEvent failed, ret=%{public}d", ret);
2990         return SOFTBUS_MEM_ERR;
2991     }
2992     (void)memset_s(&sessionNode->cachedQosEvent, sizeof(CachedQosEvent), 0, sizeof(CachedQosEvent));
2993     UnlockClientSessionServerList();
2994     TRANS_LOGI(TRANS_SDK, "get cached qos event success, socket=%{public}d", socket);
2995     return SOFTBUS_OK;
2996 }
2997 
GetMaxIdleTimeBySocket(int32_t socket,uint32_t * optValue)2998 int32_t GetMaxIdleTimeBySocket(int32_t socket, uint32_t *optValue)
2999 {
3000     if (socket <= 0 || optValue == NULL) {
3001         TRANS_LOGE(TRANS_SDK, "invalid param");
3002         return SOFTBUS_INVALID_PARAM;
3003     }
3004 
3005     int32_t ret = LockClientSessionServerList();
3006     if (ret != SOFTBUS_OK) {
3007         TRANS_LOGE(TRANS_SDK, "lock failed");
3008         return ret;
3009     }
3010 
3011     ClientSessionServer *serverNode = NULL;
3012     SessionInfo *sessionNode = NULL;
3013     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
3014         UnlockClientSessionServerList();
3015         TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", socket);
3016         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
3017     }
3018 
3019     if (sessionNode->role == SESSION_ROLE_CLIENT) {
3020         *optValue = sessionNode->maxIdleTime;
3021     } else {
3022         ret = SOFTBUS_NOT_IMPLEMENT;
3023     }
3024     UnlockClientSessionServerList();
3025     return ret;
3026 }
3027 
SetMaxIdleTimeBySocket(int32_t socket,uint32_t maxIdleTime)3028 int32_t SetMaxIdleTimeBySocket(int32_t socket, uint32_t maxIdleTime)
3029 {
3030     if (socket <= 0) {
3031         TRANS_LOGE(TRANS_SDK, "invalid param");
3032         return SOFTBUS_INVALID_PARAM;
3033     }
3034     int32_t ret = LockClientSessionServerList();
3035     if (ret != SOFTBUS_OK) {
3036         TRANS_LOGE(TRANS_SDK, "lock failed");
3037         return ret;
3038     }
3039 
3040     ClientSessionServer *serverNode = NULL;
3041     SessionInfo *sessionNode = NULL;
3042     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
3043         UnlockClientSessionServerList();
3044         TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", socket);
3045         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
3046     }
3047 
3048     if (sessionNode->role == SESSION_ROLE_CLIENT) {
3049         sessionNode->maxIdleTime = maxIdleTime;
3050     } else {
3051         ret = SOFTBUS_NOT_IMPLEMENT;
3052     }
3053     UnlockClientSessionServerList();
3054     return ret;
3055 }
3056 
TransGetSupportTlvBySocket(int32_t socket,bool * supportTlv,int32_t * optValueSize)3057 int32_t TransGetSupportTlvBySocket(int32_t socket, bool *supportTlv, int32_t *optValueSize)
3058 {
3059     if (socket <= 0 || supportTlv == NULL || optValueSize == NULL) {
3060         TRANS_LOGE(TRANS_SDK, "invalid param");
3061         return SOFTBUS_INVALID_PARAM;
3062     }
3063 
3064     int32_t ret = LockClientSessionServerList();
3065     if (ret != SOFTBUS_OK) {
3066         TRANS_LOGE(TRANS_SDK, "lock failed");
3067         return ret;
3068     }
3069 
3070     ClientSessionServer *serverNode = NULL;
3071     SessionInfo *sessionNode = NULL;
3072     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
3073         UnlockClientSessionServerList();
3074         TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", socket);
3075         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
3076     }
3077     *supportTlv = sessionNode->isSupportTlv;
3078     *optValueSize = sizeof(bool);
3079     UnlockClientSessionServerList();
3080     return SOFTBUS_OK;
3081 }
3082 
TransSetNeedAckBySocket(int32_t socket,bool needAck)3083 int32_t TransSetNeedAckBySocket(int32_t socket, bool needAck)
3084 {
3085     if (socket <= 0) {
3086         TRANS_LOGE(TRANS_SDK, "invalid param");
3087         return SOFTBUS_INVALID_PARAM;
3088     }
3089     int32_t ret = LockClientSessionServerList();
3090     if (ret != SOFTBUS_OK) {
3091         TRANS_LOGE(TRANS_SDK, "lock failed");
3092         return ret;
3093     }
3094 
3095     ClientSessionServer *serverNode = NULL;
3096     SessionInfo *sessionNode = NULL;
3097     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
3098         UnlockClientSessionServerList();
3099         TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", socket);
3100         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
3101     }
3102 
3103     if (!sessionNode->isSupportTlv) {
3104         TRANS_LOGI(TRANS_SDK, "cannot support set needAck");
3105         return SOFTBUS_TRANS_NOT_SUPPORT_TLV_HEAD;
3106     }
3107     sessionNode->needAck = needAck;
3108     UnlockClientSessionServerList();
3109     return SOFTBUS_OK;
3110 }
3111 
GetLogicalBandwidth(int32_t socket,int32_t * optValue,int32_t * optValueSize)3112 int32_t GetLogicalBandwidth(int32_t socket, int32_t *optValue, int32_t *optValueSize)
3113 {
3114     if (socket <= 0 || optValue == NULL || optValueSize == NULL) {
3115         TRANS_LOGE(TRANS_SDK, "invalid param");
3116         return SOFTBUS_INVALID_PARAM;
3117     }
3118 
3119     int32_t ret = LockClientSessionServerList();
3120     if (ret != SOFTBUS_OK) {
3121         TRANS_LOGE(TRANS_SDK, "lock failed");
3122         return ret;
3123     }
3124 
3125     ClientSessionServer *serverNode = NULL;
3126     SessionInfo *sessionNode = NULL;
3127     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
3128         UnlockClientSessionServerList();
3129         TRANS_LOGE(TRANS_SDK, "socket not found. socket=%{public}d", socket);
3130         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
3131     }
3132     *optValue = BANDWIDTH_BUTT;
3133     if (sessionNode->routeType == BT_BR || sessionNode->routeType == BT_BLE || sessionNode->routeType == BT_SLE) {
3134         *optValue = LOW_BANDWIDTH;
3135     } else if (sessionNode->routeType == WIFI_STA) {
3136         *optValue = MEDIUM_BANDWIDTH;
3137     } else if (sessionNode->routeType == WIFI_P2P || sessionNode->routeType == WIFI_P2P_REUSE ||
3138         sessionNode->routeType == WIFI_USB) {
3139         *optValue = HIGH_BANDWIDTH;
3140     }
3141     TRANS_LOGI(TRANS_SDK, "get medium bandwidth success socket=%{public}d, routeType=%{public}d",
3142         socket, sessionNode->routeType);
3143     *optValueSize = sizeof(int32_t);
3144     UnlockClientSessionServerList();
3145     return SOFTBUS_OK;
3146 }
3147 
IsRawAuthSession(const char * sessionName)3148 bool IsRawAuthSession(const char *sessionName)
3149 {
3150     TRANS_CHECK_AND_RETURN_RET_LOGE(sessionName != NULL, false, TRANS_CTRL, "invalid param.");
3151     for (uint32_t i = 0; i < ACTION_AUTH_SESSION_NUM; i++) {
3152         if (strcmp(sessionName, g_rawAuthSession[i]) == 0) {
3153             return true;
3154         }
3155     }
3156     return false;
3157 }
3158 
ClientGetSessionNameBySessionId(int32_t sessionId,char * sessionName)3159 int32_t ClientGetSessionNameBySessionId(int32_t sessionId, char *sessionName)
3160 {
3161     if (sessionId < 0 || sessionName == NULL) {
3162         TRANS_LOGE(TRANS_SDK, "Invalid param");
3163         return SOFTBUS_INVALID_PARAM;
3164     }
3165 
3166     int32_t ret = LockClientSessionServerList();
3167     if (ret != SOFTBUS_OK) {
3168         TRANS_LOGE(TRANS_SDK, "lock failed");
3169         return ret;
3170     }
3171 
3172     ClientSessionServer *serverNode = NULL;
3173     SessionInfo *sessionNode = NULL;
3174     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
3175         if (IsListEmpty(&serverNode->sessionList)) {
3176             continue;
3177         }
3178         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
3179             if (sessionNode->sessionId != sessionId) {
3180                 continue;
3181             }
3182             if (strcpy_s(sessionName, SESSION_NAME_SIZE_MAX, serverNode->sessionName) != EOK) {
3183                 TRANS_LOGE(TRANS_SDK, "copy sessionName failed");
3184                 UnlockClientSessionServerList();
3185                 return SOFTBUS_STRCPY_ERR;
3186             }
3187             UnlockClientSessionServerList();
3188             return SOFTBUS_OK;
3189         }
3190     }
3191     UnlockClientSessionServerList();
3192     TRANS_LOGE(TRANS_SDK, "not found session with sessionId=%{public}d", sessionId);
3193     return SOFTBUS_NOT_FIND;
3194 }
3195 
ClientSetLowLatencyBySocket(int32_t socket)3196 int32_t ClientSetLowLatencyBySocket(int32_t socket)
3197 {
3198     if (socket <= 0) {
3199         TRANS_LOGE(TRANS_SDK, "invalid param");
3200         return SOFTBUS_INVALID_PARAM;
3201     }
3202     int32_t ret = LockClientSessionServerList();
3203     if (ret != SOFTBUS_OK) {
3204         TRANS_LOGE(TRANS_SDK, "lock failed");
3205         return ret;
3206     }
3207     ClientSessionServer *serverNode = NULL;
3208     SessionInfo *sessionNode = NULL;
3209     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
3210         UnlockClientSessionServerList();
3211         TRANS_LOGE(TRANS_SDK, "socket not found. socket=%{public}d", socket);
3212         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
3213     }
3214     sessionNode->isLowLatency = true;
3215     UnlockClientSessionServerList();
3216     return SOFTBUS_OK;
3217 }
3218 
3219 
ClientGetChannelBusinessTypeByChannelId(int32_t channelId,int32_t * businessType)3220 int32_t ClientGetChannelBusinessTypeByChannelId(int32_t channelId, int32_t *businessType)
3221 {
3222     if ((channelId < 0) || (businessType == NULL)) {
3223         return SOFTBUS_INVALID_PARAM;
3224     }
3225     int32_t ret = LockClientSessionServerList();
3226     if (ret != SOFTBUS_OK) {
3227         TRANS_LOGE(TRANS_SDK, "lock failed");
3228         return ret;
3229     }
3230 
3231     ClientSessionServer *serverNode = NULL;
3232     SessionInfo *sessionNode = NULL;
3233     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
3234         if (IsListEmpty(&serverNode->sessionList)) {
3235             continue;
3236         }
3237         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
3238             if (sessionNode->channelId != channelId) {
3239                 continue;
3240             }
3241             *businessType = sessionNode->businessType;
3242             UnlockClientSessionServerList();
3243             return SOFTBUS_OK;
3244         }
3245     }
3246     UnlockClientSessionServerList();
3247     TRANS_LOGE(TRANS_SDK, "not found session with channelId=%{public}d", channelId);
3248     return SOFTBUS_NOT_FIND;
3249 }
3250 
ClientCheckIsD2DBySessionId(int32_t sessionId,bool * isD2D)3251 int32_t ClientCheckIsD2DBySessionId(int32_t sessionId, bool *isD2D)
3252 {
3253     if ((sessionId < 0) || (isD2D == NULL)) {
3254         return SOFTBUS_INVALID_PARAM;
3255     }
3256     int32_t ret = LockClientSessionServerList();
3257     if (ret != SOFTBUS_OK) {
3258         TRANS_LOGE(TRANS_SDK, "lock failed");
3259         return ret;
3260     }
3261 
3262     ClientSessionServer *serverNode = NULL;
3263     SessionInfo *sessionNode = NULL;
3264     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
3265         UnlockClientSessionServerList();
3266         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
3267         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
3268     }
3269 
3270     *isD2D = sessionNode->isD2D;
3271 
3272     UnlockClientSessionServerList();
3273     return SOFTBUS_OK;
3274 }
3275 
ClientGetSessionTypeBySocket(int32_t socket,int32_t * sessionType)3276 int32_t ClientGetSessionTypeBySocket(int32_t socket, int32_t *sessionType)
3277 {
3278     if (socket < 0 || sessionType == NULL) {
3279         TRANS_LOGE(TRANS_SDK, "invalid param");
3280         return SOFTBUS_INVALID_PARAM;
3281     }
3282     int32_t ret = LockClientSessionServerList();
3283     if (ret != SOFTBUS_OK) {
3284         TRANS_LOGE(TRANS_SDK, "lock failed");
3285         return ret;
3286     }
3287     ClientSessionServer *serverNode = NULL;
3288     SessionInfo *sessionNode = NULL;
3289     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
3290         UnlockClientSessionServerList();
3291         TRANS_LOGE(TRANS_SDK, "socket not found. socket=%{public}d", socket);
3292         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
3293     }
3294     *sessionType = sessionNode->info.flag;
3295     UnlockClientSessionServerList();
3296     return SOFTBUS_OK;
3297 }
3298 
ClientSetFLTos(int32_t socket,TransFlowInfo * flowInfo)3299 int32_t ClientSetFLTos(int32_t socket, TransFlowInfo *flowInfo)
3300 {
3301     if (socket < 0 || flowInfo == NULL) {
3302         TRANS_LOGE(TRANS_SDK, "invalid param");
3303         return SOFTBUS_INVALID_PARAM;
3304     }
3305     int32_t ret = LockClientSessionServerList();
3306     if (ret != SOFTBUS_OK) {
3307         TRANS_LOGE(TRANS_SDK, "lock failed");
3308         return ret;
3309     }
3310     ClientSessionServer *serverNode = NULL;
3311     SessionInfo *sessionNode = NULL;
3312     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
3313         UnlockClientSessionServerList();
3314         TRANS_LOGE(TRANS_SDK, "socket not found. socket=%{public}d", socket);
3315         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
3316     }
3317     sessionNode->flowInfo.flowSize = flowInfo->flowSize;
3318     sessionNode->flowInfo.sessionType = flowInfo->sessionType;
3319     sessionNode->flowInfo.flowQosType = flowInfo->flowQosType;
3320     UnlockClientSessionServerList();
3321     return SOFTBUS_OK;
3322 }
3323