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 }