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