1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "client_trans_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_adapter_mem.h"
31 #include "softbus_app_info.h"
32 #include "softbus_def.h"
33 #include "softbus_errcode.h"
34 #include "softbus_socket.h"
35 #include "softbus_utils.h"
36 #include "trans_log.h"
37 #include "trans_server_proxy.h"
38 
39 #define CONVERSION_BASE 1000LL
40 #define CAST_SESSION "CastPlusSessionName"
41 static void ClientTransSessionTimerProc(void);
42 
43 static int32_t g_sessionIdNum = 0;
44 static int32_t g_sessionId = 1;
45 static int32_t g_closingIdNum = 0;
46 static SoftBusList *g_clientSessionServerList = NULL;
47 
LockClientSessionServerListnull48 static int32_t LockClientSessionServerList()
49 {
50     if (g_clientSessionServerList == NULL) {
51         TRANS_LOGE(TRANS_INIT, "entry list not init");
52         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
53     }
54     int32_t ret = SoftBusMutexLock(&(g_clientSessionServerList->lock));
55     if (ret != SOFTBUS_OK) {
56         return SOFTBUS_LOCK_ERR;
57     }
58     return SOFTBUS_OK;
59 }
60 
UnlockClientSessionServerListnull61 static void UnlockClientSessionServerList()
62 {
63     (void)SoftBusMutexUnlock(&(g_clientSessionServerList->lock));
64 }
65 
CheckPermissionState(int32_t sessionId)66 int32_t CheckPermissionState(int32_t sessionId)
67 {
68     int32_t ret = LockClientSessionServerList();
69     if (ret != SOFTBUS_OK) {
70         TRANS_LOGE(TRANS_SDK, "lock failed");
71         return ret;
72     }
73     ClientSessionServer *serverNode = NULL;
74     SessionInfo *sessionNode = NULL;
75 
76     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
77         if (IsListEmpty(&serverNode->sessionList)) {
78             continue;
79         }
80         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
81             if (sessionNode->sessionId == sessionId) {
82                 bool permissionState = serverNode->permissionState;
83                 UnlockClientSessionServerList();
84                 return permissionState ? SOFTBUS_OK : SOFTBUS_PERMISSION_DENIED;
85             }
86         }
87     }
88     UnlockClientSessionServerList();
89     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
90 }
91 
PermissionStateChange(const char *pkgName, int32_t state)92 void PermissionStateChange(const char *pkgName, int32_t state)
93 {
94     if (LockClientSessionServerList() != SOFTBUS_OK) {
95         TRANS_LOGE(TRANS_SDK, "lock failed");
96         return;
97     }
98 
99     ClientSessionServer *serverNode = NULL;
100     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
101         if ((strcmp(serverNode->pkgName, pkgName) == 0)) {
102             serverNode->permissionState = state > 0 ? true : false;
103             TRANS_LOGI(TRANS_SDK, "permission change, pkgName=%{public}s, state=%{public}d", pkgName, state);
104             break;
105         }
106     }
107     UnlockClientSessionServerList();
108 }
109 
TransClientInit(void)110 int TransClientInit(void)
111 {
112     g_clientSessionServerList = CreateSoftBusList();
113     if (g_clientSessionServerList == NULL) {
114         TRANS_LOGE(TRANS_INIT, "entry list not init");
115         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
116     }
117 
118     if (TransServerProxyInit() != SOFTBUS_OK) {
119         TRANS_LOGE(TRANS_INIT, "init trans ipc proxy failed");
120         return SOFTBUS_TRANS_SERVER_INIT_FAILED;
121     }
122 
123     if (ClientTransChannelInit() != SOFTBUS_OK) {
124         TRANS_LOGE(TRANS_INIT, "init trans channel failed");
125         return SOFTBUS_TRANS_SERVER_INIT_FAILED;
126     }
127 
128     if (RegisterTimeoutCallback(SOFTBUS_TRNAS_IDLE_TIMEOUT_TIMER_FUN, ClientTransSessionTimerProc) != SOFTBUS_OK) {
129         TRANS_LOGE(TRANS_INIT, "init trans idle timer failed");
130         return SOFTBUS_TRANS_SERVER_INIT_FAILED;
131     }
132 
133     ClientTransRegLnnOffline();
134     TRANS_LOGI(TRANS_INIT, "init trans client success");
135     return SOFTBUS_OK;
136 }
137 
SessionIdIsAvailable(int32_t sessionId)138 static bool SessionIdIsAvailable(int32_t sessionId)
139 {
140     ClientSessionServer *serverNode = NULL;
141     SessionInfo *sessionNode = NULL;
142 
143     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
144         if (IsListEmpty(&serverNode->sessionList)) {
145             continue;
146         }
147         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
148             if (sessionNode->sessionId == sessionId) {
149                 return false;
150             }
151         }
152     }
153 
154     return true;
155 }
156 
ShowAllSessionInfo(void)157 static void ShowAllSessionInfo(void)
158 {
159     TRANS_LOGI(TRANS_SDK, "g_sessionIdNum=%{public}d, g_closingIdNum=%{public}d", g_sessionIdNum, g_closingIdNum);
160     ClientSessionServer *serverNode = NULL;
161     SessionInfo *sessionNode = NULL;
162     int count = 0;
163     char *tmpName = NULL;
164     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
165         Anonymize(serverNode->sessionName, &tmpName);
166         TRANS_LOGI(TRANS_SDK, "client session server is exist. count=%{public}d, sessionName=%{public}s",
167             count, AnonymizeWrapper(tmpName));
168         AnonymizeFree(tmpName);
169         count++;
170         if (IsListEmpty(&serverNode->sessionList)) {
171             continue;
172         }
173         int sessionCount = 0;
174         char *tmpPeerSessionName = NULL;
175         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
176             Anonymize(sessionNode->info.peerSessionName, &tmpPeerSessionName);
177             TRANS_LOGI(TRANS_SDK,
178                 "client session info is exist. sessionCount=%{public}d, peerSessionName=%{public}s, "
179                 "channelId=%{public}d, channelType=%{public}d",
180                 sessionCount, AnonymizeWrapper(tmpPeerSessionName), sessionNode->channelId, sessionNode->channelType);
181             AnonymizeFree(tmpPeerSessionName);
182             sessionCount++;
183         }
184     }
185 }
186 
187 // need get g_clientSessionServerList->lock before call this function
GenerateSessionId(void)188 int32_t GenerateSessionId(void)
189 {
190     if (g_sessionIdNum >= g_closingIdNum && g_sessionIdNum - g_closingIdNum >= MAX_SESSION_ID) {
191         TRANS_LOGE(TRANS_SDK, "sessionid num cross the line error");
192         return INVALID_SESSION_ID;
193     }
194     int32_t cnt = MAX_SESSION_ID + g_closingIdNum + 1;
195     int32_t id = INVALID_SESSION_ID;
196 
197     while (cnt) {
198         id = g_sessionId++;
199         if (g_sessionId < 0) {
200             g_sessionId = 1;
201         }
202         if (SessionIdIsAvailable(id)) {
203             g_sessionIdNum++;
204             return id;
205         }
206         cnt--;
207     }
208     TRANS_LOGE(TRANS_SDK, "generate id error");
209     return id;
210 }
211 
212 // need get g_clientSessionServerList->lock before call this function
DestroySessionId(void)213 void DestroySessionId(void)
214 {
215     if (g_sessionIdNum > 0) {
216         g_sessionIdNum--;
217     }
218 
219     if (g_closingIdNum > 0) {
220         g_closingIdNum--;
221     }
222 }
223 
TryDeleteEmptySessionServer(const char *pkgName, const char *sessionName)224 int32_t TryDeleteEmptySessionServer(const char *pkgName, const char *sessionName)
225 {
226     if (pkgName == NULL || sessionName == NULL) {
227         TRANS_LOGE(TRANS_SDK, "invalid param.");
228         return SOFTBUS_INVALID_PARAM;
229     }
230     int32_t ret = LockClientSessionServerList();
231     if (ret != SOFTBUS_OK) {
232         TRANS_LOGE(TRANS_SDK, "lock failed");
233         return ret;
234     }
235 
236     char *tmpName = NULL;
237     Anonymize(sessionName, &tmpName);
238     ClientSessionServer *serverNode = NULL;
239     ClientSessionServer *serverNodeNext = NULL;
240     ListNode destroyList;
241     ListInit(&destroyList);
242     LIST_FOR_EACH_ENTRY_SAFE(
243         serverNode, serverNodeNext, &(g_clientSessionServerList->list), ClientSessionServer, node) {
244         if (strcmp(serverNode->sessionName, sessionName) == 0 && IsListEmpty(&serverNode->sessionList) &&
245             serverNode->sessionAddingCnt == 0) {
246             ListDelete(&(serverNode->node));
247             SoftBusFree(serverNode);
248             g_clientSessionServerList->cnt--;
249             UnlockClientSessionServerList();
250             // calling the ipc interface by locking here may block other threads for a long time
251             ret = ServerIpcRemoveSessionServer(pkgName, sessionName);
252             if (ret != SOFTBUS_OK) {
253                 TRANS_LOGE(TRANS_SDK, "remove session server failed, ret=%{public}d", ret);
254                 AnonymizeFree(tmpName);
255                 return ret;
256             }
257             TRANS_LOGI(TRANS_SDK, "delete empty session server, sessionName=%{public}s", AnonymizeWrapper(tmpName));
258             AnonymizeFree(tmpName);
259             return SOFTBUS_OK;
260         }
261     }
262     UnlockClientSessionServerList();
263     TRANS_LOGE(TRANS_SDK, "not found session server or session list is not empty, sessionName=%{public}s",
264         AnonymizeWrapper(tmpName));
265     AnonymizeFree(tmpName);
266     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
267 }
268 
TransClientDeinit(void)269 void TransClientDeinit(void)
270 {
271     if (LockClientSessionServerList() != SOFTBUS_OK) {
272         TRANS_LOGE(TRANS_SDK, "lock failed");
273         return;
274     }
275     ClientSessionServer *serverNode = NULL;
276     ClientSessionServer *serverNodeNext = NULL;
277     ListNode destroyList;
278     ListInit(&destroyList);
279     LIST_FOR_EACH_ENTRY_SAFE(serverNode, serverNodeNext, &(g_clientSessionServerList->list),
280         ClientSessionServer, node) {
281         DestroyClientSessionServer(serverNode, &destroyList);
282     }
283     UnlockClientSessionServerList();
284     ClientDestroySession(&destroyList, SHUTDOWN_REASON_LOCAL);
285 
286     DestroySoftBusList(g_clientSessionServerList);
287     g_clientSessionServerList = NULL;
288     ClientTransChannelDeinit();
289     TransServerProxyDeInit();
290     (void)RegisterTimeoutCallback(SOFTBUS_TRNAS_IDLE_TIMEOUT_TIMER_FUN, NULL);
291 }
292 
SessionServerIsExist(const char *sessionName)293 static bool SessionServerIsExist(const char *sessionName)
294 {
295     /* need get lock before */
296     ListNode *pos = NULL;
297     ListNode *tmp = NULL;
298     ClientSessionServer *node = NULL;
299     LIST_FOR_EACH_SAFE(pos, tmp, &g_clientSessionServerList->list) {
300         node = (ClientSessionServer *)pos;
301         if (strcmp(node->sessionName, sessionName) == 0) {
302             return true;
303         }
304     }
305     return false;
306 }
307 
SocketServerIsExistAndUpdate(const char *sessionName)308 static bool SocketServerIsExistAndUpdate(const char *sessionName)
309 {
310     /* need get lock before */
311     ClientSessionServer *item = NULL;
312     LIST_FOR_EACH_ENTRY(item, &g_clientSessionServerList->list, ClientSessionServer, node) {
313         if (strcmp(item->sessionName, sessionName) == 0) {
314             /*
315              * this field indicates that a process is using a SessionServer,
316              * but the process has not yet added the session node to the sessionList.
317              * Other processes cannot perceive this intermediate state, so this field is added to identify this state;
318              * This field is cleared after adding the session node to the session list in the process
319              */
320             item->sessionAddingCnt++;
321             return true;
322         }
323     }
324     return false;
325 }
326 
SocketServerStateUpdate(const char *sessionName)327 void SocketServerStateUpdate(const char *sessionName)
328 {
329     if (sessionName == NULL) {
330         TRANS_LOGE(TRANS_SDK, "invalid param");
331         return;
332     }
333     if (LockClientSessionServerList() != SOFTBUS_OK) {
334         TRANS_LOGE(TRANS_SDK, "lock failed");
335         return;
336     }
337     ClientSessionServer *item = NULL;
338     LIST_FOR_EACH_ENTRY(item, &g_clientSessionServerList->list, ClientSessionServer, node) {
339         if (strcmp(item->sessionName, sessionName) == 0) {
340             if (item->sessionAddingCnt > 0) {
341                 item->sessionAddingCnt--;
342             }
343             UnlockClientSessionServerList();
344             return;
345         }
346     }
347     char *tmpName = NULL;
348     Anonymize(sessionName, &tmpName);
349     TRANS_LOGE(TRANS_SDK, "not found session server by sessionName=%{public}s", AnonymizeWrapper(tmpName));
350     AnonymizeFree(tmpName);
351     UnlockClientSessionServerList();
352 }
353 
ShowClientSessionServer(void)354 static void ShowClientSessionServer(void)
355 {
356     ClientSessionServer *pos = NULL;
357     ClientSessionServer *tmp = NULL;
358     int count = 0;
359     char *tmpName = NULL;
360     LIST_FOR_EACH_ENTRY_SAFE(pos, tmp, &g_clientSessionServerList->list, ClientSessionServer, node) {
361         Anonymize(pos->sessionName, &tmpName);
362         TRANS_LOGE(TRANS_SDK,
363             "client session server is exist. count=%{public}d, sessionName=%{public}s",
364                 count, AnonymizeWrapper(tmpName));
365         AnonymizeFree(tmpName);
366         count++;
367     }
368 }
369 
ClientAddSessionServer(SoftBusSecType type, const char *pkgName, const char *sessionName, const ISessionListener *listener)370 int32_t ClientAddSessionServer(SoftBusSecType type, const char *pkgName, const char *sessionName,
371     const ISessionListener *listener)
372 {
373     if (pkgName == NULL || sessionName == NULL || listener == NULL) {
374         return SOFTBUS_INVALID_PARAM;
375     }
376 
377     int32_t ret = LockClientSessionServerList();
378     if (ret != SOFTBUS_OK) {
379         TRANS_LOGE(TRANS_SDK, "lock failed");
380         return ret;
381     }
382     if (SessionServerIsExist(sessionName)) {
383         UnlockClientSessionServerList();
384         return SOFTBUS_SERVER_NAME_REPEATED;
385     }
386 
387     if (g_clientSessionServerList->cnt >= MAX_SESSION_SERVER_NUMBER) {
388         ShowClientSessionServer();
389         UnlockClientSessionServerList();
390         TRANS_LOGE(TRANS_SDK, "ClientAddSessionServer: client server num reach max");
391         return SOFTBUS_INVALID_NUM;
392     }
393 
394     ClientSessionServer *server = GetNewSessionServer(type, sessionName, pkgName, listener);
395     if (server == NULL) {
396         UnlockClientSessionServerList();
397         return SOFTBUS_MEM_ERR;
398     }
399     server->permissionState = true;
400     ListAdd(&g_clientSessionServerList->list, &server->node);
401     g_clientSessionServerList->cnt++;
402 
403     UnlockClientSessionServerList();
404     char *tmpName = NULL;
405     char *tmpPkgName = NULL;
406     Anonymize(pkgName, &tmpPkgName);
407     Anonymize(sessionName, &tmpName);
408     TRANS_LOGI(TRANS_SDK, "sessionName=%{public}s, pkgName=%{public}s",
409         AnonymizeWrapper(tmpName), AnonymizeWrapper(tmpPkgName));
410     AnonymizeFree(tmpName);
411     AnonymizeFree(tmpPkgName);
412     return SOFTBUS_OK;
413 }
414 
GetExistSession(const SessionParam *param)415 static SessionInfo *GetExistSession(const SessionParam *param)
416 {
417     /* need get lock before */
418     ClientSessionServer *serverNode = NULL;
419     SessionInfo *sessionNode = NULL;
420     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
421         if ((strcmp(serverNode->sessionName, param->sessionName) != 0) || IsListEmpty(&serverNode->sessionList)) {
422             continue;
423         }
424         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
425             if (sessionNode->isServer || (strcmp(sessionNode->info.peerSessionName, param->peerSessionName) != 0) ||
426                 (strcmp(sessionNode->info.peerDeviceId, param->peerDeviceId) != 0) ||
427                 (strcmp(sessionNode->info.groupId, param->groupId) != 0) ||
428                 (memcmp(sessionNode->linkType, param->attr->linkType, sizeof(param->attr->linkType)) != 0) ||
429                 (sessionNode->info.flag != param->attr->dataType)) {
430                 continue;
431             }
432             return sessionNode;
433         }
434     }
435     return NULL;
436 }
437 
GetSessionById(int32_t sessionId, ClientSessionServer **server, SessionInfo **session)438 static int32_t GetSessionById(int32_t sessionId, ClientSessionServer **server, SessionInfo **session)
439 {
440     /* need get lock before */
441     ClientSessionServer *serverNode = NULL;
442     SessionInfo *sessionNode = NULL;
443 
444     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
445         if (IsListEmpty(&serverNode->sessionList)) {
446             continue;
447         }
448         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
449             if (sessionNode->sessionId == sessionId) {
450                 *server = serverNode;
451                 *session = sessionNode;
452                 return SOFTBUS_OK;
453             }
454         }
455     }
456     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
457 }
458 
AddSession(const char *sessionName, SessionInfo *session)459 static int32_t AddSession(const char *sessionName, SessionInfo *session)
460 {
461     /* need get lock before */
462     session->sessionId = GenerateSessionId();
463     if (session->sessionId < 0) {
464         ShowAllSessionInfo();
465         return SOFTBUS_TRANS_SESSION_CNT_EXCEEDS_LIMIT;
466     }
467     ClientSessionServer *serverNode = NULL;
468     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
469         if (strcmp(serverNode->sessionName, sessionName) != 0) {
470             continue;
471         }
472         ListAdd(&serverNode->sessionList, &session->node);
473         char *anonyDeviceId = NULL;
474         Anonymize(session->info.peerDeviceId, &anonyDeviceId);
475         TRANS_LOGI(TRANS_SDK,
476             "add, sessionId=%{public}d, channelId=%{public}d, channelType=%{public}d, routeType=%{public}d, "
477             "peerDeviceId=%{public}s",
478             session->sessionId, session->channelId, session->channelType, session->routeType,
479             AnonymizeWrapper(anonyDeviceId));
480         AnonymizeFree(anonyDeviceId);
481         return SOFTBUS_OK;
482     }
483     DestroySessionId();
484     return SOFTBUS_TRANS_SESSIONSERVER_NOT_CREATED;
485 }
486 
ClientAddNewSession(const char *sessionName, SessionInfo *session)487 int32_t ClientAddNewSession(const char *sessionName, SessionInfo *session)
488 {
489     if (session == NULL) {
490         TRANS_LOGW(TRANS_SDK, "Invalid param");
491         return SOFTBUS_INVALID_PARAM;
492     }
493 
494     int32_t ret = LockClientSessionServerList();
495     if (ret != SOFTBUS_OK) {
496         TRANS_LOGE(TRANS_SDK, "lock failed");
497         return ret;
498     }
499 
500     ret = AddSession(sessionName, session);
501     if (ret != SOFTBUS_OK) {
502         UnlockClientSessionServerList();
503         TRANS_LOGE(TRANS_SDK, "add session failed, ret=%{public}d", ret);
504         return ret;
505     }
506     UnlockClientSessionServerList();
507     return SOFTBUS_OK;
508 }
509 
ClientAddSession(const SessionParam *param, int32_t *sessionId, SessionEnableStatus *isEnabled)510 int32_t ClientAddSession(const SessionParam *param, int32_t *sessionId, SessionEnableStatus *isEnabled)
511 {
512     if (!IsValidSessionParam(param) || (sessionId == NULL) || (isEnabled == NULL)) {
513         TRANS_LOGW(TRANS_SDK, "Invalid param");
514         return SOFTBUS_INVALID_PARAM;
515     }
516 
517     int32_t ret = LockClientSessionServerList();
518     if (ret != SOFTBUS_OK) {
519         TRANS_LOGE(TRANS_SDK, "lock failed");
520         return ret;
521     }
522 
523     SessionInfo *session = GetExistSession(param);
524     if (session != NULL) {
525         *sessionId = session->sessionId;
526         *isEnabled = session->enableStatus;
527         UnlockClientSessionServerList();
528         return SOFTBUS_TRANS_SESSION_REPEATED;
529     }
530 
531     session = CreateNewSession(param);
532     if (session == NULL) {
533         UnlockClientSessionServerList();
534         TRANS_LOGE(TRANS_SDK, "create session failed");
535         return SOFTBUS_TRANS_SESSION_CREATE_FAILED;
536     }
537 
538     ret = AddSession(param->sessionName, session);
539     if (ret != SOFTBUS_OK) {
540         SoftBusFree(session);
541         UnlockClientSessionServerList();
542         TRANS_LOGE(TRANS_SDK, "Add Session failed, ret=%{public}d", ret);
543         return ret;
544     }
545 
546     *sessionId = session->sessionId;
547     UnlockClientSessionServerList();
548     return SOFTBUS_OK;
549 }
550 
ClientAddAuthSession(const char *sessionName, int32_t *sessionId)551 int32_t ClientAddAuthSession(const char *sessionName, int32_t *sessionId)
552 {
553     if (!IsValidString(sessionName, SESSION_NAME_SIZE_MAX - 1) || (sessionId == NULL)) {
554         TRANS_LOGW(TRANS_SDK, "Invalid param");
555         return SOFTBUS_INVALID_PARAM;
556     }
557     if (g_clientSessionServerList == NULL) {
558         TRANS_LOGE(TRANS_INIT, "entry list not init");
559         return SOFTBUS_TRANS_SESSION_SERVER_NOINIT;
560     }
561     SessionInfo *session = CreateNonEncryptSessionInfo(sessionName);
562     if (session == NULL) {
563         return SOFTBUS_MALLOC_ERR;
564     }
565     int32_t ret = ClientAddNewSession(sessionName, session);
566     if (ret != SOFTBUS_OK) {
567         SoftBusFree(session);
568         TRANS_LOGE(TRANS_SDK, "client add new session failed, ret=%{public}d.", ret);
569         return ret;
570     }
571     *sessionId = session->sessionId;
572     return SOFTBUS_OK;
573 }
574 
ClientDeleteSessionServer(SoftBusSecType type, const char *sessionName)575 int32_t ClientDeleteSessionServer(SoftBusSecType type, const char *sessionName)
576 {
577     if ((type == SEC_TYPE_UNKNOWN) || (sessionName == NULL)) {
578         TRANS_LOGW(TRANS_SDK, "Invalid param");
579         return SOFTBUS_INVALID_PARAM;
580     }
581 
582     int32_t ret = LockClientSessionServerList();
583     if (ret != SOFTBUS_OK) {
584         TRANS_LOGE(TRANS_SDK, "lock failed");
585         return ret;
586     }
587 
588     ClientSessionServer *serverNode = NULL;
589     ListNode destroyList;
590     ListInit(&destroyList);
591     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
592         if ((strcmp(serverNode->sessionName, sessionName) == 0) && (serverNode->type == type)) {
593             DestroyClientSessionServer(serverNode, &destroyList);
594             g_clientSessionServerList->cnt--;
595             break;
596         }
597     }
598     UnlockClientSessionServerList();
599     (void)ClientDestroySession(&destroyList, SHUTDOWN_REASON_LOCAL);
600     return SOFTBUS_OK;
601 }
602 
ClientDeleteSession(int32_t sessionId)603 int32_t ClientDeleteSession(int32_t sessionId)
604 {
605     TRANS_LOGI(TRANS_SDK, "sessionId=%{public}d", sessionId);
606     if (sessionId < 0) {
607         return SOFTBUS_TRANS_INVALID_SESSION_ID;
608     }
609 
610     int32_t ret = LockClientSessionServerList();
611     if (ret != SOFTBUS_OK) {
612         TRANS_LOGE(TRANS_SDK, "lock failed");
613         return ret;
614     }
615 
616     ClientSessionServer *serverNode = NULL;
617     SessionInfo *sessionNode = NULL;
618 
619     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
620         if (IsListEmpty(&serverNode->sessionList)) {
621             continue;
622         }
623         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
624             if (sessionNode->sessionId != sessionId) {
625                 continue;
626             }
627             ListDelete(&(sessionNode->node));
628             TRANS_LOGI(TRANS_SDK, "delete session by sessionId=%{public}d success", sessionId);
629             DestroySessionId();
630             if (!sessionNode->lifecycle.condIsWaiting) {
631                 (void)SoftBusCondDestroy(&(sessionNode->lifecycle.callbackCond));
632             } else {
633                 (void)SoftBusCondSignal(&(sessionNode->lifecycle.callbackCond)); // destroy in CheckSessionEnableStatus
634                 TRANS_LOGI(TRANS_SDK, "sessionId=%{public}d condition is waiting", sessionId);
635             }
636             SoftBusFree(sessionNode);
637             UnlockClientSessionServerList();
638             return SOFTBUS_OK;
639         }
640     }
641 
642     UnlockClientSessionServerList();
643     TRANS_LOGE(TRANS_SDK, "not found session by sessionId=%{public}d", sessionId);
644     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
645 }
646 
ClientGetSessionDataById(int32_t sessionId, char *data, uint16_t len, SessionKey key)647 int32_t ClientGetSessionDataById(int32_t sessionId, char *data, uint16_t len, SessionKey key)
648 {
649     if ((sessionId < 0) || (data == NULL) || (len == 0)) {
650         TRANS_LOGW(TRANS_SDK, "Invalid param");
651         return SOFTBUS_INVALID_PARAM;
652     }
653 
654     int32_t ret = LockClientSessionServerList();
655     if (ret != SOFTBUS_OK) {
656         TRANS_LOGE(TRANS_SDK, "lock failed");
657         return ret;
658     }
659 
660     ClientSessionServer *serverNode = NULL;
661     SessionInfo *sessionNode = NULL;
662     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
663         UnlockClientSessionServerList();
664         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
665         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
666     }
667     switch (key) {
668         case KEY_SESSION_NAME:
669             ret = strcpy_s(data, len, serverNode->sessionName);
670             break;
671         case KEY_PEER_SESSION_NAME:
672             ret = strcpy_s(data, len, sessionNode->info.peerSessionName);
673             break;
674         case KEY_PEER_DEVICE_ID:
675             ret = strcpy_s(data, len, sessionNode->info.peerDeviceId);
676             break;
677         case KEY_PKG_NAME:
678             ret = strcpy_s(data, len, serverNode->pkgName);
679             break;
680         default:
681             UnlockClientSessionServerList();
682             return SOFTBUS_MEM_ERR;
683     }
684 
685     UnlockClientSessionServerList();
686     if (ret != EOK) {
687         TRANS_LOGE(TRANS_SDK, "strcpy_s data info failed, ret=%{public}d", ret);
688         return SOFTBUS_STRCPY_ERR;
689     }
690     return SOFTBUS_OK;
691 }
692 
ClientGetSessionIntegerDataById(int32_t sessionId, int *data, SessionKey key)693 int32_t ClientGetSessionIntegerDataById(int32_t sessionId, int *data, SessionKey key)
694 {
695     if ((sessionId < 0) || (data == NULL)) {
696         TRANS_LOGW(TRANS_SDK, "Invalid param");
697         return SOFTBUS_INVALID_PARAM;
698     }
699 
700     int32_t ret = LockClientSessionServerList();
701     if (ret != SOFTBUS_OK) {
702         TRANS_LOGE(TRANS_SDK, "lock failed");
703         return ret;
704     }
705 
706     ClientSessionServer *serverNode = NULL;
707     SessionInfo *sessionNode = NULL;
708     ret = GetSessionById(sessionId, &serverNode, &sessionNode);
709     if (ret != SOFTBUS_OK) {
710         UnlockClientSessionServerList();
711         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
712         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
713     }
714     switch (key) {
715         case KEY_IS_SERVER:
716             *data = sessionNode->isServer;
717             break;
718         case KEY_PEER_PID:
719             *data = sessionNode->peerPid;
720             break;
721         case KEY_PEER_UID:
722             *data = sessionNode->peerUid;
723             break;
724         case KEY_ACTION_ID:
725             *data = (int)sessionNode->actionId;
726             break;
727         default:
728             UnlockClientSessionServerList();
729             return SOFTBUS_NOT_FIND;
730     }
731 
732     UnlockClientSessionServerList();
733     return SOFTBUS_OK;
734 }
735 
ClientGetChannelBySessionId( int32_t sessionId, int32_t *channelId, int32_t *type, SessionEnableStatus *enableStatus)736 int32_t ClientGetChannelBySessionId(
737     int32_t sessionId, int32_t *channelId, int32_t *type, SessionEnableStatus *enableStatus)
738 {
739     if (sessionId < 0) {
740         return SOFTBUS_TRANS_INVALID_SESSION_ID;
741     }
742     int32_t ret = LockClientSessionServerList();
743     if (ret != SOFTBUS_OK) {
744         TRANS_LOGE(TRANS_SDK, "lock failed");
745         return ret;
746     }
747 
748     ClientSessionServer *serverNode = NULL;
749     SessionInfo *sessionNode = NULL;
750     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
751         UnlockClientSessionServerList();
752         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
753         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
754     }
755 
756     if (channelId != NULL) {
757         *channelId = sessionNode->channelId;
758     }
759     if (type != NULL) {
760         *type = sessionNode->channelType;
761     }
762     if (enableStatus != NULL) {
763         *enableStatus = sessionNode->enableStatus;
764     }
765     UnlockClientSessionServerList();
766     return SOFTBUS_OK;
767 }
768 
ClientSetStatusClosingBySocket(int32_t socket, bool isClosing)769 int32_t ClientSetStatusClosingBySocket(int32_t socket, bool isClosing)
770 {
771     if (socket < 0) {
772         TRANS_LOGE(TRANS_INIT, "invalid socket=%{public}d", socket);
773         return SOFTBUS_TRANS_INVALID_SESSION_ID;
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     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
785         UnlockClientSessionServerList();
786         TRANS_LOGE(TRANS_SDK, "socket not found. socket=%{public}d", socket);
787         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
788     }
789 
790     sessionNode->isClosing = isClosing;
791     UnlockClientSessionServerList();
792     return SOFTBUS_OK;
793 }
794 
ClientSetEnableStatusBySocket(int32_t socket, SessionEnableStatus enableStatus)795 int32_t ClientSetEnableStatusBySocket(int32_t socket, SessionEnableStatus enableStatus)
796 {
797     if (socket < 0) {
798         TRANS_LOGE(TRANS_INIT, "invalid socket=%{public}d", socket);
799         return SOFTBUS_TRANS_INVALID_SESSION_ID;
800     }
801 
802     int32_t ret = LockClientSessionServerList();
803     if (ret != SOFTBUS_OK) {
804         TRANS_LOGE(TRANS_SDK, "lock failed");
805         return ret;
806     }
807 
808     ClientSessionServer *serverNode = NULL;
809     SessionInfo *sessionNode = NULL;
810     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
811         UnlockClientSessionServerList();
812         TRANS_LOGE(TRANS_SDK, "socket not found. socket=%{public}d", socket);
813         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
814     }
815 
816     sessionNode->enableStatus = enableStatus;
817     UnlockClientSessionServerList();
818     return SOFTBUS_OK;
819 }
820 
ClientGetChannelBusinessTypeBySessionId(int32_t sessionId, int32_t *businessType)821 int32_t ClientGetChannelBusinessTypeBySessionId(int32_t sessionId, int32_t *businessType)
822 {
823     if ((sessionId < 0) || (businessType == NULL)) {
824         return SOFTBUS_INVALID_PARAM;
825     }
826     int32_t ret = LockClientSessionServerList();
827     if (ret != SOFTBUS_OK) {
828         TRANS_LOGE(TRANS_SDK, "lock failed");
829         return ret;
830     }
831 
832     ClientSessionServer *serverNode = NULL;
833     SessionInfo *sessionNode = NULL;
834     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
835         UnlockClientSessionServerList();
836         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
837         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
838     }
839 
840     *businessType = sessionNode->businessType;
841 
842     UnlockClientSessionServerList();
843     return SOFTBUS_OK;
844 }
845 
ClientSetChannelBySessionId(int32_t sessionId, TransInfo *transInfo)846 int32_t ClientSetChannelBySessionId(int32_t sessionId, TransInfo *transInfo)
847 {
848     if ((sessionId < 0) || (transInfo->channelId < 0)) {
849         TRANS_LOGW(TRANS_SDK, "Invalid param");
850         return SOFTBUS_INVALID_PARAM;
851     }
852 
853     int32_t ret = LockClientSessionServerList();
854     if (ret != SOFTBUS_OK) {
855         TRANS_LOGE(TRANS_SDK, "lock failed");
856         return ret;
857     }
858 
859     ClientSessionServer *serverNode = NULL;
860     SessionInfo *sessionNode = NULL;
861     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
862         UnlockClientSessionServerList();
863         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
864         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
865     }
866     sessionNode->channelId = transInfo->channelId;
867     sessionNode->channelType = (ChannelType)transInfo->channelType;
868     TRANS_LOGI(TRANS_SDK, "Client set channel by sessionId success, sessionId=%{public}d, channelId=%{public}d, "
869         "channelType=%{public}d", sessionId, sessionNode->channelId, sessionNode->channelType);
870 
871     UnlockClientSessionServerList();
872     return SOFTBUS_OK;
873 }
874 
GetEncryptByChannelId(int32_t channelId, int32_t channelType, int32_t *data)875 int32_t GetEncryptByChannelId(int32_t channelId, int32_t channelType, int32_t *data)
876 {
877     if ((channelId < 0) || (data == NULL)) {
878         TRANS_LOGW(TRANS_SDK, "Invalid param");
879         return SOFTBUS_INVALID_PARAM;
880     }
881 
882     int32_t ret = LockClientSessionServerList();
883     if (ret != SOFTBUS_OK) {
884         TRANS_LOGE(TRANS_SDK, "lock failed");
885         return ret;
886     }
887 
888     ClientSessionServer *serverNode = NULL;
889     SessionInfo *sessionNode = NULL;
890 
891     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
892         if (IsListEmpty(&serverNode->sessionList)) {
893             continue;
894         }
895 
896         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
897             if (sessionNode->channelId == channelId && (int32_t)sessionNode->channelType == channelType) {
898                 *data = (int32_t)sessionNode->isEncrypt;
899                 UnlockClientSessionServerList();
900                 return SOFTBUS_OK;
901             }
902         }
903     }
904 
905     UnlockClientSessionServerList();
906     TRANS_LOGE(TRANS_SDK, "not found session by channelId=%{public}d", channelId);
907     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
908 }
909 
ClientGetSessionStateByChannelId(int32_t channelId, int32_t channelType, SessionState *sessionState)910 int32_t ClientGetSessionStateByChannelId(int32_t channelId, int32_t channelType, SessionState *sessionState)
911 {
912     if ((channelId < 0) || (sessionState == NULL)) {
913         TRANS_LOGW(TRANS_SDK, "Invalid param, channelId=%{public}d, channelType=%{public}d", channelId, channelType);
914         return SOFTBUS_INVALID_PARAM;
915     }
916 
917     int32_t ret = LockClientSessionServerList();
918     if (ret != SOFTBUS_OK) {
919         TRANS_LOGE(TRANS_SDK, "lock failed");
920         return ret;
921     }
922 
923     ClientSessionServer *serverNode = NULL;
924     SessionInfo *sessionNode = NULL;
925 
926     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
927         if (IsListEmpty(&serverNode->sessionList)) {
928             continue;
929         }
930 
931         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
932             if (sessionNode->channelId == channelId && sessionNode->channelType == (ChannelType)channelType) {
933                 *sessionState = sessionNode->lifecycle.sessionState;
934                 UnlockClientSessionServerList();
935                 return SOFTBUS_OK;
936             }
937         }
938     }
939 
940     UnlockClientSessionServerList();
941     TRANS_LOGE(TRANS_SDK, "not found session by channelId=%{public}d", channelId);
942     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
943 }
944 
ClientGetSessionIdByChannelId(int32_t channelId, int32_t channelType, int32_t *sessionId, bool isClosing)945 int32_t ClientGetSessionIdByChannelId(int32_t channelId, int32_t channelType, int32_t *sessionId, bool isClosing)
946 {
947     if ((channelId < 0) || (sessionId == NULL)) {
948         TRANS_LOGW(TRANS_SDK, "Invalid param");
949         return SOFTBUS_INVALID_PARAM;
950     }
951 
952     int32_t ret = LockClientSessionServerList();
953     if (ret != SOFTBUS_OK) {
954         TRANS_LOGE(TRANS_SDK, "lock failed");
955         return ret;
956     }
957 
958     ClientSessionServer *serverNode = NULL;
959     SessionInfo *sessionNode = NULL;
960 
961     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
962         if (IsListEmpty(&serverNode->sessionList)) {
963             continue;
964         }
965 
966         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
967             bool flag = (isClosing ? sessionNode->isClosing : true);
968             if (sessionNode->channelId == channelId && sessionNode->channelType == (ChannelType)channelType && flag) {
969                 *sessionId = sessionNode->sessionId;
970                 UnlockClientSessionServerList();
971                 return SOFTBUS_OK;
972             }
973         }
974     }
975 
976     UnlockClientSessionServerList();
977     TRANS_LOGE(TRANS_SDK, "not found session by channelId=%{public}d", channelId);
978     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
979 }
980 
ClientGetSessionIsAsyncBySessionId(int32_t sessionId, bool *isAsync)981 int32_t ClientGetSessionIsAsyncBySessionId(int32_t sessionId, bool *isAsync)
982 {
983     if ((sessionId < 0) || (isAsync == NULL)) {
984         TRANS_LOGW(TRANS_SDK, "Invalid param");
985         return SOFTBUS_INVALID_PARAM;
986     }
987 
988     int32_t ret = LockClientSessionServerList();
989     if (ret != SOFTBUS_OK) {
990         TRANS_LOGE(TRANS_SDK, "lock failed");
991         return ret;
992     }
993     ClientSessionServer *serverNode = NULL;
994     SessionInfo *sessionNode = NULL;
995     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
996         if (IsListEmpty(&serverNode->sessionList)) {
997             continue;
998         }
999 
1000         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1001             if (sessionNode->sessionId == sessionId) {
1002                 *isAsync = sessionNode->isAsync;
1003                 UnlockClientSessionServerList();
1004                 return SOFTBUS_OK;
1005             }
1006         }
1007     }
1008 
1009     UnlockClientSessionServerList();
1010     TRANS_LOGE(TRANS_SDK, "not found session with sessionId=%{public}d", sessionId);
1011     return SOFTBUS_NOT_FIND;
1012 }
1013 
ClientGetRouteTypeByChannelId(int32_t channelId, int32_t channelType, int32_t *routeType)1014 int32_t ClientGetRouteTypeByChannelId(int32_t channelId, int32_t channelType, int32_t *routeType)
1015 {
1016     if ((channelId < 0) || (routeType == NULL)) {
1017         TRANS_LOGW(TRANS_SDK, "Invalid param");
1018         return SOFTBUS_INVALID_PARAM;
1019     }
1020 
1021     int32_t ret = LockClientSessionServerList();
1022     if (ret != SOFTBUS_OK) {
1023         TRANS_LOGE(TRANS_SDK, "lock failed");
1024         return ret;
1025     }
1026 
1027     ClientSessionServer *serverNode = NULL;
1028     SessionInfo *sessionNode = NULL;
1029 
1030     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1031         if (IsListEmpty(&serverNode->sessionList)) {
1032             continue;
1033         }
1034 
1035         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1036             if (sessionNode->channelId == channelId && sessionNode->channelType == (ChannelType)channelType) {
1037                 *routeType = sessionNode->routeType;
1038                 UnlockClientSessionServerList();
1039                 return SOFTBUS_OK;
1040             }
1041         }
1042     }
1043 
1044     UnlockClientSessionServerList();
1045     TRANS_LOGE(TRANS_SDK, "not found session by channelId=%{public}d", channelId);
1046     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1047 }
1048 
ClientGetDataConfigByChannelId(int32_t channelId, int32_t channelType, uint32_t *dataConfig)1049 int32_t ClientGetDataConfigByChannelId(int32_t channelId, int32_t channelType, uint32_t *dataConfig)
1050 {
1051     if ((channelId < 0) || (dataConfig == NULL)) {
1052         TRANS_LOGW(TRANS_SDK, "Invalid param");
1053         return SOFTBUS_INVALID_PARAM;
1054     }
1055 
1056     int32_t ret = LockClientSessionServerList();
1057     if (ret != SOFTBUS_OK) {
1058         TRANS_LOGE(TRANS_SDK, "lock failed");
1059         return ret;
1060     }
1061 
1062     ClientSessionServer *serverNode = NULL;
1063     SessionInfo *sessionNode = NULL;
1064 
1065     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1066         if (IsListEmpty(&serverNode->sessionList)) {
1067             continue;
1068         }
1069 
1070         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1071             if (sessionNode->channelId == channelId && sessionNode->channelType == (ChannelType)channelType) {
1072                 *dataConfig = sessionNode->dataConfig;
1073                 UnlockClientSessionServerList();
1074                 return SOFTBUS_OK;
1075             }
1076         }
1077     }
1078 
1079     UnlockClientSessionServerList();
1080     TRANS_LOGE(TRANS_SDK, "not found session by channelId=%{public}d", channelId);
1081     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1082 }
1083 
1084 // Only need to operate on the action guidance ishare auth channel
ClientSetAuthSessionTimer(const ClientSessionServer *serverNode, SessionInfo *sessionNode)1085 static void ClientSetAuthSessionTimer(const ClientSessionServer *serverNode, SessionInfo *sessionNode)
1086 {
1087     if (strcmp(serverNode->sessionName, ISHARE_AUTH_SESSION) == 0 && sessionNode->channelType == CHANNEL_TYPE_AUTH &&
1088         sessionNode->actionId != 0) {
1089         sessionNode->lifecycle.maxWaitTime = ISHARE_AUTH_SESSION_MAX_IDLE_TIME;
1090         sessionNode->lifecycle.waitTime = 0;
1091         TRANS_LOGI(TRANS_SDK, "set auth sessionId=%{public}d waitTime success.", sessionNode->sessionId);
1092     }
1093 }
1094 
ClientEnableSessionByChannelId(const ChannelInfo *channel, int32_t *sessionId)1095 int32_t ClientEnableSessionByChannelId(const ChannelInfo *channel, int32_t *sessionId)
1096 {
1097     TRANS_CHECK_AND_RETURN_RET_LOGE(
1098         (channel != NULL && sessionId != NULL), SOFTBUS_INVALID_PARAM, TRANS_SDK, "Invalid param");
1099 
1100     int32_t ret = LockClientSessionServerList();
1101     if (ret != SOFTBUS_OK) {
1102         TRANS_LOGE(TRANS_SDK, "lock failed");
1103         return ret;
1104     }
1105 
1106     ClientSessionServer *serverNode = NULL;
1107     SessionInfo *sessionNode = NULL;
1108 
1109     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1110         if (IsListEmpty(&serverNode->sessionList)) {
1111             continue;
1112         }
1113 
1114         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1115             if ((sessionNode->channelId == channel->channelId) &&
1116                 (sessionNode->channelType == (ChannelType)(channel->channelType))) {
1117                 sessionNode->peerPid = channel->peerPid;
1118                 sessionNode->peerUid = channel->peerUid;
1119                 sessionNode->isServer = channel->isServer;
1120                 sessionNode->enableStatus = ENABLE_STATUS_SUCCESS;
1121                 sessionNode->routeType = channel->routeType;
1122                 sessionNode->businessType = channel->businessType;
1123                 sessionNode->fileEncrypt = channel->fileEncrypt;
1124                 sessionNode->dataConfig = channel->dataConfig;
1125                 sessionNode->algorithm = channel->algorithm;
1126                 sessionNode->crc = channel->crc;
1127                 sessionNode->isEncrypt = channel->isEncrypt;
1128                 sessionNode->osType = channel->osType;
1129                 *sessionId = sessionNode->sessionId;
1130                 if (channel->channelType == CHANNEL_TYPE_AUTH || !sessionNode->isEncrypt) {
1131                     ClientSetAuthSessionTimer(serverNode, sessionNode);
1132                     if (memcpy_s(sessionNode->info.peerDeviceId, DEVICE_ID_SIZE_MAX,
1133                         channel->peerDeviceId, DEVICE_ID_SIZE_MAX) != EOK) {
1134                         UnlockClientSessionServerList();
1135                         return SOFTBUS_MEM_ERR;
1136                     }
1137                 }
1138                 UnlockClientSessionServerList();
1139                 return SOFTBUS_OK;
1140             }
1141         }
1142     }
1143 
1144     UnlockClientSessionServerList();
1145     TRANS_LOGE(TRANS_SDK, "not found session by channelId=%{public}d, channelType=%{public}d",
1146         channel->channelId, channel->channelType);
1147     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1148 }
1149 
ClientGetSessionCallbackById(int32_t sessionId, ISessionListener *callback)1150 int32_t ClientGetSessionCallbackById(int32_t sessionId, ISessionListener *callback)
1151 {
1152     if (sessionId < 0 || callback == NULL) {
1153         TRANS_LOGW(TRANS_SDK, "Invalid param");
1154         return SOFTBUS_INVALID_PARAM;
1155     }
1156 
1157     int32_t ret = LockClientSessionServerList();
1158     if (ret != SOFTBUS_OK) {
1159         TRANS_LOGE(TRANS_SDK, "lock failed");
1160         return ret;
1161     }
1162 
1163     ClientSessionServer *serverNode = NULL;
1164     SessionInfo *sessionNode = NULL;
1165     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
1166         UnlockClientSessionServerList();
1167         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
1168         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1169     }
1170 
1171     ret = memcpy_s(callback, sizeof(ISessionListener), &serverNode->listener.session, sizeof(ISessionListener));
1172     UnlockClientSessionServerList();
1173     if (ret != EOK) {
1174         return SOFTBUS_MEM_ERR;
1175     }
1176     return SOFTBUS_OK;
1177 }
1178 
ClientGetSessionCallbackByName(const char *sessionName, ISessionListener *callback)1179 int32_t ClientGetSessionCallbackByName(const char *sessionName, ISessionListener *callback)
1180 {
1181     if (sessionName == NULL || callback == NULL) {
1182         TRANS_LOGW(TRANS_SDK, "Invalid param");
1183         return SOFTBUS_INVALID_PARAM;
1184     }
1185 
1186     int32_t ret = LockClientSessionServerList();
1187     if (ret != SOFTBUS_OK) {
1188         TRANS_LOGE(TRANS_SDK, "lock failed");
1189         return ret;
1190     }
1191 
1192     ClientSessionServer *serverNode = NULL;
1193 
1194     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1195         if (strcmp(serverNode->sessionName, sessionName) != 0) {
1196             continue;
1197         }
1198 
1199         ret = memcpy_s(callback, sizeof(ISessionListener), &serverNode->listener.session, sizeof(ISessionListener));
1200         UnlockClientSessionServerList();
1201         if (ret != EOK) {
1202             return SOFTBUS_MEM_ERR;
1203         }
1204         return SOFTBUS_OK;
1205     }
1206 
1207     UnlockClientSessionServerList();
1208     char *tmpName = NULL;
1209     Anonymize(sessionName, &tmpName);
1210     TRANS_LOGE(TRANS_SDK, "not found session by sessionName=%{public}s", AnonymizeWrapper(tmpName));
1211     AnonymizeFree(tmpName);
1212     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1213 }
1214 
ClientGetSessionSide(int32_t sessionId)1215 int32_t ClientGetSessionSide(int32_t sessionId)
1216 {
1217     int32_t ret = LockClientSessionServerList();
1218     if (ret != SOFTBUS_OK) {
1219         TRANS_LOGE(TRANS_SDK, "lock failed");
1220         return ret;
1221     }
1222 
1223     int32_t side = -1;
1224     ClientSessionServer *serverNode = NULL;
1225     SessionInfo *sessionNode = NULL;
1226 
1227     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1228         if (IsListEmpty(&serverNode->sessionList)) {
1229             continue;
1230         }
1231         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1232             if (sessionNode->sessionId != sessionId) {
1233                 continue;
1234             }
1235             side = sessionNode->isServer ? IS_SERVER : IS_CLIENT;
1236             UnlockClientSessionServerList();
1237             return side;
1238         }
1239     }
1240     UnlockClientSessionServerList();
1241     return side;
1242 }
1243 
ClientTransLnnOfflineProc(NodeBasicInfo *info)1244 static void ClientTransLnnOfflineProc(NodeBasicInfo *info)
1245 {
1246     TRANS_LOGD(TRANS_SDK, "device offline callback enter.");
1247     if (info == NULL) {
1248         return;
1249     }
1250     if (LockClientSessionServerList() != SOFTBUS_OK) {
1251         TRANS_LOGE(TRANS_SDK, "lock failed");
1252         return;
1253     }
1254 
1255     ClientSessionServer *serverNode = NULL;
1256     ListNode destroyList;
1257     ListInit(&destroyList);
1258     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1259         DestroyClientSessionByNetworkId(serverNode, info->networkId, ROUTE_TYPE_ALL, &destroyList);
1260     }
1261     UnlockClientSessionServerList();
1262     (void)ClientDestroySession(&destroyList, SHUTDOWN_REASON_LNN_OFFLINE);
1263     return;
1264 }
1265 
1266 static INodeStateCb g_transLnnCb = {
1267     .events = EVENT_NODE_STATE_OFFLINE,
1268     .onNodeOffline = ClientTransLnnOfflineProc,
1269 };
1270 
ClientTransRegLnnOffline(void)1271 void ClientTransRegLnnOffline(void)
1272 {
1273     int32_t ret;
1274     ret = RegNodeDeviceStateCbInner("trans", &g_transLnnCb);
1275     if (ret != SOFTBUS_OK) {
1276         TRANS_LOGE(TRANS_SDK, "reg lnn offline fail");
1277     }
1278 }
1279 
ClientTransOnLinkDown(const char *networkId, int32_t routeType)1280 void ClientTransOnLinkDown(const char *networkId, int32_t routeType)
1281 {
1282     if (networkId == NULL) {
1283         return;
1284     }
1285     if (LockClientSessionServerList() != SOFTBUS_OK) {
1286         TRANS_LOGE(TRANS_SDK, "lock failed");
1287         return;
1288     }
1289     char *anonyNetworkId = NULL;
1290     Anonymize(networkId, &anonyNetworkId);
1291     TRANS_LOGD(TRANS_SDK, "routeType=%{public}d, networkId=%{public}s", routeType, AnonymizeWrapper(anonyNetworkId));
1292     AnonymizeFree(anonyNetworkId);
1293 
1294     ClientSessionServer *serverNode = NULL;
1295     ListNode destroyList;
1296     ListInit(&destroyList);
1297     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1298         if (strcmp(CAST_SESSION, serverNode->sessionName) == 0 && CheckIsSystemService()) {
1299             TRANS_LOGD(TRANS_SDK, "cast plus sessionname is different");
1300             continue;
1301         }
1302         DestroyClientSessionByNetworkId(serverNode, networkId, routeType, &destroyList);
1303     }
1304     UnlockClientSessionServerList();
1305     (void)ClientDestroySession(&destroyList, SHUTDOWN_REASON_LINK_DOWN);
1306     return;
1307 }
1308 
ClientGetFileConfigInfoById(int32_t sessionId, int32_t *fileEncrypt, int32_t *algorithm, int32_t *crc)1309 int32_t ClientGetFileConfigInfoById(int32_t sessionId, int32_t *fileEncrypt, int32_t *algorithm, int32_t *crc)
1310 {
1311     if (sessionId < 0 || fileEncrypt == NULL || algorithm == NULL || crc == NULL) {
1312         TRANS_LOGW(TRANS_SDK, "Invalid param");
1313         return SOFTBUS_INVALID_PARAM;
1314     }
1315 
1316     int32_t ret = LockClientSessionServerList();
1317     if (ret != SOFTBUS_OK) {
1318         TRANS_LOGE(TRANS_SDK, "lock failed");
1319         return ret;
1320     }
1321 
1322     ClientSessionServer *serverNode = NULL;
1323     SessionInfo *sessionNode = NULL;
1324     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
1325         UnlockClientSessionServerList();
1326         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
1327         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1328     }
1329     *fileEncrypt = sessionNode->fileEncrypt;
1330     *algorithm = sessionNode->algorithm;
1331     *crc = sessionNode->crc;
1332     UnlockClientSessionServerList();
1333     return SOFTBUS_OK;
1334 }
1335 
ClientCleanAllSessionWhenServerDeath(ListNode *sessionServerInfoList)1336 void ClientCleanAllSessionWhenServerDeath(ListNode *sessionServerInfoList)
1337 {
1338     if (sessionServerInfoList == NULL) {
1339         TRANS_LOGE(TRANS_SDK, "invalid param.");
1340         return;
1341     }
1342 
1343     if (LockClientSessionServerList() != SOFTBUS_OK) {
1344         TRANS_LOGE(TRANS_SDK, "lock failed");
1345         return;
1346     }
1347     uint32_t destroyCnt = 0;
1348     ListNode destroyList;
1349     ListInit(&destroyList);
1350     ClientSessionServer *serverNode = NULL;
1351     SessionInfo *sessionNode = NULL;
1352     SessionInfo *nextSessionNode = NULL;
1353     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1354         serverNode->sessionAddingCnt = 0;
1355         SessionServerInfo * info = CreateSessionServerInfoNode(serverNode);
1356         if (info != NULL) {
1357             ListAdd(sessionServerInfoList, &info->node);
1358         }
1359         if (IsListEmpty(&serverNode->sessionList)) {
1360             continue;
1361         }
1362         LIST_FOR_EACH_ENTRY_SAFE(sessionNode, nextSessionNode, &(serverNode->sessionList), SessionInfo, node) {
1363             if (sessionNode->role == SESSION_ROLE_SERVER) {
1364                 TRANS_LOGD(TRANS_SDK, "cannot delete socket for listening, socket=%{public}d", sessionNode->sessionId);
1365                 continue;
1366             }
1367             DestroySessionInfo *destroyNode = CreateDestroySessionNode(sessionNode, serverNode);
1368             if (destroyNode == NULL) {
1369                 continue;
1370             }
1371             ListAdd(&destroyList, &(destroyNode->node));
1372             DestroySessionId();
1373             ListDelete(&sessionNode->node);
1374             SoftBusFree(sessionNode);
1375             ++destroyCnt;
1376         }
1377     }
1378     UnlockClientSessionServerList();
1379     (void)ClientDestroySession(&destroyList, SHUTDOWN_REASON_SERVICE_DIED);
1380     TRANS_LOGI(TRANS_SDK, "client destroy session cnt=%{public}d.", destroyCnt);
1381 }
1382 
ClientAddSocketServer(SoftBusSecType type, const char *pkgName, const char *sessionName)1383 int32_t ClientAddSocketServer(SoftBusSecType type, const char *pkgName, const char *sessionName)
1384 {
1385     if (pkgName == NULL || sessionName == NULL) {
1386         return SOFTBUS_INVALID_PARAM;
1387     }
1388 
1389     int32_t ret = LockClientSessionServerList();
1390     if (ret != SOFTBUS_OK) {
1391         TRANS_LOGE(TRANS_SDK, "lock failed");
1392         return ret;
1393     }
1394     if (SocketServerIsExistAndUpdate(sessionName)) {
1395         UnlockClientSessionServerList();
1396         return SOFTBUS_SERVER_NAME_REPEATED;
1397     }
1398 
1399     if (g_clientSessionServerList->cnt >= MAX_SESSION_SERVER_NUMBER) {
1400         ShowClientSessionServer();
1401         UnlockClientSessionServerList();
1402         TRANS_LOGE(TRANS_SDK, "ClientAddSocketServer: client server num reach max");
1403         return SOFTBUS_INVALID_NUM;
1404     }
1405 
1406     ClientSessionServer *server = GetNewSocketServer(type, sessionName, pkgName);
1407     if (server == NULL) {
1408         UnlockClientSessionServerList();
1409         return SOFTBUS_MEM_ERR;
1410     }
1411     server->permissionState = true;
1412     ListAdd(&g_clientSessionServerList->list, &server->node);
1413     g_clientSessionServerList->cnt++;
1414 
1415     UnlockClientSessionServerList();
1416     char *anonymizePkgName = NULL;
1417     char *tmpName = NULL;
1418     Anonymize(pkgName, &anonymizePkgName);
1419     Anonymize(sessionName, &tmpName);
1420     TRANS_LOGE(TRANS_SDK, "sessionName=%{public}s, pkgName=%{public}s",
1421         AnonymizeWrapper(tmpName), AnonymizeWrapper(anonymizePkgName));
1422     AnonymizeFree(anonymizePkgName);
1423     AnonymizeFree(tmpName);
1424     return SOFTBUS_OK;
1425 }
1426 
DeleteSocketSession(int32_t sessionId, char *pkgName, char *sessionName)1427 int32_t DeleteSocketSession(int32_t sessionId, char *pkgName, char *sessionName)
1428 {
1429     int32_t ret = LockClientSessionServerList();
1430     if (ret != SOFTBUS_OK) {
1431         TRANS_LOGE(TRANS_SDK, "lock failed");
1432         return ret;
1433     }
1434 
1435     ClientSessionServer *serverNode = NULL;
1436     SessionInfo *sessionNode = NULL;
1437     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
1438         UnlockClientSessionServerList();
1439         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
1440         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1441     }
1442 
1443     if (strcpy_s(pkgName, PKG_NAME_SIZE_MAX, serverNode->pkgName) != EOK) {
1444         UnlockClientSessionServerList();
1445         TRANS_LOGE(TRANS_SDK, "strcpy pkgName failed");
1446         return SOFTBUS_STRCPY_ERR;
1447     }
1448 
1449     if (strcpy_s(sessionName, SESSION_NAME_SIZE_MAX, serverNode->sessionName) != EOK) {
1450         UnlockClientSessionServerList();
1451         TRANS_LOGE(TRANS_SDK, "strcpy sessionName failed");
1452         return SOFTBUS_STRCPY_ERR;
1453     }
1454     ListDelete(&(sessionNode->node));
1455     TRANS_LOGI(TRANS_SDK, "delete session, sessionId=%{public}d", sessionId);
1456     DestroySessionId();
1457     if (!sessionNode->lifecycle.condIsWaiting) {
1458         (void)SoftBusCondDestroy(&(sessionNode->lifecycle.callbackCond));
1459     } else {
1460         (void)SoftBusCondSignal(&(sessionNode->lifecycle.callbackCond)); // destroy in CheckSessionEnableStatus
1461         TRANS_LOGI(TRANS_SDK, "sessionId=%{public}d condition is waiting", sessionId);
1462     }
1463     SoftBusFree(sessionNode);
1464     UnlockClientSessionServerList();
1465     return SOFTBUS_OK;
1466 }
1467 
GetSocketExistSession(const SessionParam *param, bool isEncyptedRawStream)1468 static SessionInfo *GetSocketExistSession(const SessionParam *param, bool isEncyptedRawStream)
1469 {
1470     ClientSessionServer *serverNode = NULL;
1471     SessionInfo *sessionInfo = NULL;
1472     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1473         // distributeddata module can create different socket of whether the SocketInfo is same or not
1474         if ((strcmp(serverNode->sessionName, param->sessionName) != 0) || IsListEmpty(&serverNode->sessionList) ||
1475             IsDistributedDataSession(param->sessionName)) {
1476             continue;
1477         }
1478         LIST_FOR_EACH_ENTRY(sessionInfo, &(serverNode->sessionList), SessionInfo, node) {
1479             if (sessionInfo->isServer || (strcmp(sessionInfo->info.peerSessionName, param->peerSessionName) != 0) ||
1480                 (strcmp(sessionInfo->info.peerDeviceId, param->peerDeviceId) != 0) ||
1481                 (strcmp(sessionInfo->info.groupId, param->groupId) != 0) ||
1482                 IsDifferentDataType(sessionInfo, param->attr->dataType, isEncyptedRawStream)) {
1483                 continue;
1484             }
1485             return sessionInfo;
1486         }
1487     }
1488     return NULL;
1489 }
1490 
ClientAddSocketSession( const SessionParam *param, bool isEncyptedRawStream, int32_t *sessionId, SessionEnableStatus *isEnabled)1491 int32_t ClientAddSocketSession(
1492     const SessionParam *param, bool isEncyptedRawStream, int32_t *sessionId, SessionEnableStatus *isEnabled)
1493 {
1494     if (param == NULL || param->sessionName == NULL || param->groupId == NULL || param->attr == NULL ||
1495         sessionId == NULL) {
1496         TRANS_LOGE(TRANS_SDK, "Invalid param");
1497         return SOFTBUS_INVALID_PARAM;
1498     }
1499     int32_t ret = LockClientSessionServerList();
1500     if (ret != SOFTBUS_OK) {
1501         TRANS_LOGE(TRANS_SDK, "lock failed");
1502         return ret;
1503     }
1504 
1505     SessionInfo *session = GetSocketExistSession(param, isEncyptedRawStream);
1506     if (session != NULL) {
1507         if (session->lifecycle.bindErrCode != SOFTBUS_TRANS_STOP_BIND_BY_CANCEL) {
1508             *sessionId = session->sessionId;
1509             *isEnabled = session->enableStatus;
1510             UnlockClientSessionServerList();
1511             return SOFTBUS_TRANS_SESSION_REPEATED;
1512         }
1513         TRANS_LOGI(TRANS_SDK, "socket=%{public}d is shutdown", session->sessionId);
1514     }
1515 
1516     session = CreateNewSocketSession(param);
1517     if (session == NULL) {
1518         UnlockClientSessionServerList();
1519         TRANS_LOGE(TRANS_SDK, "create session failed");
1520         return SOFTBUS_TRANS_SESSION_CREATE_FAILED;
1521     }
1522     session->isEncyptedRawStream = isEncyptedRawStream;
1523     ret = AddSession(param->sessionName, session);
1524     if (ret != SOFTBUS_OK) {
1525         SoftBusFree(session);
1526         UnlockClientSessionServerList();
1527         TRANS_LOGE(TRANS_SDK, "Add Session failed, ret=%{public}d", ret);
1528         return ret;
1529     }
1530 
1531     *sessionId = session->sessionId;
1532     UnlockClientSessionServerList();
1533     return SOFTBUS_OK;
1534 }
1535 
ClientSetListenerBySessionId(int32_t sessionId, const ISocketListener *listener, bool isServer)1536 int32_t ClientSetListenerBySessionId(int32_t sessionId, const ISocketListener *listener, bool isServer)
1537 {
1538     if ((sessionId < 0) || listener == NULL) {
1539         TRANS_LOGE(TRANS_SDK, "Invalid param");
1540         return SOFTBUS_INVALID_PARAM;
1541     }
1542     int32_t ret = LockClientSessionServerList();
1543     if (ret != SOFTBUS_OK) {
1544         TRANS_LOGE(TRANS_SDK, "lock failed");
1545         return ret;
1546     }
1547 
1548     ClientSessionServer *serverNode = NULL;
1549     SessionInfo *sessionNode = NULL;
1550     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
1551         UnlockClientSessionServerList();
1552         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
1553         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1554     }
1555 
1556     if (sessionNode->role != SESSION_ROLE_INIT) {
1557         TRANS_LOGE(TRANS_SDK, "socket in use, currentRole=%{public}d", sessionNode->role);
1558         UnlockClientSessionServerList();
1559         return SOFTBUS_TRANS_SOCKET_IN_USE;
1560     }
1561     ISocketListener *socketListener = isServer ? &(serverNode->listener.socketServer) :
1562         &(serverNode->listener.socketClient);
1563     ret = memcpy_s(socketListener, sizeof(ISocketListener), listener, sizeof(ISocketListener));
1564     if (ret != EOK) {
1565         UnlockClientSessionServerList();
1566         TRANS_LOGE(TRANS_SDK, "memcpy_s socketListener failed, ret=%{public}d", ret);
1567         return SOFTBUS_MEM_ERR;
1568     }
1569     serverNode->listener.isSocketListener = true;
1570     if (socketListener->OnFile == NULL) {
1571         UnlockClientSessionServerList();
1572         return SOFTBUS_OK;
1573     }
1574     ret = TransSetSocketFileListener(serverNode->sessionName, socketListener->OnFile, isServer);
1575     if (ret != SOFTBUS_OK) {
1576         UnlockClientSessionServerList();
1577         TRANS_LOGE(TRANS_SDK, "register socket file listener failed");
1578         return ret;
1579     }
1580     UnlockClientSessionServerList();
1581     return SOFTBUS_OK;
1582 }
1583 
ClientIpcOpenSession(int32_t sessionId, const QosTV *qos, uint32_t qosCount, TransInfo *transInfo, bool isAsync)1584 int32_t ClientIpcOpenSession(int32_t sessionId, const QosTV *qos, uint32_t qosCount, TransInfo *transInfo, bool isAsync)
1585 {
1586     if (sessionId < 0 || transInfo == NULL) {
1587         TRANS_LOGE(TRANS_SDK, "Invalid param");
1588         return SOFTBUS_INVALID_PARAM;
1589     }
1590 
1591     int32_t ret = LockClientSessionServerList();
1592     if (ret != SOFTBUS_OK) {
1593         TRANS_LOGE(TRANS_SDK, "lock failed");
1594         return ret;
1595     }
1596 
1597     ClientSessionServer *serverNode = NULL;
1598     SessionInfo *sessionNode = NULL;
1599     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
1600         UnlockClientSessionServerList();
1601         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
1602         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1603     }
1604     ret = CheckBindSocketInfo(sessionNode);
1605     if (ret != SOFTBUS_OK) {
1606         UnlockClientSessionServerList();
1607         TRANS_LOGE(TRANS_SDK, "check socekt info failed, ret=%{public}d", ret);
1608         return ret;
1609     }
1610 
1611     SessionAttribute tmpAttr;
1612     (void)memset_s(&tmpAttr, sizeof(SessionAttribute), 0, sizeof(SessionAttribute));
1613     SessionParam param;
1614     FillSessionParam(&param, &tmpAttr, serverNode, sessionNode);
1615     UnlockClientSessionServerList();
1616 
1617     param.qosCount = qosCount;
1618     if (param.qosCount > 0 && memcpy_s(param.qos, sizeof(param.qos), qos, sizeof(QosTV) * qosCount) != EOK) {
1619         TRANS_LOGE(TRANS_SDK, "memcpy qos failed");
1620         return SOFTBUS_MEM_ERR;
1621     }
1622     param.isAsync = isAsync;
1623     param.sessionId = sessionId;
1624     ret = SetSessionStateBySessionId(param.sessionId, SESSION_STATE_OPENING, 0);
1625     TRANS_CHECK_AND_RETURN_RET_LOGE(
1626         ret == SOFTBUS_OK, ret, TRANS_SDK, "set session state failed, maybe cancel, ret=%{public}d", ret);
1627     ret = ServerIpcOpenSession(&param, transInfo);
1628     if (ret != SOFTBUS_OK) {
1629         ClientConvertRetVal(sessionId, &ret);
1630         TRANS_LOGE(TRANS_SDK, "open session ipc err: ret=%{public}d", ret);
1631         return ret;
1632     }
1633     return SOFTBUS_OK;
1634 }
1635 
ClientSetActionIdBySessionId(int32_t sessionId, uint32_t actionId)1636 int32_t ClientSetActionIdBySessionId(int32_t sessionId, uint32_t actionId)
1637 {
1638     if ((sessionId < 0) || actionId == 0) {
1639         TRANS_LOGE(TRANS_SDK, "Invalid param");
1640         return SOFTBUS_INVALID_PARAM;
1641     }
1642     int32_t ret = LockClientSessionServerList();
1643     if (ret != SOFTBUS_OK) {
1644         TRANS_LOGE(TRANS_SDK, "lock failed");
1645         return ret;
1646     }
1647 
1648     ClientSessionServer *serverNode = NULL;
1649     SessionInfo *sessionNode = NULL;
1650 
1651     ret = GetSessionById(sessionId, &serverNode, &sessionNode);
1652     if (ret != SOFTBUS_OK) {
1653         UnlockClientSessionServerList();
1654         TRANS_LOGE(TRANS_SDK, "not found");
1655         return ret;
1656     }
1657 
1658     if (sessionNode->role != SESSION_ROLE_INIT) {
1659         TRANS_LOGE(TRANS_SDK, "socket in use, currentRole=%{public}d", sessionNode->role);
1660         UnlockClientSessionServerList();
1661         return SOFTBUS_TRANS_SOCKET_IN_USE;
1662     }
1663 
1664     sessionNode->actionId = actionId;
1665     UnlockClientSessionServerList();
1666     return SOFTBUS_OK;
1667 }
1668 
ClientHandleBindWaitTimer(int32_t socket, uint32_t maxWaitTime, TimerAction action)1669 int32_t ClientHandleBindWaitTimer(int32_t socket, uint32_t maxWaitTime, TimerAction action)
1670 {
1671     if (socket <= 0) {
1672         TRANS_LOGE(TRANS_SDK, "Invalid socket=%{public}d", socket);
1673         return SOFTBUS_INVALID_PARAM;
1674     }
1675 
1676     if (action < TIMER_ACTION_START || action >= TIMER_ACTION_BUTT) {
1677         TRANS_LOGE(TRANS_SDK, "Invalid action=%{public}d", action);
1678         return SOFTBUS_INVALID_PARAM;
1679     }
1680 
1681     int32_t ret = LockClientSessionServerList();
1682     if (ret != SOFTBUS_OK) {
1683         TRANS_LOGE(TRANS_SDK, "lock failed");
1684         return ret;
1685     }
1686 
1687     ClientSessionServer *serverNode = NULL;
1688     SessionInfo *sessionNode = NULL;
1689     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
1690         UnlockClientSessionServerList();
1691         TRANS_LOGE(TRANS_SDK, "socket not found. socket=%{public}d", socket);
1692         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1693     }
1694     if (action == TIMER_ACTION_START) {
1695         TRANS_LOGI(TRANS_SDK,
1696             "socket=%{public}d, inputMaxWaitTime=%{public}u, maxWaitTime=%{public}u, enableStatus=%{public}d",
1697             socket, maxWaitTime, sessionNode->lifecycle.maxWaitTime, sessionNode->enableStatus);
1698         bool binding = (sessionNode->lifecycle.maxWaitTime != 0);
1699         bool bindSuccess =
1700             (sessionNode->lifecycle.maxWaitTime == 0 && sessionNode->enableStatus == ENABLE_STATUS_SUCCESS);
1701         if (binding) {
1702             UnlockClientSessionServerList();
1703             TRANS_LOGE(TRANS_SDK, "socket=%{public}d The socket is binding", socket);
1704             return SOFTBUS_TRANS_SOCKET_IN_USE;
1705         }
1706         if (bindSuccess) {
1707             UnlockClientSessionServerList();
1708             TRANS_LOGW(TRANS_SDK, "socket=%{public}d The socket was bound successfully", socket);
1709             return SOFTBUS_ALREADY_TRIGGERED;
1710         }
1711     }
1712 
1713     sessionNode->lifecycle.maxWaitTime = (action == TIMER_ACTION_START) ? maxWaitTime : 0;
1714     sessionNode->lifecycle.waitTime = 0;
1715     UnlockClientSessionServerList();
1716     return SOFTBUS_OK;
1717 }
1718 
ClientSetSocketState(int32_t socket, uint32_t maxIdleTimeout, SessionRole role)1719 int32_t ClientSetSocketState(int32_t socket, uint32_t maxIdleTimeout, SessionRole role)
1720 {
1721     if (socket < 0) {
1722         TRANS_LOGE(TRANS_SDK, "Invalid param");
1723         return SOFTBUS_INVALID_PARAM;
1724     }
1725 
1726     int32_t ret = LockClientSessionServerList();
1727     if (ret != SOFTBUS_OK) {
1728         TRANS_LOGE(TRANS_SDK, "lock failed");
1729         return ret;
1730     }
1731 
1732     ClientSessionServer *serverNode = NULL;
1733     SessionInfo *sessionNode = NULL;
1734     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
1735         UnlockClientSessionServerList();
1736         TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", socket);
1737         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1738     }
1739 
1740     sessionNode->role = role;
1741     if (sessionNode->role == SESSION_ROLE_CLIENT) {
1742         sessionNode->maxIdleTime = maxIdleTimeout;
1743     }
1744     if (sessionNode->role == SESSION_ROLE_SERVER) {
1745         serverNode->isSrvEncryptedRawStream = sessionNode->isEncyptedRawStream;
1746     }
1747     UnlockClientSessionServerList();
1748     return SOFTBUS_OK;
1749 }
1750 
ClientGetSessionCallbackAdapterByName(const char *sessionName, SessionListenerAdapter *callbackAdapter)1751 int32_t ClientGetSessionCallbackAdapterByName(const char *sessionName, SessionListenerAdapter *callbackAdapter)
1752 {
1753     if (sessionName == NULL || callbackAdapter == NULL) {
1754         TRANS_LOGE(TRANS_SDK, "Invalid param");
1755         return SOFTBUS_INVALID_PARAM;
1756     }
1757 
1758     int32_t ret = LockClientSessionServerList();
1759     if (ret != SOFTBUS_OK) {
1760         TRANS_LOGE(TRANS_SDK, "lock failed");
1761         return ret;
1762     }
1763 
1764     ClientSessionServer *serverNode = NULL;
1765 
1766     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1767         if (strcmp(serverNode->sessionName, sessionName) != 0) {
1768             continue;
1769         }
1770 
1771         ret = memcpy_s(callbackAdapter, sizeof(SessionListenerAdapter),
1772             &serverNode->listener, sizeof(SessionListenerAdapter));
1773         UnlockClientSessionServerList();
1774         if (ret != EOK) {
1775             char *tmpName = NULL;
1776             Anonymize(sessionName, &tmpName);
1777             TRANS_LOGE(TRANS_SDK,
1778                 "memcpy SessionListenerAdapter failed, sessionName=%{public}s, ret=%{public}d",
1779                 AnonymizeWrapper(tmpName), ret);
1780             AnonymizeFree(tmpName);
1781             return SOFTBUS_MEM_ERR;
1782         }
1783         return SOFTBUS_OK;
1784     }
1785 
1786     UnlockClientSessionServerList();
1787     char *tmpName = NULL;
1788     Anonymize(sessionName, &tmpName);
1789     TRANS_LOGE(TRANS_SDK, "SessionCallbackAdapter not found, sessionName=%{public}s", AnonymizeWrapper(tmpName));
1790     AnonymizeFree(tmpName);
1791     return SOFTBUS_NOT_FIND;
1792 }
1793 
ClientGetSessionCallbackAdapterById(int32_t sessionId, SessionListenerAdapter *callbackAdapter, bool *isServer)1794 int32_t ClientGetSessionCallbackAdapterById(int32_t sessionId, SessionListenerAdapter *callbackAdapter, bool *isServer)
1795 {
1796     if (sessionId < 0 || callbackAdapter == NULL) {
1797         TRANS_LOGE(TRANS_SDK, "Invalid param");
1798         return SOFTBUS_INVALID_PARAM;
1799     }
1800 
1801     int32_t ret = LockClientSessionServerList();
1802     if (ret != SOFTBUS_OK) {
1803         TRANS_LOGE(TRANS_SDK, "lock failed");
1804         return ret;
1805     }
1806 
1807     ClientSessionServer *serverNode = NULL;
1808     SessionInfo *sessionNode = NULL;
1809     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
1810         UnlockClientSessionServerList();
1811         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
1812         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1813     }
1814 
1815     ret = memcpy_s(callbackAdapter, sizeof(SessionListenerAdapter), &serverNode->listener,
1816         sizeof(SessionListenerAdapter));
1817     *isServer = sessionNode->isServer;
1818     UnlockClientSessionServerList();
1819     if (ret != EOK) {
1820         TRANS_LOGE(TRANS_SDK,
1821             "memcpy SessionListenerAdapter failed, socket=%{public}d, ret=%{public}d", sessionId, ret);
1822         return SOFTBUS_MEM_ERR;
1823     }
1824     return SOFTBUS_OK;
1825 }
1826 
ClientGetPeerSocketInfoById(int32_t socket, PeerSocketInfo *peerSocketInfo)1827 int32_t ClientGetPeerSocketInfoById(int32_t socket, PeerSocketInfo *peerSocketInfo)
1828 {
1829     if (socket < 0 || peerSocketInfo == NULL) {
1830         TRANS_LOGE(TRANS_SDK, "Invalid param");
1831         return SOFTBUS_INVALID_PARAM;
1832     }
1833 
1834     int32_t ret = LockClientSessionServerList();
1835     if (ret != SOFTBUS_OK) {
1836         TRANS_LOGE(TRANS_SDK, "lock failed");
1837         return ret;
1838     }
1839 
1840     ClientSessionServer *serverNode = NULL;
1841     SessionInfo *sessionNode = NULL;
1842     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
1843         UnlockClientSessionServerList();
1844         TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", socket);
1845         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1846     }
1847 
1848     peerSocketInfo->name = sessionNode->info.peerSessionName;
1849     peerSocketInfo->networkId = sessionNode->info.peerDeviceId;
1850     peerSocketInfo->pkgName = serverNode->pkgName;
1851     peerSocketInfo->dataType = (TransDataType)sessionNode->info.flag;
1852     UnlockClientSessionServerList();
1853     return SOFTBUS_OK;
1854 }
1855 
IsSessionExceedLimit(void)1856 bool IsSessionExceedLimit(void)
1857 {
1858     if (LockClientSessionServerList() != SOFTBUS_OK) {
1859         TRANS_LOGE(TRANS_SDK, "lock failed");
1860         return true;
1861     }
1862     if (g_sessionIdNum >= MAX_SESSION_ID) {
1863         UnlockClientSessionServerList();
1864         TRANS_LOGE(TRANS_SDK, "sessionId num exceed limit.");
1865         return true;
1866     }
1867     UnlockClientSessionServerList();
1868     return false;
1869 }
1870 
ClientTransSessionTimerProc(void)1871 static void ClientTransSessionTimerProc(void)
1872 {
1873     if (LockClientSessionServerList() != SOFTBUS_OK) {
1874         TRANS_LOGE(TRANS_SDK, "lock failed");
1875         return;
1876     }
1877 
1878     ClientSessionServer *serverNode = NULL;
1879     SessionInfo *sessionNode = NULL;
1880     SessionInfo *nextSessionNode = NULL;
1881     ListNode destroyList;
1882     ListInit(&destroyList);
1883     int32_t waitOutSocket[MAX_SESSION_ID] = { 0 };
1884     uint32_t waitOutNum = 0;
1885     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1886         if (IsListEmpty(&serverNode->sessionList)) {
1887             continue;
1888         }
1889         LIST_FOR_EACH_ENTRY_SAFE(sessionNode, nextSessionNode, &(serverNode->sessionList), SessionInfo, node) {
1890             ClientCheckWaitTimeOut(serverNode, sessionNode, waitOutSocket, MAX_SESSION_ID, &waitOutNum);
1891             ClientUpdateIdleTimeout(serverNode, sessionNode, &destroyList);
1892         }
1893     }
1894     UnlockClientSessionServerList();
1895     (void)ClientCleanUpIdleTimeoutSocket(&destroyList);
1896     (void)ClientCleanUpWaitTimeoutSocket(waitOutSocket, waitOutNum);
1897 }
1898 
ClientResetIdleTimeoutById(int32_t sessionId)1899 int32_t ClientResetIdleTimeoutById(int32_t sessionId)
1900 {
1901     if (sessionId <= 0) {
1902         TRANS_LOGE(TRANS_SDK, "invalid sessionId");
1903         return SOFTBUS_TRANS_INVALID_SESSION_ID;
1904     }
1905 
1906     int32_t ret = LockClientSessionServerList();
1907     if (ret != SOFTBUS_OK) {
1908         TRANS_LOGE(TRANS_SDK, "lock failed");
1909         return ret;
1910     }
1911 
1912     ClientSessionServer *serverNode = NULL;
1913     SessionInfo *sessionNode = NULL;
1914     SessionInfo *nextSessionNode = NULL;
1915     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1916         if (IsListEmpty(&serverNode->sessionList)) {
1917             continue;
1918         }
1919         LIST_FOR_EACH_ENTRY_SAFE(sessionNode, nextSessionNode, &(serverNode->sessionList), SessionInfo, node) {
1920             if (sessionNode->sessionId == sessionId) {
1921                 sessionNode->timeout = 0;
1922                 UnlockClientSessionServerList();
1923                 TRANS_LOGD(TRANS_SDK, "reset timeout of sessionId=%{public}d", sessionId);
1924                 return SOFTBUS_OK;
1925             }
1926         }
1927     }
1928     UnlockClientSessionServerList();
1929     TRANS_LOGE(TRANS_SDK, "not found session by sessionId=%{public}d", sessionId);
1930     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1931 }
1932 
ClientGetSessionNameByChannelId(int32_t channelId, int32_t channelType, char *sessionName, int32_t len)1933 int32_t ClientGetSessionNameByChannelId(int32_t channelId, int32_t channelType, char *sessionName, int32_t len)
1934 {
1935     if (channelId < 0 || sessionName == NULL || len <= 0 || len > SESSION_NAME_SIZE_MAX) {
1936         TRANS_LOGW(TRANS_SDK, "Invalid param");
1937         return SOFTBUS_INVALID_PARAM;
1938     }
1939 
1940     int32_t ret = LockClientSessionServerList();
1941     if (ret != SOFTBUS_OK) {
1942         TRANS_LOGE(TRANS_SDK, "lock failed");
1943         return ret;
1944     }
1945 
1946     ClientSessionServer *serverNode = NULL;
1947     SessionInfo *sessionNode = NULL;
1948 
1949     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1950         if (IsListEmpty(&serverNode->sessionList)) {
1951             continue;
1952         }
1953 
1954         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
1955             if (sessionNode->channelId == channelId && sessionNode->channelType == (ChannelType)channelType) {
1956                 (void)memcpy_s(sessionName, len, serverNode->sessionName, len);
1957                 UnlockClientSessionServerList();
1958                 return SOFTBUS_OK;
1959             }
1960         }
1961     }
1962 
1963     UnlockClientSessionServerList();
1964     TRANS_LOGE(TRANS_SDK, "not found session with channelId=%{public}d", channelId);
1965     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
1966 }
1967 
ClientRawStreamEncryptDefOptGet(const char *sessionName, bool *isEncrypt)1968 int32_t ClientRawStreamEncryptDefOptGet(const char *sessionName, bool *isEncrypt)
1969 {
1970     if (sessionName == NULL || isEncrypt == NULL) {
1971         TRANS_LOGE(TRANS_SDK, "Invalid param");
1972         return SOFTBUS_INVALID_PARAM;
1973     }
1974 
1975     int32_t ret = LockClientSessionServerList();
1976     if (ret != SOFTBUS_OK) {
1977         TRANS_LOGE(TRANS_SDK, "lock failed");
1978         return ret;
1979     }
1980 
1981     ClientSessionServer *serverNode = NULL;
1982     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
1983         if (strcmp(serverNode->sessionName, sessionName) == 0) {
1984             *isEncrypt = serverNode->isSrvEncryptedRawStream;
1985             UnlockClientSessionServerList();
1986             return SOFTBUS_OK;
1987         }
1988     }
1989     UnlockClientSessionServerList();
1990     char *tmpName = NULL;
1991     Anonymize(sessionName, &tmpName);
1992     TRANS_LOGE(TRANS_SDK, "not found ClientSessionServer by sessionName=%{public}s", AnonymizeWrapper(tmpName));
1993     AnonymizeFree(tmpName);
1994     return SOFTBUS_TRANS_SESSION_SERVER_NOT_FOUND;
1995 }
1996 
ClientRawStreamEncryptOptGet(int32_t channelId, int32_t channelType, bool *isEncrypt)1997 int32_t ClientRawStreamEncryptOptGet(int32_t channelId, int32_t channelType, bool *isEncrypt)
1998 {
1999     if (channelId < 0 || isEncrypt == NULL) {
2000         TRANS_LOGE(TRANS_SDK, "Invalid param");
2001         return SOFTBUS_INVALID_PARAM;
2002     }
2003 
2004     int32_t ret = LockClientSessionServerList();
2005     if (ret != SOFTBUS_OK) {
2006         TRANS_LOGE(TRANS_SDK, "lock failed");
2007         return ret;
2008     }
2009 
2010     ClientSessionServer *serverNode = NULL;
2011     SessionInfo *sessionNode = NULL;
2012     SessionInfo *nextSessionNode = NULL;
2013     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
2014         if (IsListEmpty(&serverNode->sessionList)) {
2015             continue;
2016         }
2017         LIST_FOR_EACH_ENTRY_SAFE(sessionNode, nextSessionNode, &(serverNode->sessionList), SessionInfo, node) {
2018             if (sessionNode->channelId == channelId && sessionNode->channelType == (ChannelType)channelType) {
2019                 *isEncrypt = sessionNode->isEncyptedRawStream;
2020                 UnlockClientSessionServerList();
2021                 return SOFTBUS_OK;
2022             }
2023         }
2024     }
2025     UnlockClientSessionServerList();
2026     TRANS_LOGE(TRANS_SDK, "not found session by channelId=%{public}d", channelId);
2027     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2028 }
2029 
SetSessionIsAsyncById(int32_t sessionId, bool isAsync)2030 int32_t SetSessionIsAsyncById(int32_t sessionId, bool isAsync)
2031 {
2032     if (sessionId <= 0) {
2033         TRANS_LOGE(TRANS_SDK, "invalid sessionId");
2034         return SOFTBUS_INVALID_PARAM;
2035     }
2036 
2037     int32_t ret = LockClientSessionServerList();
2038     if (ret != SOFTBUS_OK) {
2039         TRANS_LOGE(TRANS_SDK, "lock failed");
2040         return ret;
2041     }
2042 
2043     ClientSessionServer *serverNode = NULL;
2044     SessionInfo *sessionNode = NULL;
2045     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
2046         if (IsListEmpty(&serverNode->sessionList)) {
2047             continue;
2048         }
2049         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
2050             if (sessionNode->sessionId == sessionId) {
2051                 sessionNode->isAsync = isAsync;
2052                 UnlockClientSessionServerList();
2053                 return SOFTBUS_OK;
2054             }
2055         }
2056     }
2057     UnlockClientSessionServerList();
2058     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2059 }
2060 
SetSessionInitInfoById(int32_t sessionId)2061 int32_t SetSessionInitInfoById(int32_t sessionId)
2062 {
2063     if (sessionId <= 0) {
2064         TRANS_LOGE(TRANS_SDK, "invalid sessionId");
2065         return SOFTBUS_TRANS_INVALID_SESSION_ID;
2066     }
2067 
2068     int32_t ret = LockClientSessionServerList();
2069     if (ret != SOFTBUS_OK) {
2070         TRANS_LOGE(TRANS_SDK, "lock failed");
2071         return ret;
2072     }
2073 
2074     ClientSessionServer *serverNode = NULL;
2075     SessionInfo *sessionNode = NULL;
2076     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
2077         if (IsListEmpty(&serverNode->sessionList)) {
2078             continue;
2079         }
2080         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
2081             if (sessionNode->sessionId == sessionId) {
2082                 sessionNode->enableStatus = ENABLE_STATUS_INIT;
2083                 sessionNode->channelId = INVALID_CHANNEL_ID;
2084                 sessionNode->channelType = CHANNEL_TYPE_BUTT;
2085                 sessionNode->lifecycle.sessionState = SESSION_STATE_INIT;
2086                 UnlockClientSessionServerList();
2087                 return SOFTBUS_OK;
2088             }
2089         }
2090     }
2091     UnlockClientSessionServerList();
2092     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2093 }
2094 
ClientTransSetChannelInfo(const char *sessionName, int32_t sessionId, int32_t channelId, int32_t channelType)2095 int32_t ClientTransSetChannelInfo(const char *sessionName, int32_t sessionId, int32_t channelId, int32_t channelType)
2096 {
2097     if (sessionName == NULL || sessionId <= 0) {
2098         TRANS_LOGE(TRANS_SDK, "invalid session info");
2099         return SOFTBUS_INVALID_PARAM;
2100     }
2101 
2102     int32_t ret = LockClientSessionServerList();
2103     if (ret != SOFTBUS_OK) {
2104         TRANS_LOGE(TRANS_SDK, "lock failed");
2105         return ret;
2106     }
2107     ClientSessionServer *serverNode = NULL;
2108     SessionInfo *sessionNode = NULL;
2109     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
2110         UnlockClientSessionServerList();
2111         TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", sessionId);
2112         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2113     }
2114     if (sessionNode->lifecycle.sessionState == SESSION_STATE_CANCELLING) {
2115         TRANS_LOGW(TRANS_SDK, "this socket already in cancelling state. socketFd=%{public}d", sessionId);
2116         UnlockClientSessionServerList();
2117         return sessionNode->lifecycle.bindErrCode;
2118     }
2119     sessionNode->channelId = channelId;
2120     sessionNode->channelType = (ChannelType)channelType;
2121     sessionNode->lifecycle.sessionState = SESSION_STATE_OPENED;
2122     UnlockClientSessionServerList();
2123     return SOFTBUS_OK;
2124 }
2125 
GetSocketLifecycleAndSessionNameBySessionId( int32_t sessionId, char *sessionName, SocketLifecycleData *lifecycle)2126 int32_t GetSocketLifecycleAndSessionNameBySessionId(
2127     int32_t sessionId, char *sessionName, SocketLifecycleData *lifecycle)
2128 {
2129     if (sessionId <= 0 || lifecycle == NULL) {
2130         TRANS_LOGE(TRANS_SDK, "invalid param, sessionId =%{public}d", sessionId);
2131         return SOFTBUS_INVALID_PARAM;
2132     }
2133 
2134     int32_t ret = LockClientSessionServerList();
2135     if (ret != SOFTBUS_OK) {
2136         TRANS_LOGE(TRANS_SDK, "lock failed");
2137         return ret;
2138     }
2139 
2140     ClientSessionServer *serverNode = NULL;
2141     SessionInfo *sessionNode = NULL;
2142     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
2143         UnlockClientSessionServerList();
2144         TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", sessionId);
2145         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2146     }
2147     *lifecycle = sessionNode->lifecycle;
2148     if (sessionName != NULL && strcpy_s(sessionName, SESSION_NAME_SIZE_MAX, serverNode->sessionName) != EOK) {
2149         UnlockClientSessionServerList();
2150         return SOFTBUS_STRCPY_ERR;
2151     }
2152     UnlockClientSessionServerList();
2153     return SOFTBUS_OK;
2154 }
2155 
AddSessionStateClosing(void)2156 void AddSessionStateClosing(void)
2157 {
2158     if (LockClientSessionServerList() != SOFTBUS_OK) {
2159         TRANS_LOGE(TRANS_SDK, "lock failed");
2160         return;
2161     }
2162     g_closingIdNum++;
2163     UnlockClientSessionServerList();
2164 }
2165 
DelSessionStateClosing(void)2166 void DelSessionStateClosing(void)
2167 {
2168     if (LockClientSessionServerList() != SOFTBUS_OK) {
2169         TRANS_LOGE(TRANS_SDK, "lock failed");
2170         return;
2171     }
2172     if (g_closingIdNum > 0) {
2173         g_closingIdNum--;
2174     }
2175     UnlockClientSessionServerList();
2176 }
2177 
SetSessionStateBySessionId(int32_t sessionId, SessionState sessionState, int32_t optional)2178 int32_t SetSessionStateBySessionId(int32_t sessionId, SessionState sessionState, int32_t optional)
2179 {
2180     if (sessionId <= 0) {
2181         TRANS_LOGE(TRANS_SDK, "invalid sessionId =%{public}d", sessionId);
2182         return SOFTBUS_TRANS_INVALID_SESSION_ID;
2183     }
2184 
2185     int32_t ret = LockClientSessionServerList();
2186     if (ret != SOFTBUS_OK) {
2187         TRANS_LOGE(TRANS_SDK, "lock failed");
2188         return ret;
2189     }
2190 
2191     ClientSessionServer *serverNode = NULL;
2192     SessionInfo *sessionNode = NULL;
2193     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
2194         UnlockClientSessionServerList();
2195         TRANS_LOGE(TRANS_SDK, "socket not found. socketFd=%{public}d", sessionId);
2196         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2197     }
2198 
2199     TRANS_LOGI(TRANS_SDK, "socket state change:%{public}d -> %{public}d. socket=%{public}d",
2200         sessionNode->lifecycle.sessionState, sessionState, sessionId);
2201     sessionNode->lifecycle.sessionState = sessionState;
2202     if (sessionState == SESSION_STATE_CANCELLING) {
2203         TRANS_LOGW(TRANS_SDK, "set socket to cancelling, socket=%{public}d, errCode=%{public}d", sessionId, optional);
2204         sessionNode->lifecycle.bindErrCode = optional;
2205     }
2206     UnlockClientSessionServerList();
2207     return SOFTBUS_OK;
2208 }
2209 
CheckSessionEnableStatus(int32_t socket, SoftBusCond *callbackCond)2210 static int32_t CheckSessionEnableStatus(int32_t socket, SoftBusCond *callbackCond)
2211 {
2212     int32_t ret = LockClientSessionServerList();
2213     if (ret != SOFTBUS_OK) {
2214         TRANS_LOGE(TRANS_SDK, "lock failed socket=%{public}d", socket);
2215         return ret;
2216     }
2217 
2218     ClientSessionServer *serverNode = NULL;
2219     SessionInfo *sessionNode = NULL;
2220     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
2221         UnlockClientSessionServerList();
2222         (void)SoftBusCondDestroy(callbackCond);
2223         TRANS_LOGE(TRANS_SDK, "socket=%{public}d not found, destroy condition", socket);
2224         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2225     }
2226     sessionNode->lifecycle.condIsWaiting = false;
2227     ret = sessionNode->lifecycle.bindErrCode;
2228     if (sessionNode->enableStatus != ENABLE_STATUS_SUCCESS) {
2229         UnlockClientSessionServerList();
2230         // enableStatus=false and ret=SOFTBUS_OK, is an unexpected state
2231         if (ret == SOFTBUS_OK) {
2232             TRANS_LOGE(TRANS_SDK, "invalid bindErrCode, socket=%{public}d, ret=%{public}d", socket, ret);
2233             return SOFTBUS_TRANS_SESSION_NO_ENABLE;
2234         }
2235         TRANS_LOGE(TRANS_SDK, "Bind fail, socket=%{public}d, ret=%{public}d", socket, ret);
2236         return ret;
2237     }
2238     UnlockClientSessionServerList();
2239     TRANS_LOGI(TRANS_SDK, "socket=%{public}d is enable, ret=%{public}d", socket, ret);
2240     return ret;
2241 }
2242 
ClientWaitSyncBind(int32_t socket)2243 int32_t ClientWaitSyncBind(int32_t socket)
2244 {
2245 #define EXTRA_WAIT_TIME 5 // 5s, ensure that the timeout here occurs after ClientCheckWaitTimeOut
2246     if (socket <= 0) {
2247         TRANS_LOGE(TRANS_SDK, "invalid param sessionId =%{public}d", socket);
2248         return SOFTBUS_TRANS_INVALID_SESSION_ID;
2249     }
2250 
2251     int32_t ret = LockClientSessionServerList();
2252     if (ret != SOFTBUS_OK) {
2253         TRANS_LOGE(TRANS_SDK, "lock failed");
2254         return ret;
2255     }
2256 
2257     ClientSessionServer *serverNode = NULL;
2258     SessionInfo *sessionNode = NULL;
2259     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
2260         UnlockClientSessionServerList();
2261         TRANS_LOGE(TRANS_SDK, "socket not found. socket=%{public}d", socket);
2262         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2263     }
2264 
2265     if (sessionNode->lifecycle.sessionState == SESSION_STATE_CANCELLING) {
2266         UnlockClientSessionServerList();
2267         TRANS_LOGW(TRANS_SDK, "session is cancelling socket=%{public}d", socket);
2268         return sessionNode->lifecycle.bindErrCode;
2269     }
2270     SoftBusCond *callbackCond = &(sessionNode->lifecycle.callbackCond);
2271     sessionNode->lifecycle.condIsWaiting = true;
2272     SoftBusSysTime *timePtr = NULL;
2273     SoftBusSysTime absTime = { 0 };
2274     if (sessionNode->lifecycle.maxWaitTime != 0) {
2275         ret = SoftBusGetTime(&absTime);
2276         if (ret == SOFTBUS_OK) {
2277             absTime.sec += (int64_t)((sessionNode->lifecycle.maxWaitTime / CONVERSION_BASE) + EXTRA_WAIT_TIME);
2278             timePtr = &absTime;
2279         }
2280     }
2281     ret = SoftBusCondWait(callbackCond, &(g_clientSessionServerList->lock), timePtr);
2282     if (ret != SOFTBUS_OK) {
2283         UnlockClientSessionServerList();
2284         TRANS_LOGE(TRANS_SDK, "cond wait failed, socket=%{public}d", socket);
2285         return ret;
2286     }
2287     UnlockClientSessionServerList();
2288     return CheckSessionEnableStatus(socket, callbackCond);
2289 }
2290 
TransWaitForBindReturn(int32_t socket)2291 static void TransWaitForBindReturn(int32_t socket)
2292 {
2293 #define RETRY_GET_BIND_RESULT_TIMES 3
2294 #define RETRY_WAIT_TIME             5000 // 5ms
2295 
2296     SocketLifecycleData lifecycle;
2297     (void)memset_s(&lifecycle, sizeof(SocketLifecycleData), 0, sizeof(SocketLifecycleData));
2298     int32_t ret;
2299 
2300     for (int32_t retryTimes = 0; retryTimes < RETRY_GET_BIND_RESULT_TIMES; ++retryTimes) {
2301         ret = GetSocketLifecycleAndSessionNameBySessionId(socket, NULL, &lifecycle);
2302         if (ret != SOFTBUS_OK) {
2303             TRANS_LOGE(TRANS_SDK, "Get session lifecycle failed, ret=%{public}d", ret);
2304             return;
2305         }
2306 
2307         if (lifecycle.maxWaitTime == 0) {
2308             return;
2309         }
2310         TRANS_LOGW(TRANS_SDK, "wait for bind return, socket=%{public}d, retryTimes=%{public}d", socket, retryTimes);
2311         usleep(RETRY_WAIT_TIME);
2312     }
2313 }
2314 
ClientSignalSyncBind(int32_t socket, int32_t errCode)2315 int32_t ClientSignalSyncBind(int32_t socket, int32_t errCode)
2316 {
2317     if (socket <= 0) {
2318         TRANS_LOGE(TRANS_SDK, "invalid param sessionId =%{public}d", socket);
2319         return SOFTBUS_TRANS_INVALID_SESSION_ID;
2320     }
2321 
2322     int32_t ret = LockClientSessionServerList();
2323     if (ret != SOFTBUS_OK) {
2324         TRANS_LOGE(TRANS_SDK, "lock failed");
2325         return ret;
2326     }
2327 
2328     ClientSessionServer *serverNode = NULL;
2329     SessionInfo *sessionNode = NULL;
2330     if (GetSessionById(socket, &serverNode, &sessionNode) != SOFTBUS_OK) {
2331         UnlockClientSessionServerList();
2332         TRANS_LOGE(TRANS_SDK, "socket not found. socket=%{public}d", socket);
2333         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2334     }
2335 
2336     if (sessionNode->isAsync) {
2337         UnlockClientSessionServerList();
2338         TRANS_LOGW(TRANS_SDK, "socket is async, do not need signal. socket=%{public}d", socket);
2339         return SOFTBUS_OK;
2340     }
2341 
2342     sessionNode->lifecycle.bindErrCode = errCode;
2343     ret = SoftBusCondSignal(&(sessionNode->lifecycle.callbackCond));
2344     if (ret != SOFTBUS_OK) {
2345         UnlockClientSessionServerList();
2346         TRANS_LOGE(TRANS_SDK, "cond single failed, socket=%{public}d", socket);
2347         return ret;
2348     }
2349 
2350     UnlockClientSessionServerList();
2351     TRANS_LOGI(TRANS_SDK, "socket=%{public}d signal success", socket);
2352     TransWaitForBindReturn(socket);
2353     return SOFTBUS_OK;
2354 }
2355 
ClientDfsIpcOpenSession(int32_t sessionId, TransInfo *transInfo)2356 int32_t ClientDfsIpcOpenSession(int32_t sessionId, TransInfo *transInfo)
2357 {
2358     if (sessionId < 0 || transInfo == NULL) {
2359         TRANS_LOGE(TRANS_SDK, "Invalid param");
2360         return SOFTBUS_INVALID_PARAM;
2361     }
2362 
2363     int32_t ret = LockClientSessionServerList();
2364     if (ret != SOFTBUS_OK) {
2365         TRANS_LOGE(TRANS_SDK, "lock failed");
2366         return ret;
2367     }
2368 
2369     ClientSessionServer *serverNode = NULL;
2370     SessionInfo *sessionNode = NULL;
2371     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
2372         UnlockClientSessionServerList();
2373         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
2374         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2375     }
2376     ret = CheckBindSocketInfo(sessionNode);
2377     if (ret != SOFTBUS_OK) {
2378         UnlockClientSessionServerList();
2379         TRANS_LOGE(TRANS_SDK, "check socekt info failed, ret=%{public}d", ret);
2380         return ret;
2381     }
2382 
2383     SessionAttribute tmpAttr;
2384     (void)memset_s(&tmpAttr, sizeof(SessionAttribute), 0, sizeof(SessionAttribute));
2385     SessionParam param;
2386     FillDfsSocketParam(&param, &tmpAttr, serverNode, sessionNode);
2387     UnlockClientSessionServerList();
2388 
2389     param.sessionId = sessionId;
2390     ret = SetSessionStateBySessionId(param.sessionId, SESSION_STATE_OPENING, 0);
2391     TRANS_CHECK_AND_RETURN_RET_LOGE(
2392         ret == SOFTBUS_OK, ret, TRANS_SDK, "set session state failed, maybe cancel, ret=%{public}d", ret);
2393     ret = ServerIpcOpenSession(&param, transInfo);
2394     if (ret != SOFTBUS_OK) {
2395         ClientConvertRetVal(sessionId, &ret);
2396         TRANS_LOGE(TRANS_SDK, "open session ipc err: ret=%{public}d", ret);
2397         return ret;
2398     }
2399     return SOFTBUS_OK;
2400 }
2401 
ClientUpdateAuthSessionTimer(SessionInfo *sessionNode, int32_t sessionId)2402 static int32_t ClientUpdateAuthSessionTimer(SessionInfo *sessionNode, int32_t sessionId)
2403 {
2404     // Only need to operate on the action guidance channel
2405     if (sessionNode->actionId == 0) {
2406         return SOFTBUS_OK;
2407     }
2408     if (sessionNode->lifecycle.maxWaitTime == 0) {
2409         TRANS_LOGE(TRANS_SDK, "sessionId=%{public}d is not need update.", sessionId);
2410         return SOFTBUS_NOT_NEED_UPDATE;
2411     }
2412     sessionNode->lifecycle.maxWaitTime = 0;
2413     return SOFTBUS_OK;
2414 }
2415 
ClientCancelAuthSessionTimer(int32_t sessionId)2416 int32_t ClientCancelAuthSessionTimer(int32_t sessionId)
2417 {
2418     if (sessionId <= 0) {
2419         TRANS_LOGE(TRANS_SDK, "invalid sessionId");
2420         return SOFTBUS_TRANS_INVALID_SESSION_ID;
2421     }
2422 
2423     int32_t ret = LockClientSessionServerList();
2424     if (ret != SOFTBUS_OK) {
2425         TRANS_LOGE(TRANS_SDK, "lock failed");
2426         return ret;
2427     }
2428 
2429     ClientSessionServer *serverNode = NULL;
2430     SessionInfo *sessionNode = NULL;
2431     LIST_FOR_EACH_ENTRY(serverNode, &(g_clientSessionServerList->list), ClientSessionServer, node) {
2432         if (IsListEmpty(&serverNode->sessionList) || strcmp(serverNode->sessionName, ISHARE_AUTH_SESSION) != 0) {
2433             continue;
2434         }
2435         LIST_FOR_EACH_ENTRY(sessionNode, &(serverNode->sessionList), SessionInfo, node) {
2436             if (sessionNode->sessionId != sessionId ||
2437                 (sessionNode->channelType != CHANNEL_TYPE_PROXY && sessionNode->channelType != CHANNEL_TYPE_AUTH)) {
2438                 continue;
2439             }
2440             ret = ClientUpdateAuthSessionTimer(sessionNode, sessionId);
2441             UnlockClientSessionServerList();
2442             return ret;
2443         }
2444     }
2445     UnlockClientSessionServerList();
2446     TRANS_LOGE(TRANS_SDK, "not found ishare auth session by sessionId=%{public}d", sessionId);
2447     return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2448 }
2449 
ClientGetChannelOsTypeBySessionId(int32_t sessionId, int32_t *osType)2450 int32_t ClientGetChannelOsTypeBySessionId(int32_t sessionId, int32_t *osType)
2451 {
2452     if ((sessionId < 0) || (osType == NULL)) {
2453         return SOFTBUS_INVALID_PARAM;
2454     }
2455     int32_t ret = LockClientSessionServerList();
2456     if (ret != SOFTBUS_OK) {
2457         TRANS_LOGE(TRANS_SDK, "lock failed");
2458         return ret;
2459     }
2460 
2461     ClientSessionServer *serverNode = NULL;
2462     SessionInfo *sessionNode = NULL;
2463     if (GetSessionById(sessionId, &serverNode, &sessionNode) != SOFTBUS_OK) {
2464         UnlockClientSessionServerList();
2465         TRANS_LOGE(TRANS_SDK, "session not found. sessionId=%{public}d", sessionId);
2466         return SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND;
2467     }
2468 
2469     *osType = sessionNode->osType;
2470 
2471     UnlockClientSessionServerList();
2472     return SOFTBUS_OK;
2473 }