• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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