• 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 "client_bus_center_manager.h"
17 
18 #include <pthread.h>
19 #include <securec.h>
20 
21 #include "bus_center_server_proxy.h"
22 #include "common_list.h"
23 #include "softbus_adapter_mem.h"
24 #include "softbus_adapter_thread.h"
25 #include "softbus_def.h"
26 #include "softbus_errcode.h"
27 #include "softbus_feature_config.h"
28 #include "softbus_log.h"
29 #include "softbus_utils.h"
30 
31 #define DEFAULT_NODE_STATE_CB_CNT 10
32 #define MAX_IPC_LEN 1024
33 
34 static int32_t g_maxNodeStateCbCount;
35 
36 typedef struct {
37     ListNode node;
38     ConnectionAddr addr;
39     OnJoinLNNResult cb;
40 } JoinLNNCbListItem;
41 
42 typedef struct {
43     ListNode node;
44     ConnectionAddr addr;
45     OnJoinMetaNodeResult cb;
46 } JoinMetaNodeCbListItem;
47 
48 typedef struct {
49     ListNode node;
50     char networkId[NETWORK_ID_BUF_LEN];
51     OnLeaveLNNResult cb;
52 } LeaveLNNCbListItem;
53 
54 typedef struct {
55     ListNode node;
56     char networkId[NETWORK_ID_BUF_LEN];
57     OnLeaveMetaNodeResult cb;
58 } LeaveMetaNodeCbListItem;
59 
60 typedef struct {
61     ListNode node;
62     char networkId[NETWORK_ID_BUF_LEN];
63     ITimeSyncCb cb;
64 } TimeSyncCallbackItem;
65 
66 typedef struct {
67     ListNode node;
68     INodeStateCb cb;
69     char pkgName[PKG_NAME_SIZE_MAX];
70 } NodeStateCallbackItem;
71 
72 typedef struct {
73     ListNode joinLNNCbList;
74     ListNode joinMetaNodeCbList;
75     ListNode leaveLNNCbList;
76     ListNode leaveMetaNodeCbList;
77     ListNode nodeStateCbList;
78     ListNode timeSyncCbList;
79     int32_t nodeStateCbListCnt;
80     IPublishCb publishCb;
81     IRefreshCallback refreshCb;
82     bool isInit;
83     SoftBusMutex lock;
84 } BusCenterClient;
85 
86 static BusCenterClient g_busCenterClient = {
87     .nodeStateCbListCnt = 0,
88     .publishCb.OnPublishResult = NULL,
89     .refreshCb.OnDeviceFound = NULL,
90     .refreshCb.OnDiscoverResult = NULL,
91     .isInit = false,
92 };
93 
IsSameConnectionAddr(const ConnectionAddr * addr1,const ConnectionAddr * addr2)94 static bool IsSameConnectionAddr(const ConnectionAddr *addr1, const ConnectionAddr *addr2)
95 {
96     if (addr1->type != addr2->type) {
97         return false;
98     }
99     if (addr1->type == CONNECTION_ADDR_BR) {
100         return strncmp(addr1->info.br.brMac, addr2->info.br.brMac, BT_MAC_LEN) == 0;
101     }
102     if (addr1->type == CONNECTION_ADDR_BLE) {
103         return strncmp(addr1->info.ble.bleMac, addr2->info.ble.bleMac, BT_MAC_LEN) == 0;
104     }
105     if (addr1->type == CONNECTION_ADDR_WLAN || addr1->type == CONNECTION_ADDR_ETH) {
106         return (strncmp(addr1->info.ip.ip, addr2->info.ip.ip, IP_STR_MAX_LEN) == 0)
107             && (addr1->info.ip.port == addr2->info.ip.port);
108     }
109     if (addr1->type == CONNECTION_ADDR_SESSION) {
110         return ((addr1->info.session.sessionId == addr2->info.session.sessionId) &&
111             (addr1->info.session.channelId == addr2->info.session.channelId) &&
112             (addr1->info.session.type == addr2->info.session.type));
113     }
114     return false;
115 }
116 
FindJoinLNNCbItem(ConnectionAddr * addr,OnJoinLNNResult cb)117 static JoinLNNCbListItem *FindJoinLNNCbItem(ConnectionAddr *addr, OnJoinLNNResult cb)
118 {
119     JoinLNNCbListItem *item = NULL;
120 
121     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.joinLNNCbList, JoinLNNCbListItem, node) {
122         if (IsSameConnectionAddr(&item->addr, addr) &&
123             (cb == NULL || cb == item->cb)) {
124             return item;
125         }
126     }
127     return NULL;
128 }
129 
FindJoinMetaNodeCbItem(ConnectionAddr * addr,OnJoinMetaNodeResult cb)130 static JoinMetaNodeCbListItem *FindJoinMetaNodeCbItem(ConnectionAddr *addr, OnJoinMetaNodeResult cb)
131 {
132     JoinMetaNodeCbListItem *item = NULL;
133 
134     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.joinMetaNodeCbList, JoinMetaNodeCbListItem, node) {
135         if (IsSameConnectionAddr(&item->addr, addr) &&
136             (cb == NULL || cb == item->cb)) {
137             return item;
138         }
139     }
140     return NULL;
141 }
142 
AddJoinLNNCbItem(ConnectionAddr * target,OnJoinLNNResult cb)143 static int32_t AddJoinLNNCbItem(ConnectionAddr *target, OnJoinLNNResult cb)
144 {
145     JoinLNNCbListItem *item = NULL;
146 
147     item = (JoinLNNCbListItem *)SoftBusMalloc(sizeof(*item));
148     if (item == NULL) {
149         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: malloc join LNN cb list item");
150         return SOFTBUS_MALLOC_ERR;
151     }
152     ListInit(&item->node);
153     item->addr = *target;
154     item->cb = cb;
155     ListAdd(&g_busCenterClient.joinLNNCbList, &item->node);
156     return SOFTBUS_OK;
157 }
158 
AddJoinMetaNodeCbItem(ConnectionAddr * target,OnJoinMetaNodeResult cb)159 static int32_t AddJoinMetaNodeCbItem(ConnectionAddr *target, OnJoinMetaNodeResult cb)
160 {
161     JoinMetaNodeCbListItem *item = NULL;
162 
163     item = (JoinMetaNodeCbListItem *)SoftBusMalloc(sizeof(*item));
164     if (item == NULL) {
165         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: malloc join MetaNode cb list item");
166         return SOFTBUS_MALLOC_ERR;
167     }
168     ListInit(&item->node);
169     item->addr = *target;
170     item->cb = cb;
171     ListAdd(&g_busCenterClient.joinMetaNodeCbList, &item->node);
172     return SOFTBUS_OK;
173 }
174 
FindLeaveLNNCbItem(const char * networkId,OnLeaveLNNResult cb)175 static LeaveLNNCbListItem *FindLeaveLNNCbItem(const char *networkId, OnLeaveLNNResult cb)
176 {
177     LeaveLNNCbListItem *item = NULL;
178 
179     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.leaveLNNCbList, LeaveLNNCbListItem, node) {
180         if (strcmp(item->networkId, networkId) == 0 &&
181             (cb == NULL || cb == item->cb)) {
182             return item;
183         }
184     }
185     return NULL;
186 }
187 
FindLeaveMetaNodeCbItem(const char * networkId,OnLeaveMetaNodeResult cb)188 static LeaveMetaNodeCbListItem *FindLeaveMetaNodeCbItem(const char *networkId, OnLeaveMetaNodeResult cb)
189 {
190     LeaveMetaNodeCbListItem *item = NULL;
191 
192     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.leaveMetaNodeCbList, LeaveMetaNodeCbListItem, node) {
193         if (strcmp(item->networkId, networkId) == 0 &&
194             (cb == NULL || cb == item->cb)) {
195             return item;
196         }
197     }
198     return NULL;
199 }
200 
AddLeaveLNNCbItem(const char * networkId,OnLeaveLNNResult cb)201 static int32_t AddLeaveLNNCbItem(const char *networkId, OnLeaveLNNResult cb)
202 {
203     LeaveLNNCbListItem *item = NULL;
204 
205     item = (LeaveLNNCbListItem *)SoftBusMalloc(sizeof(*item));
206     if (item == NULL) {
207         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: malloc join LNN cb list item");
208         return SOFTBUS_MALLOC_ERR;
209     }
210     ListInit(&item->node);
211     if (strncpy_s(item->networkId, NETWORK_ID_BUF_LEN, networkId, strlen(networkId)) != EOK) {
212         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "strcpy network id fail");
213         SoftBusFree(item);
214         return SOFTBUS_ERR;
215     }
216     item->cb = cb;
217     ListAdd(&g_busCenterClient.leaveLNNCbList, &item->node);
218     return SOFTBUS_OK;
219 }
220 
AddLeaveMetaNodeCbItem(const char * networkId,OnLeaveMetaNodeResult cb)221 static int32_t AddLeaveMetaNodeCbItem(const char *networkId, OnLeaveMetaNodeResult cb)
222 {
223     LeaveMetaNodeCbListItem *item = NULL;
224 
225     item = (LeaveMetaNodeCbListItem *)SoftBusMalloc(sizeof(*item));
226     if (item == NULL) {
227         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: malloc join MetaNode cb list item");
228         return SOFTBUS_MALLOC_ERR;
229     }
230     ListInit(&item->node);
231     if (strncpy_s(item->networkId, NETWORK_ID_BUF_LEN, networkId, strlen(networkId)) != EOK) {
232         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "strcpy network id fail");
233         SoftBusFree(item);
234         return SOFTBUS_ERR;
235     }
236     item->cb = cb;
237     ListAdd(&g_busCenterClient.leaveMetaNodeCbList, &item->node);
238     return SOFTBUS_OK;
239 }
240 
FindTimeSyncCbItem(const char * networkId,ITimeSyncCb * cb)241 static TimeSyncCallbackItem *FindTimeSyncCbItem(const char *networkId, ITimeSyncCb *cb)
242 {
243     TimeSyncCallbackItem *item = NULL;
244 
245     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.timeSyncCbList, TimeSyncCallbackItem, node) {
246         if (strcmp(item->networkId, networkId) == 0 &&
247             (cb == NULL || cb->onTimeSyncResult == item->cb.onTimeSyncResult)) {
248             return item;
249         }
250     }
251     return NULL;
252 }
253 
AddTimeSyncCbItem(const char * networkId,ITimeSyncCb * cb)254 static int32_t AddTimeSyncCbItem(const char *networkId, ITimeSyncCb *cb)
255 {
256     TimeSyncCallbackItem *item = NULL;
257 
258     item = (TimeSyncCallbackItem *)SoftBusMalloc(sizeof(*item));
259     if (item == NULL) {
260         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: malloc time sync cb list item");
261         return SOFTBUS_MALLOC_ERR;
262     }
263     ListInit(&item->node);
264     if (strncpy_s(item->networkId, NETWORK_ID_BUF_LEN, networkId, strlen(networkId)) != EOK) {
265         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "strcpy network id fail");
266         SoftBusFree(item);
267         return SOFTBUS_ERR;
268     }
269     item->cb = *cb;
270     ListAdd(&g_busCenterClient.timeSyncCbList, &item->node);
271     return SOFTBUS_OK;
272 }
273 
ClearJoinLNNList(void)274 static void ClearJoinLNNList(void)
275 {
276     JoinLNNCbListItem *item = NULL;
277     JoinLNNCbListItem *next = NULL;
278 
279     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_busCenterClient.joinLNNCbList, JoinLNNCbListItem, node) {
280         ListDelete(&item->node);
281         SoftBusFree(item);
282     }
283 }
284 
ClearLeaveLNNList(void)285 static void ClearLeaveLNNList(void)
286 {
287     LeaveLNNCbListItem *item = NULL;
288     LeaveLNNCbListItem *next = NULL;
289 
290     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_busCenterClient.leaveLNNCbList, LeaveLNNCbListItem, node) {
291         ListDelete(&item->node);
292         SoftBusFree(item);
293     }
294 }
295 
ClearJoinMetaNodeList(void)296 static void ClearJoinMetaNodeList(void)
297 {
298     JoinMetaNodeCbListItem *item = NULL;
299     JoinMetaNodeCbListItem *next = NULL;
300 
301     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_busCenterClient.joinMetaNodeCbList, JoinMetaNodeCbListItem, node) {
302         ListDelete(&item->node);
303         SoftBusFree(item);
304     }
305 }
306 
ClearLeaveMetaNodeList(void)307 static void ClearLeaveMetaNodeList(void)
308 {
309     LeaveMetaNodeCbListItem *item = NULL;
310     LeaveMetaNodeCbListItem *next = NULL;
311 
312     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_busCenterClient.leaveMetaNodeCbList, LeaveMetaNodeCbListItem, node) {
313         ListDelete(&item->node);
314         SoftBusFree(item);
315     }
316 }
317 
ClearTimeSyncList(ListNode * list)318 static void ClearTimeSyncList(ListNode *list)
319 {
320     TimeSyncCallbackItem *item = NULL;
321     TimeSyncCallbackItem *next = NULL;
322 
323     LIST_FOR_EACH_ENTRY_SAFE(item, next, list, TimeSyncCallbackItem, node) {
324         ListDelete(&item->node);
325         SoftBusFree(item);
326     }
327 }
328 
ClearNodeStateCbList(ListNode * list)329 static void ClearNodeStateCbList(ListNode *list)
330 {
331     NodeStateCallbackItem *item = NULL;
332     NodeStateCallbackItem *next = NULL;
333 
334     LIST_FOR_EACH_ENTRY_SAFE(item, next, list, NodeStateCallbackItem, node) {
335         ListDelete(&item->node);
336         SoftBusFree(item);
337     }
338 }
339 
DuplicateNodeStateCbList(ListNode * list)340 static void DuplicateNodeStateCbList(ListNode *list)
341 {
342     NodeStateCallbackItem *item = NULL;
343     NodeStateCallbackItem *copyItem = NULL;
344 
345     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.nodeStateCbList, NodeStateCallbackItem, node) {
346         copyItem = (NodeStateCallbackItem *)SoftBusCalloc(sizeof(NodeStateCallbackItem));
347         if (copyItem == NULL) {
348             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc node state callback item fail");
349             continue;
350         }
351         (void)strncpy_s(copyItem->pkgName, PKG_NAME_SIZE_MAX, item->pkgName, PKG_NAME_SIZE_MAX - 1);
352         ListInit(&copyItem->node);
353         copyItem->cb = item->cb;
354         ListAdd(list, &copyItem->node);
355     }
356 }
357 
DuplicateTimeSyncResultCbList(ListNode * list,const char * networkId)358 static void DuplicateTimeSyncResultCbList(ListNode *list, const char *networkId)
359 {
360     TimeSyncCallbackItem *item = NULL;
361     TimeSyncCallbackItem *copyItem = NULL;
362 
363     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.timeSyncCbList, TimeSyncCallbackItem, node) {
364         if (strcmp(item->networkId, networkId) != 0) {
365             continue;
366         }
367         copyItem = (TimeSyncCallbackItem *)SoftBusMalloc(sizeof(TimeSyncCallbackItem));
368         if (copyItem == NULL) {
369             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc time sync callback item fail");
370             continue;
371         }
372         copyItem->cb = item->cb;
373         ListInit(&copyItem->node);
374         if (strncpy_s(copyItem->networkId, NETWORK_ID_BUF_LEN, item->networkId, strlen(item->networkId)) != EOK) {
375             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy networkId fail");
376             SoftBusFree(copyItem);
377             continue;
378         }
379         ListAdd(list, &copyItem->node);
380     }
381 }
382 
BusCenterClientDeinit(void)383 void BusCenterClientDeinit(void)
384 {
385     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
386         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock in deinit");
387     }
388     ClearJoinLNNList();
389     ClearLeaveLNNList();
390     ClearJoinMetaNodeList();
391     ClearLeaveMetaNodeList();
392     ClearTimeSyncList(&g_busCenterClient.timeSyncCbList);
393     ClearNodeStateCbList(&g_busCenterClient.nodeStateCbList);
394     g_busCenterClient.nodeStateCbListCnt = 0;
395     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
396         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock in deinit");
397     }
398     BusCenterServerProxyDeInit();
399 }
400 
BusCenterClientInit(void)401 int BusCenterClientInit(void)
402 {
403     if (SoftbusGetConfig(SOFTBUS_INT_MAX_NODE_STATE_CB_CNT,
404         (unsigned char *)&g_maxNodeStateCbCount, sizeof(g_maxNodeStateCbCount)) != SOFTBUS_OK) {
405         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "Cannot get NodeStateCbCount from config file");
406         g_maxNodeStateCbCount = DEFAULT_NODE_STATE_CB_CNT;
407     }
408     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "NodeStateCbCount is %u", g_maxNodeStateCbCount);
409 
410     if (SoftBusMutexInit(&g_busCenterClient.lock, NULL) != SOFTBUS_OK) {
411         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "g_busCenterClient.lock init failed.");
412         return SOFTBUS_ERR;
413     }
414 
415     ListInit(&g_busCenterClient.joinLNNCbList);
416     ListInit(&g_busCenterClient.joinMetaNodeCbList);
417     ListInit(&g_busCenterClient.leaveLNNCbList);
418     ListInit(&g_busCenterClient.leaveMetaNodeCbList);
419     ListInit(&g_busCenterClient.nodeStateCbList);
420     ListInit(&g_busCenterClient.timeSyncCbList);
421     g_busCenterClient.isInit = true;
422     if (BusCenterServerProxyInit() != SOFTBUS_OK) {
423         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "bus center server proxy init failed.");
424         BusCenterClientDeinit();
425         return SOFTBUS_ERR;
426     }
427     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "BusCenterClientInit init OK!");
428     return SOFTBUS_OK;
429 }
430 
GetAllNodeDeviceInfoInner(const char * pkgName,NodeBasicInfo ** info,int32_t * infoNum)431 int32_t GetAllNodeDeviceInfoInner(const char *pkgName, NodeBasicInfo **info, int32_t *infoNum)
432 {
433     int ret = ServerIpcGetAllOnlineNodeInfo(pkgName, (void **)info, sizeof(NodeBasicInfo), infoNum);
434     if (ret != SOFTBUS_OK) {
435         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "Server GetAllOnlineNodeInfo failed, ret = %d", ret);
436     }
437     return ret;
438 }
439 
GetLocalNodeDeviceInfoInner(const char * pkgName,NodeBasicInfo * info)440 int32_t GetLocalNodeDeviceInfoInner(const char *pkgName, NodeBasicInfo *info)
441 {
442     int ret = ServerIpcGetLocalDeviceInfo(pkgName, info, sizeof(*info));
443     if (ret != SOFTBUS_OK) {
444         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "Server GetLocalNodeDeviceInfo failed, ret = %d", ret);
445     }
446     return ret;
447 }
448 
GetNodeKeyInfoInner(const char * pkgName,const char * networkId,NodeDeviceInfoKey key,uint8_t * info,int32_t infoLen)449 int32_t GetNodeKeyInfoInner(const char *pkgName, const char *networkId, NodeDeviceInfoKey key,
450     uint8_t *info, int32_t infoLen)
451 {
452     int ret = ServerIpcGetNodeKeyInfo(pkgName, networkId, key, info, infoLen);
453     if (ret != SOFTBUS_OK) {
454         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "Server GetNodeKeyInfo failed, ret = %d", ret);
455     }
456     return ret;
457 }
458 
SetNodeDataChangeFlagInner(const char * pkgName,const char * networkId,uint16_t dataChangeFlag)459 int32_t SetNodeDataChangeFlagInner(const char *pkgName, const char *networkId, uint16_t dataChangeFlag)
460 {
461     int ret = ServerIpcSetNodeDataChangeFlag(pkgName, networkId, dataChangeFlag);
462     if (ret != SOFTBUS_OK) {
463         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "Server SetNodeDataChangeFlag failed, ret = %d", ret);
464     }
465     return ret;
466 }
467 
JoinLNNInner(const char * pkgName,ConnectionAddr * target,OnJoinLNNResult cb)468 int32_t JoinLNNInner(const char *pkgName, ConnectionAddr *target, OnJoinLNNResult cb)
469 {
470     int32_t rc;
471 
472     if (!g_busCenterClient.isInit) {
473         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : join lnn not init");
474         return SOFTBUS_NO_INIT;
475     }
476     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
477         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock join lnn cb list in join");
478     }
479 
480     do {
481         if (FindJoinLNNCbItem(target, cb) != NULL) {
482             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : join request already exist");
483             rc = SOFTBUS_ALREADY_EXISTED;
484             break;
485         }
486         rc = ServerIpcJoinLNN(pkgName, target, sizeof(*target));
487         if (rc != SOFTBUS_OK) {
488             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : request join lnn");
489         } else {
490             rc = AddJoinLNNCbItem(target, cb);
491         }
492     } while (false);
493     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
494         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock join lnn cb list in join");
495     }
496     return rc;
497 }
498 
JoinMetaNodeInner(const char * pkgName,ConnectionAddr * target,CustomData * customData,OnJoinLNNResult cb)499 int32_t JoinMetaNodeInner(const char *pkgName, ConnectionAddr *target, CustomData *customData, OnJoinLNNResult cb)
500 {
501     int32_t rc;
502 
503     if (!g_busCenterClient.isInit) {
504         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : join MetaNode not init");
505         return SOFTBUS_NO_INIT;
506     }
507     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
508         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock join MetaNode cb list in join");
509     }
510 
511     do {
512         if (FindJoinMetaNodeCbItem(target, cb) != NULL) {
513             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : join request already exist");
514             rc = SOFTBUS_ALREADY_EXISTED;
515             break;
516         }
517         rc = ServerIpcJoinMetaNode(pkgName, target, customData, sizeof(*target));
518         if (rc != SOFTBUS_OK) {
519             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : request join MetaNode");
520         } else {
521             rc = AddJoinMetaNodeCbItem(target, cb);
522         }
523     } while (false);
524     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
525         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock join MetaNode cb list in join");
526     }
527     return rc;
528 }
529 
LeaveLNNInner(const char * pkgName,const char * networkId,OnLeaveLNNResult cb)530 int32_t LeaveLNNInner(const char *pkgName, const char *networkId, OnLeaveLNNResult cb)
531 {
532     int32_t rc;
533 
534     if (!g_busCenterClient.isInit) {
535         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : leave lnn not init");
536         return SOFTBUS_NO_INIT;
537     }
538     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
539         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock leave lnn cb list in leave");
540     }
541     rc = SOFTBUS_ERR;
542     do {
543         if (FindLeaveLNNCbItem(networkId, cb) != NULL) {
544             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : leave request already exist");
545             break;
546         }
547         rc = ServerIpcLeaveLNN(pkgName, networkId);
548         if (rc != SOFTBUS_OK) {
549             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : request leave lnn");
550         } else {
551             rc = AddLeaveLNNCbItem(networkId, cb);
552         }
553     } while (false);
554     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
555         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock leave lnn cb list in leave");
556     }
557     return rc;
558 }
559 
LeaveMetaNodeInner(const char * pkgName,const char * networkId,OnLeaveMetaNodeResult cb)560 int32_t LeaveMetaNodeInner(const char *pkgName, const char *networkId, OnLeaveMetaNodeResult cb)
561 {
562     int32_t rc;
563 
564     if (!g_busCenterClient.isInit) {
565         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : leave MetaNode not init");
566         return SOFTBUS_NO_INIT;
567     }
568     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
569         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock leave MetaNode cb list in leave");
570     }
571     rc = SOFTBUS_ERR;
572     do {
573         if (FindLeaveMetaNodeCbItem(networkId, cb) != NULL) {
574             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : leave request already exist");
575             break;
576         }
577         rc = ServerIpcLeaveMetaNode(pkgName, networkId);
578         if (rc != SOFTBUS_OK) {
579             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : request leave MetaNode");
580         } else {
581             rc = AddLeaveMetaNodeCbItem(networkId, cb);
582         }
583     } while (false);
584     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
585         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock leave MetaNode cb list in leave");
586     }
587     return rc;
588 }
589 
IsSameNodeStateCb(const INodeStateCb * callback1,const INodeStateCb * callback2)590 static bool IsSameNodeStateCb(const INodeStateCb *callback1, const INodeStateCb *callback2)
591 {
592     if (callback1->events != callback2->events) {
593         return false;
594     }
595     if ((callback1->events & EVENT_NODE_STATE_ONLINE) &&
596         callback1->onNodeOnline != callback2->onNodeOnline) {
597         return false;
598     }
599     if ((callback1->events & EVENT_NODE_STATE_OFFLINE) &&
600         callback1->onNodeOffline != callback2->onNodeOffline) {
601         return false;
602     }
603     if ((callback1->events & EVENT_NODE_STATE_INFO_CHANGED) &&
604         callback1->onNodeBasicInfoChanged != callback2->onNodeBasicInfoChanged) {
605         return false;
606     }
607     if ((callback1->events & EVENT_NODE_STATUS_CHANGED) &&
608         callback1->onNodeStatusChanged != callback2->onNodeStatusChanged) {
609         return false;
610     }
611     return true;
612 }
613 
RegNodeDeviceStateCbInner(const char * pkgName,INodeStateCb * callback)614 int32_t RegNodeDeviceStateCbInner(const char *pkgName, INodeStateCb *callback)
615 {
616     NodeStateCallbackItem *item = NULL;
617     int32_t rc = SOFTBUS_ERR;
618 
619     if (!IsValidString(pkgName, PKG_NAME_SIZE_MAX - 1)) {
620         SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "Package name is empty or length exceeds");
621         return SOFTBUS_INVALID_PARAM;
622     }
623     if (!g_busCenterClient.isInit) {
624         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: reg node state cb not init");
625         return SOFTBUS_NO_INIT;
626     }
627     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
628         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock node state cb list in reg");
629     }
630     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.nodeStateCbList, NodeStateCallbackItem, node) {
631         if (IsSameNodeStateCb(&item->cb, callback)) {
632             (void)SoftBusMutexUnlock(&g_busCenterClient.lock);
633             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "warn: reg node state callback repeatedly");
634             return SOFTBUS_OK;
635         }
636     }
637     do {
638         if (g_busCenterClient.nodeStateCbListCnt >= g_maxNodeStateCbCount) {
639             break;
640         }
641         item = (NodeStateCallbackItem *)SoftBusCalloc(sizeof(*item));
642         if (item == NULL) {
643             rc = SOFTBUS_MALLOC_ERR;
644             break;
645         }
646         (void)strncpy_s(item->pkgName, PKG_NAME_SIZE_MAX, pkgName, PKG_NAME_SIZE_MAX - 1);
647         ListInit(&item->node);
648         item->cb = *callback;
649         ListAdd(&g_busCenterClient.nodeStateCbList, &item->node);
650         g_busCenterClient.nodeStateCbListCnt++;
651         rc = SOFTBUS_OK;
652     } while (false);
653     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
654         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock node state cb list");
655     }
656     return rc;
657 }
658 
UnregNodeDeviceStateCbInner(INodeStateCb * callback)659 int32_t UnregNodeDeviceStateCbInner(INodeStateCb *callback)
660 {
661     NodeStateCallbackItem *item = NULL;
662     NodeStateCallbackItem *next = NULL;
663 
664     if (!g_busCenterClient.isInit) {
665         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unreg node state cb not init");
666         return SOFTBUS_NO_INIT;
667     }
668     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
669         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock node state cb list in unreg");
670     }
671     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_busCenterClient.nodeStateCbList, NodeStateCallbackItem, node) {
672         if (IsSameNodeStateCb(&item->cb, callback)) {
673             ListDelete(&item->node);
674             SoftBusFree(item);
675             g_busCenterClient.nodeStateCbListCnt--;
676             break;
677         }
678     }
679     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
680         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock node state cb list in unreg");
681     }
682     return SOFTBUS_OK;
683 }
684 
StartTimeSyncInner(const char * pkgName,const char * targetNetworkId,TimeSyncAccuracy accuracy,TimeSyncPeriod period,ITimeSyncCb * cb)685 int32_t StartTimeSyncInner(const char *pkgName, const char *targetNetworkId, TimeSyncAccuracy accuracy,
686     TimeSyncPeriod period, ITimeSyncCb *cb)
687 {
688     int32_t rc;
689 
690     if (!g_busCenterClient.isInit) {
691         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : start time sync not init");
692         return SOFTBUS_NO_INIT;
693     }
694     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
695         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock time sync cb list");
696     }
697     rc = SOFTBUS_ERR;
698     do {
699         if (FindTimeSyncCbItem(targetNetworkId, cb) != NULL) {
700             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "repeat request from %s, StopTimeSync first!", pkgName);
701             break;
702         }
703         rc = ServerIpcStartTimeSync(pkgName, targetNetworkId, accuracy, period);
704         if (rc != SOFTBUS_OK) {
705             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : start time sync");
706         } else {
707             rc = AddTimeSyncCbItem(targetNetworkId, cb);
708         }
709     } while (false);
710     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
711         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock time sync cb list");
712     }
713     return rc;
714 }
715 
StopTimeSyncInner(const char * pkgName,const char * targetNetworkId)716 int32_t StopTimeSyncInner(const char *pkgName, const char *targetNetworkId)
717 {
718     int32_t rc;
719     TimeSyncCallbackItem *item = NULL;
720 
721     if (!g_busCenterClient.isInit) {
722         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : stop time sync cb list not init");
723         return SOFTBUS_NO_INIT;
724     }
725     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
726         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock time sync cb list");
727     }
728     rc = SOFTBUS_ERR;
729     while ((item = FindTimeSyncCbItem(targetNetworkId, NULL)) != NULL) {
730         rc = ServerIpcStopTimeSync(pkgName, targetNetworkId);
731         if (rc != SOFTBUS_OK) {
732             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : stop time sync");
733         } else {
734             ListDelete(&item->node);
735             SoftBusFree(item);
736         }
737     }
738     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
739         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock time sync cb list");
740     }
741     return rc;
742 }
743 
PublishLNNInner(const char * pkgName,const PublishInfo * info,const IPublishCb * cb)744 int32_t PublishLNNInner(const char *pkgName, const PublishInfo *info, const IPublishCb *cb)
745 {
746     g_busCenterClient.publishCb = *cb;
747     int32_t ret = ServerIpcPublishLNN(pkgName, info);
748     if (ret != SOFTBUS_OK) {
749         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "Server PublishLNNInner failed, ret = %d", ret);
750     }
751     return ret;
752 }
753 
StopPublishLNNInner(const char * pkgName,int32_t publishId)754 int32_t StopPublishLNNInner(const char *pkgName, int32_t publishId)
755 {
756     int32_t ret = ServerIpcStopPublishLNN(pkgName, publishId);
757     if (ret != SOFTBUS_OK) {
758         SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "Server StopPublishLNNInner failed, ret = %d", ret);
759     }
760     return ret;
761 }
762 
RefreshLNNInner(const char * pkgName,const SubscribeInfo * info,const IRefreshCallback * cb)763 int32_t RefreshLNNInner(const char *pkgName, const SubscribeInfo *info, const IRefreshCallback *cb)
764 {
765     g_busCenterClient.refreshCb = *cb;
766     int32_t ret = ServerIpcRefreshLNN(pkgName, info);
767     if (ret != SOFTBUS_OK) {
768         SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "Server RefreshLNNInner failed, ret = %d", ret);
769     }
770     return ret;
771 }
772 
StopRefreshLNNInner(const char * pkgName,int32_t refreshId)773 int32_t StopRefreshLNNInner(const char *pkgName, int32_t refreshId)
774 {
775     int32_t ret = ServerIpcStopRefreshLNN(pkgName, refreshId);
776     if (ret != SOFTBUS_OK) {
777         SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "Server StopRefreshLNNInner failed, ret = %d", ret);
778     }
779     return ret;
780 }
781 
ActiveMetaNodeInner(const char * pkgName,const MetaNodeConfigInfo * info,char * metaNodeId)782 int32_t ActiveMetaNodeInner(const char *pkgName, const MetaNodeConfigInfo *info, char *metaNodeId)
783 {
784     return ServerIpcActiveMetaNode(pkgName, info, metaNodeId);
785 }
786 
DeactiveMetaNodeInner(const char * pkgName,const char * metaNodeId)787 int32_t DeactiveMetaNodeInner(const char *pkgName, const char *metaNodeId)
788 {
789     return ServerIpcDeactiveMetaNode(pkgName, metaNodeId);
790 }
791 
GetAllMetaNodeInfoInner(const char * pkgName,MetaNodeInfo * infos,int32_t * infoNum)792 int32_t GetAllMetaNodeInfoInner(const char *pkgName, MetaNodeInfo *infos, int32_t *infoNum)
793 {
794     return ServerIpcGetAllMetaNodeInfo(pkgName, infos, infoNum);
795 }
796 
ShiftLNNGearInner(const char * pkgName,const char * callerId,const char * targetNetworkId,const GearMode * mode)797 int32_t ShiftLNNGearInner(const char *pkgName, const char *callerId, const char *targetNetworkId, const GearMode *mode)
798 {
799     return ServerIpcShiftLNNGear(pkgName, callerId, targetNetworkId, mode);
800 }
801 
LnnOnJoinResult(void * addr,const char * networkId,int32_t retCode)802 NO_SANITIZE("cfi") int32_t LnnOnJoinResult(void *addr, const char *networkId, int32_t retCode)
803 {
804     JoinLNNCbListItem *item = NULL;
805     ConnectionAddr *connAddr = (ConnectionAddr *)addr;
806 
807     if (connAddr == NULL) {
808         return SOFTBUS_INVALID_PARAM;
809     }
810     if (!g_busCenterClient.isInit) {
811         return SOFTBUS_ERR;
812     }
813 
814     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
815         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock join lnn cb list in join result");
816     }
817     while ((item = FindJoinLNNCbItem((ConnectionAddr *)addr, NULL)) != NULL) {
818         ListDelete(&item->node);
819         if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
820             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock join lnn cb list in join result");
821         }
822         if (item->cb != NULL) {
823             item->cb(connAddr, networkId, retCode);
824         }
825         SoftBusFree(item);
826         if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
827             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock join lnn cb list in join result");
828         }
829     }
830     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
831         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock join lnn cb list in join result");
832     }
833     return SOFTBUS_OK;
834 }
835 
MetaNodeOnJoinResult(void * addr,const char * networkId,int32_t retCode)836 int32_t MetaNodeOnJoinResult(void *addr, const char *networkId, int32_t retCode)
837 {
838     JoinMetaNodeCbListItem *item = NULL;
839     ConnectionAddr *connAddr = (ConnectionAddr *)addr;
840 
841     if (connAddr == NULL) {
842         return SOFTBUS_INVALID_PARAM;
843     }
844     if (!g_busCenterClient.isInit) {
845         return SOFTBUS_ERR;
846     }
847 
848     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
849         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock join MetaNode cb list in join result");
850     }
851     while ((item = FindJoinMetaNodeCbItem((ConnectionAddr *)addr, NULL)) != NULL) {
852         ListDelete(&item->node);
853         if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
854             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock join MetaNode cb list in join result");
855         }
856         if (item->cb != NULL) {
857             item->cb(connAddr, networkId, retCode);
858         }
859         SoftBusFree(item);
860         if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
861             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock join MetaNode cb list in join result");
862         }
863     }
864     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
865         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock join MetaNode cb list in join result");
866     }
867     return SOFTBUS_OK;
868 }
869 
LnnOnLeaveResult(const char * networkId,int32_t retCode)870 NO_SANITIZE("cfi") int32_t LnnOnLeaveResult(const char *networkId, int32_t retCode)
871 {
872     LeaveLNNCbListItem *item = NULL;
873 
874     if (networkId == NULL) {
875         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: networkId is null");
876         return SOFTBUS_INVALID_PARAM;
877     }
878     if (!g_busCenterClient.isInit) {
879         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: leave cb not init");
880         return SOFTBUS_ERR;
881     }
882 
883     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
884         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock leave lnn cb list in leave result");
885     }
886     while ((item = FindLeaveLNNCbItem(networkId, NULL)) != NULL) {
887         ListDelete(&item->node);
888         if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
889             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock leave lnn cb list in leave result");
890         }
891         if (item->cb != NULL) {
892             item->cb(networkId, retCode);
893         }
894         SoftBusFree(item);
895         if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
896             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock leave lnn cb list in leave result");
897         }
898     }
899     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
900         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock leave lnn cb list in leave result");
901     }
902     return SOFTBUS_OK;
903 }
904 
MetaNodeOnLeaveResult(const char * networkId,int32_t retCode)905 int32_t MetaNodeOnLeaveResult(const char *networkId, int32_t retCode)
906 {
907     LeaveMetaNodeCbListItem *item = NULL;
908 
909     if (networkId == NULL) {
910         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: networkId is null");
911         return SOFTBUS_INVALID_PARAM;
912     }
913     if (!g_busCenterClient.isInit) {
914         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: leave cb not init");
915         return SOFTBUS_ERR;
916     }
917 
918     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
919         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock leave MetaNode cb list in leave result");
920     }
921     while ((item = FindLeaveMetaNodeCbItem(networkId, NULL)) != NULL) {
922         ListDelete(&item->node);
923         if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
924             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock leave MetaNode cb list in leave result");
925         }
926         if (item->cb != NULL) {
927             item->cb(networkId, retCode);
928         }
929         SoftBusFree(item);
930         if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
931             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock leave MetaNode cb list in leave result");
932         }
933     }
934     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
935         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock leave MetaNode cb list in leave result");
936     }
937     return SOFTBUS_OK;
938 }
939 
LnnOnNodeOnlineStateChanged(const char * pkgName,bool isOnline,void * info)940 NO_SANITIZE("cfi") int32_t LnnOnNodeOnlineStateChanged(const char *pkgName, bool isOnline, void *info)
941 {
942     NodeStateCallbackItem *item = NULL;
943     NodeBasicInfo *basicInfo = (NodeBasicInfo *)info;
944     ListNode dupList;
945 
946     if (basicInfo == NULL || pkgName == NULL) {
947         return SOFTBUS_INVALID_PARAM;
948     }
949     if (!g_busCenterClient.isInit) {
950         return SOFTBUS_ERR;
951     }
952 
953     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
954         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock node state cb list in notify");
955     }
956     ListInit(&dupList);
957     DuplicateNodeStateCbList(&dupList);
958     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
959         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock node state cb list in notify");
960     }
961     LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
962         if (isOnline == true) {
963             if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
964                 (item->cb.events & EVENT_NODE_STATE_ONLINE) != 0) {
965                 item->cb.onNodeOnline(basicInfo);
966             }
967         } else {
968             if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
969                 (item->cb.events & EVENT_NODE_STATE_OFFLINE) != 0) {
970                 item->cb.onNodeOffline(basicInfo);
971             }
972         }
973     }
974     ClearNodeStateCbList(&dupList);
975     return SOFTBUS_OK;
976 }
977 
LnnOnNodeBasicInfoChanged(const char * pkgName,void * info,int32_t type)978 NO_SANITIZE("cfi") int32_t LnnOnNodeBasicInfoChanged(const char *pkgName, void *info, int32_t type)
979 {
980     NodeStateCallbackItem *item = NULL;
981     NodeBasicInfo *basicInfo = (NodeBasicInfo *)info;
982     ListNode dupList;
983 
984     if (basicInfo == NULL || pkgName == NULL) {
985         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "info or pkgName is null");
986         return SOFTBUS_INVALID_PARAM;
987     }
988     if (!g_busCenterClient.isInit) {
989         return SOFTBUS_ERR;
990     }
991 
992     if ((type < 0) || (type > TYPE_NETWORK_INFO)) {
993         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "OnNodeBasicInfoChanged invalid type: %d", type);
994         return SOFTBUS_INVALID_PARAM;
995     }
996 
997     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
998         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock node basic info cb list in notify");
999     }
1000     ListInit(&dupList);
1001     DuplicateNodeStateCbList(&dupList);
1002     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
1003         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock node basic info cb list in notify");
1004     }
1005     LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
1006         if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1007             (item->cb.events & EVENT_NODE_STATE_INFO_CHANGED) != 0) {
1008             item->cb.onNodeBasicInfoChanged((NodeBasicInfoType)type, basicInfo);
1009         }
1010     }
1011     ClearNodeStateCbList(&dupList);
1012     return SOFTBUS_OK;
1013 }
1014 
LnnOnTimeSyncResult(const void * info,int retCode)1015 NO_SANITIZE("cfi") int32_t LnnOnTimeSyncResult(const void *info, int retCode)
1016 {
1017     TimeSyncCallbackItem *item = NULL;
1018     TimeSyncResultInfo *basicInfo = (TimeSyncResultInfo *)info;
1019     ListNode dupList;
1020 
1021     if (info == NULL) {
1022         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "info or list is null");
1023         return SOFTBUS_INVALID_PARAM;
1024     }
1025     if (!g_busCenterClient.isInit) {
1026         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: time sync cb not init");
1027         return SOFTBUS_ERR;
1028     }
1029 
1030     if (SoftBusMutexLock(&g_busCenterClient.lock) != 0) {
1031         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: lock time sync cb list in time sync result");
1032     }
1033     ListInit(&dupList);
1034     DuplicateTimeSyncResultCbList(&dupList, basicInfo->target.targetNetworkId);
1035     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != 0) {
1036         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: unlock time sync cb list in time sync result");
1037     }
1038     LIST_FOR_EACH_ENTRY(item, &dupList, TimeSyncCallbackItem, node) {
1039         if (item->cb.onTimeSyncResult != NULL) {
1040             item->cb.onTimeSyncResult((TimeSyncResultInfo *)info, retCode);
1041         }
1042     }
1043     ClearTimeSyncList(&dupList);
1044     return SOFTBUS_OK;
1045 }
1046 
LnnOnPublishLNNResult(int32_t publishId,int32_t reason)1047 NO_SANITIZE("cfi") void LnnOnPublishLNNResult(int32_t publishId, int32_t reason)
1048 {
1049     if (g_busCenterClient.publishCb.OnPublishResult != NULL) {
1050         g_busCenterClient.publishCb.OnPublishResult(publishId, (PublishResult)reason);
1051     }
1052 }
1053 
LnnOnRefreshLNNResult(int32_t refreshId,int32_t reason)1054 NO_SANITIZE("cfi") void LnnOnRefreshLNNResult(int32_t refreshId, int32_t reason)
1055 {
1056     if (g_busCenterClient.refreshCb.OnDiscoverResult != NULL) {
1057         g_busCenterClient.refreshCb.OnDiscoverResult(refreshId, (RefreshResult)reason);
1058     }
1059 }
1060 
LnnOnRefreshDeviceFound(const void * device)1061 NO_SANITIZE("cfi") void LnnOnRefreshDeviceFound(const void *device)
1062 {
1063     if (g_busCenterClient.refreshCb.OnDeviceFound != NULL) {
1064         g_busCenterClient.refreshCb.OnDeviceFound((const DeviceInfo *)device);
1065     }
1066 }
1067