1 /*
2 * Copyright (c) 2021 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 "trans_session_manager.h"
17
18 #include "lnn_lane_link.h"
19 #include "securec.h"
20 #include "softbus_adapter_mem.h"
21 #include "softbus_adapter_thread.h"
22 #include "softbus_def.h"
23 #include "softbus_errcode.h"
24 #include "softbus_log.h"
25 #include "softbus_utils.h"
26 #include "trans_channel_callback.h"
27 #include "softbus_hidumper_trans.h"
28
29 #define MAX_SESSION_SERVER_NUM 32
30 #define CMD_REGISTED_SESSION_LIST "registed_sessionlist"
31
32 static SoftBusList *g_sessionServerList = NULL;
33
TransSessionForEachShowInfo(int fd)34 static int32_t TransSessionForEachShowInfo(int fd)
35 {
36 if (g_sessionServerList == NULL) {
37 return SOFTBUS_ERR;
38 }
39
40 if (SoftBusMutexLock(&g_sessionServerList->lock) != 0) {
41 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock mutex fail!");
42 return SOFTBUS_ERR;
43 }
44
45 SessionServer *pos = NULL;
46 LIST_FOR_EACH_ENTRY(pos, &g_sessionServerList->list, SessionServer, node) {
47 SoftBusTransDumpRegisterSession(fd, pos->pkgName, pos->sessionName, pos->uid, pos->pid);
48 }
49
50 (void)SoftBusMutexUnlock(&g_sessionServerList->lock);
51 return SOFTBUS_OK;
52 }
53
TransSessionMgrInit(void)54 NO_SANITIZE("cfi") int32_t TransSessionMgrInit(void)
55 {
56 if (g_sessionServerList != NULL) {
57 return SOFTBUS_OK;
58 }
59 g_sessionServerList = CreateSoftBusList();
60 if (g_sessionServerList == NULL) {
61 return SOFTBUS_ERR;
62 }
63
64 return SoftBusRegTransVarDump(CMD_REGISTED_SESSION_LIST, TransSessionForEachShowInfo);
65 }
66
TransSessionMgrDeinit(void)67 NO_SANITIZE("cfi") void TransSessionMgrDeinit(void)
68 {
69 if (g_sessionServerList != NULL) {
70 DestroySoftBusList(g_sessionServerList);
71 g_sessionServerList = NULL;
72 }
73 }
74
TransSessionServerIsExist(const char * sessionName)75 NO_SANITIZE("cfi") bool TransSessionServerIsExist(const char *sessionName)
76 {
77 if (sessionName == NULL) {
78 return false;
79 }
80 if (g_sessionServerList == NULL) {
81 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "not init");
82 return false;
83 }
84
85 SessionServer *pos = NULL;
86 SessionServer *tmp = NULL;
87 if (SoftBusMutexLock(&g_sessionServerList->lock) != 0) {
88 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock mutex fail!");
89 return false;
90 }
91 LIST_FOR_EACH_ENTRY_SAFE(pos, tmp, &g_sessionServerList->list, SessionServer, node) {
92 if (strcmp(pos->sessionName, sessionName) == 0) {
93 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "session server [%s] is exist", sessionName);
94 (void)SoftBusMutexUnlock(&g_sessionServerList->lock);
95 return true;
96 }
97 }
98
99 (void)SoftBusMutexUnlock(&g_sessionServerList->lock);
100 return false;
101 }
102
TransSessionServerAddItem(SessionServer * newNode)103 NO_SANITIZE("cfi") int32_t TransSessionServerAddItem(SessionServer *newNode)
104 {
105 if (newNode == NULL) {
106 return SOFTBUS_INVALID_PARAM;
107 }
108 if (g_sessionServerList == NULL) {
109 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "not init");
110 return SOFTBUS_NO_INIT;
111 }
112
113 if (SoftBusMutexLock(&g_sessionServerList->lock) != 0) {
114 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock mutex fail!");
115 return SOFTBUS_ERR;
116 }
117 if (g_sessionServerList->cnt >= MAX_SESSION_SERVER_NUM) {
118 (void)SoftBusMutexUnlock(&g_sessionServerList->lock);
119 return SOFTBUS_INVALID_NUM;
120 }
121 SessionServer *pos = NULL;
122 SessionServer *tmp = NULL;
123 LIST_FOR_EACH_ENTRY_SAFE(pos, tmp, &g_sessionServerList->list, SessionServer, node) {
124 if (strcmp(pos->sessionName, newNode->sessionName) == 0) {
125 if ((pos->uid == newNode->uid) && (pos->pid == newNode->pid)) {
126 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "session server [%s] is exist", newNode->sessionName);
127 (void)SoftBusMutexUnlock(&g_sessionServerList->lock);
128 return SOFTBUS_SERVER_NAME_REPEATED;
129 } else {
130 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO,
131 "sessionname [%s] has been used by other processes", newNode->sessionName);
132 (void)SoftBusMutexUnlock(&g_sessionServerList->lock);
133 return SOFTBUS_SERVER_NAME_USED;
134 }
135 }
136 }
137
138 ListAdd(&(g_sessionServerList->list), &(newNode->node));
139 g_sessionServerList->cnt++;
140 (void)SoftBusMutexUnlock(&g_sessionServerList->lock);
141
142 return SOFTBUS_OK;
143 }
144
TransSessionServerDelItem(const char * sessionName)145 NO_SANITIZE("cfi") int32_t TransSessionServerDelItem(const char *sessionName)
146 {
147 if (sessionName == NULL) {
148 return SOFTBUS_INVALID_PARAM;
149 }
150 if (g_sessionServerList == NULL) {
151 return SOFTBUS_ERR;
152 }
153
154 bool isFind = false;
155 SessionServer *pos = NULL;
156 SessionServer *tmp = NULL;
157 if (SoftBusMutexLock(&g_sessionServerList->lock) != 0) {
158 return SOFTBUS_ERR;
159 }
160 LIST_FOR_EACH_ENTRY_SAFE(pos, tmp, &g_sessionServerList->list, SessionServer, node) {
161 if (strcmp(pos->sessionName, sessionName) == 0) {
162 isFind = true;
163 break;
164 }
165 }
166 if (isFind) {
167 ListDelete(&pos->node);
168 g_sessionServerList->cnt--;
169 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "destroy session server [%s]", sessionName);
170 SoftBusFree(pos);
171 }
172 (void)SoftBusMutexUnlock(&g_sessionServerList->lock);
173 return SOFTBUS_OK;
174 }
175
TransDelItemByPackageName(const char * pkgName,int32_t pid)176 NO_SANITIZE("cfi") void TransDelItemByPackageName(const char *pkgName, int32_t pid)
177 {
178 if (pkgName == NULL || g_sessionServerList == NULL) {
179 return;
180 }
181
182 SessionServer *pos = NULL;
183 SessionServer *tmp = NULL;
184 if (SoftBusMutexLock(&g_sessionServerList->lock) != 0) {
185 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock mutex fail!");
186 return;
187 }
188 LIST_FOR_EACH_ENTRY_SAFE(pos, tmp, &g_sessionServerList->list, SessionServer, node) {
189 if ((strcmp(pos->pkgName, pkgName) == 0) && (pos->pid == pid)) {
190 ListDelete(&pos->node);
191 g_sessionServerList->cnt--;
192 SoftBusFree(pos);
193 pos = NULL;
194 }
195 }
196 (void)SoftBusMutexUnlock(&g_sessionServerList->lock);
197 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "del package name [%s].", pkgName);
198 }
199
TransGetPkgNameBySessionName(const char * sessionName,char * pkgName,uint16_t len)200 int32_t TransGetPkgNameBySessionName(const char *sessionName, char *pkgName, uint16_t len)
201 {
202 if ((sessionName == NULL) || (pkgName == NULL) || (len == 0)) {
203 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "TransGetPkgNameBySessionName param error.");
204 return SOFTBUS_ERR;
205 }
206 if (g_sessionServerList == NULL) {
207 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "session server list not init");
208 return SOFTBUS_ERR;
209 }
210
211 SessionServer *pos = NULL;
212 SessionServer *tmp = NULL;
213 if (SoftBusMutexLock(&g_sessionServerList->lock) != 0) {
214 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock mutex fail!");
215 return SOFTBUS_ERR;
216 }
217 LIST_FOR_EACH_ENTRY_SAFE(pos, tmp, &g_sessionServerList->list, SessionServer, node) {
218 if (strcmp(pos->sessionName, sessionName) == 0) {
219 int32_t ret = strcpy_s(pkgName, len, pos->pkgName);
220 (void)SoftBusMutexUnlock(&g_sessionServerList->lock);
221 if (ret != 0) {
222 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "strcpy_s error ret, [%d]", ret);
223 return SOFTBUS_ERR;
224 }
225 return SOFTBUS_OK;
226 }
227 }
228
229 (void)SoftBusMutexUnlock(&g_sessionServerList->lock);
230 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "not found session name [%s].", sessionName);
231 return SOFTBUS_ERR;
232 }
233
TransGetUidAndPid(const char * sessionName,int32_t * uid,int32_t * pid)234 int32_t TransGetUidAndPid(const char *sessionName, int32_t *uid, int32_t *pid)
235 {
236 if (sessionName == NULL || uid == NULL || pid == NULL) {
237 return SOFTBUS_INVALID_PARAM;
238 }
239 if (g_sessionServerList == NULL) {
240 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "not init");
241 return SOFTBUS_ERR;
242 }
243
244 SessionServer *pos = NULL;
245 SessionServer *tmp = NULL;
246 if (SoftBusMutexLock(&g_sessionServerList->lock) != 0) {
247 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock mutex fail!");
248 return SOFTBUS_LOCK_ERR;
249 }
250 char *anonyOut = NULL;
251 LIST_FOR_EACH_ENTRY_SAFE(pos, tmp, &g_sessionServerList->list, SessionServer, node) {
252 if (strcmp(pos->sessionName, sessionName) == 0) {
253 *uid = pos->uid;
254 *pid = pos->pid;
255 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "TransGetUidAndPid: sessionName=%s, uid=%d, pid=%d",
256 AnonyDevId(&anonyOut, sessionName), pos->uid, pos->pid);
257 SoftBusFree(anonyOut);
258 (void)SoftBusMutexUnlock(&g_sessionServerList->lock);
259 return SOFTBUS_OK;
260 }
261 }
262
263 (void)SoftBusMutexUnlock(&g_sessionServerList->lock);
264 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "TransGetUidAndPid err: sessionName=%s",
265 AnonyDevId(&anonyOut, sessionName));
266 SoftBusFree(anonyOut);
267 return SOFTBUS_ERR;
268 }
269
TransListDelete(ListNode * sessionServerList)270 static void TransListDelete(ListNode *sessionServerList)
271 {
272 SessionServer *pos = NULL;
273 SessionServer *tmp = NULL;
274
275 LIST_FOR_EACH_ENTRY_SAFE(pos, tmp, sessionServerList, SessionServer, node) {
276 ListDelete(&pos->node);
277 SoftBusFree(pos);
278 }
279 return;
280 }
281
TransListCopy(ListNode * sessionServerList)282 static int32_t TransListCopy(ListNode *sessionServerList)
283 {
284 if (sessionServerList == NULL) {
285 return SOFTBUS_ERR;
286 }
287
288 SessionServer *pos = NULL;
289 SessionServer *tmp = NULL;
290
291 if (SoftBusMutexLock(&g_sessionServerList->lock) != 0) {
292 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "lock mutex fail!");
293 return SOFTBUS_ERR;
294 }
295 LIST_FOR_EACH_ENTRY_SAFE(pos, tmp, &g_sessionServerList->list, SessionServer, node) {
296 SessionServer *newpos = (SessionServer *)SoftBusMalloc(sizeof(SessionServer));
297 if (newpos == NULL) {
298 TransListDelete(sessionServerList);
299 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "SoftBusMalloc fail!");
300 (void)SoftBusMutexUnlock(&g_sessionServerList->lock);
301 return SOFTBUS_MALLOC_ERR;
302 }
303 *newpos = *pos;
304 ListAdd(sessionServerList, &newpos->node);
305 }
306 (void)SoftBusMutexUnlock(&g_sessionServerList->lock);
307 return SOFTBUS_OK;
308 }
309
TransOnLinkDown(const char * networkId,const char * uuid,const char * udid,const char * peerIp,int32_t routeType)310 NO_SANITIZE("cfi") void TransOnLinkDown(const char *networkId, const char *uuid, const char *udid,
311 const char *peerIp, int32_t routeType)
312 {
313 if (networkId == NULL || g_sessionServerList == NULL) {
314 return;
315 }
316 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "TransOnLinkDown: routeType=%d", routeType);
317
318 ListNode sessionServerList = {0};
319 ListInit(&sessionServerList);
320 int32_t ret = TransListCopy(&sessionServerList);
321 if (ret != SOFTBUS_OK) {
322 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "TransOnLinkDown copy list fail!");
323 return;
324 }
325
326 SessionServer *pos = NULL;
327 SessionServer *tmp = NULL;
328
329 LIST_FOR_EACH_ENTRY_SAFE(pos, tmp, &sessionServerList, SessionServer, node) {
330 (void)TransServerOnChannelLinkDown(pos->pkgName, pos->pid, uuid, udid, peerIp, networkId, routeType);
331 }
332
333 if (routeType == WIFI_P2P) {
334 LaneDeleteP2pAddress(networkId);
335 }
336 TransListDelete(&sessionServerList);
337 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO, "TransOnLinkDown end");
338 return;
339 }
340