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_bus_center_manager.h"
17 
18 #include <pthread.h>
19 #include <securec.h>
20 
21 #include "anonymizer.h"
22 #include "bus_center_server_proxy.h"
23 #include "common_list.h"
24 #include "lnn_log.h"
25 #include "softbus_adapter_mem.h"
26 #include "softbus_adapter_thread.h"
27 #include "softbus_def.h"
28 #include "softbus_errcode.h"
29 #include "softbus_feature_config.h"
30 #include "softbus_utils.h"
31 
32 #define DEFAULT_NODE_STATE_CB_CNT 10
33 #define MAX_IPC_LEN 1024
34 
35 static int32_t g_maxNodeStateCbCount;
36 static SoftBusList *g_publishMsgList = NULL;
37 static SoftBusList *g_discoveryMsgList = NULL;
38 static bool g_isInited = false;
39 static SoftBusMutex g_isInitedLock;
40 static char g_regDataLevelChangePkgName[PKG_NAME_SIZE_MAX] = {0};
41 
42 typedef struct {
43     ListNode node;
44     ConnectionAddr addr;
45     OnJoinLNNResult cb;
46 } JoinLNNCbListItem;
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     ITimeSyncCb cb;
58 } TimeSyncCallbackItem;
59 
60 typedef struct {
61     ListNode node;
62     INodeStateCb cb;
63     char pkgName[PKG_NAME_SIZE_MAX];
64 } NodeStateCallbackItem;
65 
66 typedef struct {
67     ListNode joinLNNCbList;
68     ListNode leaveLNNCbList;
69     ListNode nodeStateCbList;
70     ListNode timeSyncCbList;
71     int32_t nodeStateCbListCnt;
72     IPublishCb publishCb;
73     IRefreshCallback refreshCb;
74     IDataLevelCb dataLevelCb;
75     bool isInit;
76     SoftBusMutex lock;
77 } BusCenterClient;
78 
79 typedef struct {
80     char pkgName[PKG_NAME_SIZE_MAX];
81     PublishInfo *info;
82     ListNode node;
83 } DiscPublishMsg;
84 
85 typedef struct {
86     char pkgName[PKG_NAME_SIZE_MAX];
87     SubscribeInfo *info;
88     ListNode node;
89 } DiscSubscribeMsg;
90 
91 static BusCenterClient g_busCenterClient = {
92     .nodeStateCbListCnt = 0,
93     .publishCb.OnPublishResult = NULL,
94     .refreshCb.OnDeviceFound = NULL,
95     .refreshCb.OnDiscoverResult = NULL,
96     .dataLevelCb.onDataLevelChanged = NULL,
97     .isInit = false,
98 };
99 
IsUdidHashEmpty(const ConnectionAddr *addr)100 static bool IsUdidHashEmpty(const ConnectionAddr *addr)
101 {
102     for (uint32_t i = 0; i < UDID_HASH_LEN; i++) {
103         if (addr->info.ble.udidHash[i] != 0) {
104             return false;
105         }
106     }
107     return true;
108 }
109 
IsSameConnectionAddr(const ConnectionAddr *addr1, const ConnectionAddr *addr2)110 static bool IsSameConnectionAddr(const ConnectionAddr *addr1, const ConnectionAddr *addr2)
111 {
112     if (addr1->type != addr2->type) {
113         return false;
114     }
115     if (addr1->type == CONNECTION_ADDR_BR) {
116         return strncmp(addr1->info.br.brMac, addr2->info.br.brMac, BT_MAC_LEN) == 0;
117     }
118     if (addr1->type == CONNECTION_ADDR_BLE) {
119         if (IsUdidHashEmpty(addr2)) {
120             return strncmp(addr1->info.ble.bleMac, addr2->info.ble.bleMac, BT_MAC_LEN) == 0;
121         }
122         return memcmp(addr1->info.ble.udidHash, addr2->info.ble.udidHash, UDID_HASH_LEN) == 0 ||
123             strncmp(addr1->info.ble.bleMac, addr2->info.ble.bleMac, BT_MAC_LEN) == 0;
124     }
125     if (addr1->type == CONNECTION_ADDR_WLAN || addr1->type == CONNECTION_ADDR_ETH) {
126         return (strncmp(addr1->info.ip.ip, addr2->info.ip.ip, IP_STR_MAX_LEN) == 0)
127             && (addr1->info.ip.port == addr2->info.ip.port);
128     }
129     if (addr1->type == CONNECTION_ADDR_SESSION) {
130         return ((addr1->info.session.sessionId == addr2->info.session.sessionId) &&
131             (addr1->info.session.channelId == addr2->info.session.channelId) &&
132             (addr1->info.session.type == addr2->info.session.type));
133     }
134     return false;
135 }
136 
FindJoinLNNCbItem(ConnectionAddr *addr, OnJoinLNNResult cb)137 static JoinLNNCbListItem *FindJoinLNNCbItem(ConnectionAddr *addr, OnJoinLNNResult cb)
138 {
139     JoinLNNCbListItem *item = NULL;
140 
141     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.joinLNNCbList, JoinLNNCbListItem, node) {
142         if (IsSameConnectionAddr(&item->addr, addr) &&
143             (cb == NULL || cb == item->cb)) {
144             return item;
145         }
146     }
147     return NULL;
148 }
149 
AddJoinLNNCbItem(ConnectionAddr *target, OnJoinLNNResult cb)150 static int32_t AddJoinLNNCbItem(ConnectionAddr *target, OnJoinLNNResult cb)
151 {
152     JoinLNNCbListItem *item = NULL;
153 
154     item = (JoinLNNCbListItem *)SoftBusMalloc(sizeof(*item));
155     if (item == NULL) {
156         LNN_LOGE(LNN_STATE, "malloc join LNN cb item fail");
157         return SOFTBUS_MALLOC_ERR;
158     }
159     ListInit(&item->node);
160     item->addr = *target;
161     item->cb = cb;
162     ListAdd(&g_busCenterClient.joinLNNCbList, &item->node);
163     return SOFTBUS_OK;
164 }
165 
FindLeaveLNNCbItem(const char *networkId, OnLeaveLNNResult cb)166 static LeaveLNNCbListItem *FindLeaveLNNCbItem(const char *networkId, OnLeaveLNNResult cb)
167 {
168     LeaveLNNCbListItem *item = NULL;
169 
170     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.leaveLNNCbList, LeaveLNNCbListItem, node) {
171         if (strcmp(item->networkId, networkId) == 0 &&
172             (cb == NULL || cb == item->cb)) {
173             return item;
174         }
175     }
176     return NULL;
177 }
178 
AddLeaveLNNCbItem(const char *networkId, OnLeaveLNNResult cb)179 static int32_t AddLeaveLNNCbItem(const char *networkId, OnLeaveLNNResult cb)
180 {
181     LeaveLNNCbListItem *item = NULL;
182 
183     item = (LeaveLNNCbListItem *)SoftBusMalloc(sizeof(*item));
184     if (item == NULL) {
185         LNN_LOGE(LNN_STATE, "malloc join LNN cb item fail");
186         return SOFTBUS_MALLOC_ERR;
187     }
188     ListInit(&item->node);
189     if (strncpy_s(item->networkId, NETWORK_ID_BUF_LEN, networkId, strlen(networkId)) != EOK) {
190         LNN_LOGE(LNN_STATE, "strcpy network id fail");
191         SoftBusFree(item);
192         return SOFTBUS_ERR;
193     }
194     item->cb = cb;
195     ListAdd(&g_busCenterClient.leaveLNNCbList, &item->node);
196     return SOFTBUS_OK;
197 }
198 
FindTimeSyncCbItem(const char *networkId, ITimeSyncCb *cb)199 static TimeSyncCallbackItem *FindTimeSyncCbItem(const char *networkId, ITimeSyncCb *cb)
200 {
201     TimeSyncCallbackItem *item = NULL;
202 
203     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.timeSyncCbList, TimeSyncCallbackItem, node) {
204         if (strcmp(item->networkId, networkId) == 0 &&
205             (cb == NULL || cb->onTimeSyncResult == item->cb.onTimeSyncResult)) {
206             return item;
207         }
208     }
209     return NULL;
210 }
211 
AddTimeSyncCbItem(const char *networkId, ITimeSyncCb *cb)212 static int32_t AddTimeSyncCbItem(const char *networkId, ITimeSyncCb *cb)
213 {
214     TimeSyncCallbackItem *item = NULL;
215 
216     item = (TimeSyncCallbackItem *)SoftBusMalloc(sizeof(*item));
217     if (item == NULL) {
218         LNN_LOGE(LNN_STATE, "malloc time sync cb item fail");
219         return SOFTBUS_MALLOC_ERR;
220     }
221     ListInit(&item->node);
222     if (strncpy_s(item->networkId, NETWORK_ID_BUF_LEN, networkId, strlen(networkId)) != EOK) {
223         LNN_LOGE(LNN_STATE, "strcpy network id fail");
224         SoftBusFree(item);
225         return SOFTBUS_ERR;
226     }
227     item->cb = *cb;
228     ListAdd(&g_busCenterClient.timeSyncCbList, &item->node);
229     return SOFTBUS_OK;
230 }
231 
ClearJoinLNNList(void)232 static void ClearJoinLNNList(void)
233 {
234     JoinLNNCbListItem *item = NULL;
235     JoinLNNCbListItem *next = NULL;
236 
237     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_busCenterClient.joinLNNCbList, JoinLNNCbListItem, node) {
238         ListDelete(&item->node);
239         SoftBusFree(item);
240     }
241 }
242 
ClearLeaveLNNList(void)243 static void ClearLeaveLNNList(void)
244 {
245     LeaveLNNCbListItem *item = NULL;
246     LeaveLNNCbListItem *next = NULL;
247 
248     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_busCenterClient.leaveLNNCbList, LeaveLNNCbListItem, node) {
249         ListDelete(&item->node);
250         SoftBusFree(item);
251     }
252 }
253 
ClearTimeSyncList(ListNode *list)254 static void ClearTimeSyncList(ListNode *list)
255 {
256     TimeSyncCallbackItem *item = NULL;
257     TimeSyncCallbackItem *next = NULL;
258 
259     LIST_FOR_EACH_ENTRY_SAFE(item, next, list, TimeSyncCallbackItem, node) {
260         ListDelete(&item->node);
261         SoftBusFree(item);
262     }
263 }
264 
ClearNodeStateCbList(ListNode *list)265 static void ClearNodeStateCbList(ListNode *list)
266 {
267     NodeStateCallbackItem *item = NULL;
268     NodeStateCallbackItem *next = NULL;
269 
270     LIST_FOR_EACH_ENTRY_SAFE(item, next, list, NodeStateCallbackItem, node) {
271         ListDelete(&item->node);
272         SoftBusFree(item);
273     }
274 }
275 
DuplicateNodeStateCbList(ListNode *list)276 static void DuplicateNodeStateCbList(ListNode *list)
277 {
278     NodeStateCallbackItem *item = NULL;
279     NodeStateCallbackItem *copyItem = NULL;
280 
281     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.nodeStateCbList, NodeStateCallbackItem, node) {
282         copyItem = (NodeStateCallbackItem *)SoftBusCalloc(sizeof(NodeStateCallbackItem));
283         if (copyItem == NULL) {
284             LNN_LOGE(LNN_STATE, "malloc node state callback item fail");
285             continue;
286         }
287         if (strncpy_s(copyItem->pkgName, PKG_NAME_SIZE_MAX, item->pkgName, PKG_NAME_SIZE_MAX - 1) != EOK) {
288             LNN_LOGE(LNN_STATE, "copy pkgName fail");
289             SoftBusFree(copyItem);
290             continue;
291         }
292         ListInit(&copyItem->node);
293         copyItem->cb = item->cb;
294         ListAdd(list, &copyItem->node);
295     }
296 }
297 
DuplicateTimeSyncResultCbList(ListNode *list, const char *networkId)298 static void DuplicateTimeSyncResultCbList(ListNode *list, const char *networkId)
299 {
300     TimeSyncCallbackItem *item = NULL;
301     TimeSyncCallbackItem *copyItem = NULL;
302 
303     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.timeSyncCbList, TimeSyncCallbackItem, node) {
304         if (strcmp(item->networkId, networkId) != 0) {
305             continue;
306         }
307         copyItem = (TimeSyncCallbackItem *)SoftBusMalloc(sizeof(TimeSyncCallbackItem));
308         if (copyItem == NULL) {
309             LNN_LOGE(LNN_STATE, "malloc time sync callback item fail");
310             continue;
311         }
312         copyItem->cb = item->cb;
313         ListInit(&copyItem->node);
314         if (strncpy_s(copyItem->networkId, NETWORK_ID_BUF_LEN, item->networkId, strlen(item->networkId)) != EOK) {
315             LNN_LOGE(LNN_STATE, "copy networkId fail");
316             SoftBusFree(copyItem);
317             continue;
318         }
319         ListAdd(list, &copyItem->node);
320     }
321 }
322 
FreeDiscPublishMsg(DiscPublishMsg **msgNode)323 static void FreeDiscPublishMsg(DiscPublishMsg **msgNode)
324 {
325     if (*msgNode != NULL && (*msgNode)->info != NULL) {
326         SoftBusFree((char *)(*msgNode)->info->capability);
327         SoftBusFree((*msgNode)->info->capabilityData);
328         SoftBusFree((*msgNode)->info);
329     }
330     SoftBusFree(*msgNode);
331     *msgNode = NULL;
332 }
333 
FreeDiscSubscribeMsg(DiscSubscribeMsg **msgNode)334 static void FreeDiscSubscribeMsg(DiscSubscribeMsg **msgNode)
335 {
336     if (*msgNode != NULL && (*msgNode)->info != NULL) {
337         SoftBusFree((char *)(*msgNode)->info->capability);
338         SoftBusFree((*msgNode)->info->capabilityData);
339         SoftBusFree((*msgNode)->info);
340     }
341     SoftBusFree(*msgNode);
342     *msgNode = NULL;
343 }
344 
BuildDiscPublishMsg(DiscPublishMsg **msgNode, const PublishInfo *info, const char *pkgName)345 static int32_t BuildDiscPublishMsg(DiscPublishMsg **msgNode, const PublishInfo *info, const char *pkgName)
346 {
347     *msgNode = (DiscPublishMsg *)SoftBusCalloc(sizeof(DiscPublishMsg));
348     if (*msgNode == NULL) {
349         LNN_LOGE(LNN_STATE, "calloc msgNode failed");
350         return SOFTBUS_MALLOC_ERR;
351     }
352     (*msgNode)->info = (PublishInfo *)SoftBusCalloc(sizeof(PublishInfo));
353     if ((*msgNode)->info == NULL) {
354         FreeDiscPublishMsg(msgNode);
355         LNN_LOGE(LNN_STATE, "calloc info failed");
356         return SOFTBUS_MALLOC_ERR;
357     }
358     (*msgNode)->info->capability = (char *)SoftBusCalloc(strlen(info->capability) + 1);
359     if ((*msgNode)->info->capability == NULL) {
360         FreeDiscPublishMsg(msgNode);
361         LNN_LOGE(LNN_STATE, "calloc capability failed");
362         return SOFTBUS_MALLOC_ERR;
363     }
364     (*msgNode)->info->publishId = info->publishId;
365     (*msgNode)->info->mode = info->mode;
366     (*msgNode)->info->medium = info->medium;
367     (*msgNode)->info->freq = info->freq;
368     (*msgNode)->info->dataLen = info->dataLen;
369     (*msgNode)->info->ranging = info->ranging;
370     if (strcpy_s((char *)(*msgNode)->info->capability, strlen(info->capability) + 1, info->capability) != EOK ||
371         strcpy_s((*msgNode)->pkgName, PKG_NAME_SIZE_MAX, pkgName) != EOK) {
372         FreeDiscPublishMsg(msgNode);
373         LNN_LOGE(LNN_STATE, "copy capability or pkgName failed");
374         return SOFTBUS_ERR;
375     }
376     if (info->dataLen > 0) {
377         (*msgNode)->info->capabilityData = (unsigned char *)SoftBusCalloc(info->dataLen + 1);
378         if ((*msgNode)->info->capabilityData == NULL) {
379             FreeDiscPublishMsg(msgNode);
380             LNN_LOGE(LNN_STATE, "calloc failed");
381             return SOFTBUS_MALLOC_ERR;
382         }
383         if (strcpy_s((char *)(*msgNode)->info->capabilityData, info->dataLen + 1,
384             (const char *)info->capabilityData) != EOK) {
385             FreeDiscPublishMsg(msgNode);
386             LNN_LOGE(LNN_STATE, "copy capabilityData failed");
387             return SOFTBUS_ERR;
388         }
389     }
390     return SOFTBUS_OK;
391 }
392 
BuildDiscSubscribeMsg(DiscSubscribeMsg **msgNode, const SubscribeInfo *info, const char *pkgName)393 static int32_t BuildDiscSubscribeMsg(DiscSubscribeMsg **msgNode, const SubscribeInfo *info, const char *pkgName)
394 {
395     *msgNode = (DiscSubscribeMsg *)SoftBusCalloc(sizeof(DiscSubscribeMsg));
396     if (*msgNode == NULL) {
397         LNN_LOGE(LNN_STATE, "calloc msgNode failed");
398         return SOFTBUS_MALLOC_ERR;
399     }
400     (*msgNode)->info = (SubscribeInfo *)SoftBusCalloc(sizeof(SubscribeInfo));
401     if ((*msgNode)->info == NULL) {
402         FreeDiscSubscribeMsg(msgNode);
403         LNN_LOGE(LNN_STATE, "calloc info failed");
404         return SOFTBUS_MALLOC_ERR;
405     }
406     (*msgNode)->info->capability = (char *)SoftBusCalloc(strlen(info->capability) + 1);
407     if ((*msgNode)->info->capability == NULL) {
408         FreeDiscSubscribeMsg(msgNode);
409         LNN_LOGE(LNN_STATE, "calloc capability failed");
410         return SOFTBUS_MALLOC_ERR;
411     }
412     (*msgNode)->info->subscribeId = info->subscribeId;
413     (*msgNode)->info->mode = info->mode;
414     (*msgNode)->info->medium = info->medium;
415     (*msgNode)->info->freq = info->freq;
416     (*msgNode)->info->dataLen = info->dataLen;
417     if (strcpy_s((char *)(*msgNode)->info->capability, strlen(info->capability) + 1, info->capability) != EOK ||
418         strcpy_s((*msgNode)->pkgName, PKG_NAME_SIZE_MAX, pkgName) != EOK) {
419         FreeDiscSubscribeMsg(msgNode);
420         LNN_LOGE(LNN_STATE, "copy capability or pkgName failed");
421         return SOFTBUS_ERR;
422     }
423     if (info->dataLen > 0) {
424         (*msgNode)->info->capabilityData = (unsigned char *)SoftBusCalloc(info->dataLen + 1);
425         if ((*msgNode)->info->capabilityData == NULL) {
426             FreeDiscSubscribeMsg(msgNode);
427             LNN_LOGE(LNN_STATE, "calloc failed");
428             return SOFTBUS_MALLOC_ERR;
429         }
430         if (strcpy_s((char *)(*msgNode)->info->capabilityData, info->dataLen + 1,
431             (const char *)info->capabilityData) != EOK) {
432             FreeDiscSubscribeMsg(msgNode);
433             LNN_LOGE(LNN_STATE, "copy capabilityData failed");
434             return SOFTBUS_ERR;
435         }
436     }
437     return SOFTBUS_OK;
438 }
439 
AddDiscPublishMsg(const char *pkgName, const PublishInfo *info)440 static int32_t AddDiscPublishMsg(const char *pkgName, const PublishInfo *info)
441 {
442     LNN_CHECK_AND_RETURN_RET_LOGW(g_isInited, SOFTBUS_NO_INIT, LNN_STATE, "disc publish list not init");
443     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_publishMsgList->lock)) == SOFTBUS_OK,
444         SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
445 
446     DiscPublishMsg *msgNode = NULL;
447     LIST_FOR_EACH_ENTRY(msgNode, &(g_publishMsgList->list), DiscPublishMsg, node) {
448         if (msgNode->info->publishId == info->publishId &&
449             strcmp(msgNode->info->capability, info->capability) == 0 && strcmp(msgNode->pkgName, pkgName) == 0) {
450             (void)SoftBusMutexUnlock(&(g_publishMsgList->lock));
451             return SOFTBUS_OK;
452         }
453     }
454 
455     if (BuildDiscPublishMsg(&msgNode, info, pkgName) != SOFTBUS_OK) {
456         (void)SoftBusMutexUnlock(&(g_publishMsgList->lock));
457         LNN_LOGE(LNN_STATE, "build DiscPublishMsg failed");
458         return SOFTBUS_ERR;
459     }
460     ListTailInsert(&(g_publishMsgList->list), &(msgNode->node));
461     (void)SoftBusMutexUnlock(&(g_publishMsgList->lock));
462     return SOFTBUS_OK;
463 }
464 
DeleteDiscPublishMsg(const char *pkgName, int32_t publishId)465 static int32_t DeleteDiscPublishMsg(const char *pkgName, int32_t publishId)
466 {
467     LNN_CHECK_AND_RETURN_RET_LOGW(g_isInited, SOFTBUS_NO_INIT, LNN_STATE, "disc publish list not init");
468     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_publishMsgList->lock)) == SOFTBUS_OK,
469         SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
470 
471     DiscPublishMsg *msgNode = NULL;
472     DiscPublishMsg *next = NULL;
473     LIST_FOR_EACH_ENTRY_SAFE(msgNode, next, &(g_publishMsgList->list), DiscPublishMsg, node) {
474         if (msgNode->info->publishId == publishId && strcmp(msgNode->pkgName, pkgName) == 0) {
475             ListDelete(&(msgNode->node));
476             FreeDiscPublishMsg(&msgNode);
477             break;
478         }
479     }
480     (void)SoftBusMutexUnlock(&(g_publishMsgList->lock));
481     return SOFTBUS_OK;
482 }
483 
AddDiscSubscribeMsg(const char *pkgName, const SubscribeInfo *info)484 static int32_t AddDiscSubscribeMsg(const char *pkgName, const SubscribeInfo *info)
485 {
486     LNN_CHECK_AND_RETURN_RET_LOGW(g_isInited, SOFTBUS_NO_INIT, LNN_STATE, "disc subscribe list not init");
487     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_discoveryMsgList->lock)) == SOFTBUS_OK,
488         SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
489 
490     DiscSubscribeMsg *msgNode = NULL;
491     LIST_FOR_EACH_ENTRY(msgNode, &(g_discoveryMsgList->list), DiscSubscribeMsg, node) {
492         if (msgNode->info->subscribeId == info->subscribeId &&
493             strcmp(msgNode->info->capability, info->capability) == 0 && strcmp(msgNode->pkgName, pkgName) == 0) {
494             (void)SoftBusMutexUnlock(&(g_discoveryMsgList->lock));
495             return SOFTBUS_OK;
496         }
497     }
498 
499     if (BuildDiscSubscribeMsg(&msgNode, info, pkgName) != SOFTBUS_OK) {
500         (void)SoftBusMutexUnlock(&(g_discoveryMsgList->lock));
501         LNN_LOGE(LNN_STATE, "build DiscSubscribeMsg failed");
502         return SOFTBUS_ERR;
503     }
504     ListTailInsert(&(g_discoveryMsgList->list), &(msgNode->node));
505     (void)SoftBusMutexUnlock(&(g_discoveryMsgList->lock));
506     return SOFTBUS_OK;
507 }
508 
DeleteDiscSubscribeMsg(const char *pkgName, int32_t refreshId)509 static int32_t DeleteDiscSubscribeMsg(const char *pkgName, int32_t refreshId)
510 {
511     LNN_CHECK_AND_RETURN_RET_LOGW(g_isInited, SOFTBUS_NO_INIT, LNN_STATE, "disc subscribe list not init");
512     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_discoveryMsgList->lock)) == SOFTBUS_OK,
513         SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
514 
515     DiscSubscribeMsg *msgNode = NULL;
516     DiscSubscribeMsg *next = NULL;
517     LIST_FOR_EACH_ENTRY_SAFE(msgNode, next, &(g_discoveryMsgList->list), DiscSubscribeMsg, node) {
518         if (msgNode->info->subscribeId == refreshId && strcmp(msgNode->pkgName, pkgName) == 0) {
519             ListDelete(&(msgNode->node));
520             FreeDiscSubscribeMsg(&msgNode);
521             break;
522         }
523     }
524     (void)SoftBusMutexUnlock(&(g_discoveryMsgList->lock));
525     return SOFTBUS_OK;
526 }
527 
DiscoveryMsgListInitnull528 static int32_t DiscoveryMsgListInit()
529 {
530     if (g_isInited) {
531         LNN_LOGI(LNN_STATE, "disc msg list already init");
532         return SOFTBUS_OK;
533     }
534     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexInit(&g_isInitedLock, NULL) == SOFTBUS_OK,
535         SOFTBUS_LOCK_ERR, LNN_STATE, "lock init failed");
536     if (SoftBusMutexLock(&g_isInitedLock) != SOFTBUS_OK) {
537         LNN_LOGE(LNN_STATE, "lock failed");
538         (void)SoftBusMutexDestroy(&g_isInitedLock);
539         return SOFTBUS_LOCK_ERR;
540     }
541     g_publishMsgList = CreateSoftBusList();
542     g_discoveryMsgList = CreateSoftBusList();
543     if (g_publishMsgList == NULL || g_discoveryMsgList == NULL) {
544         LNN_LOGE(LNN_STATE, "init disc msg list failed");
545         DestroySoftBusList(g_publishMsgList);
546         DestroySoftBusList(g_discoveryMsgList);
547         g_publishMsgList = NULL;
548         g_discoveryMsgList = NULL;
549         (void)SoftBusMutexUnlock(&g_isInitedLock);
550         return SOFTBUS_ERR;
551     }
552     g_isInited = true;
553     (void)SoftBusMutexUnlock(&g_isInitedLock);
554     static uint32_t callCount = 0;
555     LNN_LOGI(LNN_STATE, "disc list init success, callCount=%{public}u", callCount++);
556     return SOFTBUS_OK;
557 }
558 
DiscoveryMsgListDeInitnull559 static int32_t DiscoveryMsgListDeInit()
560 {
561     if (!g_isInited) {
562         LNN_LOGI(LNN_STATE, "disc msg list no need deInit");
563         return SOFTBUS_OK;
564     }
565     (void)SoftBusMutexDestroy(&g_isInitedLock);
566     DestroySoftBusList(g_publishMsgList);
567     DestroySoftBusList(g_discoveryMsgList);
568     g_publishMsgList = NULL;
569     g_discoveryMsgList = NULL;
570     g_isInited = false;
571 
572     LNN_LOGI(LNN_STATE, "disc list deinit success");
573     return SOFTBUS_OK;
574 }
575 
BusCenterClientDeinit(void)576 void BusCenterClientDeinit(void)
577 {
578     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
579         LNN_LOGE(LNN_INIT, "lock in deinit");
580         return;
581     }
582     if (DiscoveryMsgListDeInit() != SOFTBUS_OK) {
583         LNN_LOGE(LNN_INIT, "DiscoveryMsgListDeInit fail");
584         (void)SoftBusMutexUnlock(&g_busCenterClient.lock);
585         return;
586     }
587     ClearJoinLNNList();
588     ClearLeaveLNNList();
589     ClearTimeSyncList(&g_busCenterClient.timeSyncCbList);
590     ClearNodeStateCbList(&g_busCenterClient.nodeStateCbList);
591     g_busCenterClient.nodeStateCbListCnt = 0;
592     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
593         LNN_LOGE(LNN_INIT, "unlock in deinit");
594     }
595     g_busCenterClient.dataLevelCb.onDataLevelChanged = NULL;
596     SoftBusMutexDestroy(&g_busCenterClient.lock);
597     BusCenterServerProxyDeInit();
598 }
599 
BusCenterClientInit(void)600 int32_t BusCenterClientInit(void)
601 {
602     if (SoftbusGetConfig(SOFTBUS_INT_MAX_NODE_STATE_CB_CNT,
603         (unsigned char *)&g_maxNodeStateCbCount, sizeof(g_maxNodeStateCbCount)) != SOFTBUS_OK) {
604         LNN_LOGE(LNN_INIT, "Cannot get NodeStateCbCount from config file");
605         g_maxNodeStateCbCount = DEFAULT_NODE_STATE_CB_CNT;
606     }
607     LNN_LOGI(LNN_INIT, "NodeStateCbCount=%{public}u", g_maxNodeStateCbCount);
608 
609     if (SoftBusMutexInit(&g_busCenterClient.lock, NULL) != SOFTBUS_OK) {
610         LNN_LOGE(LNN_INIT, "g_busCenterClient.lock init failed");
611         return SOFTBUS_ERR;
612     }
613     if (DiscoveryMsgListInit() != SOFTBUS_OK) {
614         LNN_LOGE(LNN_INIT, "DiscoveryMsgListInit fail");
615         return SOFTBUS_ERR;
616     }
617 
618     ListInit(&g_busCenterClient.joinLNNCbList);
619     ListInit(&g_busCenterClient.leaveLNNCbList);
620     ListInit(&g_busCenterClient.nodeStateCbList);
621     ListInit(&g_busCenterClient.timeSyncCbList);
622     g_busCenterClient.isInit = true;
623     if (BusCenterServerProxyInit() != SOFTBUS_OK) {
624         LNN_LOGE(LNN_INIT, "bus center server proxy init failed");
625         BusCenterClientDeinit();
626         return SOFTBUS_ERR;
627     }
628     LNN_LOGI(LNN_INIT, "BusCenterClientInit init OK");
629     return SOFTBUS_OK;
630 }
631 
GetAllNodeDeviceInfoInner(const char *pkgName, NodeBasicInfo **info, int32_t *infoNum)632 int32_t GetAllNodeDeviceInfoInner(const char *pkgName, NodeBasicInfo **info, int32_t *infoNum)
633 {
634     int32_t ret = ServerIpcGetAllOnlineNodeInfo(pkgName, (void **)info, sizeof(NodeBasicInfo), infoNum);
635     if (ret != SOFTBUS_OK) {
636         LNN_LOGE(LNN_STATE, "Server GetAllOnlineNodeInfo failed, ret=%{public}d", ret);
637     }
638     return ret;
639 }
640 
GetLocalNodeDeviceInfoInner(const char *pkgName, NodeBasicInfo *info)641 int32_t GetLocalNodeDeviceInfoInner(const char *pkgName, NodeBasicInfo *info)
642 {
643     int32_t ret = ServerIpcGetLocalDeviceInfo(pkgName, info, sizeof(*info));
644     if (ret != SOFTBUS_OK) {
645         LNN_LOGE(LNN_STATE, "Server GetLocalNodeDeviceInfo failed, ret=%{public}d", ret);
646     }
647     return ret;
648 }
649 
GetNodeKeyInfoInner(const char *pkgName, const char *networkId, NodeDeviceInfoKey key, uint8_t *info, int32_t infoLen)650 int32_t GetNodeKeyInfoInner(const char *pkgName, const char *networkId, NodeDeviceInfoKey key,
651     uint8_t *info, int32_t infoLen)
652 {
653     int32_t ret = ServerIpcGetNodeKeyInfo(pkgName, networkId, key, info, infoLen);
654     if (ret != SOFTBUS_OK) {
655         LNN_LOGE(LNN_STATE, "Server GetNodeKeyInfo failed, ret=%{public}d", ret);
656     }
657     return ret;
658 }
659 
SetNodeDataChangeFlagInner(const char *pkgName, const char *networkId, uint16_t dataChangeFlag)660 int32_t SetNodeDataChangeFlagInner(const char *pkgName, const char *networkId, uint16_t dataChangeFlag)
661 {
662     int32_t ret = ServerIpcSetNodeDataChangeFlag(pkgName, networkId, dataChangeFlag);
663     if (ret != SOFTBUS_OK) {
664         LNN_LOGE(LNN_STATE, "Server SetNodeDataChangeFlag failed, ret=%{public}d", ret);
665     }
666     return ret;
667 }
668 
RegDataLevelChangeCbInner(const char *pkgName, IDataLevelCb *callback)669 int32_t RegDataLevelChangeCbInner(const char *pkgName, IDataLevelCb *callback)
670 {
671     LNN_LOGI(LNN_STATE, "RegDataLevelChangeCbInner enter");
672     g_busCenterClient.dataLevelCb = *callback;
673     if (strcpy_s(g_regDataLevelChangePkgName, PKG_NAME_SIZE_MAX, pkgName) != EOK) {
674         LNN_LOGE(LNN_STATE, "copy pkgName fail");
675         return SOFTBUS_MEM_ERR;
676     }
677     int32_t ret = ServerIpcRegDataLevelChangeCb(pkgName);
678     if (ret != SOFTBUS_OK) {
679         LNN_LOGE(LNN_STATE, "Server RegDataLevelChangeCb failed, ret=%{public}d", ret);
680     }
681     return ret;
682 }
683 
RestartRegDataLevelChange(void)684 void RestartRegDataLevelChange(void)
685 {
686     LNN_LOGI(LNN_STATE, "enter");
687     if (g_regDataLevelChangePkgName[0] == '\0') {
688         LNN_LOGI(LNN_STATE, "restart regDataLevelChange is not used");
689         return;
690     }
691     int32_t ret = ServerIpcRegDataLevelChangeCb(g_regDataLevelChangePkgName);
692     if (ret != SOFTBUS_OK) {
693         LNN_LOGE(LNN_STATE, "Server RegDataLevelChangeCb failed, ret=%{public}d", ret);
694         return;
695     }
696     LNN_LOGI(LNN_STATE, "Server RegDataLevelChangeCb succeed");
697 }
698 
UnregDataLevelChangeCbInner(const char *pkgName)699 int32_t UnregDataLevelChangeCbInner(const char *pkgName)
700 {
701     LNN_LOGI(LNN_STATE, "UnregDataLevelChangeCbInner enter");
702     g_busCenterClient.dataLevelCb.onDataLevelChanged = NULL;
703     int32_t ret = ServerIpcUnregDataLevelChangeCb(pkgName);
704     if (ret != SOFTBUS_OK) {
705         LNN_LOGE(LNN_STATE, "Server UnregDataLevelChangeCb failed, ret=%{public}d", ret);
706     }
707     return ret;
708 }
709 
SetDataLevelInner(const DataLevel *dataLevel)710 int32_t SetDataLevelInner(const DataLevel *dataLevel)
711 {
712     int32_t ret = ServerIpcSetDataLevel(dataLevel);
713     if (ret != SOFTBUS_OK) {
714         LNN_LOGE(LNN_STATE, "Server SetDataLevel failed, ret=%{public}d", ret);
715     }
716     return ret;
717 }
718 
JoinLNNInner(const char *pkgName, ConnectionAddr *target, OnJoinLNNResult cb)719 int32_t JoinLNNInner(const char *pkgName, ConnectionAddr *target, OnJoinLNNResult cb)
720 {
721     if (target == NULL) {
722         LNN_LOGE(LNN_STATE, "target is null");
723         return SOFTBUS_INVALID_PARAM;
724     }
725     int32_t rc;
726 
727     if (!g_busCenterClient.isInit) {
728         LNN_LOGE(LNN_STATE, "buscenter client not init");
729         return SOFTBUS_NO_INIT;
730     }
731     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
732         LNN_LOGE(LNN_STATE, "lock join lnn cb list in join");
733         return SOFTBUS_LOCK_ERR;
734     }
735 
736     do {
737         if (FindJoinLNNCbItem(target, cb) != NULL) {
738             LNN_LOGE(LNN_STATE, "join request already exist");
739             rc = SOFTBUS_ALREADY_EXISTED;
740             break;
741         }
742         rc = ServerIpcJoinLNN(pkgName, target, sizeof(*target));
743         if (rc != SOFTBUS_OK) {
744             LNN_LOGE(LNN_STATE, "request join lnn failed, ret=%{public}d", rc);
745         } else {
746             rc = AddJoinLNNCbItem(target, cb);
747         }
748     } while (false);
749     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
750         LNN_LOGE(LNN_STATE, "unlock join lnn cb list in join");
751     }
752     return rc;
753 }
754 
LeaveLNNInner(const char *pkgName, const char *networkId, OnLeaveLNNResult cb)755 int32_t LeaveLNNInner(const char *pkgName, const char *networkId, OnLeaveLNNResult cb)
756 {
757     if (networkId == NULL) {
758         LNN_LOGE(LNN_STATE, "networkId is null");
759         return SOFTBUS_INVALID_PARAM;
760     }
761     int32_t rc;
762 
763     if (!g_busCenterClient.isInit) {
764         LNN_LOGE(LNN_STATE, "buscenter client not init");
765         return SOFTBUS_NO_INIT;
766     }
767     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
768         LNN_LOGE(LNN_STATE, "lock leave lnn cb list in leave");
769         return SOFTBUS_LOCK_ERR;
770     }
771     rc = SOFTBUS_ERR;
772     do {
773         if (FindLeaveLNNCbItem(networkId, cb) != NULL) {
774             LNN_LOGE(LNN_STATE, "leave request already exist");
775             break;
776         }
777         rc = ServerIpcLeaveLNN(pkgName, networkId);
778         if (rc != SOFTBUS_OK) {
779             LNN_LOGE(LNN_STATE, "request leave lnn failed, ret=%{public}d", rc);
780         } else {
781             rc = AddLeaveLNNCbItem(networkId, cb);
782         }
783     } while (false);
784     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
785         LNN_LOGE(LNN_STATE, "unlock leave lnn cb list in leave");
786     }
787     return rc;
788 }
789 
IsSameNodeStateCb(const INodeStateCb *callback1, const INodeStateCb *callback2)790 static bool IsSameNodeStateCb(const INodeStateCb *callback1, const INodeStateCb *callback2)
791 {
792     if (callback1->events != callback2->events) {
793         return false;
794     }
795     if ((callback1->events & EVENT_NODE_STATE_ONLINE) &&
796         callback1->onNodeOnline != callback2->onNodeOnline) {
797         return false;
798     }
799     if ((callback1->events & EVENT_NODE_STATE_OFFLINE) &&
800         callback1->onNodeOffline != callback2->onNodeOffline) {
801         return false;
802     }
803     if ((callback1->events & EVENT_NODE_STATE_INFO_CHANGED) &&
804         callback1->onNodeBasicInfoChanged != callback2->onNodeBasicInfoChanged) {
805         return false;
806     }
807     if ((callback1->events & EVENT_NODE_STATUS_CHANGED) &&
808         callback1->onNodeStatusChanged != callback2->onNodeStatusChanged) {
809         return false;
810     }
811     if ((callback1->events & EVENT_NODE_HICHAIN_PROOF_EXCEPTION) &&
812         callback1->onHichainProofException != callback2->onHichainProofException) {
813         return false;
814     }
815     return true;
816 }
817 
RegNodeDeviceStateCbInner(const char *pkgName, INodeStateCb *callback)818 int32_t RegNodeDeviceStateCbInner(const char *pkgName, INodeStateCb *callback)
819 {
820     if (callback == NULL) {
821         LNN_LOGE(LNN_STATE, "callback is null");
822         return SOFTBUS_INVALID_PARAM;
823     }
824     NodeStateCallbackItem *item = NULL;
825     int32_t rc = SOFTBUS_ERR;
826 
827     if (!IsValidString(pkgName, PKG_NAME_SIZE_MAX - 1)) {
828         LNN_LOGE(LNN_STATE, "Package name is empty or length exceeds");
829         return SOFTBUS_INVALID_PARAM;
830     }
831     if (!g_busCenterClient.isInit) {
832         LNN_LOGE(LNN_STATE, "buscenter client not init");
833         return SOFTBUS_NO_INIT;
834     }
835     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
836         LNN_LOGE(LNN_STATE, "lock node state cb list in reg");
837         return SOFTBUS_LOCK_ERR;
838     }
839     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.nodeStateCbList, NodeStateCallbackItem, node) {
840         if (IsSameNodeStateCb(&item->cb, callback)) {
841             (void)SoftBusMutexUnlock(&g_busCenterClient.lock);
842             LNN_LOGI(LNN_STATE, "warn: reg node state callback repeatedly");
843             return SOFTBUS_OK;
844         }
845     }
846     do {
847         if (g_busCenterClient.nodeStateCbListCnt >= g_maxNodeStateCbCount) {
848             break;
849         }
850         item = (NodeStateCallbackItem *)SoftBusCalloc(sizeof(*item));
851         if (item == NULL) {
852             rc = SOFTBUS_MALLOC_ERR;
853             break;
854         }
855         (void)strncpy_s(item->pkgName, PKG_NAME_SIZE_MAX, pkgName, PKG_NAME_SIZE_MAX - 1);
856         ListInit(&item->node);
857         item->cb = *callback;
858         ListAdd(&g_busCenterClient.nodeStateCbList, &item->node);
859         g_busCenterClient.nodeStateCbListCnt++;
860         rc = SOFTBUS_OK;
861     } while (false);
862     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
863         LNN_LOGE(LNN_STATE, "unlock node state cb list");
864     }
865     return rc;
866 }
867 
UnregNodeDeviceStateCbInner(INodeStateCb *callback)868 int32_t UnregNodeDeviceStateCbInner(INodeStateCb *callback)
869 {
870     if (callback == NULL) {
871         LNN_LOGE(LNN_STATE, "callback is null");
872         return SOFTBUS_INVALID_PARAM;
873     }
874     NodeStateCallbackItem *item = NULL;
875     NodeStateCallbackItem *next = NULL;
876 
877     if (!g_busCenterClient.isInit) {
878         LNN_LOGE(LNN_STATE, "buscenter client not init");
879         return SOFTBUS_NO_INIT;
880     }
881     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
882         LNN_LOGE(LNN_STATE, "lock node state cb list in unreg");
883         return SOFTBUS_LOCK_ERR;
884     }
885     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_busCenterClient.nodeStateCbList, NodeStateCallbackItem, node) {
886         if (IsSameNodeStateCb(&item->cb, callback)) {
887             ListDelete(&item->node);
888             SoftBusFree(item);
889             g_busCenterClient.nodeStateCbListCnt--;
890             break;
891         }
892     }
893     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
894         LNN_LOGE(LNN_STATE, "unlock node state cb list in unreg");
895     }
896     return SOFTBUS_OK;
897 }
898 
StartTimeSyncInner(const char *pkgName, const char *targetNetworkId, TimeSyncAccuracy accuracy, TimeSyncPeriod period, ITimeSyncCb *cb)899 int32_t StartTimeSyncInner(const char *pkgName, const char *targetNetworkId, TimeSyncAccuracy accuracy,
900     TimeSyncPeriod period, ITimeSyncCb *cb)
901 {
902     int32_t rc = SOFTBUS_ERR;
903 
904     if (!g_busCenterClient.isInit) {
905         LNN_LOGE(LNN_STATE, "buscenter client not init");
906         return SOFTBUS_NO_INIT;
907     }
908     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
909         LNN_LOGE(LNN_STATE, "lock time sync cb list");
910         return SOFTBUS_LOCK_ERR;
911     }
912 
913     do {
914         if (FindTimeSyncCbItem(targetNetworkId, cb) != NULL) {
915             LNN_LOGE(LNN_STATE, "repeat pkgName request, StopTimeSync first! pkgName=%{public}s", pkgName);
916             break;
917         }
918         rc = ServerIpcStartTimeSync(pkgName, targetNetworkId, accuracy, period);
919         if (rc != SOFTBUS_OK) {
920             LNN_LOGE(LNN_STATE, "start time sync failed, ret=%{public}d", rc);
921         } else {
922             rc = AddTimeSyncCbItem(targetNetworkId, cb);
923         }
924     } while (false);
925     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
926         LNN_LOGE(LNN_STATE, "unlock time sync cb list");
927     }
928     return rc;
929 }
930 
StopTimeSyncInner(const char *pkgName, const char *targetNetworkId)931 int32_t StopTimeSyncInner(const char *pkgName, const char *targetNetworkId)
932 {
933     int32_t rc = SOFTBUS_ERR;
934     TimeSyncCallbackItem *item = NULL;
935 
936     if (!g_busCenterClient.isInit) {
937         LNN_LOGE(LNN_STATE, "buscenter client not init");
938         return SOFTBUS_NO_INIT;
939     }
940     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
941         LNN_LOGE(LNN_STATE, "lock time sync cb list");
942         return SOFTBUS_LOCK_ERR;
943     }
944 
945     while ((item = FindTimeSyncCbItem(targetNetworkId, NULL)) != NULL) {
946         rc = ServerIpcStopTimeSync(pkgName, targetNetworkId);
947         if (rc != SOFTBUS_OK) {
948             LNN_LOGE(LNN_STATE, "stop time sync failed, ret=%{public}d", rc);
949         } else {
950             ListDelete(&item->node);
951             SoftBusFree(item);
952         }
953     }
954     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
955         LNN_LOGE(LNN_STATE, "unlock time sync cb list");
956     }
957     return rc;
958 }
959 
PublishLNNInner(const char *pkgName, const PublishInfo *info, const IPublishCb *cb)960 int32_t PublishLNNInner(const char *pkgName, const PublishInfo *info, const IPublishCb *cb)
961 {
962     g_busCenterClient.publishCb = *cb;
963     int32_t ret = ServerIpcPublishLNN(pkgName, info);
964     if (ret != SOFTBUS_OK) {
965         LNN_LOGE(LNN_STATE, "Server PublishLNNInner failed, ret=%{public}d", ret);
966         return ret;
967     }
968     if (AddDiscPublishMsg(pkgName, info) != SOFTBUS_OK) {
969         LNN_LOGE(LNN_STATE, "add publish msg error");
970     }
971     return SOFTBUS_OK;
972 }
973 
StopPublishLNNInner(const char *pkgName, int32_t publishId)974 int32_t StopPublishLNNInner(const char *pkgName, int32_t publishId)
975 {
976     int32_t ret = ServerIpcStopPublishLNN(pkgName, publishId);
977     if (ret != SOFTBUS_OK) {
978         LNN_LOGE(LNN_STATE, "Server StopPublishLNNInner failed, ret=%{public}d", ret);
979         return ret;
980     }
981     if (DeleteDiscPublishMsg(pkgName, publishId) != SOFTBUS_OK) {
982         LNN_LOGE(LNN_STATE, "del publish msg error");
983     }
984     return SOFTBUS_OK;
985 }
986 
RefreshLNNInner(const char *pkgName, const SubscribeInfo *info, const IRefreshCallback *cb)987 int32_t RefreshLNNInner(const char *pkgName, const SubscribeInfo *info, const IRefreshCallback *cb)
988 {
989     g_busCenterClient.refreshCb = *cb;
990     int32_t ret = ServerIpcRefreshLNN(pkgName, info);
991     if (ret != SOFTBUS_OK) {
992         LNN_LOGE(LNN_STATE, "Server RefreshLNNInner failed, ret=%{public}d", ret);
993         return ret;
994     }
995     if (AddDiscSubscribeMsg(pkgName, info) != SOFTBUS_OK) {
996         LNN_LOGE(LNN_STATE, "add subscribe msg error");
997     }
998     return SOFTBUS_OK;
999 }
1000 
StopRefreshLNNInner(const char *pkgName, int32_t refreshId)1001 int32_t StopRefreshLNNInner(const char *pkgName, int32_t refreshId)
1002 {
1003     int32_t ret = ServerIpcStopRefreshLNN(pkgName, refreshId);
1004     if (ret != SOFTBUS_OK) {
1005         LNN_LOGE(LNN_STATE, "Server StopRefreshLNNInner failed, ret=%{public}d", ret);
1006         return ret;
1007     }
1008     if (DeleteDiscSubscribeMsg(pkgName, refreshId) != SOFTBUS_OK) {
1009         LNN_LOGE(LNN_STATE, "del subscribe msg error");
1010     }
1011     return SOFTBUS_OK;
1012 }
1013 
ActiveMetaNodeInner(const char *pkgName, const MetaNodeConfigInfo *info, char *metaNodeId)1014 int32_t ActiveMetaNodeInner(const char *pkgName, const MetaNodeConfigInfo *info, char *metaNodeId)
1015 {
1016     return ServerIpcActiveMetaNode(pkgName, info, metaNodeId);
1017 }
1018 
DeactiveMetaNodeInner(const char *pkgName, const char *metaNodeId)1019 int32_t DeactiveMetaNodeInner(const char *pkgName, const char *metaNodeId)
1020 {
1021     return ServerIpcDeactiveMetaNode(pkgName, metaNodeId);
1022 }
1023 
GetAllMetaNodeInfoInner(const char *pkgName, MetaNodeInfo *infos, int32_t *infoNum)1024 int32_t GetAllMetaNodeInfoInner(const char *pkgName, MetaNodeInfo *infos, int32_t *infoNum)
1025 {
1026     return ServerIpcGetAllMetaNodeInfo(pkgName, infos, infoNum);
1027 }
1028 
ShiftLNNGearInner(const char *pkgName, const char *callerId, const char *targetNetworkId, const GearMode *mode)1029 int32_t ShiftLNNGearInner(const char *pkgName, const char *callerId, const char *targetNetworkId, const GearMode *mode)
1030 {
1031     return ServerIpcShiftLNNGear(pkgName, callerId, targetNetworkId, mode);
1032 }
1033 
SyncTrustedRelationShipInner(const char *pkgName, const char *msg, uint32_t msgLen)1034 int32_t SyncTrustedRelationShipInner(const char *pkgName, const char *msg, uint32_t msgLen)
1035 {
1036     return ServerIpcSyncTrustedRelationShip(pkgName, msg, msgLen);
1037 }
1038 
LnnOnJoinResult(void *addr, const char *networkId, int32_t retCode)1039 NO_SANITIZE("cfi") int32_t LnnOnJoinResult(void *addr, const char *networkId, int32_t retCode)
1040 {
1041     JoinLNNCbListItem *item = NULL;
1042     ConnectionAddr *connAddr = (ConnectionAddr *)addr;
1043 
1044     if (connAddr == NULL) {
1045         return SOFTBUS_INVALID_PARAM;
1046     }
1047     if (!g_busCenterClient.isInit) {
1048         LNN_LOGE(LNN_STATE, "buscenter client not init");
1049         return SOFTBUS_ERR;
1050     }
1051 
1052     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1053         LNN_LOGE(LNN_STATE, "lock join lnn cb list in join result");
1054         return SOFTBUS_LOCK_ERR;
1055     }
1056     while ((item = FindJoinLNNCbItem((ConnectionAddr *)addr, NULL)) != NULL) {
1057         ListDelete(&item->node);
1058         if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1059             LNN_LOGE(LNN_STATE, "unlock join lnn cb list in join result");
1060         }
1061         if (item->cb != NULL) {
1062             item->cb(connAddr, networkId, retCode);
1063         }
1064         SoftBusFree(item);
1065         if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1066             LNN_LOGE(LNN_STATE, "lock join lnn cb list in join result");
1067             return SOFTBUS_LOCK_ERR;
1068         }
1069     }
1070     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1071         LNN_LOGE(LNN_STATE, "unlock join lnn cb list in join result");
1072     }
1073     return SOFTBUS_OK;
1074 }
1075 
LnnOnLeaveResult(const char *networkId, int32_t retCode)1076 int32_t LnnOnLeaveResult(const char *networkId, int32_t retCode)
1077 {
1078     LeaveLNNCbListItem *item = NULL;
1079 
1080     if (networkId == NULL) {
1081         LNN_LOGE(LNN_STATE, "networkId is null");
1082         return SOFTBUS_INVALID_PARAM;
1083     }
1084     if (!g_busCenterClient.isInit) {
1085         LNN_LOGE(LNN_STATE, "buscenter client not init");
1086         return SOFTBUS_ERR;
1087     }
1088 
1089     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1090         LNN_LOGE(LNN_STATE, "lock leave lnn cb list fail");
1091         return SOFTBUS_LOCK_ERR;
1092     }
1093     while ((item = FindLeaveLNNCbItem(networkId, NULL)) != NULL) {
1094         ListDelete(&item->node);
1095         if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1096             LNN_LOGE(LNN_STATE, "unlock leave lnn cb list fail");
1097         }
1098         if (item->cb != NULL) {
1099             item->cb(networkId, retCode);
1100         }
1101         SoftBusFree(item);
1102         if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1103             LNN_LOGE(LNN_STATE, "lock leave lnn cb list fail");
1104             return SOFTBUS_LOCK_ERR;
1105         }
1106     }
1107     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1108         LNN_LOGE(LNN_STATE, "unlock leave lnn cb list fail");
1109     }
1110     return SOFTBUS_OK;
1111 }
1112 
LnnOnNodeOnlineStateChanged(const char *pkgName, bool isOnline, void *info)1113 int32_t LnnOnNodeOnlineStateChanged(const char *pkgName, bool isOnline, void *info)
1114 {
1115     NodeStateCallbackItem *item = NULL;
1116     NodeBasicInfo *basicInfo = (NodeBasicInfo *)info;
1117     ListNode dupList;
1118 
1119     if (basicInfo == NULL || pkgName == NULL) {
1120         return SOFTBUS_INVALID_PARAM;
1121     }
1122     if (!g_busCenterClient.isInit) {
1123         LNN_LOGE(LNN_STATE, "buscenter client not init");
1124         return SOFTBUS_ERR;
1125     }
1126 
1127     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1128         LNN_LOGE(LNN_STATE, "lock node state cb list in notify");
1129         return SOFTBUS_LOCK_ERR;
1130     }
1131     ListInit(&dupList);
1132     DuplicateNodeStateCbList(&dupList);
1133     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1134         LNN_LOGE(LNN_STATE, "unlock node state cb list in notify");
1135     }
1136     LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
1137         if (isOnline == true) {
1138             if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1139                 (item->cb.events & EVENT_NODE_STATE_ONLINE) != 0) {
1140                 item->cb.onNodeOnline(basicInfo);
1141             }
1142         } else {
1143             if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1144                 (item->cb.events & EVENT_NODE_STATE_OFFLINE) != 0) {
1145                 item->cb.onNodeOffline(basicInfo);
1146             }
1147         }
1148     }
1149     ClearNodeStateCbList(&dupList);
1150     return SOFTBUS_OK;
1151 }
1152 
LnnOnNodeBasicInfoChanged(const char *pkgName, void *info, int32_t type)1153 int32_t LnnOnNodeBasicInfoChanged(const char *pkgName, void *info, int32_t type)
1154 {
1155     NodeStateCallbackItem *item = NULL;
1156     NodeBasicInfo *basicInfo = (NodeBasicInfo *)info;
1157     ListNode dupList;
1158 
1159     if (basicInfo == NULL || pkgName == NULL) {
1160         LNN_LOGE(LNN_STATE, "info or pkgName is null");
1161         return SOFTBUS_INVALID_PARAM;
1162     }
1163     if (!g_busCenterClient.isInit) {
1164         LNN_LOGE(LNN_STATE, "buscenter client not init");
1165         return SOFTBUS_ERR;
1166     }
1167 
1168     if ((type < 0) || (type > TYPE_NETWORK_INFO)) {
1169         LNN_LOGE(LNN_STATE, "OnNodeBasicInfoChanged invalid type. type=%{public}d", type);
1170         return SOFTBUS_INVALID_PARAM;
1171     }
1172 
1173     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1174         LNN_LOGE(LNN_STATE, "lock node basic info cb list in notify");
1175         return SOFTBUS_LOCK_ERR;
1176     }
1177     ListInit(&dupList);
1178     DuplicateNodeStateCbList(&dupList);
1179     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1180         LNN_LOGE(LNN_STATE, "unlock node basic info cb list in notify");
1181     }
1182     LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
1183         if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1184             (item->cb.events & EVENT_NODE_STATE_INFO_CHANGED) != 0) {
1185             item->cb.onNodeBasicInfoChanged((NodeBasicInfoType)type, basicInfo);
1186         }
1187     }
1188     ClearNodeStateCbList(&dupList);
1189     return SOFTBUS_OK;
1190 }
1191 
LnnOnNodeStatusChanged(const char *pkgName, void *info, int32_t type)1192 int32_t LnnOnNodeStatusChanged(const char *pkgName, void *info, int32_t type)
1193 {
1194     if (pkgName == NULL || info == NULL) {
1195         LNN_LOGE(LNN_STATE, "pkgName or info is null");
1196         return SOFTBUS_INVALID_PARAM;
1197     }
1198     NodeStateCallbackItem *item = NULL;
1199     NodeStatus *nodeStatus = (NodeStatus *)info;
1200     ListNode dupList;
1201     if (!g_busCenterClient.isInit) {
1202         LNN_LOGE(LNN_STATE, "buscenter client not init");
1203         return SOFTBUS_NO_INIT;
1204     }
1205 
1206     if ((type < 0) || (type > TYPE_STATUS_MAX)) {
1207         LNN_LOGE(LNN_STATE, "LnnOnNodeStatusChanged invalid type. type=%{public}d", type);
1208         return SOFTBUS_INVALID_PARAM;
1209     }
1210 
1211     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1212         LNN_LOGE(LNN_STATE, "lock node status cb list in notify");
1213         return SOFTBUS_LOCK_ERR;
1214     }
1215     ListInit(&dupList);
1216     DuplicateNodeStateCbList(&dupList);
1217     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1218         LNN_LOGE(LNN_STATE, "unlock node status cb list in notify");
1219     }
1220     char *anonyPkgName = NULL;
1221     Anonymize(pkgName, &anonyPkgName);
1222     LNN_LOGI(LNN_STATE, "LnnOnNodeStatusChanged, pkgName=%{public}s, type=%{public}d, screen=%{public}d",
1223         AnonymizeWrapper(anonyPkgName), type, nodeStatus->reserved[0]);
1224     LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
1225         if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1226             (item->cb.events & EVENT_NODE_STATUS_CHANGED) != 0 && item->cb.onNodeStatusChanged != NULL) {
1227             LNN_LOGI(LNN_STATE, "LnnOnNodeStatusChanged, pkgName=%{public}s, type=%{public}d, screen=%{public}d",
1228                 AnonymizeWrapper(anonyPkgName), type, nodeStatus->reserved[0]);
1229             item->cb.onNodeStatusChanged((NodeStatusType)type, nodeStatus);
1230         }
1231     }
1232     AnonymizeFree(anonyPkgName);
1233     ClearNodeStateCbList(&dupList);
1234     return SOFTBUS_OK;
1235 }
1236 
LnnOnLocalNetworkIdChanged(const char *pkgName)1237 int32_t LnnOnLocalNetworkIdChanged(const char *pkgName)
1238 {
1239     NodeStateCallbackItem *item = NULL;
1240     ListNode dupList;
1241 
1242     if (pkgName == NULL) {
1243         LNN_LOGE(LNN_STATE, "info or pkgName is null");
1244         return SOFTBUS_INVALID_PARAM;
1245     }
1246     if (!g_busCenterClient.isInit) {
1247         LNN_LOGE(LNN_STATE, "buscenter client not init");
1248         return SOFTBUS_NO_INIT;
1249     }
1250 
1251     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1252         LNN_LOGE(LNN_STATE, "lock local networkId cb list in notify");
1253         return SOFTBUS_LOCK_ERR;
1254     }
1255     ListInit(&dupList);
1256     DuplicateNodeStateCbList(&dupList);
1257     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1258         LNN_LOGE(LNN_STATE, "unlock local networkId cb list in notify");
1259     }
1260     LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
1261         if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1262             (item->cb.onLocalNetworkIdChanged) != NULL) {
1263             item->cb.onLocalNetworkIdChanged();
1264         }
1265     }
1266     ClearNodeStateCbList(&dupList);
1267     return SOFTBUS_OK;
1268 }
1269 
LnnOnNodeDeviceTrustedChange(const char *pkgName, int32_t type, const char *msg, uint32_t msgLen)1270 int32_t LnnOnNodeDeviceTrustedChange(const char *pkgName, int32_t type, const char *msg, uint32_t msgLen)
1271 {
1272     NodeStateCallbackItem *item = NULL;
1273     ListNode dupList;
1274 
1275     if (pkgName == NULL) {
1276         LNN_LOGE(LNN_STATE, "pkgName is null");
1277         return SOFTBUS_INVALID_PARAM;
1278     }
1279     if (!g_busCenterClient.isInit) {
1280         LNN_LOGE(LNN_STATE, "buscenter client not init");
1281         return SOFTBUS_NO_INIT;
1282     }
1283 
1284     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1285         LNN_LOGE(LNN_STATE, "lock local cb list in notify");
1286         return SOFTBUS_LOCK_ERR;
1287     }
1288     ListInit(&dupList);
1289     DuplicateNodeStateCbList(&dupList);
1290     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1291         LNN_LOGE(LNN_STATE, "unlock local cb list in notify");
1292     }
1293     LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
1294         if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1295             (item->cb.onNodeDeviceTrustedChange) != NULL) {
1296             item->cb.onNodeDeviceTrustedChange((TrustChangeType)type, msg, msgLen);
1297         }
1298     }
1299     ClearNodeStateCbList(&dupList);
1300     return SOFTBUS_OK;
1301 }
1302 
LnnOnHichainProofException( const char *pkgName, const char *deviceList, uint32_t deviceListLen, uint16_t deviceTypeId, int32_t errCode)1303 int32_t LnnOnHichainProofException(
1304     const char *pkgName, const char *deviceList, uint32_t deviceListLen, uint16_t deviceTypeId, int32_t errCode)
1305 {
1306     NodeStateCallbackItem *item = NULL;
1307     ListNode dupList;
1308 
1309     if (pkgName == NULL) {
1310         LNN_LOGE(LNN_STATE, "pkgName is null");
1311         return SOFTBUS_INVALID_PARAM;
1312     }
1313     if (!g_busCenterClient.isInit) {
1314         LNN_LOGE(LNN_STATE, "buscenter client not init");
1315         return SOFTBUS_NO_INIT;
1316     }
1317     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1318         LNN_LOGE(LNN_STATE, "lock auth restrict cb list in notify");
1319         return SOFTBUS_LOCK_ERR;
1320     }
1321     ListInit(&dupList);
1322     DuplicateNodeStateCbList(&dupList);
1323     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1324         LNN_LOGE(LNN_STATE, "unlock auth restrict cb list in notify");
1325     }
1326     LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
1327         if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1328             (item->cb.events & EVENT_NODE_HICHAIN_PROOF_EXCEPTION) != 0 && item->cb.onHichainProofException != NULL) {
1329             item->cb.onHichainProofException(deviceList, deviceListLen, deviceTypeId, errCode);
1330             char *anonyPkgName = NULL;
1331             char *anonyDeviceList = NULL;
1332             Anonymize(pkgName, &anonyPkgName);
1333             Anonymize(deviceList, &anonyDeviceList);
1334             LNN_LOGI(LNN_STATE,
1335                 "onHichainProofException, pkgName=%{public}s, deviceList=%{public}s, errCode=%{public}d, "
1336                 "type=%{public}hu",
1337                 AnonymizeWrapper(anonyPkgName), AnonymizeWrapper(anonyDeviceList), errCode, deviceTypeId);
1338             AnonymizeFree(anonyPkgName);
1339             AnonymizeFree(anonyDeviceList);
1340         }
1341     }
1342     ClearNodeStateCbList(&dupList);
1343     return SOFTBUS_OK;
1344 }
1345 
LnnOnTimeSyncResult(const void *info, int32_t retCode)1346 int32_t LnnOnTimeSyncResult(const void *info, int32_t retCode)
1347 {
1348     TimeSyncCallbackItem *item = NULL;
1349     TimeSyncResultInfo *basicInfo = (TimeSyncResultInfo *)info;
1350     ListNode dupList;
1351 
1352     if (info == NULL) {
1353         LNN_LOGE(LNN_STATE, "info or list is null");
1354         return SOFTBUS_INVALID_PARAM;
1355     }
1356     if (!g_busCenterClient.isInit) {
1357         LNN_LOGE(LNN_STATE, "buscenter client not init");
1358         return SOFTBUS_ERR;
1359     }
1360 
1361     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1362         LNN_LOGE(LNN_STATE, "lock time sync cb list in time sync result");
1363         return SOFTBUS_LOCK_ERR;
1364     }
1365     ListInit(&dupList);
1366     DuplicateTimeSyncResultCbList(&dupList, basicInfo->target.targetNetworkId);
1367     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1368         LNN_LOGE(LNN_STATE, "unlock time sync cb list in time sync result");
1369     }
1370     LIST_FOR_EACH_ENTRY(item, &dupList, TimeSyncCallbackItem, node) {
1371         if (item->cb.onTimeSyncResult != NULL) {
1372             item->cb.onTimeSyncResult((TimeSyncResultInfo *)info, retCode);
1373         }
1374     }
1375     ClearTimeSyncList(&dupList);
1376     return SOFTBUS_OK;
1377 }
1378 
LnnOnPublishLNNResult(int32_t publishId, int32_t reason)1379 void LnnOnPublishLNNResult(int32_t publishId, int32_t reason)
1380 {
1381     if (g_busCenterClient.publishCb.OnPublishResult != NULL) {
1382         g_busCenterClient.publishCb.OnPublishResult(publishId, (PublishResult)reason);
1383     }
1384 }
1385 
LnnOnRefreshLNNResult(int32_t refreshId, int32_t reason)1386 void LnnOnRefreshLNNResult(int32_t refreshId, int32_t reason)
1387 {
1388     if (g_busCenterClient.refreshCb.OnDiscoverResult != NULL) {
1389         g_busCenterClient.refreshCb.OnDiscoverResult(refreshId, (RefreshResult)reason);
1390     }
1391 }
1392 
LnnOnRefreshDeviceFound(const void *device)1393 void LnnOnRefreshDeviceFound(const void *device)
1394 {
1395     if (g_busCenterClient.refreshCb.OnDeviceFound != NULL) {
1396         g_busCenterClient.refreshCb.OnDeviceFound((const DeviceInfo *)device);
1397     }
1398 }
1399 
LnnOnDataLevelChanged(const char *networkId, const DataLevelInfo *dataLevelInfo)1400 void LnnOnDataLevelChanged(const char *networkId, const DataLevelInfo *dataLevelInfo)
1401 {
1402     if (g_busCenterClient.dataLevelCb.onDataLevelChanged == NULL) {
1403         LNN_LOGW(LNN_STATE, "data level callback is null");
1404         return;
1405     }
1406     DataLevel dataLevel = {
1407         .dynamicLevel = dataLevelInfo->dynamicLevel,
1408         .staticLevel = dataLevelInfo->staticLevel,
1409         .switchLevel = dataLevelInfo->switchLevel,
1410         .switchLength = dataLevelInfo->switchLength
1411     };
1412     g_busCenterClient.dataLevelCb.onDataLevelChanged(networkId, dataLevel);
1413 }
1414 
DiscRecoveryPublishnull1415 int32_t DiscRecoveryPublish()
1416 {
1417     if (!g_isInited) {
1418         LNN_LOGI(LNN_STATE, "no need recovery publish");
1419         return SOFTBUS_OK;
1420     }
1421     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_publishMsgList->lock)) == SOFTBUS_OK,
1422         SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
1423 
1424     DiscPublishMsg *msgNode = NULL;
1425     int32_t ret = SOFTBUS_OK;
1426     LIST_FOR_EACH_ENTRY(msgNode, &(g_publishMsgList->list), DiscPublishMsg, node) {
1427         if (ServerIpcPublishLNN(msgNode->pkgName, msgNode->info) != SOFTBUS_OK) {
1428             LNN_LOGE(LNN_STATE, "recovery publish error, pkgName=%{public}s, capability=%{public}s",
1429                 msgNode->pkgName, msgNode->info->capability);
1430             ret = SOFTBUS_ERR;
1431         } else {
1432             LNN_LOGI(LNN_STATE, "recovery publish success, pkgName=%{public}s, capability=%{public}s",
1433                 msgNode->pkgName, msgNode->info->capability);
1434         }
1435     }
1436 
1437     (void)SoftBusMutexUnlock(&(g_publishMsgList->lock));
1438     return ret;
1439 }
1440 
DiscRecoverySubscribenull1441 int32_t DiscRecoverySubscribe()
1442 {
1443     if (!g_isInited) {
1444         LNN_LOGI(LNN_STATE, "no need recovery subscribe");
1445         return SOFTBUS_OK;
1446     }
1447     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_discoveryMsgList->lock)) == SOFTBUS_OK,
1448         SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
1449 
1450     DiscSubscribeMsg *msgNode = NULL;
1451     int32_t ret = SOFTBUS_OK;
1452     LIST_FOR_EACH_ENTRY(msgNode, &(g_discoveryMsgList->list), DiscSubscribeMsg, node) {
1453         if (ServerIpcRefreshLNN(msgNode->pkgName, msgNode->info) != SOFTBUS_OK) {
1454             LNN_LOGE(LNN_STATE, "recovery subscribe error, pkgName=%{public}s, capability=%{public}s",
1455                 msgNode->pkgName, msgNode->info->capability);
1456             ret = SOFTBUS_ERR;
1457         } else {
1458             LNN_LOGI(LNN_STATE, "recovery subscribe success, pkgName=%{public}s, capability=%{public}s",
1459                 msgNode->pkgName, msgNode->info->capability);
1460         }
1461     }
1462 
1463     (void)SoftBusMutexUnlock(&(g_discoveryMsgList->lock));
1464     return ret;
1465 }
1466