• 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 "bus_center_event.h"
17 
18 #include <securec.h>
19 #include <stdlib.h>
20 
21 #include "bus_center_manager.h"
22 #include "lnn_bus_center_ipc.h"
23 #include "lnn_network_id.h"
24 #include "message_handler.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_log.h"
30 #include "softbus_qos.h"
31 
32 typedef struct {
33     ListNode node;
34     LnnEventHandler handler;
35 } LnnEventHandlerItem;
36 
37 typedef struct {
38     ListNode handlers[LNN_EVENT_TYPE_MAX];
39     SoftBusMutex lock;
40 } BusCenterEventCtrl;
41 
42 typedef enum {
43     NOTIFY_ONLINE_STATE_CHANGED = 0,
44     NOTIFY_NODE_BASIC_INFO_CHANGED,
45     NOTIFY_NETWORKID_UPDATE,
46 } NotifyType;
47 
48 #define NETWORK_ID_UPDATE_DELAY_TIME (60 * 60 * 1000 * 24) // 24 hour
49 
50 static BusCenterEventCtrl g_eventCtrl;
51 static SoftBusHandler g_notifyHandler = {"NotifyHandler", NULL, NULL};
52 
PostMessageToHandlerDelay(SoftBusMessage * msg,uint64_t delayMillis)53 NO_SANITIZE("cfi") static int32_t PostMessageToHandlerDelay(SoftBusMessage *msg, uint64_t delayMillis)
54 {
55     if (g_notifyHandler.looper == NULL) {
56         LLOGE("NotifyHandler not initialized.");
57         FreeMessage(msg);
58         return SOFTBUS_NO_INIT;
59     }
60     if (g_notifyHandler.looper->PostMessage == NULL || g_notifyHandler.looper->PostMessageDelay == NULL) {
61         LLOGE("invalid looper");
62         FreeMessage(msg);
63         return SOFTBUS_ERR;
64     }
65     if (delayMillis == 0) {
66         g_notifyHandler.looper->PostMessage(g_notifyHandler.looper, msg);
67     } else {
68         g_notifyHandler.looper->PostMessageDelay(g_notifyHandler.looper, msg, delayMillis);
69     }
70     return SOFTBUS_OK;
71 }
72 
RemoveNotifyMessage(int32_t what)73 static void RemoveNotifyMessage(int32_t what)
74 {
75     if (g_notifyHandler.looper == NULL) {
76         LLOGE("looper not initialized, can't remove message");
77         return;
78     }
79     if (g_notifyHandler.looper->RemoveMessage == NULL) {
80         LLOGE("removeMessage is null");
81         return;
82     }
83     g_notifyHandler.looper->RemoveMessage(g_notifyHandler.looper, &g_notifyHandler, what);
84 }
85 
HandleOnlineStateChangedMessage(SoftBusMessage * msg)86 static void HandleOnlineStateChangedMessage(SoftBusMessage *msg)
87 {
88     if (msg->obj == NULL) {
89         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid online state message.");
90         return;
91     }
92     bool isOnline = (bool)msg->arg1;
93     LnnIpcNotifyOnlineState(isOnline, msg->obj, sizeof(NodeBasicInfo));
94 }
95 
HandleNodeBasicInfoChangedMessage(SoftBusMessage * msg)96 static void HandleNodeBasicInfoChangedMessage(SoftBusMessage *msg)
97 {
98     if (msg->obj == NULL) {
99         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid node basic info message.");
100         return;
101     }
102     int32_t type = (int32_t)msg->arg1;
103     LnnIpcNotifyBasicInfoChanged(msg->obj, sizeof(NodeBasicInfo), type);
104 }
105 
HandleNetworkUpdateMessage(SoftBusMessage * msg)106 static void HandleNetworkUpdateMessage(SoftBusMessage *msg)
107 {
108     (void)msg;
109     char networkId[NETWORK_ID_BUF_LEN] = {0};
110     if (LnnGenLocalNetworkId(networkId, NETWORK_ID_BUF_LEN) != SOFTBUS_OK) {
111         LLOGE("generate networkid fail");
112         return;
113     }
114     LnnSetLocalStrInfo(STRING_KEY_NETWORKID, networkId);
115     LLOGD("offline exceted 5min, process networkId update event");
116 }
117 
HandleNotifyMessage(SoftBusMessage * msg)118 NO_SANITIZE("cfi") static void HandleNotifyMessage(SoftBusMessage *msg)
119 {
120     if (msg == NULL) {
121         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid notify message.");
122         return;
123     }
124     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "handle notify message, type = %d.", msg->what);
125     switch (msg->what) {
126         case NOTIFY_ONLINE_STATE_CHANGED:
127             HandleOnlineStateChangedMessage(msg);
128             break;
129         case NOTIFY_NODE_BASIC_INFO_CHANGED:
130             HandleNodeBasicInfoChangedMessage(msg);
131             break;
132         case NOTIFY_NETWORKID_UPDATE:
133             HandleNetworkUpdateMessage(msg);
134             break;
135         default:
136             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "unknown notify message, type = %d.", msg->what);
137             break;
138     }
139     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "handle notify message done, type = %d.", msg->what);
140 }
141 
FreeNotifyMessage(SoftBusMessage * msg)142 NO_SANITIZE("cfi") static void FreeNotifyMessage(SoftBusMessage *msg)
143 {
144     if (msg == NULL) {
145         return;
146     }
147     if (msg->obj != NULL) {
148         SoftBusFree(msg->obj);
149         msg->obj = NULL;
150     }
151     SoftBusFree(msg);
152 }
153 
DupNodeBasicInfo(const NodeBasicInfo * info)154 static NodeBasicInfo *DupNodeBasicInfo(const NodeBasicInfo *info)
155 {
156     if (info == NULL) {
157         return NULL;
158     }
159     NodeBasicInfo *dupInfo = SoftBusMalloc(sizeof(NodeBasicInfo));
160     if (dupInfo == NULL) {
161         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc NodeBasicInfo err.");
162         return NULL;
163     }
164     if (memcpy_s(dupInfo, sizeof(NodeBasicInfo), info, sizeof(NodeBasicInfo)) != EOK) {
165         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy NodeBasicInfo fail.");
166         SoftBusFree(dupInfo);
167         return NULL;
168     }
169     return dupInfo;
170 }
171 
PostNotifyMessage(int32_t what,uint64_t arg,const NodeBasicInfo * info)172 static int32_t PostNotifyMessage(int32_t what, uint64_t arg, const NodeBasicInfo *info)
173 {
174     SoftBusMessage *msg = SoftBusCalloc(sizeof(SoftBusMessage));
175     if (msg == NULL) {
176         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc msg err.");
177         return SOFTBUS_MALLOC_ERR;
178     }
179     msg->what = what;
180     msg->arg1 = arg;
181     msg->obj = DupNodeBasicInfo(info);
182     if (msg->obj == NULL) {
183         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "dup NodeBasicInfo err.");
184         SoftBusFree(msg);
185         return SOFTBUS_MEM_ERR;
186     }
187     msg->handler = &g_notifyHandler;
188     msg->FreeMessage = FreeNotifyMessage;
189     return PostMessageToHandlerDelay(msg, 0);
190 }
191 
PostNotifyMessageDelay(int32_t what,uint64_t delayMillis)192 static int32_t PostNotifyMessageDelay(int32_t what, uint64_t delayMillis)
193 {
194     SoftBusMessage *msg = SoftBusCalloc(sizeof(SoftBusMessage));
195     if (msg == NULL) {
196         LLOGE("malloc msg fail");
197         return SOFTBUS_MALLOC_ERR;
198     }
199     msg->what = what;
200     msg->handler = &g_notifyHandler;
201     msg->FreeMessage = FreeNotifyMessage;
202     return PostMessageToHandlerDelay(msg, delayMillis);
203 }
204 
IsRepeatEventHandler(LnnEventType event,LnnEventHandler handler)205 static bool IsRepeatEventHandler(LnnEventType event, LnnEventHandler handler)
206 {
207     LnnEventHandlerItem *item = NULL;
208 
209     LIST_FOR_EACH_ENTRY(item, &g_eventCtrl.handlers[event], LnnEventHandlerItem, node) {
210         if (item->handler == handler) {
211             return true;
212         }
213     }
214     return false;
215 }
216 
CreateEventHandlerItem(LnnEventHandler handler)217 static LnnEventHandlerItem *CreateEventHandlerItem(LnnEventHandler handler)
218 {
219     LnnEventHandlerItem *item = SoftBusMalloc(sizeof(LnnEventHandlerItem));
220 
221     if (item == NULL) {
222         return NULL;
223     }
224     ListInit(&item->node);
225     item->handler = handler;
226     return item;
227 }
228 
NotifyEvent(const LnnEventBasicInfo * info)229 NO_SANITIZE("cfi") static void NotifyEvent(const LnnEventBasicInfo *info)
230 {
231     LnnEventHandlerItem *item = NULL;
232 
233     if (SoftBusMutexLock(&g_eventCtrl.lock) != 0) {
234         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "lock failed in notify event");
235         return;
236     }
237     LIST_FOR_EACH_ENTRY(item, &g_eventCtrl.handlers[info->event], LnnEventHandlerItem, node) {
238         item->handler(info);
239     }
240     (void)SoftBusMutexUnlock(&g_eventCtrl.lock);
241 }
242 
LnnNotifyDeviceVerified(const char * udid)243 void LnnNotifyDeviceVerified(const char *udid)
244 {
245     (void)udid;
246     LLOGI("exist device joining LNN, remove networkId update event");
247     RemoveNotifyMessage(NOTIFY_NETWORKID_UPDATE);
248 }
249 
LnnNotifyOnlineState(bool isOnline,NodeBasicInfo * info)250 NO_SANITIZE("cfi") void LnnNotifyOnlineState(bool isOnline, NodeBasicInfo *info)
251 {
252     LnnOnlineStateEventInfo eventInfo;
253 
254     if (info == NULL) {
255         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "para : info = null!");
256         return;
257     }
258     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "notify node %s %s",
259         info->deviceName, (isOnline == true) ? "online" : "offline");
260     SetDefaultQdisc();
261     (void)PostNotifyMessage(NOTIFY_ONLINE_STATE_CHANGED, (uint64_t)isOnline, info);
262     eventInfo.basic.event = LNN_EVENT_NODE_ONLINE_STATE_CHANGED;
263     eventInfo.isOnline = isOnline;
264     eventInfo.networkId = info->networkId;
265     eventInfo.uuid = "";
266     eventInfo.udid = "";
267     NotifyEvent((LnnEventBasicInfo *)&eventInfo);
268     int32_t onlineNodeNum = 0;
269     if (LnnGetAllOnlineNodeNum(&onlineNodeNum) != SOFTBUS_OK) {
270         LLOGE("get online nodeNum fail");
271         return;
272     }
273     if (!isOnline && onlineNodeNum == 0) {
274         LLOGI("no online devices, post networkId update event");
275         RemoveNotifyMessage(NOTIFY_NETWORKID_UPDATE);
276         (void)PostNotifyMessageDelay(NOTIFY_NETWORKID_UPDATE, NETWORK_ID_UPDATE_DELAY_TIME);
277     }
278     if (isOnline) {
279         LLOGI("online process, remove networkId update event");
280         RemoveNotifyMessage(NOTIFY_NETWORKID_UPDATE);
281     }
282 }
283 
LnnNotifyMigrate(bool isOnline,NodeBasicInfo * info)284 void LnnNotifyMigrate(bool isOnline, NodeBasicInfo *info)
285 {
286     LnnOnlineStateEventInfo eventInfo;
287 
288     if (info == NULL) {
289         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "para : info = null!");
290         return;
291     }
292     eventInfo.basic.event = LNN_EVENT_NODE_MIGRATE;
293     eventInfo.isOnline = isOnline;
294     eventInfo.networkId = info->networkId;
295     NotifyEvent((LnnEventBasicInfo *)&eventInfo);
296 }
297 
LnnNotifyBasicInfoChanged(NodeBasicInfo * info,NodeBasicInfoType type)298 NO_SANITIZE("cfi") void LnnNotifyBasicInfoChanged(NodeBasicInfo *info, NodeBasicInfoType type)
299 {
300     if (info == NULL) {
301         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "para : info = null!");
302         return;
303     }
304     if (type == TYPE_DEVICE_NAME) {
305         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "notify peer device name changed %s", info->deviceName);
306     }
307     (void)PostNotifyMessage(NOTIFY_NODE_BASIC_INFO_CHANGED, (uint64_t)type, info);
308 }
309 
LnnNotifyJoinResult(ConnectionAddr * addr,const char * networkId,int32_t retCode)310 NO_SANITIZE("cfi") void LnnNotifyJoinResult(ConnectionAddr *addr, const char *networkId, int32_t retCode)
311 {
312     if (addr == NULL) {
313         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "para : addr or networkId = null!");
314         return;
315     }
316     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "notify join LNN result :%d", retCode);
317     LnnIpcNotifyJoinResult(addr, sizeof(ConnectionAddr), networkId, retCode);
318 }
319 
MetaNodeNotifyJoinResult(ConnectionAddr * addr,const char * networkId,int32_t retCode)320 NO_SANITIZE("cfi") void MetaNodeNotifyJoinResult(ConnectionAddr *addr, const char *networkId, int32_t retCode)
321 {
322     if (addr == NULL) {
323         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "para : addr or networkId = null!");
324         return;
325     }
326     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "notify join MetaNode result :%d", retCode);
327     MetaNodeIpcNotifyJoinResult(addr, sizeof(ConnectionAddr), networkId, retCode);
328 }
329 
LnnNotifyLeaveResult(const char * networkId,int32_t retCode)330 NO_SANITIZE("cfi") void LnnNotifyLeaveResult(const char *networkId, int32_t retCode)
331 {
332     if (networkId == NULL) {
333         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "para : networkId = null!");
334         return;
335     }
336     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "notify leave LNN result %d", retCode);
337     LnnIpcNotifyLeaveResult(networkId, retCode);
338 }
339 
MetaNodeNotifyLeaveResult(const char * networkId,int32_t retCode)340 NO_SANITIZE("cfi") void MetaNodeNotifyLeaveResult(const char *networkId, int32_t retCode)
341 {
342     if (networkId == NULL) {
343         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "para : networkId = null!");
344         return;
345     }
346     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "notify leave MetaNode result %d", retCode);
347     MetaNodeIpcNotifyLeaveResult(networkId, retCode);
348 }
349 
LnnNotifyLnnRelationChanged(const char * udid,ConnectionAddrType type,uint8_t relation,bool isJoin)350 NO_SANITIZE("cfi") void LnnNotifyLnnRelationChanged(const char *udid, ConnectionAddrType type, uint8_t relation,
351     bool isJoin)
352 {
353     LnnRelationChanedEventInfo info;
354 
355     info.basic.event = LNN_EVENT_RELATION_CHANGED;
356     info.type = type;
357     info.relation = relation;
358     info.isJoin = isJoin;
359     info.udid = udid;
360     NotifyEvent((LnnEventBasicInfo *)&info);
361 }
362 
LnnNotifyTimeSyncResult(const char * pkgName,int32_t pid,const TimeSyncResultInfo * info,int32_t retCode)363 NO_SANITIZE("cfi") void LnnNotifyTimeSyncResult(const char *pkgName, int32_t pid, const TimeSyncResultInfo *info,
364     int32_t retCode)
365 {
366     if (pkgName == NULL || info == NULL) {
367         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid paramters");
368         return;
369     }
370     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "notify time Sync result %d", retCode);
371     LnnIpcNotifyTimeSyncResult(pkgName, pid, info, sizeof(TimeSyncResultInfo), retCode);
372 }
373 
LnnNotifyWlanStateChangeEvent(SoftBusWifiState state)374 NO_SANITIZE("cfi") void LnnNotifyWlanStateChangeEvent(SoftBusWifiState state)
375 {
376     if (state < SOFTBUS_WIFI_CONNECTED || state > SOFTBUS_WIFI_UNKNOWN) {
377         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "bad state %d", state);
378         return;
379     }
380     LnnMonitorWlanStateChangedEvent event = {.basic.event = LNN_EVENT_WIFI_STATE_CHANGED, .status = state};
381     NotifyEvent((const LnnEventBasicInfo *)&event);
382 }
383 
LnnNotifyScreenStateChangeEvent(SoftBusScreenState state)384 NO_SANITIZE("cfi") void LnnNotifyScreenStateChangeEvent(SoftBusScreenState state)
385 {
386     if (state < SOFTBUS_SCREEN_ON || state >= SOFTBUS_SCREEN_UNKNOWN) {
387         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "bad state %d", state);
388         return;
389     }
390     LnnMonitorHbStateChangedEvent event = {.basic.event = LNN_EVENT_SCREEN_STATE_CHANGED, .status = state};
391     NotifyEvent((const LnnEventBasicInfo *)&event);
392 }
393 
LnnNotifyBtStateChangeEvent(void * state)394 NO_SANITIZE("cfi") void LnnNotifyBtStateChangeEvent(void *state)
395 {
396     SoftBusBtState *btState = (SoftBusBtState *)state;
397     if (*btState < SOFTBUS_BLE_TURN_ON || *btState >= SOFTBUS_BT_UNKNOWN) {
398         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "bad btState %d", *btState);
399         SoftBusFree(btState);
400         return;
401     }
402     LnnMonitorHbStateChangedEvent event = {.basic.event = LNN_EVENT_BT_STATE_CHANGED, .status = (uint8_t)(*btState)};
403     NotifyEvent((const LnnEventBasicInfo *)&event);
404     SoftBusFree(btState);
405 }
406 
LnnNotifyScreenLockStateChangeEvent(SoftBusScreenLockState state)407 void LnnNotifyScreenLockStateChangeEvent(SoftBusScreenLockState state)
408 {
409     if (state < SOFTBUS_SCREEN_LOCK || state >= SOFTBUS_SCREEN_LOCK_UNKNOWN) {
410         LLOGE("bad lockState %d", state);
411         return;
412     }
413     LnnMonitorHbStateChangedEvent event = {.basic.event = LNN_EVENT_SCREEN_LOCK_CHANGED, .status = state};
414     NotifyEvent((const LnnEventBasicInfo *)&event);
415 }
416 
LnnNotifyAccountStateChangeEvent(void * state)417 void LnnNotifyAccountStateChangeEvent(void *state)
418 {
419     SoftBusAccountState *accountState = (SoftBusAccountState *)state;
420     if (*accountState < SOFTBUS_ACCOUNT_LOG_IN || *accountState >= SOFTBUS_ACCOUNT_UNKNOWN) {
421         LLOGE("bad accountState %d", *accountState);
422         SoftBusFree(accountState);
423         return;
424     }
425     LnnMonitorHbStateChangedEvent event = {.basic.event = LNN_EVENT_ACCOUNT_CHANGED,
426         .status = (uint8_t)(*accountState)};
427     NotifyEvent((const LnnEventBasicInfo *)&event);
428     SoftBusFree(accountState);
429 }
430 
LnnNotifyDifferentAccountChangeEvent(void * state)431 void LnnNotifyDifferentAccountChangeEvent(void *state)
432 {
433     SoftBusDifferentAccountState *difAccountState = (SoftBusDifferentAccountState *)state;
434     if (*difAccountState < SOFTBUS_DIF_ACCOUNT_DEV_CHANGE || *difAccountState >= SOFTBUS_DIF_ACCOUNT_UNKNOWN) {
435         LLOGE("bad difAccountState %d", *difAccountState);
436         SoftBusFree(difAccountState);
437         return;
438     }
439     LnnMonitorHbStateChangedEvent event = {.basic.event = LNN_EVENT_DIF_ACCOUNT_DEV_CHANGED,
440         .status = (uint8_t)(*difAccountState)};
441     NotifyEvent((const LnnEventBasicInfo *)&event);
442     SoftBusFree(difAccountState);
443 }
444 
LnnNotifyUserStateChangeEvent(SoftBusUserState state)445 void LnnNotifyUserStateChangeEvent(SoftBusUserState state)
446 {
447     if (state < SOFTBUS_USER_FOREGROUND || state >= SOFTBUS_USER_UNKNOWN) {
448         LLOGE("bad backgroundtState %d", state);
449         return;
450     }
451     LnnMonitorHbStateChangedEvent event = {.basic.event = LNN_EVENT_USER_STATE_CHANGED, .status = state};
452     NotifyEvent((const LnnEventBasicInfo *)&event);
453 }
454 
LnnNotifyNightModeStateChangeEvent(void * state)455 void LnnNotifyNightModeStateChangeEvent(void *state)
456 {
457     SoftBusNightModeState *nightModeState = (SoftBusNightModeState *)state;
458     if (*nightModeState < SOFTBUS_NIGHT_MODE_ON || *nightModeState >= SOFTBUS_NIGHT_MODE_UNKNOWN) {
459         LLOGE("bad nightModeState %d", *nightModeState);
460         SoftBusFree(nightModeState);
461         return;
462     }
463     LnnMonitorHbStateChangedEvent event = {.basic.event = LNN_EVENT_NIGHT_MODE_CHANGED,
464         .status = (uint8_t)(*nightModeState)};
465     NotifyEvent((const LnnEventBasicInfo *)&event);
466     SoftBusFree(nightModeState);
467 }
468 
LnnNotifyHomeGroupChangeEvent(SoftBusHomeGroupState state)469 void LnnNotifyHomeGroupChangeEvent(SoftBusHomeGroupState state)
470 {
471     LLOGI("[native]notify home group change");
472     LnnMonitorHbStateChangedEvent event = {.basic.event = LNN_EVENT_HOME_GROUP_CHANGED, .status = (uint8_t)state};
473     NotifyEvent((const LnnEventBasicInfo *)&event);
474 }
475 
LnnNotifyOOBEStateChangeEvent(SoftBusOOBEState state)476 void LnnNotifyOOBEStateChangeEvent(SoftBusOOBEState state)
477 {
478     if (state < SOFTBUS_OOBE_RUNNING || state >= SOFTBUS_OOBE_UNKNOWN) {
479         LLOGE("bad OOBEState %d", state);
480         return;
481     }
482     LnnMonitorHbStateChangedEvent event = {.basic.event = LNN_EVENT_OOBE_STATE_CHANGED, .status = state};
483     NotifyEvent((const LnnEventBasicInfo *)&event);
484 }
485 
LnnNotifyBtAclStateChangeEvent(const char * btMac,SoftBusBtAclState state)486 NO_SANITIZE("cfi") void LnnNotifyBtAclStateChangeEvent(const char *btMac, SoftBusBtAclState state)
487 {
488     if (btMac == NULL) {
489         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid btMac, state = %d", state);
490         return;
491     }
492     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
493         "notify bt acl state changed: state=%d, btMac=%s.", state, AnonymizesMac(btMac));
494     LnnMonitorBtAclStateChangedEvent event = {.basic.event = LNN_EVENT_BT_ACL_STATE_CHANGED, .status = state};
495     if (strcpy_s(event.btMac, sizeof(event.btMac), btMac) != EOK) {
496         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy bt mac fail");
497         return;
498     }
499     NotifyEvent((const LnnEventBasicInfo *)&event);
500 }
501 
LnnNotifyAddressChangedEvent(const char * ifName)502 NO_SANITIZE("cfi") void LnnNotifyAddressChangedEvent(const char *ifName)
503 {
504     LnnMonitorAddressChangedEvent event = {.basic.event = LNN_EVENT_IP_ADDR_CHANGED, .ifName = {0}};
505     if (ifName != NULL) {
506         int32_t ret = strcpy_s(event.ifName, sizeof(event.ifName), ifName);
507         if (ret != EOK) {
508             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy ifName failed!ret=%d", ret);
509             return;
510         }
511     }
512     NotifyEvent((const LnnEventBasicInfo *)&event);
513 }
514 
LnnNotifyMasterNodeChanged(bool isMaster,const char * masterNodeUdid,int32_t weight)515 NO_SANITIZE("cfi") void LnnNotifyMasterNodeChanged(bool isMaster, const char *masterNodeUdid, int32_t weight)
516 {
517     LnnMasterNodeChangedEvent event = {.basic.event = LNN_EVENT_NODE_MASTER_STATE_CHANGED,
518         .isMasterNode = isMaster,
519         .masterNodeUDID = masterNodeUdid,
520         .weight = weight};
521 
522     NotifyEvent((const LnnEventBasicInfo *)&event);
523 }
524 
LnnNotifyNodeAddressChanged(const char * addr,const char * networkId,bool isLocal)525 NO_SANITIZE("cfi") void LnnNotifyNodeAddressChanged(const char *addr, const char *networkId, bool isLocal)
526 {
527     if (addr == NULL) {
528         return;
529     }
530 
531     LnnNodeAddrChangedEvent eventInfo;
532     (void)memset_s(&eventInfo, sizeof(eventInfo), 0, sizeof(eventInfo));
533     eventInfo.basic.event = LNN_EVENT_NODE_ADDR_CHANGED;
534     if (strcpy_s(eventInfo.addr, sizeof(eventInfo.addr), addr) != EOK ||
535         strcpy_s(eventInfo.networkId, NETWORK_ID_BUF_LEN, networkId) != EOK) {
536         return;
537     }
538     if (strcmp(addr, NODE_ADDR_LOOPBACK) == 0) {
539         eventInfo.delFlag = true;
540     } else {
541         eventInfo.delFlag = false;
542     }
543     eventInfo.isLocal = isLocal;
544     NotifyEvent((LnnEventBasicInfo *)&eventInfo);
545 }
546 
LnnNotifyHBRepeat(void)547 NO_SANITIZE("cfi") void LnnNotifyHBRepeat(void)
548 {
549     LnnEventBasicInfo event;
550     event.event = LNN_EVENT_NODE_HB_REPEAT_CYCLE;
551 
552     NotifyEvent(&event);
553 }
554 
LnnNotifyNetworkStateChanged(SoftBusNetworkState state)555 NO_SANITIZE("cfi") void LnnNotifyNetworkStateChanged(SoftBusNetworkState state)
556 {
557     if (state < SOFTBUS_WIFI_NETWORKD_ENABLE || state >= SOFTBUS_NETWORKD_UNKNOWN) {
558         LLOGE("bad network state %d", state);
559         return;
560     }
561     LnnMonitorHbStateChangedEvent event = {.basic.event = LNN_EVENT_NETWORK_STATE_CHANGED, .status = state};
562     NotifyEvent((const LnnEventBasicInfo *)&event);
563 }
564 
LnnInitBusCenterEvent(void)565 NO_SANITIZE("cfi") int32_t LnnInitBusCenterEvent(void)
566 {
567     int32_t i;
568     SoftBusLooper *looper = CreateNewLooper("NotifyLooper");
569     if (looper == NULL) {
570         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "create notify looper fail.");
571         return SOFTBUS_ERR;
572     }
573     g_notifyHandler.looper = looper;
574     g_notifyHandler.HandleMessage = HandleNotifyMessage;
575 
576     SoftBusMutexAttr mutexAttr;
577     mutexAttr.type = SOFTBUS_MUTEX_RECURSIVE;
578     SoftBusMutexInit(&g_eventCtrl.lock, &mutexAttr);
579     for (i = 0; i < LNN_EVENT_TYPE_MAX; ++i) {
580         ListInit(&g_eventCtrl.handlers[i]);
581     }
582     return SOFTBUS_OK;
583 }
584 
LnnDeinitBusCenterEvent(void)585 NO_SANITIZE("cfi") void LnnDeinitBusCenterEvent(void)
586 {
587     if (g_notifyHandler.looper != NULL) {
588         DestroyLooper(g_notifyHandler.looper);
589         g_notifyHandler.looper = NULL;
590         g_notifyHandler.HandleMessage = NULL;
591     }
592     SoftBusMutexDestroy(&g_eventCtrl.lock);
593 }
594 
LnnRegisterEventHandler(LnnEventType event,LnnEventHandler handler)595 NO_SANITIZE("cfi") int32_t LnnRegisterEventHandler(LnnEventType event, LnnEventHandler handler)
596 {
597     LnnEventHandlerItem *item = NULL;
598 
599     if (event == LNN_EVENT_TYPE_MAX || handler == NULL) {
600         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid event handler params");
601         return SOFTBUS_INVALID_PARAM;
602     }
603     if (SoftBusMutexLock(&g_eventCtrl.lock) != 0) {
604         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "lock failed in register event handler");
605         return SOFTBUS_LOCK_ERR;
606     }
607     if (IsRepeatEventHandler(event, handler)) {
608         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "event(%u) handler is already exist", event);
609         (void)SoftBusMutexUnlock(&g_eventCtrl.lock);
610         return SOFTBUS_INVALID_PARAM;
611     }
612     item = CreateEventHandlerItem(handler);
613     if (item == NULL) {
614         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "create event handler item failed");
615         (void)SoftBusMutexUnlock(&g_eventCtrl.lock);
616         return SOFTBUS_MEM_ERR;
617     }
618     ListAdd(&g_eventCtrl.handlers[event], &item->node);
619     (void)SoftBusMutexUnlock(&g_eventCtrl.lock);
620     return SOFTBUS_OK;
621 }
622 
LnnUnregisterEventHandler(LnnEventType event,LnnEventHandler handler)623 NO_SANITIZE("cfi") void LnnUnregisterEventHandler(LnnEventType event, LnnEventHandler handler)
624 {
625     LnnEventHandlerItem *item = NULL;
626     LnnEventHandlerItem *next = NULL;
627 
628     if (event == LNN_EVENT_TYPE_MAX || handler == NULL) {
629         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid event handler params");
630         return;
631     }
632     if (SoftBusMutexLock(&g_eventCtrl.lock) != 0) {
633         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "hold lock failed in unregister event handler");
634         return;
635     }
636     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_eventCtrl.handlers[event], LnnEventHandlerItem, node) {
637         if (item->handler == handler) {
638             ListDelete(&item->node);
639             SoftBusFree(item);
640             break;
641         }
642     }
643     (void)SoftBusMutexUnlock(&g_eventCtrl.lock);
644 }