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