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(¶m, &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(¶m, 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(¶m, &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(¶m, 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 }