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