1 /*
2 * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "client_trans_session_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 "softbus_adapter_mem.h"
27 #include "softbus_def.h"
28 #include "softbus_error_code.h"
29 #include "trans_log.h"
30
31 #define RETRY_GET_INFO_TIMES_MS 300
32
33 static IClientSessionCallBack g_sessionCb;
34
AcceptSessionAsServer(const char * sessionName,const ChannelInfo * channel,uint32_t flag,int32_t * sessionId)35 static int32_t AcceptSessionAsServer(const char *sessionName, const ChannelInfo *channel, uint32_t flag,
36 int32_t *sessionId)
37 {
38 TRANS_LOGD(TRANS_SDK, "enter.");
39 SessionInfo *session = (SessionInfo *)SoftBusCalloc(sizeof(SessionInfo));
40 if (session == NULL) {
41 TRANS_LOGE(TRANS_SDK, "malloc failed");
42 return SOFTBUS_MALLOC_ERR;
43 }
44
45 session->channelId = channel->channelId;
46 session->channelType = (ChannelType)channel->channelType;
47 session->peerPid = channel->peerPid;
48 session->peerUid = channel->peerUid;
49 session->isServer = channel->isServer;
50 session->enableStatus = ENABLE_STATUS_SUCCESS;
51 session->info.flag = (int32_t)flag;
52 session->isEncrypt = channel->isEncrypt;
53 session->businessType = channel->businessType;
54 session->routeType = channel->routeType;
55 session->fileEncrypt = channel->fileEncrypt;
56 session->algorithm = channel->algorithm;
57 session->crc = channel->crc;
58 session->dataConfig = channel->dataConfig;
59 session->isAsync = false;
60 session->osType = channel->osType;
61 session->lifecycle.sessionState = SESSION_STATE_CALLBACK_FINISHED;
62 session->isSupportTlv = channel->isSupportTlv;
63 if (strcpy_s(session->info.peerSessionName, SESSION_NAME_SIZE_MAX, channel->peerSessionName) != EOK ||
64 strcpy_s(session->info.peerDeviceId, DEVICE_ID_SIZE_MAX, channel->peerDeviceId) != EOK ||
65 strcpy_s(session->info.groupId, GROUP_ID_SIZE_MAX, channel->groupId) != EOK) {
66 TRANS_LOGE(TRANS_SDK, "client or peer session name, device id, group id failed");
67 SoftBusFree(session);
68 return SOFTBUS_STRCPY_ERR;
69 }
70
71 int32_t ret = ClientAddNewSession(sessionName, session);
72 if (ret != SOFTBUS_OK) {
73 TRANS_LOGE(TRANS_SDK, "client add session failed, ret=%{public}d", ret);
74 SoftBusFree(session);
75 return ret;
76 }
77 *sessionId = session->sessionId;
78 TRANS_LOGD(TRANS_SDK, "ok");
79 return SOFTBUS_OK;
80 }
81
GetSessionCallbackByChannelId(int32_t channelId,int32_t channelType,int32_t * sessionId,ISessionListener * listener)82 static int32_t GetSessionCallbackByChannelId(int32_t channelId, int32_t channelType,
83 int32_t *sessionId, ISessionListener *listener)
84 {
85 if ((channelId < 0) || (sessionId == NULL) || (listener == NULL)) {
86 TRANS_LOGW(TRANS_SDK, "Invalid param");
87 return SOFTBUS_INVALID_PARAM;
88 }
89 int32_t ret = ClientGetSessionIdByChannelId(channelId, channelType, sessionId, false);
90 if (ret != SOFTBUS_OK) {
91 TRANS_LOGE(TRANS_SDK, "get sessionId failed, channelId=%{public}d, ret=%{public}d", channelId, ret);
92 return ret;
93 }
94 ret = ClientGetSessionCallbackById(*sessionId, listener);
95 if (ret != SOFTBUS_OK) {
96 TRANS_LOGE(TRANS_SDK, "get session listener failed, ret=%{public}d", ret);
97 return ret;
98 }
99 return SOFTBUS_OK;
100 }
101
GetSocketCallbackAdapterByChannelId(int32_t channelId,int32_t channelType,int32_t * sessionId,SessionListenerAdapter * sessionCallback,bool * isServer)102 static int32_t GetSocketCallbackAdapterByChannelId(int32_t channelId, int32_t channelType, int32_t *sessionId,
103 SessionListenerAdapter *sessionCallback, bool *isServer)
104 {
105 if ((channelId < 0) || (sessionId == NULL) ||
106 (sessionCallback == NULL) || (isServer == NULL)) {
107 TRANS_LOGE(TRANS_SDK, "Invalid param");
108 return SOFTBUS_INVALID_PARAM;
109 }
110
111 int32_t ret = ClientGetSessionIdByChannelId(channelId, channelType, sessionId, false);
112 if (ret != SOFTBUS_OK) {
113 TRANS_LOGE(TRANS_SDK, "get sessionId failed, channelId=%{public}d, ret=%{public}d", channelId, ret);
114 return ret;
115 }
116 ret = ClientGetSessionCallbackAdapterById(*sessionId, sessionCallback, isServer);
117 if (ret != SOFTBUS_OK) {
118 TRANS_LOGE(TRANS_SDK, "get socket callback failed, channelId=%{public}d,"
119 "ret=%{public}d", channelId, ret);
120 return ret;
121 }
122 return SOFTBUS_OK;
123 }
124
GetSocketCallbackAdapterByUdpChannelId(int32_t channelId,int32_t channelType,int32_t * sessionId,SessionListenerAdapter * sessionCallback,bool * isServer)125 static int32_t GetSocketCallbackAdapterByUdpChannelId(int32_t channelId, int32_t channelType, int32_t *sessionId,
126 SessionListenerAdapter *sessionCallback, bool *isServer)
127 {
128 if ((channelId < 0) || (sessionId == NULL) ||
129 (sessionCallback == NULL) || (isServer == NULL)) {
130 TRANS_LOGE(TRANS_SDK, "Invalid param");
131 return SOFTBUS_INVALID_PARAM;
132 }
133
134 int32_t ret = ClientGetSessionIdByChannelId(channelId, channelType, sessionId, true);
135 if (ret != SOFTBUS_OK) {
136 TRANS_LOGE(TRANS_SDK, "get sessionId failed, channelId=%{public}d, ret=%{public}d", channelId, ret);
137 return ret;
138 }
139 ret = ClientGetSessionCallbackAdapterById(*sessionId, sessionCallback, isServer);
140 if (ret != SOFTBUS_OK) {
141 TRANS_LOGE(TRANS_SDK, "get socket callback failed, ret=%{public}d", ret);
142 return ret;
143 }
144 return SOFTBUS_OK;
145 }
146
TransOnBindSuccess(int32_t sessionId,const ISocketListener * socketCallback)147 NO_SANITIZE("cfi") static int32_t TransOnBindSuccess(int32_t sessionId, const ISocketListener *socketCallback)
148 {
149 if (socketCallback == NULL || socketCallback->OnBind == NULL) {
150 TRANS_LOGE(TRANS_SDK, "Invalid OnBind callback function");
151 return SOFTBUS_INVALID_PARAM;
152 }
153
154 PeerSocketInfo info;
155 int32_t ret = ClientGetPeerSocketInfoById(sessionId, &info);
156 if (ret != SOFTBUS_OK) {
157 TRANS_LOGE(TRANS_SDK, "Get peer socket info failed, ret=%{public}d", ret);
158 return ret;
159 }
160
161 (void)socketCallback->OnBind(sessionId, info);
162 return SOFTBUS_OK;
163 }
164
165 NO_SANITIZE("cfi")
TransOnBindFailed(int32_t sessionId,const ISocketListener * socketCallback,int32_t errCode)166 static int32_t TransOnBindFailed(int32_t sessionId, const ISocketListener *socketCallback, int32_t errCode)
167 {
168 (void)ClientHandleBindWaitTimer(sessionId, 0, TIMER_ACTION_STOP);
169 bool isAsync = true;
170 int32_t ret = ClientGetSessionIsAsyncBySessionId(sessionId, &isAsync);
171 if (ret != SOFTBUS_OK) {
172 TRANS_LOGE(TRANS_SDK, "get is async type failed, sessionId=%{public}d, ret=%{public}d", sessionId, ret);
173 return ret;
174 }
175 if (!isAsync) {
176 (void)ClientSignalSyncBind(sessionId, errCode);
177 return SOFTBUS_OK;
178 }
179 if (socketCallback == NULL || socketCallback->OnError == NULL) {
180 TRANS_LOGE(TRANS_SDK, "Invalid OnBind callback function");
181 return SOFTBUS_INVALID_PARAM;
182 }
183
184 SocketLifecycleData lifecycle;
185 (void)memset_s(&lifecycle, sizeof(SocketLifecycleData), 0, sizeof(SocketLifecycleData));
186 ret = GetSocketLifecycleAndSessionNameBySessionId(sessionId, NULL, &lifecycle);
187 (void)SetSessionStateBySessionId(sessionId, SESSION_STATE_INIT, 0);
188 if (ret == SOFTBUS_OK && lifecycle.sessionState == SESSION_STATE_CANCELLING) {
189 TRANS_LOGW(TRANS_SDK, "socket is cancelling, no need call back, socket=%{public}d, bindErrCode=%{public}d",
190 sessionId, lifecycle.bindErrCode);
191 return lifecycle.bindErrCode;
192 }
193
194 (void)socketCallback->OnError(sessionId, errCode);
195 TRANS_LOGI(TRANS_SDK, "OnError success, client socket=%{public}d", sessionId);
196 return SOFTBUS_OK;
197 }
198
HandleAsyncBindSuccess(int32_t sessionId,const ISocketListener * socketClient,const SocketLifecycleData * lifecycle)199 static int32_t HandleAsyncBindSuccess(
200 int32_t sessionId, const ISocketListener *socketClient, const SocketLifecycleData *lifecycle)
201 {
202 int32_t ret = ClientHandleBindWaitTimer(sessionId, 0, TIMER_ACTION_STOP);
203 if (ret != SOFTBUS_OK) {
204 TRANS_LOGE(TRANS_SDK, "stop bind wait timer failed, ret=%{public}d", ret);
205 return ret;
206 }
207 if (lifecycle->sessionState == SESSION_STATE_CANCELLING) {
208 TRANS_LOGW(TRANS_SDK, "session is cancelling, no need call back");
209 return SOFTBUS_OK;
210 }
211 ret = SetSessionStateBySessionId(sessionId, SESSION_STATE_CALLBACK_FINISHED, 0);
212 if (ret != SOFTBUS_OK) {
213 TRANS_LOGE(TRANS_SDK, "set session state failed, ret=%{public}d", ret);
214 return ret;
215 }
216
217 return TransOnBindSuccess(sessionId, socketClient);
218 }
219
TransOnNegotiate(int32_t socket,const ISocketListener * socketCallback)220 NO_SANITIZE("cfi") static int32_t TransOnNegotiate(int32_t socket, const ISocketListener *socketCallback)
221 {
222 if (socketCallback == NULL) {
223 TRANS_LOGE(TRANS_SDK, "Invalid socketCallback socket=%{public}d", socket);
224 return SOFTBUS_INVALID_PARAM;
225 }
226
227 if (socketCallback->OnNegotiate == NULL) {
228 TRANS_LOGW(TRANS_SDK, "no OnNegotiate callback function socket=%{public}d", socket);
229 return SOFTBUS_OK;
230 }
231
232 PeerSocketInfo info = {0};
233 int32_t ret = ClientGetPeerSocketInfoById(socket, &info);
234 if (ret != SOFTBUS_OK) {
235 TRANS_LOGE(TRANS_SDK, "Get peer socket info failed, ret=%{public}d, socket=%{public}d", ret, socket);
236 return ret;
237 }
238
239 if (!socketCallback->OnNegotiate(socket, info)) {
240 TRANS_LOGW(TRANS_SDK, "The negotiate rejected the socket=%{public}d", socket);
241 return SOFTBUS_TRANS_NEGOTIATE_REJECTED;
242 }
243
244 return SOFTBUS_OK;
245 }
246
HandleServerOnNegotiate(int32_t socket,const ISocketListener * socketServer)247 static int32_t HandleServerOnNegotiate(int32_t socket, const ISocketListener *socketServer)
248 {
249 int32_t ret = TransOnNegotiate(socket, socketServer);
250 if (ret != SOFTBUS_OK) {
251 TRANS_LOGE(TRANS_SDK, "OnBind failed, ret=%{public}d", ret);
252 (void)ClientDeleteSocketSession(socket);
253 return ret;
254 }
255 return SOFTBUS_OK;
256 }
257
HandleCacheQosEvent(int32_t socket,SessionListenerAdapter sessionCallback,bool isServer)258 static int32_t HandleCacheQosEvent(int32_t socket, SessionListenerAdapter sessionCallback, bool isServer)
259 {
260 if (isServer) {
261 TRANS_LOGD(TRANS_SDK, "server side no need to handle cache qos event");
262 return SOFTBUS_OK;
263 }
264 if (sessionCallback.socketClient.OnQos == NULL) {
265 TRANS_LOGD(TRANS_SDK, "no OnQos callback function socket=%{public}d", socket);
266 return SOFTBUS_OK;
267 }
268 CachedQosEvent cachedQosEvent;
269 (void)memset_s(&cachedQosEvent, sizeof(CachedQosEvent), 0, sizeof(CachedQosEvent));
270 int32_t ret = ClientGetCachedQosEventBySocket(socket, &cachedQosEvent);
271 if (ret != SOFTBUS_OK) {
272 TRANS_LOGE(TRANS_SDK, "get cached qos event failed, ret=%{public}d", ret);
273 return ret;
274 }
275 if (cachedQosEvent.count > 0) {
276 TRANS_LOGI(TRANS_SDK, "trigger OnQos callback, socket=%{public}d", socket);
277 sessionCallback.socketClient.OnQos(
278 socket, cachedQosEvent.event, (const QosTV *)cachedQosEvent.qos, cachedQosEvent.count);
279 }
280 return SOFTBUS_OK;
281 }
282
HandleSyncBindSuccess(int32_t sessionId,const SocketLifecycleData * lifecycle)283 static int32_t HandleSyncBindSuccess(int32_t sessionId, const SocketLifecycleData *lifecycle)
284 {
285 if (lifecycle->sessionState == SESSION_STATE_CANCELLING) {
286 TRANS_LOGW(
287 TRANS_SDK, "socket=%{public}d is cancelling, bindErrCode=%{public}d", sessionId, lifecycle->bindErrCode);
288 return SOFTBUS_OK;
289 }
290
291 int32_t ret = ClientSignalSyncBind(sessionId, 0);
292 if (ret != SOFTBUS_OK) {
293 TRANS_LOGE(TRANS_SDK, "sync signal bind failed, ret=%{public}d, socket=%{public}d", ret, sessionId);
294 return ret;
295 }
296 return SOFTBUS_OK;
297 }
298
HandleOnBindSuccess(int32_t sessionId,SessionListenerAdapter sessionCallback,bool isServer)299 static int32_t HandleOnBindSuccess(int32_t sessionId, SessionListenerAdapter sessionCallback, bool isServer)
300 {
301 // async bind call back client and server, sync bind only call back server.
302 bool isAsync = true;
303 int32_t ret = ClientGetSessionIsAsyncBySessionId(sessionId, &isAsync);
304 if (ret != SOFTBUS_OK) {
305 TRANS_LOGE(TRANS_SDK, "Get is async type failed");
306 return ret;
307 }
308
309 SocketLifecycleData lifecycle;
310 (void)memset_s(&lifecycle, sizeof(SocketLifecycleData), 0, sizeof(SocketLifecycleData));
311 ret = GetSocketLifecycleAndSessionNameBySessionId(sessionId, NULL, &lifecycle);
312 if (ret != SOFTBUS_OK) {
313 TRANS_LOGE(TRANS_SDK, "Get session lifecycle failed, ret=%{public}d", ret);
314 return ret;
315 }
316
317 if (isServer) {
318 return HandleServerOnNegotiate(sessionId, &sessionCallback.socketServer);
319 } else if (isAsync) {
320 ret = HandleAsyncBindSuccess(sessionId, &sessionCallback.socketClient, &lifecycle);
321 (void)HandleCacheQosEvent(sessionId, sessionCallback, isServer);
322 return ret;
323 } else { // sync bind
324 ret = HandleSyncBindSuccess(sessionId, &lifecycle);
325 (void)HandleCacheQosEvent(sessionId, sessionCallback, isServer);
326 return ret;
327 }
328
329 return SOFTBUS_OK;
330 }
331
AnonymizeLogTransOnSessionOpenedInfo(const char * sessionName,const ChannelInfo * channel,SessionType flag)332 static void AnonymizeLogTransOnSessionOpenedInfo(const char *sessionName, const ChannelInfo *channel, SessionType flag)
333 {
334 char *tmpName = NULL;
335 Anonymize(sessionName, &tmpName);
336 TRANS_LOGI(TRANS_SDK,
337 "TransOnSessionOpened: sessionName=%{public}s, channelId=%{public}d, channelType=%{public}d, flag=%{public}d,"
338 "isServer=%{public}d, type=%{public}d, crc=%{public}d", AnonymizeWrapper(tmpName), channel->channelId,
339 channel->channelType, flag, channel->isServer, channel->routeType, channel->crc);
340 AnonymizeFree(tmpName);
341 }
342
TransOnSessionOpened(const char * sessionName,const ChannelInfo * channel,SessionType flag)343 NO_SANITIZE("cfi") int32_t TransOnSessionOpened(const char *sessionName, const ChannelInfo *channel, SessionType flag)
344 {
345 if ((sessionName == NULL) || (channel == NULL)) {
346 TRANS_LOGW(TRANS_SDK, "Invalid param");
347 return SOFTBUS_INVALID_PARAM;
348 }
349 AnonymizeLogTransOnSessionOpenedInfo(sessionName, channel, flag);
350 SessionListenerAdapter sessionCallback;
351 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
352 int32_t ret = ClientGetSessionCallbackAdapterByName(sessionName, &sessionCallback);
353 if (ret != SOFTBUS_OK) {
354 TRANS_LOGE(TRANS_SDK, "get session listener failed, ret=%{public}d", ret);
355 return ret;
356 }
357
358 int32_t sessionId = INVALID_SESSION_ID;
359 if (channel->isServer) {
360 ret = AcceptSessionAsServer(sessionName, channel, flag, &sessionId);
361 } else {
362 ret = ClientEnableSessionByChannelId(channel, &sessionId);
363 if (ret == SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND) {
364 SoftBusSleepMs(RETRY_GET_INFO_TIMES_MS); // avoid set channel info later than sesssion opened callback
365 ret = ClientEnableSessionByChannelId(channel, &sessionId);
366 }
367 }
368
369 if (ret != SOFTBUS_OK) {
370 TRANS_LOGE(TRANS_SDK, "accept session failed, ret=%{public}d", ret);
371 return ret;
372 }
373 if (channel->channelType == CHANNEL_TYPE_UDP) {
374 TransSetUdpChanelSessionId(channel->channelId, sessionId);
375 }
376 if (sessionCallback.isSocketListener) {
377 ret = HandleOnBindSuccess(sessionId, sessionCallback, channel->isServer);
378 return ret;
379 }
380 TRANS_LOGD(TRANS_SDK, "trigger session open callback");
381 if ((sessionCallback.session.OnSessionOpened == NULL) ||
382 (sessionCallback.session.OnSessionOpened(sessionId, SOFTBUS_OK) != SOFTBUS_OK)) {
383 TRANS_LOGE(TRANS_SDK, "OnSessionOpened failed");
384 (void)ClientDeleteSession(sessionId);
385 return SOFTBUS_TRANS_ON_SESSION_OPENED_FAILED;
386 }
387 TRANS_LOGI(TRANS_SDK, "ok, sessionId=%{public}d", sessionId);
388 return SOFTBUS_OK;
389 }
390
TransOnSessionOpenFailed(int32_t channelId,int32_t channelType,int32_t errCode)391 NO_SANITIZE("cfi") int32_t TransOnSessionOpenFailed(int32_t channelId, int32_t channelType, int32_t errCode)
392 {
393 int32_t sessionId = INVALID_SESSION_ID;
394 SessionListenerAdapter sessionCallback;
395 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
396 if (channelType == CHANNEL_TYPE_UNDEFINED) {
397 sessionId = channelId;
398 (void)ClientSetEnableStatusBySocket(sessionId, ENABLE_STATUS_FAILED);
399 // only client async bind failed call
400 bool tmpIsServer = false;
401 ClientGetSessionCallbackAdapterById(sessionId, &sessionCallback, &tmpIsServer);
402 (void)TransOnBindFailed(sessionId, &sessionCallback.socketClient, errCode);
403 return SOFTBUS_OK;
404 }
405 TRANS_LOGI(TRANS_SDK, "trigger session open failed callback, channelId=%{public}d, channelType=%{public}d",
406 channelId, channelType);
407 bool isServer = false;
408 int32_t ret = GetSocketCallbackAdapterByChannelId(channelId, channelType, &sessionId, &sessionCallback, &isServer);
409 if (ret != SOFTBUS_OK) {
410 TRANS_LOGE(TRANS_SDK, "Get Socket Callback Adapter failed, ret=%{public}d", ret);
411 return ret;
412 }
413 if (sessionCallback.isSocketListener) {
414 (void)ClientSetEnableStatusBySocket(sessionId, ENABLE_STATUS_FAILED);
415 bool isAsync = true;
416 int ret = ClientGetSessionIsAsyncBySessionId(sessionId, &isAsync);
417 if (ret != SOFTBUS_OK) {
418 TRANS_LOGE(TRANS_SDK, "get is async type failed, ret=%{public}d", ret);
419 return ret;
420 }
421
422 if (isServer) {
423 (void)ClientDeleteSocketSession(sessionId);
424 } else if (isAsync) {
425 (void)TransOnBindFailed(sessionId, &sessionCallback.socketClient, errCode);
426 } else { // sync bind
427 (void)ClientSignalSyncBind(sessionId, errCode);
428 }
429
430 TRANS_LOGI(TRANS_SDK, "ok, sessionid=%{public}d", sessionId);
431 return SOFTBUS_OK;
432 }
433 if (sessionCallback.session.OnSessionOpened != NULL) {
434 (void)sessionCallback.session.OnSessionOpened(sessionId, errCode);
435 }
436 (void)ClientDeleteSession(sessionId);
437 TRANS_LOGI(TRANS_SDK, "ok, sessionid=%{public}d", sessionId);
438 return SOFTBUS_OK;
439 }
440
TransOnSessionClosed(int32_t channelId,int32_t channelType,ShutdownReason reason)441 NO_SANITIZE("cfi") int32_t TransOnSessionClosed(int32_t channelId, int32_t channelType, ShutdownReason reason)
442 {
443 TRANS_LOGI(TRANS_SDK, "channelId=%{public}d, channelType=%{public}d", channelId, channelType);
444 int32_t sessionId = INVALID_SESSION_ID;
445 int32_t ret = SOFTBUS_NO_INIT;
446 SessionListenerAdapter sessionCallback;
447 SessionEnableStatus enableStatus;
448 bool isServer = false;
449 bool isUdpType = (channelType == CHANNEL_TYPE_UDP ? true : false);
450 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
451 if (isUdpType) {
452 (void)GetSocketCallbackAdapterByUdpChannelId(channelId, channelType, &sessionId, &sessionCallback, &isServer);
453 } else {
454 (void)GetSocketCallbackAdapterByChannelId(channelId, channelType, &sessionId, &sessionCallback, &isServer);
455 }
456
457 (void)ClientGetChannelBySessionId(sessionId, NULL, NULL, &enableStatus);
458 TRANS_LOGI(TRANS_SDK, "trigger session close callback");
459 if (sessionCallback.isSocketListener && enableStatus == ENABLE_STATUS_SUCCESS) {
460 ISocketListener *listener = isServer ? &sessionCallback.socketServer : &sessionCallback.socketClient;
461 if (listener->OnShutdown != NULL) {
462 listener->OnShutdown(sessionId, reason);
463 }
464 ret = ClientDeleteSocketSession(sessionId);
465 } else if (sessionCallback.session.OnSessionClosed != NULL) {
466 sessionCallback.session.OnSessionClosed(sessionId);
467 ret = ClientDeleteSession(sessionId);
468 }
469
470 if (ret != SOFTBUS_OK) {
471 TRANS_LOGE(TRANS_SDK, "client delete session failed");
472 return ret;
473 }
474 TRANS_LOGI(TRANS_SDK, "ok, sessionId=%{public}d", sessionId);
475 return SOFTBUS_OK;
476 }
477
ProcessReceivedFileData(int32_t sessionId,int32_t channelId,const char * data,uint32_t len,SessionPktType type)478 static int32_t ProcessReceivedFileData(int32_t sessionId, int32_t channelId, const char *data, uint32_t len,
479 SessionPktType type)
480 {
481 char sessionName[SESSION_NAME_SIZE_MAX] = { 0 };
482 int32_t ret = ClientGetSessionDataById(sessionId, sessionName, SESSION_NAME_SIZE_MAX, KEY_SESSION_NAME);
483 if (ret != SOFTBUS_OK) {
484 TRANS_LOGE(TRANS_FILE, "get sessionName by sessionId=%{public}d failed, ret=%{public}d", sessionId, ret);
485 return ret;
486 }
487
488 ret = ProcessFileFrameData(sessionId, channelId, data, len, type);
489 if (ret != SOFTBUS_OK) {
490 TRANS_LOGE(TRANS_FILE, "process file frame data failed, ret=%{public}d", ret);
491 return ret;
492 }
493 return SOFTBUS_OK;
494 }
495
TransOnDataReceived(int32_t channelId,int32_t channelType,const void * data,uint32_t len,SessionPktType type)496 NO_SANITIZE("cfi") int32_t TransOnDataReceived(int32_t channelId, int32_t channelType,
497 const void *data, uint32_t len, SessionPktType type)
498 {
499 int32_t sessionId;
500 SessionListenerAdapter sessionCallback;
501 bool isServer = false;
502 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
503 int32_t ret = GetSocketCallbackAdapterByChannelId(channelId, channelType, &sessionId, &sessionCallback, &isServer);
504 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "get session callback failed");
505 (void)ClientResetIdleTimeoutById(sessionId);
506 ISocketListener *listener = isServer ? &sessionCallback.socketServer : &sessionCallback.socketClient;
507 switch (type) {
508 case TRANS_SESSION_BYTES:
509 if (sessionCallback.isSocketListener) {
510 if (listener->OnBytes != NULL) {
511 listener->OnBytes(sessionId, data, len);
512 }
513 } else if (sessionCallback.session.OnBytesReceived != NULL) {
514 sessionCallback.session.OnBytesReceived(sessionId, data, len);
515 }
516 break;
517 case TRANS_SESSION_MESSAGE:
518 if (sessionCallback.isSocketListener) {
519 if (listener->OnMessage != NULL) {
520 listener->OnMessage(sessionId, data, len);
521 }
522 } else if (sessionCallback.session.OnMessageReceived != NULL) {
523 sessionCallback.session.OnMessageReceived(sessionId, data, len);
524 }
525 break;
526 case TRANS_SESSION_FILE_FIRST_FRAME:
527 case TRANS_SESSION_FILE_ONGOINE_FRAME:
528 case TRANS_SESSION_FILE_LAST_FRAME:
529 case TRANS_SESSION_FILE_ONLYONE_FRAME:
530 case TRANS_SESSION_FILE_ALLFILE_SENT:
531 case TRANS_SESSION_FILE_CRC_CHECK_FRAME:
532 case TRANS_SESSION_FILE_RESULT_FRAME:
533 case TRANS_SESSION_FILE_ACK_REQUEST_SENT:
534 case TRANS_SESSION_FILE_ACK_RESPONSE_SENT:
535 if (channelType == CHANNEL_TYPE_PROXY) {
536 return ProcessReceivedFileData(sessionId, channelId, (char *)data, len, type);
537 }
538 break;
539 default:
540 TRANS_LOGE(TRANS_FILE, "revc unknown session type = %{public}d", type);
541 return SOFTBUS_TRANS_INVALID_SESSION_TYPE;
542 }
543
544 return SOFTBUS_OK;
545 }
546
TransOnOnStreamRecevied(int32_t channelId,int32_t channelType,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)547 NO_SANITIZE("cfi") int32_t TransOnOnStreamRecevied(int32_t channelId, int32_t channelType,
548 const StreamData *data, const StreamData *ext, const StreamFrameInfo *param)
549 {
550 int32_t sessionId;
551 SessionListenerAdapter sessionCallback;
552 bool isServer = false;
553 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
554 int32_t ret = GetSocketCallbackAdapterByChannelId(channelId, channelType, &sessionId, &sessionCallback, &isServer);
555 if (ret != SOFTBUS_OK) {
556 TRANS_LOGE(TRANS_STREAM, "get session callback failed");
557 return ret;
558 }
559
560 (void)ClientResetIdleTimeoutById(sessionId);
561 if (sessionCallback.isSocketListener) {
562 ISocketListener *listener = isServer ? &sessionCallback.socketServer : &sessionCallback.socketClient;
563 if (listener->OnStream != NULL) {
564 listener->OnStream(sessionId, data, ext, param);
565 }
566 return SOFTBUS_OK;
567 }
568
569 if (sessionCallback.session.OnStreamReceived == NULL) {
570 TRANS_LOGE(TRANS_STREAM, "listener OnStreamReceived is NULL");
571 return SOFTBUS_NO_INIT;
572 }
573
574 sessionCallback.session.OnStreamReceived(sessionId, data, ext, param);
575 return SOFTBUS_OK;
576 }
577
TransOnQosEvent(int32_t channelId,int32_t channelType,int32_t eventId,int32_t tvCount,const QosTv * tvList)578 NO_SANITIZE("cfi") int32_t TransOnQosEvent(int32_t channelId, int32_t channelType, int32_t eventId,
579 int32_t tvCount, const QosTv *tvList)
580 {
581 int32_t sessionId;
582 ISessionListener listener = {0};
583 int32_t ret = GetSessionCallbackByChannelId(channelId, channelType, &sessionId, &listener);
584 if (ret != SOFTBUS_OK) {
585 TRANS_LOGE(TRANS_QOS, "get session callback failed");
586 return ret;
587 }
588 if (listener.OnQosEvent == NULL) {
589 TRANS_LOGE(TRANS_QOS, "listener OnQosEvent is NULL, channelId=%{public}d, sessionId=%{public}d",
590 channelId, sessionId);
591 return SOFTBUS_NO_INIT;
592 }
593 listener.OnQosEvent(sessionId, eventId, tvCount, tvList);
594 return SOFTBUS_OK;
595 }
596
ClientTransOnChannelBind(int32_t channelId,int32_t channelType)597 int32_t ClientTransOnChannelBind(int32_t channelId, int32_t channelType)
598 {
599 TRANS_LOGI(TRANS_SDK, "channelId=%{public}d, channelType=%{public}d", channelId, channelType);
600 int32_t socket = INVALID_SESSION_ID;
601 SessionListenerAdapter sessionCallback;
602 bool isServer = false;
603 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
604 int32_t ret = GetSocketCallbackAdapterByChannelId(channelId, channelType, &socket, &sessionCallback, &isServer);
605 if (ret != SOFTBUS_OK) {
606 TRANS_LOGE(TRANS_SDK, "get session callback failed channelId=%{public}d", channelId);
607 return ret;
608 }
609
610 if (!sessionCallback.isSocketListener) {
611 TRANS_LOGW(TRANS_SDK, "QoS recv session callback channelId=%{public}d", channelId);
612 return SOFTBUS_NOT_NEED_UPDATE;
613 }
614
615 if (!isServer) {
616 TRANS_LOGW(TRANS_SDK, "only server need OnChannelBind channelId=%{public}d", channelId);
617 return SOFTBUS_NOT_NEED_UPDATE;
618 }
619
620 ISocketListener *listener = &sessionCallback.socketServer;
621 ret = TransOnBindSuccess(socket, listener);
622 if (ret != SOFTBUS_OK) {
623 TRANS_LOGE(TRANS_SDK, "client on bind failed channelId=%{public}d", channelId);
624 return ret;
625 }
626 TRANS_LOGI(TRANS_SDK, "ok, channelId=%{public}d", channelId);
627 return SOFTBUS_OK;
628 }
629
ClientTransIfChannelForSocket(const char * sessionName,bool * isSocket)630 int32_t ClientTransIfChannelForSocket(const char *sessionName, bool *isSocket)
631 {
632 if (sessionName == NULL || isSocket == NULL) {
633 TRANS_LOGE(TRANS_SDK, "sessionName or isSocket is NULL");
634 return SOFTBUS_INVALID_PARAM;
635 }
636
637 SessionListenerAdapter sessionCallback;
638 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
639 int32_t ret = ClientGetSessionCallbackAdapterByName(sessionName, &sessionCallback);
640 if (ret != SOFTBUS_OK) {
641 char *tmpName = NULL;
642 Anonymize(sessionName, &tmpName);
643 TRANS_LOGE(TRANS_SDK, "get session callback failed, sessionName=%{public}s", AnonymizeWrapper(tmpName));
644 AnonymizeFree(tmpName);
645 return ret;
646 }
647
648 *isSocket = sessionCallback.isSocketListener;
649 return SOFTBUS_OK;
650 }
651
ClientTransOnQos(int32_t channelId,int32_t channelType,QoSEvent event,const QosTV * qos,uint32_t count)652 int32_t ClientTransOnQos(int32_t channelId, int32_t channelType, QoSEvent event, const QosTV *qos, uint32_t count)
653 {
654 if (qos == NULL) {
655 TRANS_LOGE(TRANS_SDK, "qos is NULL");
656 return SOFTBUS_INVALID_PARAM;
657 }
658 int32_t socket = INVALID_SESSION_ID;
659 SessionListenerAdapter sessionCallback;
660 bool isServer = false;
661 (void)memset_s(&sessionCallback, sizeof(SessionListenerAdapter), 0, sizeof(SessionListenerAdapter));
662 int32_t ret = GetSocketCallbackAdapterByChannelId(channelId, channelType, &socket, &sessionCallback, &isServer);
663 if (ret != SOFTBUS_OK) {
664 TRANS_LOGE(TRANS_SDK, "get session callback failed channelId=%{public}d", channelId);
665 return ret;
666 }
667 if (isServer) {
668 TRANS_LOGI(TRANS_SDK, "not report qos event on server side");
669 return SOFTBUS_OK;
670 }
671 if (!sessionCallback.isSocketListener) {
672 TRANS_LOGI(TRANS_SDK, "not report qos event on non-socket session");
673 return SOFTBUS_OK;
674 }
675 if (sessionCallback.socketClient.OnQos == NULL) {
676 TRANS_LOGD(TRANS_SDK, "listener OnQos is NULL, sessionId=%{public}d", socket);
677 return SOFTBUS_OK;
678 }
679 ret = ClientCacheQosEvent(socket, event, qos, count);
680 if (ret != SOFTBUS_OK && ret != SOFTBUS_TRANS_NO_NEED_CACHE_QOS_EVENT) {
681 TRANS_LOGE(TRANS_SDK, "cache qos event failed, ret=%{public}d", ret);
682 return ret;
683 } else if (ret == SOFTBUS_TRANS_NO_NEED_CACHE_QOS_EVENT) {
684 sessionCallback.socketClient.OnQos(socket, event, qos, count);
685 TRANS_LOGI(TRANS_SDK, "report qos event to client socket=%{public}d, event=%{public}d", socket, event);
686 }
687 return SOFTBUS_OK;
688 }
689
GetClientSessionCb(void)690 IClientSessionCallBack *GetClientSessionCb(void)
691 {
692 g_sessionCb.OnSessionOpened = TransOnSessionOpened;
693 g_sessionCb.OnSessionClosed = TransOnSessionClosed;
694 g_sessionCb.OnSessionOpenFailed = TransOnSessionOpenFailed;
695 g_sessionCb.OnDataReceived = TransOnDataReceived;
696 g_sessionCb.OnStreamReceived = TransOnOnStreamRecevied;
697 g_sessionCb.OnGetSessionId = ClientGetSessionIdByChannelId;
698 g_sessionCb.OnQosEvent = TransOnQosEvent;
699 g_sessionCb.OnIdleTimeoutReset = ClientResetIdleTimeoutById;
700 g_sessionCb.OnRawStreamEncryptDefOptGet = ClientRawStreamEncryptDefOptGet;
701 g_sessionCb.OnRawStreamEncryptOptGet = ClientRawStreamEncryptOptGet;
702 g_sessionCb.OnChannelBind = ClientTransOnChannelBind;
703 g_sessionCb.IfChannelForSocket = ClientTransIfChannelForSocket;
704 g_sessionCb.OnQos = ClientTransOnQos;
705 return &g_sessionCb;
706 }
707