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_callback.h"
17
18 #include <securec.h>
19 #include <unistd.h>
20
21 #include "anonymizer.h"
22 #include "client_trans_proxy_manager.h"
23 #include "client_trans_session_manager.h"
24 #include "client_trans_socket_manager.h"
25 #include "client_trans_udp_manager.h"
26 #include "g_enhance_sdk_func.h"
27 #include "softbus_access_token_adapter.h"
28 #include "softbus_adapter_mem.h"
29 #include "softbus_def.h"
30 #include "softbus_error_code.h"
31 #include "trans_log.h"
32
33 #define RETRY_GET_INFO_TIMES_MS 300
34
35 static IClientSessionCallBack g_sessionCb;
36
FillSessionInfoEx(SessionInfo * session,const ChannelInfo * channel)37 static int32_t FillSessionInfoEx(SessionInfo *session, const ChannelInfo *channel)
38 {
39 if (strcpy_s(session->info.peerSessionName, SESSION_NAME_SIZE_MAX, channel->peerSessionName) != EOK ||
40 strcpy_s(session->info.peerDeviceId, DEVICE_ID_SIZE_MAX, channel->peerDeviceId) != EOK ||
41 strcpy_s(session->info.groupId, GROUP_ID_SIZE_MAX, channel->groupId) != EOK) {
42 TRANS_LOGE(TRANS_SDK, "client or peer session name, device id, group id failed");
43 return SOFTBUS_STRCPY_ERR;
44 }
45 if (channel->tokenType > ACCESS_TOKEN_TYPE_HAP && channel->peerBusinessAccountId != NULL) {
46 session->peerUserId = channel->peerUserId;
47 session->peerTokenId = channel->peerTokenId;
48 if (channel->peerBusinessAccountId != NULL &&
49 strcpy_s(session->peerBusinessAccountId, ACCOUNT_UID_LEN_MAX, channel->peerBusinessAccountId) != EOK) {
50 TRANS_LOGE(TRANS_SDK, "copy accountId failed");
51 return SOFTBUS_STRCPY_ERR;
52 }
53 if (channel->peerExtraAccessInfo != NULL &&
54 strcpy_s(session->peerExtraAccessInfo, EXTRA_ACCESS_INFO_LEN_MAX, channel->peerExtraAccessInfo) != EOK) {
55 TRANS_LOGE(TRANS_SDK, "copy extraAccessInfo failed");
56 return SOFTBUS_STRCPY_ERR;
57 }
58 }
59 return SOFTBUS_OK;
60 }
61
FillSessionInfo(SessionInfo * session,const ChannelInfo * channel,uint32_t flag)62 static int32_t FillSessionInfo(SessionInfo *session, const ChannelInfo *channel, uint32_t flag)
63 {
64 session->channelId = channel->channelId;
65 session->channelType = (ChannelType)channel->channelType;
66 session->peerPid = channel->peerPid;
67 session->peerUid = channel->peerUid;
68 session->isServer = channel->isServer;
69 session->enableStatus = ENABLE_STATUS_SUCCESS;
70 session->info.flag = (int32_t)flag;
71 session->isEncrypt = channel->isEncrypt;
72 session->businessType = channel->businessType;
73 session->routeType = channel->routeType;
74 session->fileEncrypt = channel->fileEncrypt;
75 session->algorithm = channel->algorithm;
76 session->crc = channel->crc;
77 session->dataConfig = channel->dataConfig;
78 session->isAsync = false;
79 session->osType = channel->osType;
80 session->lifecycle.sessionState = SESSION_STATE_CALLBACK_FINISHED;
81 session->isSupportTlv = channel->isSupportTlv;
82 session->tokenType = channel->tokenType;
83 if (channel->isD2D) {
84 session->isD2D = channel->isD2D;
85 session->dataLen = channel->dataLen;
86 if (channel->dataLen > 0 && channel->dataLen <= EXTRA_DATA_MAX_LEN &&
87 memcpy_s(session->extraData, EXTRA_DATA_MAX_LEN, channel->extraData, channel->dataLen) != EOK) {
88 TRANS_LOGE(TRANS_SDK, "copy extraData failed");
89 return SOFTBUS_MEM_ERR;
90 }
91 if (channel->isServer &&
92 strcpy_s(session->peerPagingAccountId, ACCOUNT_UID_LEN_MAX, channel->pagingAccountId) != EOK) {
93 TRANS_LOGE(TRANS_SDK, "copy peerPagingAccountId failed");
94 return SOFTBUS_STRCPY_ERR;
95 }
96 if (strcpy_s(session->info.peerDeviceId, DEVICE_ID_SIZE_MAX, channel->peerDeviceId) != EOK) {
97 TRANS_LOGE(TRANS_SDK, "copy peerDeviceId failed");
98 return SOFTBUS_STRCPY_ERR;
99 }
100 return SOFTBUS_OK;
101 }
102 return FillSessionInfoEx(session, channel);
103 }
104
AcceptSessionAsServer(const char * sessionName,const ChannelInfo * channel,uint32_t flag,int32_t * sessionId)105 static int32_t AcceptSessionAsServer(const char *sessionName, const ChannelInfo *channel, uint32_t flag,
106 int32_t *sessionId)
107 {
108 TRANS_LOGD(TRANS_SDK, "enter.");
109 SessionInfo *session = (SessionInfo *)SoftBusCalloc(sizeof(SessionInfo));
110 if (session == NULL) {
111 TRANS_LOGE(TRANS_SDK, "malloc failed");
112 return SOFTBUS_MALLOC_ERR;
113 }
114 int32_t ret = FillSessionInfo(session, channel, flag);
115 if (ret != SOFTBUS_OK) {
116 TRANS_LOGE(TRANS_SDK, "fill session info failed, ret=%{public}d", ret);
117 SoftBusFree(session);
118 return ret;
119 }
120 ret = ClientAddNewSession(sessionName, session);
121 if (ret != SOFTBUS_OK) {
122 TRANS_LOGE(TRANS_SDK, "client add session failed, ret=%{public}d", ret);
123 SoftBusFree(session);
124 return ret;
125 }
126 *sessionId = session->sessionId;
127 TRANS_LOGD(TRANS_SDK, "ok");
128 return SOFTBUS_OK;
129 }
130
GetSessionCallbackByChannelId(int32_t channelId,int32_t channelType,int32_t * sessionId,ISessionListener * listener)131 static int32_t GetSessionCallbackByChannelId(int32_t channelId, int32_t channelType,
132 int32_t *sessionId, ISessionListener *listener)
133 {
134 if ((channelId < 0) || (sessionId == NULL) || (listener == NULL)) {
135 TRANS_LOGW(TRANS_SDK, "Invalid param");
136 return SOFTBUS_INVALID_PARAM;
137 }
138 int32_t ret = ClientGetSessionIdByChannelId(channelId, channelType, sessionId, false);
139 if (ret != SOFTBUS_OK) {
140 TRANS_LOGE(TRANS_SDK, "get sessionId failed, channelId=%{public}d, ret=%{public}d", channelId, ret);
141 return ret;
142 }
143 ret = ClientGetSessionCallbackById(*sessionId, listener);
144 if (ret != SOFTBUS_OK) {
145 TRANS_LOGE(TRANS_SDK, "get session listener failed, ret=%{public}d", ret);
146 return ret;
147 }
148 return SOFTBUS_OK;
149 }
150
GetSocketCallbackAdapterByChannelId(int32_t channelId,int32_t channelType,int32_t * sessionId,SessionListenerAdapter * sessionCallback,bool * isServer)151 static int32_t GetSocketCallbackAdapterByChannelId(int32_t channelId, int32_t channelType, int32_t *sessionId,
152 SessionListenerAdapter *sessionCallback, bool *isServer)
153 {
154 if ((channelId < 0) || (sessionId == NULL) ||
155 (sessionCallback == NULL) || (isServer == NULL)) {
156 TRANS_LOGE(TRANS_SDK, "Invalid param");
157 return SOFTBUS_INVALID_PARAM;
158 }
159
160 int32_t ret = ClientGetSessionIdByChannelId(channelId, channelType, sessionId, false);
161 if (ret != SOFTBUS_OK) {
162 TRANS_LOGE(TRANS_SDK, "get sessionId failed, channelId=%{public}d, ret=%{public}d", channelId, ret);
163 return ret;
164 }
165 ret = ClientGetSessionCallbackAdapterById(*sessionId, sessionCallback, isServer);
166 if (ret != SOFTBUS_OK) {
167 TRANS_LOGE(TRANS_SDK, "get socket callback failed, channelId=%{public}d,"
168 "ret=%{public}d", channelId, ret);
169 return ret;
170 }
171 return SOFTBUS_OK;
172 }
173
GetSocketCallbackAdapterByUdpChannelId(int32_t channelId,int32_t channelType,int32_t * sessionId,SessionListenerAdapter * sessionCallback,bool * isServer)174 static int32_t GetSocketCallbackAdapterByUdpChannelId(int32_t channelId, int32_t channelType, int32_t *sessionId,
175 SessionListenerAdapter *sessionCallback, bool *isServer)
176 {
177 if ((channelId < 0) || (sessionId == NULL) ||
178 (sessionCallback == NULL) || (isServer == NULL)) {
179 TRANS_LOGE(TRANS_SDK, "Invalid param");
180 return SOFTBUS_INVALID_PARAM;
181 }
182
183 int32_t ret = ClientGetSessionIdByChannelId(channelId, channelType, sessionId, true);
184 if (ret != SOFTBUS_OK) {
185 TRANS_LOGE(TRANS_SDK, "get sessionId failed, channelId=%{public}d, ret=%{public}d", channelId, ret);
186 return ret;
187 }
188 ret = ClientGetSessionCallbackAdapterById(*sessionId, sessionCallback, isServer);
189 if (ret != SOFTBUS_OK) {
190 TRANS_LOGE(TRANS_SDK, "get socket callback failed, ret=%{public}d", ret);
191 return ret;
192 }
193 return SOFTBUS_OK;
194 }
195
TransOnBindSuccess(int32_t sessionId,const ISocketListener * socketCallback)196 NO_SANITIZE("cfi") static int32_t TransOnBindSuccess(int32_t sessionId, const ISocketListener *socketCallback)
197 {
198 if (socketCallback == NULL || socketCallback->OnBind == NULL) {
199 TRANS_LOGE(TRANS_SDK, "Invalid OnBind callback function");
200 return SOFTBUS_INVALID_PARAM;
201 }
202
203 PeerSocketInfo info;
204 int32_t ret = ClientGetPeerSocketInfoById(sessionId, &info);
205 if (ret != SOFTBUS_OK) {
206 TRANS_LOGE(TRANS_SDK, "Get peer socket info failed, ret=%{public}d", ret);
207 return ret;
208 }
209
210 (void)socketCallback->OnBind(sessionId, info);
211 return SOFTBUS_OK;
212 }
213
214 NO_SANITIZE("cfi")
TransOnBindFailed(int32_t sessionId,const ISocketListener * socketCallback,int32_t errCode)215 static int32_t TransOnBindFailed(int32_t sessionId, const ISocketListener *socketCallback, int32_t errCode)
216 {
217 (void)ClientHandleBindWaitTimer(sessionId, 0, TIMER_ACTION_STOP);
218 bool isAsync = true;
219 int32_t ret = ClientGetSessionIsAsyncBySessionId(sessionId, &isAsync);
220 if (ret != SOFTBUS_OK) {
221 TRANS_LOGE(TRANS_SDK, "get is async type failed, sessionId=%{public}d, ret=%{public}d", sessionId, ret);
222 return ret;
223 }
224 if (!isAsync) {
225 (void)ClientSignalSyncBind(sessionId, errCode);
226 return SOFTBUS_OK;
227 }
228 if (socketCallback == NULL || socketCallback->OnError == NULL) {
229 TRANS_LOGE(TRANS_SDK, "Invalid OnBind callback function");
230 return SOFTBUS_INVALID_PARAM;
231 }
232
233 SocketLifecycleData lifecycle;
234 (void)memset_s(&lifecycle, sizeof(SocketLifecycleData), 0, sizeof(SocketLifecycleData));
235 ret = GetSocketLifecycleAndSessionNameBySessionId(sessionId, NULL, &lifecycle);
236 (void)SetSessionStateBySessionId(sessionId, SESSION_STATE_INIT, 0);
237 if (ret == SOFTBUS_OK && lifecycle.sessionState == SESSION_STATE_CANCELLING) {
238 TRANS_LOGW(TRANS_SDK, "socket is cancelling, no need call back, socket=%{public}d, bindErrCode=%{public}d",
239 sessionId, lifecycle.bindErrCode);
240 return lifecycle.bindErrCode;
241 }
242
243 (void)socketCallback->OnError(sessionId, errCode);
244 TRANS_LOGI(TRANS_SDK, "OnError success, client socket=%{public}d", sessionId);
245 return SOFTBUS_OK;
246 }
247
HandleAsyncBindSuccess(int32_t sessionId,const ISocketListener * socketClient,const SocketLifecycleData * lifecycle)248 static int32_t HandleAsyncBindSuccess(
249 int32_t sessionId, const ISocketListener *socketClient, const SocketLifecycleData *lifecycle)
250 {
251 int32_t ret = ClientHandleBindWaitTimer(sessionId, 0, TIMER_ACTION_STOP);
252 if (ret != SOFTBUS_OK) {
253 TRANS_LOGE(TRANS_SDK, "stop bind wait timer failed, ret=%{public}d", ret);
254 return ret;
255 }
256 if (lifecycle->sessionState == SESSION_STATE_CANCELLING) {
257 TRANS_LOGW(TRANS_SDK, "session is cancelling, no need call back");
258 return SOFTBUS_OK;
259 }
260 ret = SetSessionStateBySessionId(sessionId, SESSION_STATE_CALLBACK_FINISHED, 0);
261 if (ret != SOFTBUS_OK) {
262 TRANS_LOGE(TRANS_SDK, "set session state failed, ret=%{public}d", ret);
263 return ret;
264 }
265
266 return TransOnBindSuccess(sessionId, socketClient);
267 }
268
TransOnNegotiate(int32_t socket,const ISocketListener * socketCallback)269 NO_SANITIZE("cfi") static int32_t TransOnNegotiate(int32_t socket, const ISocketListener *socketCallback)
270 {
271 if (socketCallback == NULL) {
272 TRANS_LOGE(TRANS_SDK, "Invalid socketCallback socket=%{public}d", socket);
273 return SOFTBUS_INVALID_PARAM;
274 }
275
276 if (socketCallback->OnNegotiate == NULL) {
277 TRANS_LOGW(TRANS_SDK, "no OnNegotiate callback function socket=%{public}d", socket);
278 return SOFTBUS_OK;
279 }
280
281 PeerSocketInfo info = {0};
282 int32_t ret = ClientGetPeerSocketInfoById(socket, &info);
283 if (ret != SOFTBUS_OK) {
284 TRANS_LOGE(TRANS_SDK, "Get peer socket info failed, ret=%{public}d, socket=%{public}d", ret, socket);
285 return ret;
286 }
287
288 if (!socketCallback->OnNegotiate(socket, info)) {
289 TRANS_LOGW(TRANS_SDK, "The negotiate rejected the socket=%{public}d", socket);
290 return SOFTBUS_TRANS_NEGOTIATE_REJECTED;
291 }
292
293 return SOFTBUS_OK;
294 }
295
296 NO_SANITIZE("cfi")
TransOnNegotiate2(int32_t socket,const ISocketListener * socketCallback,const ChannelInfo * channel,SocketAccessInfo * localAccessInfo)297 static int32_t TransOnNegotiate2(int32_t socket, const ISocketListener *socketCallback, const ChannelInfo *channel,
298 SocketAccessInfo *localAccessInfo)
299 {
300 if (socketCallback == NULL) {
301 TRANS_LOGE(TRANS_SDK, "Invalid socketCallback socket=%{public}d", socket);
302 return SOFTBUS_INVALID_PARAM;
303 }
304
305 if (socketCallback->OnNegotiate2 == NULL) {
306 TRANS_LOGW(TRANS_SDK, "no OnNegotiate2 callback function socket=%{public}d", socket);
307 return SOFTBUS_OK;
308 }
309
310 if (channel->peerUserId == -1) {
311 TRANS_LOGW(TRANS_SDK, "default access info, no need check acl, socket=%{public}d", socket);
312 return SOFTBUS_OK;
313 }
314 PeerSocketInfo socketInfo = {0};
315 int32_t ret = ClientGetPeerSocketInfoById(socket, &socketInfo);
316 if (ret != SOFTBUS_OK) {
317 TRANS_LOGE(TRANS_SDK, "Get peer access info failed, ret=%{public}d, socket=%{public}d", ret, socket);
318 return ret;
319 }
320
321 SocketAccessInfo peerAccessInfo = {
322 .userId = channel->peerUserId,
323 .localTokenId = channel->peerTokenId,
324 .businessAccountId = channel->peerBusinessAccountId,
325 .extraAccessInfo = channel->peerExtraAccessInfo,
326 };
327
328 if (!socketCallback->OnNegotiate2(socket, socketInfo, &peerAccessInfo, localAccessInfo)) {
329 TRANS_LOGW(TRANS_SDK, "The OnNegotiate2 rejected the socket=%{public}d", socket);
330 return SOFTBUS_TRANS_NEGOTIATE_REJECTED;
331 }
332
333 return SOFTBUS_OK;
334 }
335
HandleServerOnNegotiate(int32_t socket,int32_t tokenType,const ISocketListener * socketCallback,const ChannelInfo * channel,SocketAccessInfo * localAccessInfo)336 static int32_t HandleServerOnNegotiate(int32_t socket, int32_t tokenType, const ISocketListener *socketCallback,
337 const ChannelInfo *channel, SocketAccessInfo *localAccessInfo)
338 {
339 int32_t ret = TransOnNegotiate(socket, socketCallback);
340 if (ret != SOFTBUS_OK) {
341 TRANS_LOGE(TRANS_SDK, "TransOnNegotiate failed, ret=%{public}d", ret);
342 (void)ClientDeleteSocketSession(socket);
343 return ret;
344 }
345
346 if (tokenType > ACCESS_TOKEN_TYPE_HAP && channel->channelType != CHANNEL_TYPE_AUTH) {
347 ret = TransOnNegotiate2(socket, socketCallback, channel, localAccessInfo);
348 if (ret != SOFTBUS_OK) {
349 TRANS_LOGE(TRANS_SDK, "TransOnNegotiate2 failed, ret=%{public}d", ret);
350 (void)ClientDeleteSocketSession(socket);
351 return ret;
352 }
353 }
354 return SOFTBUS_OK;
355 }
356
HandleCacheQosEvent(int32_t socket,SessionListenerAdapter sessionCallback,bool isServer)357 static int32_t HandleCacheQosEvent(int32_t socket, SessionListenerAdapter sessionCallback, bool isServer)
358 {
359 if (isServer) {
360 TRANS_LOGD(TRANS_SDK, "server side no need to handle cache qos event");
361 return SOFTBUS_OK;
362 }
363 if (sessionCallback.socketClient.OnQos == NULL) {
364 TRANS_LOGD(TRANS_SDK, "no OnQos callback function socket=%{public}d", socket);
365 return SOFTBUS_OK;
366 }
367 CachedQosEvent cachedQosEvent;
368 (void)memset_s(&cachedQosEvent, sizeof(CachedQosEvent), 0, sizeof(CachedQosEvent));
369 int32_t ret = ClientGetCachedQosEventBySocket(socket, &cachedQosEvent);
370 if (ret != SOFTBUS_OK) {
371 TRANS_LOGE(TRANS_SDK, "get cached qos event failed, ret=%{public}d", ret);
372 return ret;
373 }
374 if (cachedQosEvent.count > 0) {
375 TRANS_LOGI(TRANS_SDK, "trigger OnQos callback, socket=%{public}d", socket);
376 sessionCallback.socketClient.OnQos(
377 socket, cachedQosEvent.event, (const QosTV *)cachedQosEvent.qos, cachedQosEvent.count);
378 }
379 return SOFTBUS_OK;
380 }
381
HandleSyncBindSuccess(int32_t sessionId,const SocketLifecycleData * lifecycle)382 static int32_t HandleSyncBindSuccess(int32_t sessionId, const SocketLifecycleData *lifecycle)
383 {
384 if (lifecycle->sessionState == SESSION_STATE_CANCELLING) {
385 TRANS_LOGW(
386 TRANS_SDK, "socket=%{public}d is cancelling, bindErrCode=%{public}d", sessionId, lifecycle->bindErrCode);
387 return SOFTBUS_OK;
388 }
389
390 int32_t ret = ClientSignalSyncBind(sessionId, 0);
391 if (ret != SOFTBUS_OK) {
392 TRANS_LOGE(TRANS_SDK, "sync signal bind failed, ret=%{public}d, socket=%{public}d", ret, sessionId);
393 return ret;
394 }
395 return SOFTBUS_OK;
396 }
397
HandleOnBindSuccess(int32_t sessionId,SessionListenerAdapter sessionCallback,const ChannelInfo * channel,SocketAccessInfo * sinkAccessInfo)398 static int32_t HandleOnBindSuccess(int32_t sessionId, SessionListenerAdapter sessionCallback,
399 const ChannelInfo *channel, SocketAccessInfo *sinkAccessInfo)
400 {
401 // async bind call back client and server, sync bind only call back server.
402 bool isAsync = true;
403 int32_t tokenType = -1;
404 int32_t ret = GetIsAsyncAndTokenTypeBySessionId(sessionId, &isAsync, &tokenType);
405 if (ret != SOFTBUS_OK) {
406 TRANS_LOGE(TRANS_SDK, "Get is async type failed");
407 return ret;
408 }
409
410 SocketLifecycleData lifecycle;
411 (void)memset_s(&lifecycle, sizeof(SocketLifecycleData), 0, sizeof(SocketLifecycleData));
412 ret = GetSocketLifecycleAndSessionNameBySessionId(sessionId, NULL, &lifecycle);
413 if (ret != SOFTBUS_OK) {
414 TRANS_LOGE(TRANS_SDK, "Get session lifecycle failed, ret=%{public}d", ret);
415 return ret;
416 }
417
418 if (channel->isServer) {
419 return HandleServerOnNegotiate(sessionId, tokenType, &sessionCallback.socketServer, channel, sinkAccessInfo);
420 } else if (isAsync) {
421 ret = HandleAsyncBindSuccess(sessionId, &sessionCallback.socketClient, &lifecycle);
422 (void)HandleCacheQosEvent(sessionId, sessionCallback, channel->isServer);
423 return ret;
424 } else { // sync bind
425 ret = HandleSyncBindSuccess(sessionId, &lifecycle);
426 (void)HandleCacheQosEvent(sessionId, sessionCallback, channel->isServer);
427 return ret;
428 }
429
430 return SOFTBUS_OK;
431 }
432
AnonymizeLogTransOnSessionOpenedInfo(const char * sessionName,const ChannelInfo * channel,SessionType flag)433 static void AnonymizeLogTransOnSessionOpenedInfo(const char *sessionName, const ChannelInfo *channel, SessionType flag)
434 {
435 char *tmpName = NULL;
436 Anonymize(sessionName, &tmpName);
437 TRANS_LOGI(TRANS_SDK,
438 "TransOnSessionOpened: sessionName=%{public}s, channelId=%{public}d, channelType=%{public}d, flag=%{public}d,"
439 "isServer=%{public}d, type=%{public}d, crc=%{public}d", AnonymizeWrapper(tmpName), channel->channelId,
440 channel->channelType, flag, channel->isServer, channel->routeType, channel->crc);
441 AnonymizeFree(tmpName);
442 }
443
ClientCheckFuncPointer(void * func)444 static int32_t ClientCheckFuncPointer(void *func)
445 {
446 if (func == NULL) {
447 TRANS_LOGE(TRANS_SDK, "enhance func not register");
448 return SOFTBUS_FUNC_NOT_REGISTER;
449 }
450 return SOFTBUS_OK;
451 }
452
TransOnPagingConnectPacked(const int32_t socket,const ChannelInfo * channel)453 static int32_t TransOnPagingConnectPacked(const int32_t socket, const ChannelInfo *channel)
454 {
455 ClientEnhanceFuncList *pfnClientEnhanceFuncList = ClientEnhanceFuncListGet();
456 if (ClientCheckFuncPointer((void *)pfnClientEnhanceFuncList->transOnPagingConnect) != SOFTBUS_OK) {
457 return SOFTBUS_FUNC_NOT_SUPPORT;
458 }
459 return pfnClientEnhanceFuncList->transOnPagingConnect(socket, channel);
460 }
461
TransOnPagingSessionOpened(const char * sessionName,const ChannelInfo * channel,SessionType flag)462 static int32_t TransOnPagingSessionOpened(const char *sessionName, const ChannelInfo *channel, SessionType flag)
463 {
464 int32_t socket = INVALID_SESSION_ID;
465 SessionListenerAdapter sessionCallback;
466 bool isServer = false;
467 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
468 int32_t ret = GetSocketCallbackAdapterByChannelId(
469 channel->channelId, channel->channelType, &socket, &sessionCallback, &isServer);
470 if (ret == SOFTBUS_OK) {
471 ret = ClientEnableSessionByChannelId(channel, &socket);
472 if (ret != SOFTBUS_OK) {
473 TRANS_LOGE(TRANS_SDK, "enable session failed, ret=%{public}d", ret);
474 return ret;
475 }
476 ret = TransOnBindSuccess(socket, &sessionCallback.socketServer);
477 if (ret != SOFTBUS_OK) {
478 TRANS_LOGE(TRANS_SDK, "fork paging on bind failed, channelId=%{public}d", channel->channelId);
479 return ret;
480 }
481 TRANS_LOGI(TRANS_SDK, "fork ok, channelId=%{public}d", channel->channelId);
482 return SOFTBUS_OK;
483 }
484 ret = AcceptSessionAsServer(sessionName, channel, flag, &socket);
485 if (ret != SOFTBUS_OK) {
486 TRANS_LOGE(TRANS_SDK, "accept paging session failed, ret=%{public}d", ret);
487 return ret;
488 }
489 return TransOnPagingConnectPacked(socket, channel);
490 }
491
492 NO_SANITIZE("cfi")
TransOnSessionOpened(const char * sessionName,const ChannelInfo * channel,SessionType flag,SocketAccessInfo * accessInfo)493 int32_t TransOnSessionOpened(
494 const char *sessionName, const ChannelInfo *channel, SessionType flag, SocketAccessInfo *accessInfo)
495 {
496 if ((sessionName == NULL) || (channel == NULL) || (accessInfo == NULL)) {
497 TRANS_LOGW(TRANS_SDK, "Invalid param");
498 return SOFTBUS_INVALID_PARAM;
499 }
500 AnonymizeLogTransOnSessionOpenedInfo(sessionName, channel, flag);
501 SessionListenerAdapter sessionCallback;
502 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
503 int32_t ret = ClientGetSessionCallbackAdapterByName(sessionName, &sessionCallback);
504 if (ret != SOFTBUS_OK) {
505 TRANS_LOGE(TRANS_SDK, "get session listener failed, ret=%{public}d", ret);
506 return ret;
507 }
508 if (!channel->isServer && channel->isD2D) {
509 return TransOnPagingSessionOpened(sessionName, channel, flag);
510 }
511 int32_t sessionId = INVALID_SESSION_ID;
512 if (channel->isServer) {
513 ret = AcceptSessionAsServer(sessionName, channel, flag, &sessionId);
514 } else {
515 ret = ClientEnableSessionByChannelId(channel, &sessionId);
516 if (ret == SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND) {
517 SoftBusSleepMs(RETRY_GET_INFO_TIMES_MS); // avoid set channel info later than sesssion opened callback
518 ret = ClientEnableSessionByChannelId(channel, &sessionId);
519 }
520 }
521
522 if (ret != SOFTBUS_OK) {
523 TRANS_LOGE(TRANS_SDK, "accept session failed, ret=%{public}d", ret);
524 return ret;
525 }
526 if (channel->channelType == CHANNEL_TYPE_UDP) {
527 TransSetUdpChannelSessionId(channel->channelId, sessionId);
528 }
529 if (sessionCallback.isSocketListener) {
530 ret = HandleOnBindSuccess(sessionId, sessionCallback, channel, accessInfo);
531 return ret;
532 }
533 TRANS_LOGD(TRANS_SDK, "trigger session open callback");
534 if ((sessionCallback.session.OnSessionOpened == NULL) ||
535 (sessionCallback.session.OnSessionOpened(sessionId, SOFTBUS_OK) != SOFTBUS_OK)) {
536 TRANS_LOGE(TRANS_SDK, "OnSessionOpened failed");
537 (void)ClientDeleteSession(sessionId);
538 return SOFTBUS_TRANS_ON_SESSION_OPENED_FAILED;
539 }
540 TRANS_LOGI(TRANS_SDK, "ok, sessionId=%{public}d", sessionId);
541 return SOFTBUS_OK;
542 }
543
TransOnSessionOpenFailed(int32_t channelId,int32_t channelType,int32_t errCode)544 NO_SANITIZE("cfi") int32_t TransOnSessionOpenFailed(int32_t channelId, int32_t channelType, int32_t errCode)
545 {
546 int32_t sessionId = INVALID_SESSION_ID;
547 SessionListenerAdapter sessionCallback;
548 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
549 if (channelType == CHANNEL_TYPE_UNDEFINED) {
550 sessionId = channelId;
551 (void)ClientSetEnableStatusBySocket(sessionId, ENABLE_STATUS_FAILED);
552 // only client async bind failed call
553 bool tmpIsServer = false;
554 ClientGetSessionCallbackAdapterById(sessionId, &sessionCallback, &tmpIsServer);
555 (void)TransOnBindFailed(sessionId, &sessionCallback.socketClient, errCode);
556 return SOFTBUS_OK;
557 }
558 TRANS_LOGI(TRANS_SDK, "trigger session open failed callback, channelId=%{public}d, channelType=%{public}d",
559 channelId, channelType);
560 bool isServer = false;
561 int32_t ret = GetSocketCallbackAdapterByChannelId(channelId, channelType, &sessionId, &sessionCallback, &isServer);
562 if (ret != SOFTBUS_OK) {
563 TRANS_LOGE(TRANS_SDK, "Get Socket Callback Adapter failed, ret=%{public}d", ret);
564 return ret;
565 }
566 if (sessionCallback.isSocketListener) {
567 (void)ClientSetEnableStatusBySocket(sessionId, ENABLE_STATUS_FAILED);
568 bool isAsync = true;
569 int ret = ClientGetSessionIsAsyncBySessionId(sessionId, &isAsync);
570 if (ret != SOFTBUS_OK) {
571 TRANS_LOGE(TRANS_SDK, "get is async type failed, ret=%{public}d", ret);
572 return ret;
573 }
574
575 if (isServer) {
576 (void)ClientDeleteSocketSession(sessionId);
577 } else if (isAsync) {
578 (void)TransOnBindFailed(sessionId, &sessionCallback.socketClient, errCode);
579 } else { // sync bind
580 (void)ClientSignalSyncBind(sessionId, errCode);
581 }
582 TRANS_LOGI(TRANS_SDK, "ok, sessionid=%{public}d", sessionId);
583 return SOFTBUS_OK;
584 }
585 if (sessionCallback.session.OnSessionOpened != NULL) {
586 (void)sessionCallback.session.OnSessionOpened(sessionId, errCode);
587 }
588 (void)ClientDeleteSession(sessionId);
589 TRANS_LOGI(TRANS_SDK, "ok, sessionid=%{public}d", sessionId);
590 return SOFTBUS_OK;
591 }
592
TransOnSessionClosed(int32_t channelId,int32_t channelType,ShutdownReason reason)593 NO_SANITIZE("cfi") int32_t TransOnSessionClosed(int32_t channelId, int32_t channelType, ShutdownReason reason)
594 {
595 TRANS_LOGI(TRANS_SDK, "channelId=%{public}d, channelType=%{public}d", channelId, channelType);
596 int32_t sessionId = INVALID_SESSION_ID;
597 int32_t ret = SOFTBUS_NO_INIT;
598 SessionListenerAdapter sessionCallback;
599 bool isServer = false;
600 bool isUdpType = (channelType == CHANNEL_TYPE_UDP ? true : false);
601 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
602 if (isUdpType) {
603 (void)GetSocketCallbackAdapterByUdpChannelId(channelId, channelType, &sessionId, &sessionCallback, &isServer);
604 } else {
605 (void)GetSocketCallbackAdapterByChannelId(channelId, channelType, &sessionId, &sessionCallback, &isServer);
606 }
607
608 SessionEnableStatus enableStatus = ENABLE_STATUS_INIT;
609 (void)ClientGetChannelBySessionId(sessionId, NULL, NULL, &enableStatus);
610 TRANS_LOGI(TRANS_SDK, "trigger session close callback");
611 if (sessionCallback.isSocketListener && enableStatus == ENABLE_STATUS_SUCCESS) {
612 bool isD2D = false;
613 (void)ClientGetSessionIsD2DByChannelId(channelId, channelType, &isD2D);
614 ISocketListener *listener = NULL;
615 if (isD2D) {
616 listener = &sessionCallback.socketServer;
617 } else {
618 listener = isServer ? &sessionCallback.socketServer : &sessionCallback.socketClient;
619 }
620 if (listener->OnShutdown != NULL) {
621 listener->OnShutdown(sessionId, reason);
622 }
623 ret = ClientDeleteSocketSession(sessionId);
624 } else if (sessionCallback.session.OnSessionClosed != NULL) {
625 sessionCallback.session.OnSessionClosed(sessionId);
626 ret = ClientDeleteSession(sessionId);
627 }
628
629 if (ret != SOFTBUS_OK) {
630 TRANS_LOGE(TRANS_SDK, "client delete session failed");
631 return ret;
632 }
633 TRANS_LOGI(TRANS_SDK, "ok, sessionId=%{public}d", sessionId);
634 return SOFTBUS_OK;
635 }
636
ProcessReceivedFileData(int32_t sessionId,int32_t channelId,const char * data,uint32_t len,SessionPktType type)637 static int32_t ProcessReceivedFileData(int32_t sessionId, int32_t channelId, const char *data, uint32_t len,
638 SessionPktType type)
639 {
640 char sessionName[SESSION_NAME_SIZE_MAX] = { 0 };
641 int32_t ret = ClientGetSessionDataById(sessionId, sessionName, SESSION_NAME_SIZE_MAX, KEY_SESSION_NAME);
642 if (ret != SOFTBUS_OK) {
643 TRANS_LOGE(TRANS_FILE, "get sessionName by sessionId=%{public}d failed, ret=%{public}d", sessionId, ret);
644 return ret;
645 }
646
647 ret = ProcessFileFrameData(sessionId, channelId, data, len, type);
648 if (ret != SOFTBUS_OK) {
649 TRANS_LOGE(TRANS_FILE, "process file frame data failed, ret=%{public}d", ret);
650 return ret;
651 }
652 return SOFTBUS_OK;
653 }
654
TransOnDataReceived(int32_t channelId,int32_t channelType,const void * data,uint32_t len,SessionPktType type)655 NO_SANITIZE("cfi") int32_t TransOnDataReceived(int32_t channelId, int32_t channelType,
656 const void *data, uint32_t len, SessionPktType type)
657 {
658 int32_t sessionId;
659 SessionListenerAdapter sessionCallback;
660 bool isServer = false;
661 bool isD2D = false;
662 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
663 int32_t ret = GetSocketCallbackAdapterByChannelId(channelId, channelType, &sessionId, &sessionCallback, &isServer);
664 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "get session callback failed");
665 (void)ClientGetSessionIsD2DByChannelId(channelId, channelType, &isD2D);
666 (void)ClientResetIdleTimeoutById(sessionId);
667 ISocketListener *listener = NULL;
668 if (isD2D) {
669 listener = &sessionCallback.socketServer;
670 } else {
671 listener = isServer ? &sessionCallback.socketServer : &sessionCallback.socketClient;
672 }
673 switch (type) {
674 case TRANS_SESSION_BYTES:
675 if (sessionCallback.isSocketListener) {
676 if (listener->OnBytes != NULL) {
677 listener->OnBytes(sessionId, data, len);
678 }
679 } else if (sessionCallback.session.OnBytesReceived != NULL) {
680 sessionCallback.session.OnBytesReceived(sessionId, data, len);
681 }
682 break;
683 case TRANS_SESSION_MESSAGE:
684 if (sessionCallback.isSocketListener) {
685 if (listener->OnMessage != NULL) {
686 listener->OnMessage(sessionId, data, len);
687 }
688 } else if (sessionCallback.session.OnMessageReceived != NULL) {
689 sessionCallback.session.OnMessageReceived(sessionId, data, len);
690 }
691 break;
692 case TRANS_SESSION_FILE_FIRST_FRAME:
693 case TRANS_SESSION_FILE_ONGOINE_FRAME:
694 case TRANS_SESSION_FILE_LAST_FRAME:
695 case TRANS_SESSION_FILE_ONLYONE_FRAME:
696 case TRANS_SESSION_FILE_ALLFILE_SENT:
697 case TRANS_SESSION_FILE_CRC_CHECK_FRAME:
698 case TRANS_SESSION_FILE_RESULT_FRAME:
699 case TRANS_SESSION_FILE_ACK_REQUEST_SENT:
700 case TRANS_SESSION_FILE_ACK_RESPONSE_SENT:
701 if (channelType == CHANNEL_TYPE_PROXY) {
702 return ProcessReceivedFileData(sessionId, channelId, (char *)data, len, type);
703 }
704 break;
705 default:
706 TRANS_LOGE(TRANS_FILE, "revc unknown session type = %{public}d", type);
707 return SOFTBUS_TRANS_INVALID_SESSION_TYPE;
708 }
709
710 return SOFTBUS_OK;
711 }
712
TransOnOnStreamRecevied(int32_t channelId,int32_t channelType,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)713 NO_SANITIZE("cfi") int32_t TransOnOnStreamRecevied(int32_t channelId, int32_t channelType,
714 const StreamData *data, const StreamData *ext, const StreamFrameInfo *param)
715 {
716 int32_t sessionId;
717 SessionListenerAdapter sessionCallback;
718 bool isServer = false;
719 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
720 int32_t ret = GetSocketCallbackAdapterByChannelId(channelId, channelType, &sessionId, &sessionCallback, &isServer);
721 if (ret != SOFTBUS_OK) {
722 TRANS_LOGE(TRANS_STREAM, "get session callback failed");
723 return ret;
724 }
725
726 (void)ClientResetIdleTimeoutById(sessionId);
727 if (sessionCallback.isSocketListener) {
728 ISocketListener *listener = isServer ? &sessionCallback.socketServer : &sessionCallback.socketClient;
729 if (listener->OnStream != NULL) {
730 listener->OnStream(sessionId, data, ext, param);
731 }
732 return SOFTBUS_OK;
733 }
734
735 if (sessionCallback.session.OnStreamReceived == NULL) {
736 TRANS_LOGE(TRANS_STREAM, "listener OnStreamReceived is NULL");
737 return SOFTBUS_NO_INIT;
738 }
739
740 sessionCallback.session.OnStreamReceived(sessionId, data, ext, param);
741 return SOFTBUS_OK;
742 }
743
TransOnQosEvent(int32_t channelId,int32_t channelType,int32_t eventId,int32_t tvCount,const QosTv * tvList)744 NO_SANITIZE("cfi") int32_t TransOnQosEvent(int32_t channelId, int32_t channelType, int32_t eventId,
745 int32_t tvCount, const QosTv *tvList)
746 {
747 int32_t sessionId;
748 ISessionListener listener = {0};
749 int32_t ret = GetSessionCallbackByChannelId(channelId, channelType, &sessionId, &listener);
750 if (ret != SOFTBUS_OK) {
751 TRANS_LOGE(TRANS_QOS, "get session callback failed");
752 return ret;
753 }
754 if (listener.OnQosEvent == NULL) {
755 TRANS_LOGE(TRANS_QOS, "listener OnQosEvent is NULL, channelId=%{public}d, sessionId=%{public}d",
756 channelId, sessionId);
757 return SOFTBUS_NO_INIT;
758 }
759 listener.OnQosEvent(sessionId, eventId, tvCount, tvList);
760 return SOFTBUS_OK;
761 }
762
ClientTransOnChannelBind(int32_t channelId,int32_t channelType)763 int32_t ClientTransOnChannelBind(int32_t channelId, int32_t channelType)
764 {
765 TRANS_LOGI(TRANS_SDK, "channelId=%{public}d, channelType=%{public}d", channelId, channelType);
766 int32_t socket = INVALID_SESSION_ID;
767 SessionListenerAdapter sessionCallback;
768 bool isServer = false;
769 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
770 int32_t ret = GetSocketCallbackAdapterByChannelId(channelId, channelType, &socket, &sessionCallback, &isServer);
771 if (ret != SOFTBUS_OK) {
772 TRANS_LOGE(TRANS_SDK, "get session callback failed channelId=%{public}d", channelId);
773 return ret;
774 }
775
776 if (!sessionCallback.isSocketListener) {
777 TRANS_LOGW(TRANS_SDK, "QoS recv session callback channelId=%{public}d", channelId);
778 return SOFTBUS_NOT_NEED_UPDATE;
779 }
780
781 if (!isServer) {
782 TRANS_LOGW(TRANS_SDK, "only server need OnChannelBind channelId=%{public}d", channelId);
783 return SOFTBUS_NOT_NEED_UPDATE;
784 }
785
786 ISocketListener *listener = &sessionCallback.socketServer;
787 ret = TransOnBindSuccess(socket, listener);
788 if (ret != SOFTBUS_OK) {
789 TRANS_LOGE(TRANS_SDK, "client on bind failed channelId=%{public}d", channelId);
790 return ret;
791 }
792 TRANS_LOGI(TRANS_SDK, "ok, channelId=%{public}d", channelId);
793 return SOFTBUS_OK;
794 }
795
ClientTransIfChannelForSocket(const char * sessionName,bool * isSocket)796 int32_t ClientTransIfChannelForSocket(const char *sessionName, bool *isSocket)
797 {
798 if (sessionName == NULL || isSocket == NULL) {
799 TRANS_LOGE(TRANS_SDK, "sessionName or isSocket is NULL");
800 return SOFTBUS_INVALID_PARAM;
801 }
802
803 SessionListenerAdapter sessionCallback;
804 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
805 int32_t ret = ClientGetSessionCallbackAdapterByName(sessionName, &sessionCallback);
806 if (ret != SOFTBUS_OK) {
807 char *tmpName = NULL;
808 Anonymize(sessionName, &tmpName);
809 TRANS_LOGE(TRANS_SDK, "get session callback failed, sessionName=%{public}s", AnonymizeWrapper(tmpName));
810 AnonymizeFree(tmpName);
811 return ret;
812 }
813
814 *isSocket = sessionCallback.isSocketListener;
815 return SOFTBUS_OK;
816 }
817
ClientTransOnQos(int32_t channelId,int32_t channelType,QoSEvent event,const QosTV * qos,uint32_t count)818 int32_t ClientTransOnQos(int32_t channelId, int32_t channelType, QoSEvent event, const QosTV *qos, uint32_t count)
819 {
820 if (qos == NULL) {
821 TRANS_LOGE(TRANS_SDK, "qos is NULL");
822 return SOFTBUS_INVALID_PARAM;
823 }
824 int32_t socket = INVALID_SESSION_ID;
825 SessionListenerAdapter sessionCallback;
826 bool isServer = false;
827 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
828 int32_t ret = GetSocketCallbackAdapterByChannelId(channelId, channelType, &socket, &sessionCallback, &isServer);
829 if (ret != SOFTBUS_OK) {
830 TRANS_LOGE(TRANS_SDK, "get session callback failed channelId=%{public}d", channelId);
831 return ret;
832 }
833 if (isServer) {
834 TRANS_LOGI(TRANS_SDK, "not report qos event on server side");
835 return SOFTBUS_OK;
836 }
837 if (!sessionCallback.isSocketListener) {
838 TRANS_LOGI(TRANS_SDK, "not report qos event on non-socket session");
839 return SOFTBUS_OK;
840 }
841 if (sessionCallback.socketClient.OnQos == NULL) {
842 TRANS_LOGD(TRANS_SDK, "listener OnQos is NULL, sessionId=%{public}d", socket);
843 return SOFTBUS_OK;
844 }
845 ret = ClientCacheQosEvent(socket, event, qos, count);
846 if (ret != SOFTBUS_OK && ret != SOFTBUS_TRANS_NO_NEED_CACHE_QOS_EVENT) {
847 TRANS_LOGE(TRANS_SDK, "cache qos event failed, ret=%{public}d", ret);
848 return ret;
849 } else if (ret == SOFTBUS_TRANS_NO_NEED_CACHE_QOS_EVENT) {
850 sessionCallback.socketClient.OnQos(socket, event, qos, count);
851 TRANS_LOGI(TRANS_SDK, "report qos event to client socket=%{public}d, event=%{public}d", socket, event);
852 }
853 return SOFTBUS_OK;
854 }
855
GetClientSessionCb(void)856 IClientSessionCallBack *GetClientSessionCb(void)
857 {
858 g_sessionCb.OnSessionOpened = TransOnSessionOpened;
859 g_sessionCb.OnSessionClosed = TransOnSessionClosed;
860 g_sessionCb.OnSessionOpenFailed = TransOnSessionOpenFailed;
861 g_sessionCb.OnDataReceived = TransOnDataReceived;
862 g_sessionCb.OnStreamReceived = TransOnOnStreamRecevied;
863 g_sessionCb.OnGetSessionId = ClientGetSessionIdByChannelId;
864 g_sessionCb.OnQosEvent = TransOnQosEvent;
865 g_sessionCb.OnIdleTimeoutReset = ClientResetIdleTimeoutById;
866 g_sessionCb.OnRawStreamEncryptDefOptGet = ClientRawStreamEncryptDefOptGet;
867 g_sessionCb.OnRawStreamEncryptOptGet = ClientRawStreamEncryptOptGet;
868 g_sessionCb.OnChannelBind = ClientTransOnChannelBind;
869 g_sessionCb.IfChannelForSocket = ClientTransIfChannelForSocket;
870 g_sessionCb.OnQos = ClientTransOnQos;
871 return &g_sessionCb;
872 }
873