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_service.h"
17
18 #ifndef _GNU_SOURCE
19 #define _GNU_SOURCE
20 #endif
21
22 #include "securec.h"
23 #include <unistd.h>
24
25 #include "anonymizer.h"
26 #include "client_qos_manager.h"
27 #include "client_trans_channel_manager.h"
28 #include "client_trans_file_listener.h"
29 #include "client_trans_session_adapter.h"
30 #include "client_trans_session_manager.h"
31 #include "client_trans_socket_manager.h"
32 #include "dfs_session.h"
33 #include "inner_session.h"
34 #include "session_ipc_adapter.h"
35 #include "softbus_access_token_adapter.h"
36 #include "softbus_adapter_mem.h"
37 #include "softbus_adapter_timer.h"
38 #include "softbus_client_frame_manager.h"
39 #include "softbus_def.h"
40 #include "softbus_error_code.h"
41 #include "softbus_feature_config.h"
42 #include "softbus_json_utils.h"
43 #include "softbus_trans_def.h"
44 #include "softbus_utils.h"
45 #include "trans_log.h"
46 #include "trans_server_proxy.h"
47
48 typedef int (*SessionOptionRead)(int32_t channelId, int32_t type, void* value, uint32_t valueSize);
49 typedef int (*SessionOptionWrite)(int32_t channelId, int32_t type, void* value, uint32_t valueSize);
50
51 typedef struct {
52 bool canRead;
53 SessionOptionRead readFunc;
54 } SessionOptionItem;
55
56 typedef struct {
57 int32_t channelType;
58 int32_t businessType;
59 ConfigType configType;
60 } ConfigTypeMap;
61
IsValidSessionId(int sessionId)62 static bool IsValidSessionId(int sessionId)
63 {
64 if (sessionId <= 0) {
65 TRANS_LOGE(TRANS_SDK, "invalid sessionId=%{public}d", sessionId);
66 return false;
67 }
68 return true;
69 }
70
IsValidListener(const ISessionListener * listener)71 static bool IsValidListener(const ISessionListener *listener)
72 {
73 if ((listener != NULL) &&
74 (listener->OnSessionOpened != NULL) &&
75 (listener->OnSessionClosed != NULL)) {
76 return true;
77 }
78 TRANS_LOGE(TRANS_SDK, "invalid ISessionListener");
79 return false;
80 }
81
OpenSessionWithExistSession(int32_t sessionId,bool isEnabled)82 static int32_t OpenSessionWithExistSession(int32_t sessionId, bool isEnabled)
83 {
84 if (!isEnabled) {
85 int32_t errCode = SOFTBUS_TRANS_SESSION_OPENING;
86 TRANS_LOGI(TRANS_SDK, "the channel is opening, errCode=%{public}d", errCode);
87 return sessionId;
88 }
89
90 ISessionListener listener = { 0 };
91 int32_t ret = ClientGetSessionCallbackById(sessionId, &listener);
92 if (ret != SOFTBUS_OK) {
93 TRANS_LOGE(TRANS_SDK, "get session listener failed, ret=%{public}d", ret);
94 CloseSession(sessionId);
95 return SOFTBUS_TRANS_INVALID_SESSION_ID;
96 }
97
98 if (listener.OnSessionOpened == NULL || listener.OnSessionOpened(sessionId, SOFTBUS_OK) != SOFTBUS_OK) {
99 TRANS_LOGE(TRANS_SDK, "session callback OnSessionOpened failed, ret=%{public}d", ret);
100 CloseSession(sessionId);
101 return SOFTBUS_TRANS_INVALID_SESSION_ID;
102 }
103 return sessionId;
104 }
105
CreateSessionServer(const char * pkgName,const char * sessionName,const ISessionListener * listener)106 int CreateSessionServer(const char *pkgName, const char *sessionName, const ISessionListener *listener)
107 {
108 if (!IsValidString(pkgName, PKG_NAME_SIZE_MAX - 1) || !IsValidString(sessionName, SESSION_NAME_SIZE_MAX - 1) ||
109 !IsValidListener(listener)) {
110 TRANS_LOGW(TRANS_SDK, "invalid param");
111 return SOFTBUS_INVALID_PARAM;
112 }
113 char *tmpName = NULL;
114 Anonymize(sessionName, &tmpName);
115 TRANS_LOGI(TRANS_SDK, "pkgName=%{public}s, sessionName=%{public}s", pkgName, AnonymizeWrapper(tmpName));
116 AnonymizeFree(tmpName);
117 if (InitSoftBus(pkgName) != SOFTBUS_OK) {
118 TRANS_LOGE(TRANS_SDK, "init softbus err");
119 return SOFTBUS_TRANS_SESSION_ADDPKG_FAILED;
120 }
121
122 if (CheckPackageName(pkgName) != SOFTBUS_OK) {
123 TRANS_LOGE(TRANS_SDK, "invalid pkg name");
124 return SOFTBUS_INVALID_PKGNAME;
125 }
126 uint64_t timestamp = 0;
127
128 int ret = ClientAddSessionServer(SEC_TYPE_CIPHERTEXT, pkgName, sessionName, listener, ×tamp);
129 if (ret == SOFTBUS_SERVER_NAME_REPEATED) {
130 TRANS_LOGI(TRANS_SDK, "SessionServer is already created in client");
131 } else if (ret != SOFTBUS_OK) {
132 TRANS_LOGE(TRANS_SDK, "add session server err, ret=%{public}d.", ret);
133 return ret;
134 }
135
136 ret = ServerIpcCreateSessionServer(pkgName, sessionName, timestamp);
137 if (ret == SOFTBUS_SERVER_NAME_REPEATED) {
138 TRANS_LOGW(TRANS_SDK, "ok, SessionServer is already created in server");
139 return SOFTBUS_OK;
140 } else if (ret != SOFTBUS_OK) {
141 TRANS_LOGE(TRANS_SDK, "createSessionServer failed, ret=%{public}d", ret);
142 (void)ClientDeleteSessionServer(SEC_TYPE_CIPHERTEXT, sessionName);
143 return ret;
144 }
145 TRANS_LOGI(TRANS_SDK, "ok");
146 return ret;
147 }
148
RemoveSessionServer(const char * pkgName,const char * sessionName)149 int RemoveSessionServer(const char *pkgName, const char *sessionName)
150 {
151 if (!IsValidString(pkgName, PKG_NAME_SIZE_MAX - 1) || !IsValidString(sessionName, SESSION_NAME_SIZE_MAX - 1)) {
152 TRANS_LOGW(TRANS_SDK, "invalid param");
153 return SOFTBUS_INVALID_PARAM;
154 }
155 char *tmpName = NULL;
156 Anonymize(sessionName, &tmpName);
157 TRANS_LOGI(TRANS_SDK, "pkgName=%{public}s, sessionName=%{public}s", pkgName, AnonymizeWrapper(tmpName));
158 uint64_t timestamp = SoftBusGetSysTimeMs();
159
160 int32_t ret = ServerIpcRemoveSessionServer(pkgName, sessionName, timestamp);
161 if (ret != SOFTBUS_OK) {
162 TRANS_LOGE(TRANS_SDK, "remove in server failed, ret=%{public}d.", ret);
163 AnonymizeFree(tmpName);
164 return ret;
165 }
166
167 ret = ClientDeleteSessionServer(SEC_TYPE_CIPHERTEXT, sessionName);
168 if (ret != SOFTBUS_OK) {
169 TRANS_LOGE(TRANS_SDK, "delete session server failed, sessionName=%{public}s, ret=%{public}d.",
170 AnonymizeWrapper(tmpName), ret);
171 DeleteFileListener(sessionName);
172 AnonymizeFree(tmpName);
173 return ret;
174 }
175 DeleteFileListener(sessionName);
176 AnonymizeFree(tmpName);
177 TRANS_LOGI(TRANS_SDK, "ok");
178 return ret;
179 }
180
CheckParamIsValid(const char * mySessionName,const char * peerSessionName,const char * peerNetworkId,const char * groupId,const SessionAttribute * attr)181 static int32_t CheckParamIsValid(const char *mySessionName, const char *peerSessionName,
182 const char *peerNetworkId, const char *groupId, const SessionAttribute *attr)
183 {
184 if (!IsValidString(mySessionName, SESSION_NAME_SIZE_MAX - 1)) {
185 char *tmpMyName = NULL;
186 Anonymize(mySessionName, &tmpMyName);
187 TRANS_LOGE(TRANS_SDK, "invalid mySessionName. tmpMyName=%{public}s", AnonymizeWrapper(tmpMyName));
188 AnonymizeFree(tmpMyName);
189 return SOFTBUS_TRANS_INVALID_SESSION_NAME;
190 }
191 if (!IsValidString(peerSessionName, SESSION_NAME_SIZE_MAX - 1)) {
192 char *tmpPeerName = NULL;
193 Anonymize(peerSessionName, &tmpPeerName);
194 TRANS_LOGE(TRANS_SDK, "invalid peerSessionName. tmpPeerName=%{public}s", AnonymizeWrapper(tmpPeerName));
195 AnonymizeFree(tmpPeerName);
196 return SOFTBUS_TRANS_INVALID_SESSION_NAME;
197 }
198 if (!IsValidString(peerNetworkId, DEVICE_ID_SIZE_MAX - 1)) {
199 char *tmpPeerNetworkId = NULL;
200 Anonymize(peerNetworkId, &tmpPeerNetworkId);
201 TRANS_LOGE(TRANS_SDK, "invalid peerNetworkId. tmpPeerNetworkId=%{public}s", AnonymizeWrapper(tmpPeerNetworkId));
202 AnonymizeFree(tmpPeerNetworkId);
203 return SOFTBUS_INVALID_PARAM;
204 }
205 if (attr == NULL) {
206 TRANS_LOGE(TRANS_SDK, "attr is NULL");
207 return SOFTBUS_INVALID_PARAM;
208 }
209 if (groupId == NULL) {
210 TRANS_LOGE(TRANS_SDK, "groupId is NULL");
211 return SOFTBUS_INVALID_PARAM;
212 }
213 if (strlen(groupId) >= GROUP_ID_SIZE_MAX) {
214 TRANS_LOGE(TRANS_SDK, "groupId length is invalid");
215 return SOFTBUS_INVALID_PARAM;
216 }
217
218 return SOFTBUS_OK;
219 }
220
PrintSessionName(const char * mySessionName,const char * peerSessionName)221 static void PrintSessionName(const char *mySessionName, const char *peerSessionName)
222 {
223 char *tmpMyName = NULL;
224 char *tmpPeerName = NULL;
225 Anonymize(mySessionName, &tmpMyName);
226 Anonymize(peerSessionName, &tmpPeerName);
227 TRANS_LOGI(TRANS_SDK, "OpenSession: mySessionName=%{public}s, peerSessionName=%{public}s",
228 AnonymizeWrapper(tmpMyName), AnonymizeWrapper(tmpPeerName));
229 AnonymizeFree(tmpMyName);
230 AnonymizeFree(tmpPeerName);
231 }
232
BuildParamSessionAttribute(const SessionAttribute * attr)233 static SessionAttribute *BuildParamSessionAttribute(const SessionAttribute *attr)
234 {
235 SessionAttribute *tmpAttr = (SessionAttribute *)SoftBusCalloc(sizeof(SessionAttribute));
236 if (tmpAttr == NULL) {
237 TRANS_LOGE(TRANS_SDK, "SoftBusCalloc SessionAttribute failed");
238 return NULL;
239 }
240 if (memcpy_s(tmpAttr, sizeof(SessionAttribute), attr, sizeof(SessionAttribute)) != EOK) {
241 TRANS_LOGE(TRANS_SDK, "memcpy_s SessionAttribute failed");
242 SoftBusFree(tmpAttr);
243 return NULL;
244 }
245 tmpAttr->fastTransData = NULL;
246 tmpAttr->fastTransDataSize = 0;
247 return tmpAttr;
248 }
249
InitSessionParam(const char * mySessionName,const char * peerSessionName,const char * peerNetworkId,const char * groupId,SessionParam * param)250 static void InitSessionParam(const char *mySessionName, const char *peerSessionName, const char *peerNetworkId,
251 const char *groupId, SessionParam *param)
252 {
253 param->sessionName = mySessionName;
254 param->peerSessionName = peerSessionName;
255 param->peerDeviceId = peerNetworkId;
256 param->groupId = groupId;
257 param->isQosLane = false;
258 param->qosCount = 0;
259 param->isAsync = false;
260 param->actionId = INVALID_ACTION_ID;
261 }
262
OpenSession(const char * mySessionName,const char * peerSessionName,const char * peerNetworkId,const char * groupId,const SessionAttribute * attr)263 int OpenSession(const char *mySessionName, const char *peerSessionName, const char *peerNetworkId,
264 const char *groupId, const SessionAttribute *attr)
265 {
266 int32_t ret = CheckParamIsValid(mySessionName, peerSessionName, peerNetworkId, groupId, attr);
267 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "invalid session name.");
268
269 PrintSessionName(mySessionName, peerSessionName);
270 SessionAttribute *tmpAttr = BuildParamSessionAttribute(attr);
271 TRANS_CHECK_AND_RETURN_RET_LOGE(tmpAttr != NULL, SOFTBUS_MEM_ERR, TRANS_SDK, "Build SessionAttribute failed.");
272 SessionParam param = { 0 };
273 InitSessionParam(mySessionName, peerSessionName, peerNetworkId, groupId, ¶m);
274 param.attr = tmpAttr;
275 (void)memset_s(param.qos, sizeof(param.qos), 0, sizeof(param.qos));
276
277 int32_t sessionId = INVALID_SESSION_ID;
278 SessionEnableStatus isEnabled = ENABLE_STATUS_INIT;
279
280 ret = ClientAddSession(¶m, &sessionId, &isEnabled);
281 if (ret != SOFTBUS_OK) {
282 SoftBusFree(tmpAttr);
283 if (ret == SOFTBUS_TRANS_SESSION_REPEATED) {
284 TRANS_LOGI(TRANS_SDK, "session already opened");
285 return OpenSessionWithExistSession(sessionId, isEnabled);
286 }
287 TRANS_LOGE(TRANS_SDK, "add session err: ret=%{public}d", ret);
288 return ret;
289 }
290 param.isAsync = false;
291 param.sessionId = sessionId;
292 TransInfo transInfo = { 0 };
293 ret = ServerIpcOpenSession(¶m, &transInfo);
294 if (ret != SOFTBUS_OK) {
295 TRANS_LOGE(TRANS_SDK, "open session ipc err: ret=%{public}d", ret);
296 SoftBusFree(tmpAttr);
297 (void)ClientDeleteSession(sessionId);
298 return ret;
299 }
300
301 ret = ClientSetChannelBySessionId(sessionId, &transInfo);
302 if (ret != SOFTBUS_OK) {
303 TRANS_LOGE(TRANS_SDK, "set channel by sessionId failed, ret=%{public}d", ret);
304 SoftBusFree(tmpAttr);
305 (void)ClientDeleteSession(sessionId);
306 return SOFTBUS_TRANS_SESSION_SET_CHANNEL_FAILED;
307 }
308 TRANS_LOGI(TRANS_SDK, "ok: sessionId=%{public}d, channelId=%{public}d, channelType=%{public}d",
309 sessionId, transInfo.channelId, transInfo.channelType);
310 SoftBusFree(tmpAttr);
311 return sessionId;
312 }
313
ConvertAddrStr(const char * addrStr,ConnectionAddr * addrInfo)314 static int32_t ConvertAddrStr(const char *addrStr, ConnectionAddr *addrInfo)
315 {
316 TRANS_CHECK_AND_RETURN_RET_LOGE(
317 (addrStr != NULL && addrInfo != NULL), SOFTBUS_INVALID_PARAM, TRANS_SDK, "invalid param");
318 cJSON *obj = cJSON_Parse(addrStr);
319 TRANS_CHECK_AND_RETURN_RET_LOGE(obj != NULL, SOFTBUS_PARSE_JSON_ERR, TRANS_SDK, "addrStr parse failed.");
320 int32_t port;
321 if (GetJsonObjectStringItem(obj, "ETH_IP", addrInfo->info.ip.ip, IP_STR_MAX_LEN) &&
322 GetJsonObjectNumberItem(obj, "ETH_PORT", &port)) {
323 addrInfo->info.ip.port = (uint16_t)port;
324 if (IsValidString(addrInfo->info.ip.ip, IP_STR_MAX_LEN) && addrInfo->info.ip.port > 0) {
325 cJSON_Delete(obj);
326 addrInfo->type = CONNECTION_ADDR_ETH;
327 return SOFTBUS_OK;
328 }
329 }
330 if (GetJsonObjectStringItem(obj, "WIFI_IP", addrInfo->info.ip.ip, IP_STR_MAX_LEN) &&
331 GetJsonObjectNumberItem(obj, "WIFI_PORT", &port)) {
332 addrInfo->info.ip.port = (uint16_t)port;
333 if (IsValidString(addrInfo->info.ip.ip, IP_STR_MAX_LEN) && addrInfo->info.ip.port > 0) {
334 cJSON_Delete(obj);
335 addrInfo->type = CONNECTION_ADDR_WLAN;
336 return SOFTBUS_OK;
337 }
338 }
339 if (GetJsonObjectStringItem(obj, "BR_MAC", addrInfo->info.br.brMac, BT_MAC_LEN)) {
340 cJSON_Delete(obj);
341 addrInfo->type = CONNECTION_ADDR_BR;
342 return SOFTBUS_OK;
343 }
344 if (GetJsonObjectStringItem(obj, "BLE_MAC", addrInfo->info.ble.bleMac, BT_MAC_LEN)) {
345 char udidHash[UDID_HASH_LEN] = {0};
346 if (GetJsonObjectStringItem(obj, "deviceId", udidHash, UDID_HASH_LEN)) {
347 char *tmpUdidHash = NULL;
348 Anonymize(udidHash, &tmpUdidHash);
349 int ret = ConvertHexStringToBytes(
350 (unsigned char *)addrInfo->info.ble.udidHash, UDID_HASH_LEN, udidHash, strlen(udidHash));
351 TRANS_LOGI(TRANS_SDK, "string to bytes ret=%{public}d, udidHash=%{public}s",
352 ret, AnonymizeWrapper(tmpUdidHash));
353 AnonymizeFree(tmpUdidHash);
354 }
355 cJSON_Delete(obj);
356 addrInfo->type = CONNECTION_ADDR_BLE;
357 return SOFTBUS_OK;
358 }
359 cJSON_Delete(obj);
360 TRANS_LOGE(TRANS_SDK, "addr convert fail");
361 return SOFTBUS_PARSE_JSON_ERR;
362 }
363
IsValidAddrInfoArr(const ConnectionAddr * addrInfo,int num)364 static int IsValidAddrInfoArr(const ConnectionAddr *addrInfo, int num)
365 {
366 int32_t addrIndex = -1;
367 if (addrInfo == NULL || num <= 0) {
368 return addrIndex;
369 }
370 int32_t usbIndex = -1;
371 int32_t wifiIndex = -1;
372 int32_t brIndex = -1;
373 int32_t bleIndex = -1;
374 for (int32_t index = 0; index < num; index++) {
375 if (addrInfo[index].type == CONNECTION_ADDR_NCM && usbIndex < 0) {
376 usbIndex = index;
377 }
378 if ((addrInfo[index].type == CONNECTION_ADDR_ETH || addrInfo[index].type == CONNECTION_ADDR_WLAN) &&
379 wifiIndex < 0) {
380 wifiIndex = index;
381 }
382 if (addrInfo[index].type == CONNECTION_ADDR_BR && brIndex < 0) {
383 brIndex = index;
384 }
385 if (addrInfo[index].type == CONNECTION_ADDR_BLE && bleIndex < 0) {
386 bleIndex = index;
387 }
388 }
389 addrIndex = (usbIndex >= 0) ? usbIndex : addrIndex;
390 addrIndex = (addrIndex < 0) ? wifiIndex : addrIndex;
391 addrIndex = (addrIndex < 0) ? brIndex : addrIndex;
392 addrIndex = (addrIndex < 0) ? bleIndex : addrIndex;
393 return addrIndex;
394 }
395
OpenAuthSession(const char * sessionName,const ConnectionAddr * addrInfo,int num,const char * mixAddr)396 int OpenAuthSession(const char *sessionName, const ConnectionAddr *addrInfo, int num, const char *mixAddr)
397 {
398 if (!IsValidString(sessionName, SESSION_NAME_SIZE_MAX - 1)) {
399 TRANS_LOGW(TRANS_SDK, "invalid param");
400 return SOFTBUS_INVALID_PARAM;
401 }
402 TransInfo transInfo;
403 int32_t addrIndex = IsValidAddrInfoArr(addrInfo, num);
404 ConnectionAddr *addr = NULL;
405 ConnectionAddr mix;
406 if (memset_s(&mix, sizeof(ConnectionAddr), 0x0, sizeof(ConnectionAddr)) != EOK) {
407 TRANS_LOGE(TRANS_SDK, "memset_s info fail");
408 return SOFTBUS_MEM_ERR;
409 }
410 if (addrIndex < 0) {
411 if (ConvertAddrStr(mixAddr, &mix) != SOFTBUS_OK) {
412 TRANS_LOGE(TRANS_SDK, "invalid addrInfo param");
413 return SOFTBUS_INVALID_PARAM;
414 }
415 addr = &mix;
416 } else {
417 addr = (ConnectionAddr *)&addrInfo[addrIndex];
418 }
419 char *tmpName = NULL;
420 Anonymize(sessionName, &tmpName);
421 TRANS_LOGI(TRANS_SDK, "sessionName=%{public}s", AnonymizeWrapper(tmpName));
422 AnonymizeFree(tmpName);
423 int32_t sessionId;
424 int32_t ret = ClientAddAuthSession(sessionName, &sessionId);
425 if (ret != SOFTBUS_OK) {
426 TRANS_LOGE(TRANS_SDK, "add non encrypt session err: ret=%{public}d", ret);
427 return ret;
428 }
429
430 transInfo.channelId = ServerIpcOpenAuthSession(sessionName, addr);
431 if (addr->type == CONNECTION_ADDR_BR || addr->type == CONNECTION_ADDR_BLE) {
432 transInfo.channelType = CHANNEL_TYPE_PROXY;
433 } else {
434 transInfo.channelType = CHANNEL_TYPE_AUTH;
435 }
436 ret = ClientSetChannelBySessionId(sessionId, &transInfo);
437 if (ret != SOFTBUS_OK) {
438 TRANS_LOGE(TRANS_SDK, "set channel by sessionId failed, ret=%{public}d", ret);
439 (void)ClientDeleteSession(sessionId);
440 return SOFTBUS_TRANS_SESSION_SET_CHANNEL_FAILED;
441 }
442 TRANS_LOGI(TRANS_SDK, "ok: sessionId=%{public}d, channelId=%{public}d, channelType=%{public}d",
443 sessionId, transInfo.channelId, transInfo.channelType);
444 return sessionId;
445 }
446
NotifyAuthSuccess(int sessionId)447 void NotifyAuthSuccess(int sessionId)
448 {
449 int32_t channelId = -1;
450 int32_t channelType = -1;
451 TRANS_LOGI(TRANS_SDK, "sessionId=%{public}d", sessionId);
452 int32_t ret = ClientGetChannelBySessionId(sessionId, &channelId, &channelType, NULL);
453 if (ret != SOFTBUS_OK) {
454 TRANS_LOGE(TRANS_SDK, "get channel err, sessionId=%{public}d, ret=%{public}d", sessionId, ret);
455 return;
456 }
457
458 int32_t isServer = 0;
459 ret = ClientGetSessionIntegerDataById(sessionId, &isServer, KEY_IS_SERVER);
460 if (ret != SOFTBUS_OK) {
461 TRANS_LOGE(TRANS_SDK, "get isServer failed, ret=%{public}d", ret);
462 return;
463 }
464 if (isServer == 1) {
465 TRANS_LOGE(TRANS_SDK, "device is service side, no notification");
466 return;
467 }
468 TRANS_LOGI(TRANS_SDK,
469 "client side, notify auth success channelId=%{public}d, channelType=%{public}d", channelId, channelType);
470
471 ret = ServerIpcNotifyAuthSuccess(channelId, channelType);
472 if (ret != SOFTBUS_OK) {
473 TRANS_LOGE(TRANS_SDK,
474 "ServerIpcNotifyAuthSuccess err channelId=%{public}d, ret=%{public}d", channelId, ret);
475 return;
476 }
477 }
478
CheckSessionIsOpened(int32_t sessionId,bool isCancelCheck)479 static int32_t CheckSessionIsOpened(int32_t sessionId, bool isCancelCheck)
480 {
481 #define SESSION_STATUS_CHECK_MAX_NUM 100
482 #define SESSION_STATUS_CANCEL_CHECK_MAX_NUM 5
483 #define SESSION_CHECK_PERIOD 200000
484 int32_t checkMaxNum = isCancelCheck ? SESSION_STATUS_CANCEL_CHECK_MAX_NUM : SESSION_STATUS_CHECK_MAX_NUM;
485 int32_t i = 0;
486 SessionEnableStatus enableStatus = ENABLE_STATUS_INIT;
487 while (i < checkMaxNum) {
488 if (ClientGetChannelBySessionId(sessionId, NULL, NULL, &enableStatus) != SOFTBUS_OK) {
489 return SOFTBUS_TRANS_SESSION_GET_CHANNEL_FAILED;
490 }
491 if (enableStatus == ENABLE_STATUS_SUCCESS) {
492 TRANS_LOGD(TRANS_SDK, "session is enable");
493 return SOFTBUS_OK;
494 }
495
496 if (enableStatus == ENABLE_STATUS_FAILED) {
497 TRANS_LOGE(TRANS_SDK, "socket is failed");
498 return SOFTBUS_TRANS_SESSION_NO_ENABLE;
499 }
500 usleep(SESSION_CHECK_PERIOD);
501 i++;
502 }
503
504 TRANS_LOGE(TRANS_SDK, "session open timeout");
505 return SOFTBUS_TIMOUT;
506 }
507
OpenSessionSync(const char * mySessionName,const char * peerSessionName,const char * peerNetworkId,const char * groupId,const SessionAttribute * attr)508 int OpenSessionSync(const char *mySessionName, const char *peerSessionName, const char *peerNetworkId,
509 const char *groupId, const SessionAttribute *attr)
510 {
511 int ret = CheckParamIsValid(mySessionName, peerSessionName, peerNetworkId, groupId, attr);
512 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "invalid session name.");
513 PrintSessionName(mySessionName, peerSessionName);
514
515 SessionParam param = {
516 .sessionName = mySessionName,
517 .peerSessionName = peerSessionName,
518 .peerDeviceId = peerNetworkId,
519 .groupId = groupId,
520 .attr = attr,
521 .isQosLane = false,
522 .qosCount = 0,
523 };
524 (void)memset_s(param.qos, sizeof(param.qos), 0, sizeof(param.qos));
525
526 int32_t sessionId = INVALID_SESSION_ID;
527 SessionEnableStatus isEnabled = ENABLE_STATUS_INIT;
528
529 ret = ClientAddSession(¶m, &sessionId, &isEnabled);
530 if (ret != SOFTBUS_OK) {
531 if (ret == SOFTBUS_TRANS_SESSION_REPEATED) {
532 TRANS_LOGI(TRANS_SDK, "session already opened");
533 CheckSessionIsOpened(sessionId, false);
534 return OpenSessionWithExistSession(sessionId, isEnabled);
535 }
536 TRANS_LOGE(TRANS_SDK, "add session err: ret=%{public}d", ret);
537 return ret;
538 }
539 param.isAsync = false;
540 param.sessionId = sessionId;
541 TransInfo transInfo = {0};
542 ret = ServerIpcOpenSession(¶m, &transInfo);
543 if (ret != SOFTBUS_OK) {
544 TRANS_LOGE(TRANS_SDK, "open session ipc err: ret=%{public}d", ret);
545 (void)ClientDeleteSession(sessionId);
546 return ret;
547 }
548 ret = ClientSetChannelBySessionId(sessionId, &transInfo);
549 if (ret != SOFTBUS_OK) {
550 TRANS_LOGE(TRANS_SDK, "set channel by sessionId=%{public}d, ret=%{public}d", sessionId, ret);
551 (void)ClientDeleteSession(sessionId);
552 return SOFTBUS_TRANS_SESSION_SET_CHANNEL_FAILED;
553 }
554
555 ret = CheckSessionIsOpened(sessionId, false);
556 if (ret != SOFTBUS_OK) {
557 TRANS_LOGE(TRANS_SDK, "CheckSessionIsOpened err: ret=%{public}d", ret);
558 (void)ClientDeleteSession(sessionId);
559 return SOFTBUS_TRANS_SESSION_NO_ENABLE;
560 }
561 TRANS_LOGI(TRANS_SDK, "ok: sessionId=%{public}d, channelId=%{public}d", sessionId, transInfo.channelId);
562 return sessionId;
563 }
564
CloseSession(int sessionId)565 void CloseSession(int sessionId)
566 {
567 TRANS_LOGI(TRANS_SDK, "sessionId=%{public}d", sessionId);
568 int32_t channelId = INVALID_CHANNEL_ID;
569 int32_t type = CHANNEL_TYPE_BUTT;
570 int32_t ret;
571
572 if (!IsValidSessionId(sessionId)) {
573 TRANS_LOGW(TRANS_SDK, "invalid param");
574 return;
575 }
576 ret = ClientGetChannelBySessionId(sessionId, &channelId, &type, NULL);
577 if (ret != SOFTBUS_OK) {
578 TRANS_LOGE(TRANS_SDK, "get channel by sessionId=%{public}d, ret=%{public}d", sessionId, ret);
579 return;
580 }
581 AddSessionStateClosing();
582 ret = ClientTransCloseChannel(channelId, type, sessionId);
583 if (ret != SOFTBUS_OK) {
584 TRANS_LOGE(TRANS_SDK, "close channel err: ret=%{public}d, channelId=%{public}d, channelType=%{public}d",
585 ret, channelId, type);
586 }
587 ret = ClientDeleteSession(sessionId);
588 if (ret != SOFTBUS_OK) {
589 TRANS_LOGE(TRANS_SDK, "delete session err: ret=%{public}d", ret);
590 return;
591 }
592 TRANS_LOGD(TRANS_SDK, "ok");
593 }
594
GetMySessionName(int sessionId,char * sessionName,unsigned int len)595 int GetMySessionName(int sessionId, char *sessionName, unsigned int len)
596 {
597 if (!IsValidSessionId(sessionId) || (sessionName == NULL) || (len > SESSION_NAME_SIZE_MAX)) {
598 TRANS_LOGE(TRANS_SDK, "invalid param");
599 return SOFTBUS_INVALID_PARAM;
600 }
601 TRANS_LOGI(TRANS_SDK, "get client sessionName by sessionId=%{public}d", sessionId);
602 return ClientGetSessionDataById(sessionId, sessionName, len, KEY_SESSION_NAME);
603 }
604
GetPeerSessionName(int sessionId,char * sessionName,unsigned int len)605 int GetPeerSessionName(int sessionId, char *sessionName, unsigned int len)
606 {
607 if (!IsValidSessionId(sessionId) || (sessionName == NULL) || (len > SESSION_NAME_SIZE_MAX)) {
608 TRANS_LOGE(TRANS_SDK, "invalid param");
609 return SOFTBUS_INVALID_PARAM;
610 }
611 TRANS_LOGI(TRANS_SDK, "get server sessionName by sessionId=%{public}d", sessionId);
612 return ClientGetSessionDataById(sessionId, sessionName, len, KEY_PEER_SESSION_NAME);
613 }
614
GetPeerDeviceId(int sessionId,char * networkId,unsigned int len)615 int GetPeerDeviceId(int sessionId, char *networkId, unsigned int len)
616 {
617 if (!IsValidSessionId(sessionId) || (networkId == NULL) || (len > SESSION_NAME_SIZE_MAX)) {
618 TRANS_LOGE(TRANS_SDK, "invalid param");
619 return SOFTBUS_INVALID_PARAM;
620 }
621 TRANS_LOGI(TRANS_SDK, "get server deviceId by sessionId=%{public}d", sessionId);
622 return ClientGetSessionDataById(sessionId, networkId, len, KEY_PEER_DEVICE_ID);
623 }
624
GetSessionSide(int sessionId)625 int GetSessionSide(int sessionId)
626 {
627 TRANS_LOGI(TRANS_SDK, "get session side by sessionId=%{public}d", sessionId);
628 return ClientGetSessionSide(sessionId);
629 }
630
IsValidFileReceivePath(const char * rootDir)631 static bool IsValidFileReceivePath(const char *rootDir)
632 {
633 if (!IsValidString(rootDir, FILE_RECV_ROOT_DIR_SIZE_MAX)) {
634 TRANS_LOGE(TRANS_SDK, "recvPath invalid. recvPath=%{private}s", rootDir);
635 return false;
636 }
637 char *absPath = realpath(rootDir, NULL);
638 if (absPath == NULL) {
639 TRANS_LOGE(TRANS_SDK, "recvPath not exist, recvPath=%{private}s, errno=%{public}d.", rootDir, errno);
640 return false;
641 }
642 SoftBusFree(absPath);
643 return true;
644 }
645
SetFileReceiveListener(const char * pkgName,const char * sessionName,const IFileReceiveListener * recvListener,const char * rootDir)646 int SetFileReceiveListener(const char *pkgName, const char *sessionName,
647 const IFileReceiveListener *recvListener, const char *rootDir)
648 {
649 if (!IsValidString(pkgName, PKG_NAME_SIZE_MAX - 1) || !IsValidString(sessionName, SESSION_NAME_SIZE_MAX - 1) ||
650 !IsValidFileReceivePath(rootDir) || (recvListener == NULL)) {
651 TRANS_LOGW(TRANS_SDK, "set file receive listener invalid param");
652 return SOFTBUS_INVALID_PARAM;
653 }
654 if (InitSoftBus(pkgName) != SOFTBUS_OK) {
655 TRANS_LOGE(TRANS_SDK, "set file receive listener init softbus client error");
656 return SOFTBUS_TRANS_SESSION_ADDPKG_FAILED;
657 }
658 char *tmpName = NULL;
659 Anonymize(sessionName, &tmpName);
660 TRANS_LOGI(TRANS_SDK, "sessionName=%{public}s", AnonymizeWrapper(tmpName));
661 AnonymizeFree(tmpName);
662 return TransSetFileReceiveListener(sessionName, recvListener, rootDir);
663 }
664
SetFileSendListener(const char * pkgName,const char * sessionName,const IFileSendListener * sendListener)665 int SetFileSendListener(const char *pkgName, const char *sessionName, const IFileSendListener *sendListener)
666 {
667 if (!IsValidString(pkgName, PKG_NAME_SIZE_MAX - 1) || !IsValidString(sessionName, SESSION_NAME_SIZE_MAX - 1) ||
668 sendListener == NULL) {
669 TRANS_LOGW(TRANS_SDK, "set file send listener invalid param");
670 return SOFTBUS_INVALID_PARAM;
671 }
672 if (InitSoftBus(pkgName) != SOFTBUS_OK) {
673 TRANS_LOGE(TRANS_SDK, "set file send listener init softbus client error");
674 return SOFTBUS_TRANS_SESSION_ADDPKG_FAILED;
675 }
676 char *tmpName = NULL;
677 Anonymize(sessionName, &tmpName);
678 TRANS_LOGI(TRANS_SDK, "sessionName=%{public}s", AnonymizeWrapper(tmpName));
679 AnonymizeFree(tmpName);
680 return TransSetFileSendListener(sessionName, sendListener);
681 }
682
683 static const char *g_busName = "DistributedFileService";
684 static const char *g_deviceStatusName = "ohos.msdp.device_status";
685
IsValidDFSSession(int32_t sessionId,int32_t * channelId)686 static int32_t IsValidDFSSession(int32_t sessionId, int32_t *channelId)
687 {
688 char sessionName[SESSION_NAME_SIZE_MAX] = { 0 };
689 int32_t type;
690 int32_t ret = GetMySessionName(sessionId, sessionName, SESSION_NAME_SIZE_MAX);
691 if (ret != SOFTBUS_OK) {
692 TRANS_LOGE(TRANS_SDK, "get dfs session name failed");
693 return ret;
694 }
695 if (strncmp(sessionName, g_busName, strlen(g_busName)) != 0 &&
696 strncmp(sessionName, g_deviceStatusName, strlen(g_deviceStatusName)) != 0) {
697 TRANS_LOGE(TRANS_SDK, "invalid dfs session name");
698 return SOFTBUS_TRANS_FUNC_NOT_SUPPORT;
699 }
700
701 ret = ClientGetChannelBySessionId(sessionId, channelId, &type, NULL);
702 if (ret != SOFTBUS_OK) {
703 TRANS_LOGE(TRANS_SDK, "get channel by sessionId=%{public}d failed, ret=%{public}d", sessionId, ret);
704 return SOFTBUS_TRANS_SESSION_GET_CHANNEL_FAILED;
705 }
706 if (type != CHANNEL_TYPE_TCP_DIRECT) {
707 TRANS_LOGE(TRANS_SDK, "invalid channel type");
708 return SOFTBUS_TRANS_FUNC_NOT_SUPPORT;
709 }
710 return SOFTBUS_OK;
711 }
712
GetSessionKey(int32_t sessionId,char * key,unsigned int len)713 int32_t GetSessionKey(int32_t sessionId, char *key, unsigned int len)
714 {
715 int32_t channelId;
716 if (!IsValidSessionId(sessionId) || key == NULL || len < SESSION_KEY_LEN) {
717 TRANS_LOGW(TRANS_SDK, "invalid param");
718 return SOFTBUS_INVALID_PARAM;
719 }
720 if (IsValidDFSSession(sessionId, &channelId) != SOFTBUS_OK) {
721 TRANS_LOGE(TRANS_SDK, "invalid dfs session");
722 return SOFTBUS_TRANS_FUNC_NOT_SUPPORT;
723 }
724 return ClientGetSessionKey(channelId, key, len);
725 }
726
GetSessionHandle(int32_t sessionId,int * handle)727 int32_t GetSessionHandle(int32_t sessionId, int *handle)
728 {
729 int32_t channelId;
730 if (!IsValidSessionId(sessionId) || handle == NULL) {
731 TRANS_LOGW(TRANS_SDK, "invalid param");
732 return SOFTBUS_INVALID_PARAM;
733 }
734 if (IsValidDFSSession(sessionId, &channelId) != SOFTBUS_OK) {
735 TRANS_LOGE(TRANS_SDK, "invalid dfs session");
736 return SOFTBUS_TRANS_FUNC_NOT_SUPPORT;
737 }
738 return ClientGetHandle(channelId, handle);
739 }
740
DisableSessionListener(int32_t sessionId)741 int32_t DisableSessionListener(int32_t sessionId)
742 {
743 int32_t channelId;
744 if (!IsValidSessionId(sessionId)) {
745 TRANS_LOGW(TRANS_SDK, "invalid param");
746 return SOFTBUS_INVALID_PARAM;
747 }
748 if (IsValidDFSSession(sessionId, &channelId) != SOFTBUS_OK) {
749 TRANS_LOGE(TRANS_SDK, "invalid dfs session");
750 return SOFTBUS_TRANS_FUNC_NOT_SUPPORT;
751 }
752 return ClientDisableSessionListener(channelId);
753 }
754
QosReport(int32_t sessionId,int32_t appType,int32_t quality)755 int32_t QosReport(int32_t sessionId, int32_t appType, int32_t quality)
756 {
757 if (quality != QOS_IMPROVE && quality != QOS_RECOVER) {
758 TRANS_LOGW(TRANS_SDK, "qos report invalid param");
759 return SOFTBUS_INVALID_PARAM;
760 }
761
762 int32_t channelId = INVALID_CHANNEL_ID;
763 int32_t type = CHANNEL_TYPE_BUTT;
764 int32_t ret = ClientGetChannelBySessionId(sessionId, &channelId, &type, NULL);
765 if (ret != SOFTBUS_OK) {
766 TRANS_LOGE(TRANS_SDK, "get channel by sessionId=%{public}d failed, ret=%{public}d.", sessionId, ret);
767 return SOFTBUS_TRANS_SESSION_GET_CHANNEL_FAILED;
768 }
769 if (ClientGetSessionSide(sessionId) != IS_CLIENT) {
770 TRANS_LOGE(TRANS_SDK,
771 "qos report not exist or not client side. sessionId=%{public}d", sessionId);
772 return SOFTBUS_TRANS_INVALID_SESSION_ID;
773 }
774 ret = ClientQosReport(channelId, type, appType, quality);
775 if (ret != SOFTBUS_OK) {
776 TRANS_LOGE(TRANS_SDK, "qos report failed. sessionId=%{public}d, ret=%{public}d", sessionId, ret);
777 }
778 return ret;
779 }
780
781 static const ConfigTypeMap g_configTypeMap[] = {
782 {CHANNEL_TYPE_AUTH, BUSINESS_TYPE_BYTE, SOFTBUS_INT_AUTH_MAX_BYTES_LENGTH},
783 {CHANNEL_TYPE_AUTH, BUSINESS_TYPE_MESSAGE, SOFTBUS_INT_AUTH_MAX_MESSAGE_LENGTH},
784 {CHANNEL_TYPE_PROXY, BUSINESS_TYPE_BYTE, SOFTBUS_INT_PROXY_MAX_BYTES_LENGTH},
785 {CHANNEL_TYPE_PROXY, BUSINESS_TYPE_MESSAGE, SOFTBUS_INT_PROXY_MAX_MESSAGE_LENGTH},
786 {CHANNEL_TYPE_TCP_DIRECT, BUSINESS_TYPE_BYTE, SOFTBUS_INT_MAX_BYTES_LENGTH},
787 {CHANNEL_TYPE_TCP_DIRECT, BUSINESS_TYPE_MESSAGE, SOFTBUS_INT_MAX_MESSAGE_LENGTH},
788 };
789
GetDefaultConfigType(int32_t channelType,int32_t businessType)790 int32_t GetDefaultConfigType(int32_t channelType, int32_t businessType)
791 {
792 const uint32_t nums = sizeof(g_configTypeMap) / sizeof(ConfigTypeMap);
793 for (uint32_t i = 0; i < nums; i++) {
794 if ((g_configTypeMap[i].channelType == channelType) &&
795 (g_configTypeMap[i].businessType == businessType)) {
796 return g_configTypeMap[i].configType;
797 }
798 }
799 return SOFTBUS_CONFIG_TYPE_MAX;
800 }
801
ReadMaxSendBytesSize(int32_t channelId,int32_t type,void * value,uint32_t valueSize)802 int32_t ReadMaxSendBytesSize(int32_t channelId, int32_t type, void *value, uint32_t valueSize)
803 {
804 if (value == NULL || valueSize != sizeof(uint32_t)) {
805 TRANS_LOGE(TRANS_SDK, "valueSize not match. valueSize=%{public}d", valueSize);
806 return SOFTBUS_INVALID_PARAM;
807 }
808
809 uint32_t dataConfig = INVALID_DATA_CONFIG;
810 if (ClientGetDataConfigByChannelId(channelId, type, &dataConfig) != SOFTBUS_OK) {
811 TRANS_LOGE(TRANS_SDK, "get config failed.");
812 return SOFTBUS_GET_CONFIG_VAL_ERR;
813 }
814
815 (*(uint32_t*)value) = dataConfig;
816 return SOFTBUS_OK;
817 }
818
ReadMaxSendMessageSize(int32_t channelId,int32_t type,void * value,uint32_t valueSize)819 int ReadMaxSendMessageSize(int32_t channelId, int32_t type, void* value, uint32_t valueSize)
820 {
821 if (value == NULL) {
822 TRANS_LOGE(TRANS_SDK, "param invalid");
823 return SOFTBUS_INVALID_PARAM;
824 }
825 if (valueSize != sizeof(uint32_t)) {
826 TRANS_LOGE(TRANS_SDK, "valueSize not match. valueSize=%{public}d", valueSize);
827 return SOFTBUS_INVALID_PARAM;
828 }
829
830 uint32_t dataConfig = INVALID_DATA_CONFIG;
831 if (ClientGetDataConfigByChannelId(channelId, type, &dataConfig) != SOFTBUS_OK) {
832 TRANS_LOGE(TRANS_SDK, "get config failed.");
833 return SOFTBUS_GET_CONFIG_VAL_ERR;
834 }
835
836 (*(uint32_t*)value) = dataConfig;
837 return SOFTBUS_OK;
838 }
839
ReadSessionLinkType(int32_t channelId,int32_t type,void * value,uint32_t valueSize)840 int ReadSessionLinkType(int32_t channelId, int32_t type, void* value, uint32_t valueSize)
841 {
842 if (value == NULL) {
843 TRANS_LOGE(TRANS_SDK, "param invalid");
844 return SOFTBUS_INVALID_PARAM;
845 }
846 if (valueSize != sizeof(uint32_t)) {
847 TRANS_LOGE(TRANS_SDK, "valueSize not match. valueSize=%{public}d", valueSize);
848 return SOFTBUS_INVALID_PARAM;
849 }
850
851 int32_t routeType = INVALID_ROUTE_TYPE;
852 if (ClientGetRouteTypeByChannelId(channelId, type, &routeType) != SOFTBUS_OK) {
853 TRANS_LOGE(TRANS_SDK, "get link type failed.");
854 return SOFTBUS_GET_CONFIG_VAL_ERR;
855 }
856
857 (*(int32_t*)value) = routeType;
858 return SOFTBUS_OK;
859 }
860
861 static const SessionOptionItem g_SessionOptionArr[SESSION_OPTION_BUTT] = {
862 {true, ReadMaxSendBytesSize},
863 {true, ReadMaxSendMessageSize},
864 {true, ReadSessionLinkType},
865 };
866
GetSessionOption(int sessionId,SessionOption option,void * optionValue,uint32_t valueSize)867 int GetSessionOption(int sessionId, SessionOption option, void* optionValue, uint32_t valueSize)
868 {
869 if ((option >= SESSION_OPTION_BUTT) || (optionValue == NULL) || (valueSize == 0)) {
870 TRANS_LOGW(TRANS_SDK, "invalid param");
871 return SOFTBUS_INVALID_PARAM;
872 }
873 if (!g_SessionOptionArr[option].canRead) {
874 TRANS_LOGE(TRANS_SDK, "option can not be get. option=%{public}d", option);
875 return SOFTBUS_INVALID_PARAM;
876 }
877
878 int32_t channelId = INVALID_CHANNEL_ID;
879 int32_t type = CHANNEL_TYPE_BUTT;
880 int32_t ret = ClientGetChannelBySessionId(sessionId, &channelId, &type, NULL);
881 if (ret != SOFTBUS_OK) {
882 TRANS_LOGE(TRANS_SDK, "get channel by sessionId=%{public}d failed, ret=%{public}d.", sessionId, ret);
883 return SOFTBUS_TRANS_SESSION_GET_CHANNEL_FAILED;
884 }
885
886 return g_SessionOptionArr[option].readFunc(channelId, type, optionValue, valueSize);
887 }
888
RemoveAppIdFromSessionName(const char * sessionName,char * newSessionName,int32_t length)889 bool RemoveAppIdFromSessionName(const char *sessionName, char *newSessionName, int32_t length)
890 {
891 if ((sessionName == NULL) || (newSessionName == NULL)) {
892 TRANS_LOGE(TRANS_SDK, "invalid param");
893 return false;
894 }
895 const char tag = '-';
896 const char *posName = strchr(sessionName, tag);
897 if (posName == NULL) {
898 TRANS_LOGE(TRANS_SDK, "sdk not find bundlename");
899 return false;
900 }
901 const char *posId = strchr(posName + 1, tag);
902 if (posId == NULL) {
903 TRANS_LOGE(TRANS_SDK, "sdk not find appid");
904 return false;
905 }
906 size_t len = posId - sessionName;
907 if (strncpy_s(newSessionName, length, sessionName, len) != EOK) {
908 TRANS_LOGE(TRANS_SDK, "copy sessionName failed");
909 return false;
910 }
911 newSessionName[len] = '\0';
912 return true;
913 }
914
CreateSocket(const char * pkgName,const char * sessionName)915 int CreateSocket(const char *pkgName, const char *sessionName)
916 {
917 if (!IsValidString(pkgName, PKG_NAME_SIZE_MAX - 1) || !IsValidString(sessionName, SESSION_NAME_SIZE_MAX - 1)) {
918 TRANS_LOGE(TRANS_SDK, "invalid pkgName or sessionName");
919 return SOFTBUS_INVALID_PARAM;
920 }
921 int32_t ret = InitSoftBus(pkgName);
922 TRANS_CHECK_AND_RETURN_RET_LOGE(
923 ret == SOFTBUS_OK, SOFTBUS_TRANS_SESSION_ADDPKG_FAILED, TRANS_SDK, "init softbus err");
924
925 ret = CheckPackageName(pkgName);
926 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, SOFTBUS_INVALID_PKGNAME, TRANS_SDK, "invalid pkg name");
927 char newSessionName[SESSION_NAME_SIZE_MAX + 1] = {0};
928 if (strncpy_s(newSessionName, SESSION_NAME_SIZE_MAX + 1, sessionName, strlen(sessionName)) != EOK) {
929 TRANS_LOGE(TRANS_SDK, "copy session name failed");
930 return SOFTBUS_STRCPY_ERR;
931 }
932 uint64_t callingFullTokenId = 0;
933 ret = SoftBusGetCallingFullTokenId(&callingFullTokenId);
934 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "get callingFullTokenId failed");
935
936 if (SoftBusCheckIsNormalApp(callingFullTokenId, sessionName)) {
937 if (!RemoveAppIdFromSessionName(sessionName, newSessionName, SESSION_NAME_SIZE_MAX + 1)) {
938 TRANS_LOGE(TRANS_SDK, "invalid bundlename or appId and delete appId failed");
939 return SOFTBUS_TRANS_NOT_FIND_APPID;
940 }
941 }
942 uint64_t timestamp = 0;
943 ret = ClientAddSocketServer(SEC_TYPE_CIPHERTEXT, pkgName, (const char*)newSessionName, ×tamp);
944 if (ret == SOFTBUS_SERVER_NAME_REPEATED) {
945 TRANS_LOGD(TRANS_SDK, "SocketServer is already created in client");
946 } else if (ret != SOFTBUS_OK) {
947 TRANS_LOGE(TRANS_SDK, "add socket server err, ret=%{public}d", ret);
948 return ret;
949 }
950 ret = ServerIpcCreateSessionServer(pkgName, sessionName, timestamp);
951 if (ret == SOFTBUS_SERVER_NAME_REPEATED) {
952 TRANS_LOGD(TRANS_SDK, "ok, SocketServer is already created in server");
953 return SOFTBUS_OK;
954 } else if (ret != SOFTBUS_OK) {
955 SocketServerStateUpdate(newSessionName);
956 TRANS_LOGE(TRANS_SDK, "createSocketServer failed, ret=%{public}d", ret);
957 (void)TryDeleteEmptySessionServer(pkgName, newSessionName);
958 return ret;
959 }
960 TRANS_LOGD(TRANS_SDK, "ok");
961 return SOFTBUS_OK;
962 }
963
CreateSessionAttributeBySocketInfoTrans(const SocketInfo * info,bool * isEncryptedRawStream)964 static SessionAttribute *CreateSessionAttributeBySocketInfoTrans(const SocketInfo *info, bool *isEncryptedRawStream)
965 {
966 if (info == NULL ||isEncryptedRawStream == NULL) {
967 TRANS_LOGE(TRANS_SDK, "Invalid param");
968 return NULL;
969 }
970 SessionAttribute *tmpAttr = (SessionAttribute *)SoftBusCalloc(sizeof(SessionAttribute));
971 if (tmpAttr == NULL) {
972 TRANS_LOGE(TRANS_SDK, "SoftBusCalloc SessionAttribute failed");
973 return NULL;
974 }
975
976 *isEncryptedRawStream = false;
977 tmpAttr->fastTransData = NULL;
978 tmpAttr->fastTransDataSize = 0;
979 switch (info->dataType) {
980 case DATA_TYPE_MESSAGE:
981 tmpAttr->dataType = TYPE_MESSAGE;
982 break;
983 case DATA_TYPE_BYTES:
984 tmpAttr->dataType = TYPE_BYTES;
985 break;
986 case DATA_TYPE_FILE:
987 tmpAttr->dataType = TYPE_FILE;
988 break;
989 case DATA_TYPE_RAW_STREAM:
990 case DATA_TYPE_RAW_STREAM_ENCRYPED:
991 tmpAttr->dataType = TYPE_STREAM;
992 tmpAttr->attr.streamAttr.streamType = RAW_STREAM;
993 *isEncryptedRawStream = (info->dataType == DATA_TYPE_RAW_STREAM_ENCRYPED);
994 break;
995 case DATA_TYPE_VIDEO_STREAM:
996 tmpAttr->dataType = TYPE_STREAM;
997 tmpAttr->attr.streamAttr.streamType = COMMON_VIDEO_STREAM;
998 break;
999 case DATA_TYPE_AUDIO_STREAM:
1000 tmpAttr->dataType = TYPE_STREAM;
1001 tmpAttr->attr.streamAttr.streamType = COMMON_AUDIO_STREAM;
1002 break;
1003 case DATA_TYPE_SLICE_STREAM:
1004 tmpAttr->dataType = TYPE_STREAM;
1005 tmpAttr->attr.streamAttr.streamType = VIDEO_SLICE_STREAM;
1006 break;
1007 default:
1008 // The socket used for listening does not require setting the data type
1009 break;
1010 }
1011 return tmpAttr;
1012 }
1013
ClientAddSocket(const SocketInfo * info,int32_t * sessionId)1014 int32_t ClientAddSocket(const SocketInfo *info, int32_t *sessionId)
1015 {
1016 if (info == NULL || sessionId == NULL) {
1017 TRANS_LOGE(TRANS_SDK, "ClientAddSocket invalid param");
1018 return SOFTBUS_INVALID_PARAM;
1019 }
1020
1021 bool isEncryptedRawStream = false;
1022 SessionAttribute *tmpAttr = CreateSessionAttributeBySocketInfoTrans(info, &isEncryptedRawStream);
1023 if (tmpAttr == NULL) {
1024 TRANS_LOGE(TRANS_SDK, "Create SessionAttribute failed");
1025 return SOFTBUS_MALLOC_ERR;
1026 }
1027
1028 SessionParam param = {
1029 .sessionName = info->name != NULL ? info->name : "",
1030 .peerSessionName = info->peerName != NULL ? info->peerName : "",
1031 .peerDeviceId = info->peerNetworkId != NULL ? info->peerNetworkId : "",
1032 .groupId = "reserved",
1033 .actionId = INVALID_ACTION_ID,
1034 .attr = tmpAttr,
1035 };
1036
1037 SessionEnableStatus isEnabled = ENABLE_STATUS_INIT;
1038 int32_t ret = ClientAddSocketSession(¶m, isEncryptedRawStream, sessionId, &isEnabled);
1039 if (ret != SOFTBUS_OK) {
1040 SoftBusFree(tmpAttr);
1041 if (ret == SOFTBUS_TRANS_SESSION_REPEATED) {
1042 TRANS_LOGI(TRANS_SDK, "socket already create");
1043 return SOFTBUS_OK;
1044 }
1045 TRANS_LOGE(TRANS_SDK, "add socket err: ret=%{public}d", ret);
1046 return ret;
1047 }
1048 SoftBusFree(tmpAttr);
1049 return SOFTBUS_OK;
1050 }
1051
IsValidSocketListener(const ISocketListener * listener,bool isListenSocket)1052 static bool IsValidSocketListener(const ISocketListener *listener, bool isListenSocket)
1053 {
1054 if (listener == NULL || listener->OnShutdown == NULL) {
1055 TRANS_LOGE(TRANS_SDK, "listener is null or OnShutdown is null");
1056 return false;
1057 }
1058
1059 if (isListenSocket && listener->OnBind == NULL) {
1060 TRANS_LOGE(TRANS_SDK, "no OnBind callback function of listen socket");
1061 return false;
1062 }
1063
1064 return true;
1065 }
1066
IsValidAsyncBindSocketListener(const ISocketListener * listener,bool isAsync)1067 static bool IsValidAsyncBindSocketListener(const ISocketListener *listener, bool isAsync)
1068 {
1069 if (isAsync && (listener->OnBind == NULL)) {
1070 TRANS_LOGE(TRANS_SDK, "no OnBind callback function of async bind");
1071 return false;
1072 }
1073 if (isAsync && (listener->OnError == NULL)) {
1074 TRANS_LOGE(TRANS_SDK, "no onError callback function of async bind");
1075 return false;
1076 }
1077 return true;
1078 }
1079
GetMaxIdleTimeout(const QosTV * qos,uint32_t qosCount,uint32_t * maxIdleTimeout)1080 static int32_t GetMaxIdleTimeout(const QosTV *qos, uint32_t qosCount, uint32_t *maxIdleTimeout)
1081 {
1082 #define TRANS_DEFAULT_MAX_IDLE_TIMEOUT 0
1083 int32_t tmpIdleTime = 0;
1084 int32_t ret = GetQosValue(qos, qosCount, QOS_TYPE_MAX_IDLE_TIMEOUT, &tmpIdleTime, TRANS_DEFAULT_MAX_IDLE_TIMEOUT);
1085 if (ret != SOFTBUS_OK) {
1086 TRANS_LOGE(TRANS_SDK, "get maximum idle time failed, ret=%{public}d", ret);
1087 return ret;
1088 }
1089
1090 if (tmpIdleTime < 0) {
1091 TRANS_LOGE(TRANS_SDK, "invalid maximum idle time, maxIdleTimeout=%{public}d", tmpIdleTime);
1092 return SOFTBUS_INVALID_PARAM;
1093 }
1094
1095 *maxIdleTimeout = (uint32_t)tmpIdleTime;
1096 return SOFTBUS_OK;
1097 }
1098
CheckSessionCancelState(int32_t socket)1099 static int32_t CheckSessionCancelState(int32_t socket)
1100 {
1101 SocketLifecycleData lifecycle;
1102 (void)memset_s(&lifecycle, sizeof(SocketLifecycleData), 0, sizeof(SocketLifecycleData));
1103 int32_t ret = GetSocketLifecycleAndSessionNameBySessionId(socket, NULL, &lifecycle);
1104 if (ret != SOFTBUS_OK) {
1105 TRANS_LOGE(TRANS_SDK, "get socket state failed, socket=%{public}d failed, ret=%{public}d", socket, ret);
1106 return ret;
1107 }
1108 if (lifecycle.sessionState == SESSION_STATE_CANCELLING) {
1109 TRANS_LOGW(TRANS_SDK, "This socket already in cancelling state. socket=%{public}d", socket);
1110 int32_t channelId = INVALID_CHANNEL_ID;
1111 int32_t type = CHANNEL_TYPE_BUTT;
1112 ret = ClientGetChannelBySessionId(socket, &channelId, &type, NULL);
1113 if (ret != SOFTBUS_OK) {
1114 TRANS_LOGE(TRANS_SDK, "get channel by socket=%{public}d failed, ret=%{public}d", socket, ret);
1115 }
1116 ret = ClientTransCloseChannel(channelId, type, socket);
1117 if (ret != SOFTBUS_OK) {
1118 TRANS_LOGE(TRANS_SDK, "close channel err: ret=%{public}d, channelId=%{public}d, channeType=%{public}d", ret,
1119 channelId, type);
1120 }
1121 return lifecycle.bindErrCode;
1122 }
1123 return SOFTBUS_OK;
1124 }
1125
SocketCheckAndSetSessionState(int32_t socket)1126 static int32_t SocketCheckAndSetSessionState(int32_t socket)
1127 {
1128 SocketLifecycleData lifecycle;
1129 (void)memset_s(&lifecycle, sizeof(SocketLifecycleData), 0, sizeof(SocketLifecycleData));
1130
1131 int32_t ret = GetSocketLifecycleAndSessionNameBySessionId(socket, NULL, &lifecycle);
1132 if (ret != SOFTBUS_OK) {
1133 TRANS_LOGE(TRANS_SDK, "get socket state failed, socket=%{public}d failed, ret=%{public}d", socket, ret);
1134 return ret;
1135 }
1136
1137 if (lifecycle.sessionState != SESSION_STATE_INIT) {
1138 TRANS_LOGE(TRANS_SDK, "socket=%{public}d is being bound, please check", socket);
1139 return SOFTBUS_TRANS_SESSION_OPENING;
1140 }
1141
1142 return SOFTBUS_OK;
1143 }
1144
ClientBind(int32_t socket,const QosTV qos[],uint32_t qosCount,const ISocketListener * listener,bool isAsync)1145 int32_t ClientBind(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener, bool isAsync)
1146 {
1147 if (!IsValidSessionId(socket) || !IsValidSocketListener(listener, false) ||
1148 !IsValidAsyncBindSocketListener(listener, isAsync) || !IsValidQosInfo(qos, qosCount)) {
1149 TRANS_LOGE(TRANS_SDK, "invalid param");
1150 return SOFTBUS_INVALID_PARAM;
1151 }
1152
1153 // For rebind, clear the socket state.
1154 int32_t ret = ClientSetSocketState(socket, 0, SESSION_ROLE_INIT);
1155 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "init session role failed, ret=%{public}d", ret);
1156
1157 ret = SocketCheckAndSetSessionState(socket);
1158 if (ret != SOFTBUS_OK) {
1159 TRANS_LOGE(TRANS_SDK, "check the socket=%{public}d status failed, ret=%{public}d", socket, ret);
1160 return ret;
1161 }
1162
1163 ret = ClientSetListenerBySessionId(socket, listener, false);
1164 TRANS_CHECK_AND_RETURN_RET_LOGE(
1165 ret == SOFTBUS_OK, ret, TRANS_SDK, "set listener by socket=%{public}d failed, ret=%{public}d", socket, ret);
1166
1167 uint32_t maxIdleTimeout = 0;
1168 ret = GetMaxIdleTimeout(qos, qosCount, &maxIdleTimeout);
1169 TRANS_CHECK_AND_RETURN_RET_LOGE(
1170 ret == SOFTBUS_OK, ret, TRANS_SDK, "get maximum idle time failed, ret=%{public}d", ret);
1171
1172 ret = SetSessionIsAsyncById(socket, isAsync);
1173 TRANS_CHECK_AND_RETURN_RET_LOGE(
1174 ret == SOFTBUS_OK, ret, TRANS_SDK, "set session is async failed, ret=%{public}d", ret);
1175
1176 TransInfo transInfo;
1177 ret = ClientIpcOpenSession(socket, qos, qosCount, &transInfo, isAsync);
1178 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "open session failed, ret=%{public}d", ret);
1179
1180 if (!isAsync) {
1181 ret = CheckSessionCancelState(socket);
1182 TRANS_CHECK_AND_RETURN_RET_LOGE(
1183 ret == SOFTBUS_OK, ret, TRANS_SDK, "check session cancel state failed, ret=%{public}d", ret);
1184 ret = ClientWaitSyncBind(socket);
1185 TRANS_CHECK_AND_RETURN_RET_LOGE(
1186 ret == SOFTBUS_OK, ret, TRANS_SDK, "ClientWaitSyncBind err, ret=%{public}d", ret);
1187 (void)SetSessionStateBySessionId(socket, SESSION_STATE_CALLBACK_FINISHED, 0);
1188 }
1189 ret = ClientSetSocketState(socket, maxIdleTimeout, SESSION_ROLE_CLIENT);
1190 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "set session role failed, ret=%{public}d", ret);
1191
1192 if (!isAsync) {
1193 (void)ClientGetChannelBySessionId(socket, &(transInfo.channelId), &(transInfo.channelType), NULL);
1194 TRANS_LOGI(TRANS_SDK, "Bind ok: socket=%{public}d, channelId=%{public}d, channelType=%{public}d", socket,
1195 transInfo.channelId, transInfo.channelType);
1196 } else {
1197 TRANS_LOGI(TRANS_SDK, "Bind async ok: socket=%{public}d", socket);
1198 }
1199 return SOFTBUS_OK;
1200 }
1201
ClientListen(int32_t socket,const QosTV qos[],uint32_t qosCount,const ISocketListener * listener)1202 int32_t ClientListen(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener)
1203 {
1204 if (!IsValidSocketListener(listener, true) || !IsValidQosInfo(qos, qosCount)) {
1205 TRANS_LOGE(TRANS_SDK, "invalid param");
1206 return SOFTBUS_INVALID_PARAM;
1207 }
1208
1209 int32_t ret = ClientSetListenerBySessionId(socket, listener, true);
1210 if (ret != SOFTBUS_OK) {
1211 TRANS_LOGE(TRANS_SDK, "set listener by socket=%{public}d failed. ret=%{public}d", socket, ret);
1212 return ret;
1213 }
1214
1215 uint32_t maxIdleTimeout = 0;
1216 ret = GetMaxIdleTimeout(qos, qosCount, &maxIdleTimeout);
1217 if (ret != SOFTBUS_OK) {
1218 TRANS_LOGE(TRANS_SDK, "get maximum idle time failed, ret=%{public}d", ret);
1219 return ret;
1220 }
1221
1222 ret = ClientSetSocketState(socket, maxIdleTimeout, SESSION_ROLE_SERVER);
1223 if (ret != SOFTBUS_OK) {
1224 TRANS_LOGE(TRANS_SDK, "set session role failed. ret=%{public}d", ret);
1225 return ret;
1226 }
1227
1228 TRANS_LOGD(TRANS_SDK, "Listen ok: socket=%{public}d", socket);
1229 return SOFTBUS_OK;
1230 }
1231
ClientShutdown(int32_t socket,int32_t cancelReason)1232 void ClientShutdown(int32_t socket, int32_t cancelReason)
1233 {
1234 if (!IsValidSessionId(socket)) {
1235 TRANS_LOGE(TRANS_SDK, "invalid param");
1236 return;
1237 }
1238
1239 SocketLifecycleData lifecycle;
1240 (void)memset_s(&lifecycle, sizeof(SocketLifecycleData), 0, sizeof(SocketLifecycleData));
1241 char sessioName[SESSION_NAME_SIZE_MAX] = { 0 };
1242 int32_t ret = GetSocketLifecycleAndSessionNameBySessionId(socket, sessioName, &lifecycle);
1243 if (ret != SOFTBUS_OK) {
1244 TRANS_LOGE(TRANS_SDK, "get socket state failed, socket=%{public}d failed, ret=%{public}d", socket, ret);
1245 return;
1246 }
1247 if (lifecycle.sessionState == SESSION_STATE_CANCELLING &&
1248 lifecycle.bindErrCode == SOFTBUS_TRANS_STOP_BIND_BY_CANCEL) {
1249 TRANS_LOGW(TRANS_SDK, "This socket already in cancelling state. socket=%{public}d", socket);
1250 return;
1251 }
1252 SetSessionStateBySessionId(socket, SESSION_STATE_CANCELLING, cancelReason);
1253 if (lifecycle.sessionState == SESSION_STATE_INIT) {
1254 TRANS_LOGI(TRANS_SDK, "This socket state is init, socket=%{public}d", socket);
1255 } else if (lifecycle.sessionState == SESSION_STATE_OPENING) {
1256 TRANS_LOGI(TRANS_SDK, "This socket state is opening, socket=%{public}d", socket);
1257 int32_t ret = ServerIpcCloseChannel(sessioName, socket, CHANNEL_TYPE_UNDEFINED);
1258 if (ret != SOFTBUS_OK) {
1259 TRANS_LOGE(TRANS_SDK, "Call sa delete socket failed: ret=%{public}d", ret);
1260 }
1261 ret = ClientSignalSyncBind(socket, 0);
1262 if (ret != SOFTBUS_OK) {
1263 TRANS_LOGE(TRANS_SDK, "sync signal bind failed, ret=%{public}d, socket=%{public}d", ret, socket);
1264 }
1265 } else if (lifecycle.sessionState == SESSION_STATE_OPENED ||
1266 lifecycle.sessionState == SESSION_STATE_CALLBACK_FINISHED) {
1267 if (lifecycle.sessionState == SESSION_STATE_OPENED) {
1268 TRANS_LOGI(TRANS_SDK, "This socket state is opened, socket=%{public}d", socket);
1269 CheckSessionIsOpened(socket, true);
1270 }
1271 TRANS_LOGI(TRANS_SDK, "This socket state is callback finish, socket=%{public}d", socket);
1272 int32_t channelId = INVALID_CHANNEL_ID;
1273 int32_t type = CHANNEL_TYPE_BUTT;
1274 ret = ClientGetChannelBySessionId(socket, &channelId, &type, NULL);
1275 if (ret != SOFTBUS_OK) {
1276 TRANS_LOGE(TRANS_SDK, "get channel by socket=%{public}d failed, ret=%{public}d", socket, ret);
1277 } else {
1278 AddSessionStateClosing();
1279 }
1280 ret = ClientTransCloseChannel(channelId, type, socket);
1281 if (ret != SOFTBUS_OK) {
1282 TRANS_LOGE(TRANS_SDK, "close channel err: ret=%{public}d, channelId=%{public}d, channeType=%{public}d", ret,
1283 channelId, type);
1284 }
1285 if (lifecycle.sessionState == SESSION_STATE_OPENED) {
1286 (void)ClientSignalSyncBind(socket, cancelReason);
1287 }
1288 }
1289 if (cancelReason == SOFTBUS_TRANS_STOP_BIND_BY_TIMEOUT) {
1290 SetSessionInitInfoById(socket);
1291 TRANS_LOGI(TRANS_SDK, "Bind timeout Shutdown ok, no delete socket: socket=%{public}d", socket);
1292 return;
1293 }
1294 (void)ClientDeleteSocketSession(socket);
1295
1296 TRANS_LOGI(TRANS_SDK, "Shutdown ok: socket=%{public}d", socket);
1297 }
1298
GetSocketMtuSize(int32_t socket,uint32_t * mtuSize)1299 int32_t GetSocketMtuSize(int32_t socket, uint32_t *mtuSize)
1300 {
1301 if (!IsValidSessionId(socket) || mtuSize == NULL) {
1302 TRANS_LOGE(TRANS_SDK, "invalid param");
1303 return SOFTBUS_INVALID_PARAM;
1304 }
1305
1306 int32_t channelId = INVALID_CHANNEL_ID;
1307 int32_t type = CHANNEL_TYPE_BUTT;
1308 SessionEnableStatus enableStatus = ENABLE_STATUS_INIT;
1309 int32_t ret = ClientGetChannelBySessionId(socket, &channelId, &type, &enableStatus);
1310 if (ret != SOFTBUS_OK) {
1311 TRANS_LOGE(TRANS_SDK, "get channel by socket=%{public}d failed, ret=%{public}d.", socket, ret);
1312 return ret;
1313 }
1314
1315 if (enableStatus != ENABLE_STATUS_SUCCESS) {
1316 TRANS_LOGI(TRANS_SDK, "socket not enable");
1317 return SOFTBUS_TRANS_SESSION_NO_ENABLE;
1318 }
1319
1320 uint32_t dataConfig = INVALID_DATA_CONFIG;
1321 if (ClientGetDataConfigByChannelId(channelId, type, &dataConfig) != SOFTBUS_OK) {
1322 TRANS_LOGE(TRANS_SDK, "get config by channelId=%{public}d failed", channelId);
1323 return SOFTBUS_GET_CONFIG_VAL_ERR;
1324 }
1325
1326 *mtuSize = dataConfig;
1327 TRANS_LOGI(TRANS_SDK, "get mtuSize success, socket=%{public}d, mtu=%{public}" PRIu32, socket, *mtuSize);
1328 return SOFTBUS_OK;
1329 }
1330
ClientDfsBind(int32_t socket,const ISocketListener * listener)1331 int32_t ClientDfsBind(int32_t socket, const ISocketListener *listener)
1332 {
1333 if (!IsValidSessionId(socket) || !IsValidSocketListener(listener, false)) {
1334 TRANS_LOGE(TRANS_SDK, "invalid param");
1335 return SOFTBUS_INVALID_PARAM;
1336 }
1337
1338 int32_t ret = ClientSetListenerBySessionId(socket, listener, false);
1339 if (ret != SOFTBUS_OK) {
1340 TRANS_LOGE(TRANS_SDK, "set listener by socket=%{public}d failed, ret=%{public}d", socket, ret);
1341 return ret;
1342 }
1343
1344 ret = SetSessionIsAsyncById(socket, false);
1345 TRANS_CHECK_AND_RETURN_RET_LOGE(
1346 ret == SOFTBUS_OK, ret, TRANS_SDK, "set session is async failed, ret=%{public}d", ret);
1347 TransInfo transInfo;
1348 ret = ClientDfsIpcOpenSession(socket, &transInfo);
1349 if (ret != SOFTBUS_OK) {
1350 TRANS_LOGE(TRANS_SDK, "open session failed, ret=%{public}d", ret);
1351 return ret;
1352 }
1353
1354 ret = ClientSetChannelBySessionId(socket, &transInfo);
1355 TRANS_CHECK_AND_RETURN_RET_LOGE(
1356 ret == SOFTBUS_OK, ret, TRANS_SDK, "set channel by socket=%{public}d failed, ret=%{public}d", socket, ret);
1357 ret = SetSessionStateBySessionId(socket, SESSION_STATE_OPENED, 0);
1358 TRANS_CHECK_AND_RETURN_RET_LOGE(
1359 ret == SOFTBUS_OK, ret, TRANS_SDK, "set session state failed socket=%{public}d, ret=%{public}d", socket, ret);
1360 ret = ClientWaitSyncBind(socket);
1361 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "ClientWaitSyncBind err, ret=%{public}d", ret);
1362
1363 ret = ClientSetSocketState(socket, 0, SESSION_ROLE_CLIENT);
1364 TRANS_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, TRANS_SDK, "set session role failed, ret=%{public}d", ret);
1365 TRANS_LOGI(TRANS_SDK, "DfsBind ok: socket=%{public}d, channelId=%{public}d, channelType=%{public}d", socket,
1366 transInfo.channelId, transInfo.channelType);
1367 return SOFTBUS_OK;
1368 }
1369