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