• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "client_trans_session_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