• 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 "lnn_net_builder.h"
17 
18 #include <securec.h>
19 #include <stdlib.h>
20 #include <inttypes.h>
21 
22 #include "auth_interface.h"
23 #include "auth_request.h"
24 #include "auth_hichain_adapter.h"
25 #include "bus_center_event.h"
26 #include "bus_center_manager.h"
27 #include "common_list.h"
28 #include "lnn_async_callback_utils.h"
29 #include "lnn_battery_info.h"
30 #include "lnn_cipherkey_manager.h"
31 #include "lnn_connection_addr_utils.h"
32 #include "lnn_connection_fsm.h"
33 #include "lnn_deviceinfo_to_profile.h"
34 #include "lnn_devicename_info.h"
35 #include "lnn_discovery_manager.h"
36 #include "lnn_distributed_net_ledger.h"
37 #include "lnn_fast_offline.h"
38 #include "lnn_heartbeat_utils.h"
39 #include "lnn_local_net_ledger.h"
40 #include "lnn_network_id.h"
41 #include "lnn_network_info.h"
42 #include "lnn_network_manager.h"
43 #include "lnn_node_info.h"
44 #include "lnn_node_weight.h"
45 #include "lnn_p2p_info.h"
46 #include "lnn_physical_subnet_manager.h"
47 #include "lnn_sync_info_manager.h"
48 #include "lnn_sync_item_info.h"
49 #include "lnn_topo_manager.h"
50 #include "softbus_adapter_crypto.h"
51 #include "softbus_adapter_mem.h"
52 #include "softbus_errcode.h"
53 #include "softbus_feature_config.h"
54 #include "softbus_hisysevt_bus_center.h"
55 #include "softbus_json_utils.h"
56 #include "softbus_adapter_json.h"
57 #include "softbus_log.h"
58 #include "softbus_utils.h"
59 
60 #define LNN_CONN_CAPABILITY_MSG_LEN 8
61 #define DEFAULT_MAX_LNN_CONNECTION_COUNT 10
62 #define JSON_KEY_MASTER_UDID "MasterUdid"
63 #define JSON_KEY_MASTER_WEIGHT "MasterWeight"
64 #define NOT_TRUSTED_DEVICE_MSG_DELAY 5000
65 #define SHORT_UDID_HASH_STR_LEN 16
66 #define DEFAULT_PKG_NAME "com.huawei.nearby"
67 
68 typedef enum {
69     MSG_TYPE_JOIN_LNN = 0,
70     MSG_TYPE_DISCOVERY_DEVICE,
71     MSG_TYPE_CLEAN_CONN_FSM,
72     MSG_TYPE_VERIFY_RESULT,
73     MSG_TYPE_DEVICE_VERIFY_PASS,
74     MSG_TYPE_DEVICE_DISCONNECT = 5,
75     MSG_TYPE_DEVICE_NOT_TRUSTED,
76     MSG_TYPE_LEAVE_LNN,
77     MSG_TYPE_SYNC_OFFLINE_FINISH,
78     MSG_TYPE_NODE_STATE_CHANGED,
79     MSG_TYPE_MASTER_ELECT = 10,
80     MSG_TYPE_LEAVE_INVALID_CONN,
81     MSG_TYPE_LEAVE_BY_ADDR_TYPE,
82     MSG_TYPE_LEAVE_SPECIFIC,
83     MSG_TYPE_JOIN_METANODE,
84     MSG_TYPE_JOIN_METANODE_AUTH_PASS,
85     MSG_TYPE_LEAVE_METANODE,
86     MSG_TYPE_JOIN_METANODE_AUTH_FAIL,
87     MSG_TYPE_MAX,
88 } NetBuilderMessageType;
89 
90 typedef int32_t (*NetBuilderMessageProcess)(const void *para);
91 
92 typedef struct {
93     ListNode node;
94     ConnectionAddr addr;
95     bool needReportFailure;
96 } PendingJoinRequestNode;
97 
98 typedef struct {
99     NodeType nodeType;
100 
101     /* connection fsm list */
102     ListNode fsmList;
103     ListNode pendingList;
104     ListNode metaNodeList;
105     /* connection count */
106     int32_t connCount;
107 
108     SoftBusLooper *looper;
109     SoftBusHandler handler;
110 
111     int32_t maxConnCount;
112     int32_t maxConcurrentCount;
113     bool isInit;
114 } NetBuilder;
115 
116 typedef struct {
117     uint32_t requestId;
118     int32_t retCode;
119     int64_t authId;
120     NodeInfo *nodeInfo;
121 } VerifyResultMsgPara;
122 
123 typedef struct {
124     ConnectionAddr addr;
125     int64_t authId;
126     NodeInfo *nodeInfo;
127 } DeviceVerifyPassMsgPara;
128 
129 typedef struct {
130     char networkId[NETWORK_ID_BUF_LEN];
131     char masterUdid[UDID_BUF_LEN];
132     int32_t masterWeight;
133 } ElectMsgPara;
134 
135 typedef struct {
136     char oldNetworkId[NETWORK_ID_BUF_LEN];
137     ConnectionAddrType addrType;
138     char newNetworkId[NETWORK_ID_BUF_LEN];
139 } LeaveInvalidConnMsgPara;
140 
141 typedef struct {
142     char networkId[NETWORK_ID_BUF_LEN];
143     ConnectionAddrType addrType;
144 } SpecificLeaveMsgPara;
145 
146 typedef struct {
147     ConnectionAddr addr;
148     CustomData customData;
149     char pkgName[PKG_NAME_SIZE_MAX];
150     int32_t callingPid;
151 } ConnectionAddrKey;
152 
153 typedef struct {
154     MetaJoinRequestNode *metaJoinNode;
155     int32_t reason;
156 } MetaReason;
157 
158 typedef struct {
159     MetaJoinRequestNode *metaJoinNode;
160     int64_t authMetaId;
161     NodeInfo info;
162 } MetaAuthInfo;
163 
164 typedef struct {
165     char pkgName[PKG_NAME_SIZE_MAX];
166     bool isNeedConnect;
167     ConnectionAddr addr;
168 } JoinLnnMsgPara;
169 
170 typedef struct {
171     char pkgName[PKG_NAME_SIZE_MAX];
172     char networkId[NETWORK_ID_BUF_LEN];
173 } LeaveLnnMsgPara;
174 
175 static NetBuilder g_netBuilder;
176 static bool g_watchdogFlag = true;
177 
SfcSyncNodeAddrHandle(const char * networkId,int32_t code)178 void __attribute__((weak)) SfcSyncNodeAddrHandle(const char *networkId, int32_t code)
179 {
180     (void)networkId;
181     (void)code;
182 }
183 
SetWatchdogFlag(bool flag)184 NO_SANITIZE("cfi") void SetWatchdogFlag(bool flag)
185 {
186     g_watchdogFlag = flag;
187 }
188 
GetWatchdogFlag(void)189 NO_SANITIZE("cfi") bool GetWatchdogFlag(void)
190 {
191     return g_watchdogFlag;
192 }
193 
NetBuilderConfigInit(void)194 static void NetBuilderConfigInit(void)
195 {
196     if (SoftbusGetConfig(SOFTBUS_INT_MAX_LNN_CONNECTION_CNT,
197         (unsigned char *)&g_netBuilder.maxConnCount, sizeof(g_netBuilder.maxConnCount)) != SOFTBUS_OK) {
198         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get lnn max connection count fail, use default value");
199         g_netBuilder.maxConnCount = DEFAULT_MAX_LNN_CONNECTION_COUNT;
200     }
201     if (SoftbusGetConfig(SOFTBUS_INT_LNN_MAX_CONCURRENT_NUM,
202         (unsigned char *)&g_netBuilder.maxConcurrentCount, sizeof(g_netBuilder.maxConcurrentCount)) != SOFTBUS_OK) {
203         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get lnn max conncurent count fail, use default value");
204         g_netBuilder.maxConcurrentCount = 0;
205     }
206     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "lnn config is %d,%d",
207         g_netBuilder.maxConnCount, g_netBuilder.maxConcurrentCount);
208 }
209 
CreateNetBuilderMessage(int32_t msgType,void * para)210 static SoftBusMessage *CreateNetBuilderMessage(int32_t msgType, void *para)
211 {
212     SoftBusMessage *msg = (SoftBusMessage *)SoftBusCalloc(sizeof(SoftBusMessage));
213     if (msg == NULL) {
214         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc softbus message failed");
215         return NULL;
216     }
217     msg->what = msgType;
218     msg->obj = para;
219     msg->handler = &g_netBuilder.handler;
220     return msg;
221 }
222 
PostMessageToHandler(int32_t msgType,void * para)223 NO_SANITIZE("cfi") static int32_t PostMessageToHandler(int32_t msgType, void *para)
224 {
225     SoftBusMessage *msg = CreateNetBuilderMessage(msgType, para);
226     if (msg == NULL) {
227         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "create softbus message failed");
228         return SOFTBUS_ERR;
229     }
230     g_netBuilder.looper->PostMessage(g_netBuilder.looper, msg);
231     return SOFTBUS_OK;
232 }
233 
FindConnectionFsmByAddr(const ConnectionAddr * addr)234 static LnnConnectionFsm *FindConnectionFsmByAddr(const ConnectionAddr *addr)
235 {
236     LnnConnectionFsm *item = NULL;
237 
238     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
239         if (LnnIsSameConnectionAddr(addr, &item->connInfo.addr)) {
240             return item;
241         }
242     }
243     return NULL;
244 }
245 
FindMetaNodeByAddr(const ConnectionAddr * addr)246 static MetaJoinRequestNode *FindMetaNodeByAddr(const ConnectionAddr *addr)
247 {
248     MetaJoinRequestNode *item = NULL;
249 
250     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.metaNodeList, MetaJoinRequestNode, node) {
251         if (LnnIsSameConnectionAddr(addr, &item->addr)) {
252             return item;
253         }
254     }
255     return NULL;
256 }
257 
FindMetaNodeByRequestId(uint32_t requestId)258 static MetaJoinRequestNode *FindMetaNodeByRequestId(uint32_t requestId)
259 {
260     MetaJoinRequestNode *item = NULL;
261 
262     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.metaNodeList, MetaJoinRequestNode, node) {
263         if (item->requestId == requestId) {
264             return item;
265         }
266     }
267     return NULL;
268 }
269 
FindConnectionFsmByRequestId(uint32_t requestId)270 static LnnConnectionFsm *FindConnectionFsmByRequestId(uint32_t requestId)
271 {
272     LnnConnectionFsm *item = NULL;
273 
274     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
275         if (item->connInfo.requestId == requestId) {
276             return item;
277         }
278     }
279     return NULL;
280 }
281 
FindConnectionFsmByAuthId(int64_t authId)282 static LnnConnectionFsm *FindConnectionFsmByAuthId(int64_t authId)
283 {
284     LnnConnectionFsm *item = NULL;
285 
286     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
287         if (item->connInfo.authId == authId) {
288             return item;
289         }
290     }
291     return NULL;
292 }
293 
FindConnectionFsmByNetworkId(const char * networkId)294 static LnnConnectionFsm *FindConnectionFsmByNetworkId(const char *networkId)
295 {
296     LnnConnectionFsm *item = NULL;
297 
298     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
299         if (strcmp(networkId, item->connInfo.peerNetworkId) == 0) {
300             return item;
301         }
302     }
303     return NULL;
304 }
305 
FindConnectionFsmByConnFsmId(uint16_t connFsmId)306 static LnnConnectionFsm *FindConnectionFsmByConnFsmId(uint16_t connFsmId)
307 {
308     LnnConnectionFsm *item = NULL;
309 
310     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
311         if (connFsmId == item->id) {
312             return item;
313         }
314     }
315     return NULL;
316 }
317 
SetBeginJoinLnnTime(LnnConnectionFsm * connFsm)318 static void SetBeginJoinLnnTime(LnnConnectionFsm *connFsm)
319 {
320     connFsm->statisticData.beginJoinLnnTime = LnnUpTimeMs();
321 }
322 
StartNewConnectionFsm(const ConnectionAddr * addr,const char * pkgName,bool isNeedConnect)323 static LnnConnectionFsm *StartNewConnectionFsm(const ConnectionAddr *addr, const char *pkgName, bool isNeedConnect)
324 {
325     LnnConnectionFsm *connFsm = NULL;
326 
327     if (g_netBuilder.connCount >= g_netBuilder.maxConnCount) {
328         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "current connection is exceed max limit: %d",
329             g_netBuilder.connCount);
330         return NULL;
331     }
332     connFsm = LnnCreateConnectionFsm(addr, pkgName, isNeedConnect);
333     if (connFsm == NULL) {
334         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "create connection fsm failed");
335         return NULL;
336     }
337     if (LnnStartConnectionFsm(connFsm) != SOFTBUS_OK) {
338         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "start connection fsm[id=%u] failed", connFsm->id);
339         LnnDestroyConnectionFsm(connFsm);
340         return NULL;
341     }
342     SetBeginJoinLnnTime(connFsm);
343     ListAdd(&g_netBuilder.fsmList, &connFsm->node);
344     ++g_netBuilder.connCount;
345     return connFsm;
346 }
347 
IsNodeOnline(const char * networkId)348 static bool IsNodeOnline(const char *networkId)
349 {
350     return LnnGetOnlineStateById(networkId, CATEGORY_NETWORK_ID);
351 }
352 
UpdateLocalMasterNode(bool isCurrentNode,const char * masterUdid,int32_t weight)353 static void UpdateLocalMasterNode(bool isCurrentNode, const char *masterUdid, int32_t weight)
354 {
355     if (LnnSetLocalStrInfo(STRING_KEY_MASTER_NODE_UDID, masterUdid) != SOFTBUS_OK) {
356         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "set local master udid failed");
357         return;
358     }
359     if (LnnSetLocalNumInfo(NUM_KEY_MASTER_NODE_WEIGHT, weight) != SOFTBUS_OK) {
360         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "set local master weight failed");
361     }
362     LnnNotifyMasterNodeChanged(isCurrentNode, masterUdid, weight);
363     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "update local master weight=%d", weight);
364 }
365 
IsNeedSyncElectMsg(const char * networkId)366 static bool IsNeedSyncElectMsg(const char *networkId)
367 {
368     NodeInfo nodeInfo;
369     (void)memset_s(&nodeInfo, sizeof(NodeInfo), 0, sizeof(NodeInfo));
370     if (LnnGetRemoteNodeInfoById(networkId, CATEGORY_NETWORK_ID, &nodeInfo) != SOFTBUS_OK) {
371         return false;
372     }
373     return LnnHasDiscoveryType(&nodeInfo, DISCOVERY_TYPE_WIFI);
374 }
375 
SyncElectMessage(const char * networkId)376 static int32_t SyncElectMessage(const char *networkId)
377 {
378     char masterUdid[UDID_BUF_LEN] = {0};
379     int32_t masterWeight;
380     char *data = NULL;
381     cJSON *json = NULL;
382     int32_t rc;
383 
384     if (!IsNeedSyncElectMsg(networkId)) {
385         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_WARN, "no ip networking, dont sync elect msg, networkId:%s",
386             AnonymizesNetworkID(networkId));
387         return SOFTBUS_OK;
388     }
389     if (LnnGetLocalStrInfo(STRING_KEY_MASTER_NODE_UDID, masterUdid, UDID_BUF_LEN) != SOFTBUS_OK ||
390         LnnGetLocalNumInfo(NUM_KEY_MASTER_NODE_WEIGHT, &masterWeight) != SOFTBUS_OK) {
391         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get local master node info failed");
392         return SOFTBUS_INVALID_PARAM;
393     }
394     json = cJSON_CreateObject();
395     if (json == NULL) {
396         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "create elect json object failed");
397         return SOFTBUS_ERR;
398     }
399     if (!AddStringToJsonObject(json, JSON_KEY_MASTER_UDID, masterUdid) ||
400         !AddNumberToJsonObject(json, JSON_KEY_MASTER_WEIGHT, masterWeight)) {
401         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "add elect info to json failed");
402         cJSON_Delete(json);
403         return SOFTBUS_ERR;
404     }
405     data = cJSON_PrintUnformatted(json);
406     cJSON_Delete(json);
407     if (data == NULL) {
408         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "format elect packet fail");
409         return SOFTBUS_ERR;
410     }
411     rc = LnnSendSyncInfoMsg(LNN_INFO_TYPE_MASTER_ELECT, networkId, (uint8_t *)data, strlen(data) + 1, NULL);
412     cJSON_free(data);
413     return rc;
414 }
415 
SendElectMessageToAll(const char * skipNetworkId)416 static void SendElectMessageToAll(const char *skipNetworkId)
417 {
418     LnnConnectionFsm *item = NULL;
419 
420     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
421         if (skipNetworkId != NULL && strcmp(item->connInfo.peerNetworkId, skipNetworkId) == 0) {
422             continue;
423         }
424         if (!IsNodeOnline(item->connInfo.peerNetworkId)) {
425             continue;
426         }
427         if (SyncElectMessage(item->connInfo.peerNetworkId) != SOFTBUS_OK) {
428             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "sync elect info to connFsm(%u) failed", item->id);
429         }
430     }
431 }
432 
NeedPendingJoinRequest(void)433 static bool NeedPendingJoinRequest(void)
434 {
435     int32_t count = 0;
436     LnnConnectionFsm *item = NULL;
437 
438     if (g_netBuilder.maxConcurrentCount == 0) { // do not limit concurent
439         return false;
440     }
441     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
442         if (item->isDead) {
443             continue;
444         }
445         if ((item->connInfo.flag & LNN_CONN_INFO_FLAG_ONLINE) != 0) {
446             continue;
447         }
448         ++count;
449         if (count >= g_netBuilder.maxConcurrentCount) {
450             return true;
451         }
452     }
453     return false;
454 }
455 
IsSamePendingRequest(const PendingJoinRequestNode * request)456 static bool IsSamePendingRequest(const PendingJoinRequestNode *request)
457 {
458     PendingJoinRequestNode *item = NULL;
459 
460     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.pendingList, PendingJoinRequestNode, node) {
461         if (LnnIsSameConnectionAddr(&item->addr, &request->addr) &&
462             item->needReportFailure == request->needReportFailure) {
463             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_DBG, "there is same pending join request");
464             return true;
465         }
466     }
467     return false;
468 }
469 
TryPendingJoinRequest(const JoinLnnMsgPara * para,bool needReportFailure)470 static bool TryPendingJoinRequest(const JoinLnnMsgPara *para, bool needReportFailure)
471 {
472     PendingJoinRequestNode *request = NULL;
473     if (para == NULL || !para->isNeedConnect) {
474         LLOGI("not connect online not need pending.");
475         return false;
476     }
477     if (!NeedPendingJoinRequest()) {
478         return false;
479     }
480     request = (PendingJoinRequestNode *)SoftBusCalloc(sizeof(PendingJoinRequestNode));
481     if (request == NULL) {
482         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc pending join request fail, go on it");
483         return false;
484     }
485     ListInit(&request->node);
486     request->addr = para->addr;
487     request->needReportFailure = needReportFailure;
488     if (IsSamePendingRequest(request)) {
489         SoftBusFree(request);
490         return true;
491     }
492     ListTailInsert(&g_netBuilder.pendingList, &request->node);
493     return true;
494 }
495 
TryJoinRequestMetaNode(const char * pkgName,const ConnectionAddr * addr,int32_t callingPid,bool needReportFailure)496 static MetaJoinRequestNode *TryJoinRequestMetaNode(const char *pkgName, const ConnectionAddr *addr,
497     int32_t callingPid, bool needReportFailure)
498 {
499     MetaJoinRequestNode *request = NULL;
500 
501     request = (MetaJoinRequestNode *)SoftBusCalloc(sizeof(MetaJoinRequestNode));
502     if (request == NULL) {
503         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc MetaNode join request fail, go on it");
504         return NULL;
505     }
506     ListInit(&request->node);
507     request->addr = *addr;
508     request->callingPid = callingPid;
509     request->needReportFailure = needReportFailure;
510     if (memcpy_s(request->pkgName, PKG_NAME_SIZE_MAX, pkgName, strlen(pkgName)) != EOK) {
511         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "memcpy_s error");
512         SoftBusFree(request);
513         return NULL;
514     }
515     ListTailInsert(&g_netBuilder.metaNodeList, &request->node);
516     return request;
517 }
518 
PostJoinRequestToConnFsm(LnnConnectionFsm * connFsm,const ConnectionAddr * addr,const char * pkgName,bool isNeedConnect,bool needReportFailure)519 static int32_t PostJoinRequestToConnFsm(LnnConnectionFsm *connFsm, const ConnectionAddr *addr,
520     const char* pkgName, bool isNeedConnect, bool needReportFailure)
521 {
522     int32_t rc = SOFTBUS_OK;
523     bool isCreate = false;
524 
525     if (connFsm == NULL) {
526         connFsm = FindConnectionFsmByAddr(addr);
527     }
528     if (connFsm == NULL || connFsm->isDead) {
529         connFsm = StartNewConnectionFsm(addr, pkgName, isNeedConnect);
530         isCreate = true;
531     }
532     if (connFsm == NULL || LnnSendJoinRequestToConnFsm(connFsm) != SOFTBUS_OK) {
533         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "process join lnn request failed");
534         if (needReportFailure) {
535             LnnNotifyJoinResult((ConnectionAddr *)addr, NULL, SOFTBUS_ERR);
536         }
537         if (connFsm != NULL && isCreate) {
538             LnnDestroyConnectionFsm(connFsm);
539         }
540         rc = SOFTBUS_ERR;
541     }
542     if (rc == SOFTBUS_OK) {
543         connFsm->connInfo.flag |=
544             (needReportFailure ? LNN_CONN_INFO_FLAG_JOIN_REQUEST : LNN_CONN_INFO_FLAG_JOIN_AUTO);
545     }
546     return rc;
547 }
548 
PostJoinRequestToMetaNode(MetaJoinRequestNode * metaJoinNode,const ConnectionAddr * addr,CustomData * customData,bool needReportFailure)549 static int32_t PostJoinRequestToMetaNode(MetaJoinRequestNode *metaJoinNode, const ConnectionAddr *addr,
550     CustomData *customData, bool needReportFailure)
551 {
552     int32_t rc = SOFTBUS_OK;
553     if (OnJoinMetaNode(metaJoinNode, customData) != SOFTBUS_OK) {
554         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "PostJoin Request To MetaNode failed");
555         rc = SOFTBUS_ERR;
556         if (needReportFailure) {
557             MetaNodeNotifyJoinResult((ConnectionAddr *)addr, NULL, SOFTBUS_ERR);
558         }
559     }
560     return rc;
561 }
562 
TryRemovePendingJoinRequest(void)563 static void TryRemovePendingJoinRequest(void)
564 {
565     PendingJoinRequestNode *item = NULL;
566     PendingJoinRequestNode *next = NULL;
567 
568     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_netBuilder.pendingList, PendingJoinRequestNode, node) {
569         if (NeedPendingJoinRequest()) {
570             return;
571         }
572         ListDelete(&item->node);
573         if (PostJoinRequestToConnFsm(NULL, &item->addr, DEFAULT_PKG_NAME, true, item->needReportFailure)
574             != SOFTBUS_OK) {
575             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post pending join request failed");
576         }
577         LLOGI("remove a pending join request, peer%s", LnnPrintConnectionAddr(&item->addr));
578         SoftBusFree(item);
579         break;
580     }
581 }
582 
RemovePendingRequestByAddrType(const bool * addrType,uint32_t typeLen)583 static void RemovePendingRequestByAddrType(const bool *addrType, uint32_t typeLen)
584 {
585     PendingJoinRequestNode *item = NULL;
586     PendingJoinRequestNode *next = NULL;
587 
588     if (addrType == NULL || typeLen != CONNECTION_ADDR_MAX) {
589         LLOGE("invalid typeLen:%d", typeLen);
590         return;
591     }
592     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_netBuilder.pendingList, PendingJoinRequestNode, node) {
593         if (!addrType[item->addr.type]) {
594             continue;
595         }
596         ListDelete(&item->node);
597         LLOGI("clean a pending join request, peer%s", LnnPrintConnectionAddr(&item->addr));
598         SoftBusFree(item);
599     }
600 }
601 
TrySendJoinLNNRequest(const JoinLnnMsgPara * para,bool needReportFailure)602 static int32_t TrySendJoinLNNRequest(const JoinLnnMsgPara *para, bool needReportFailure)
603 {
604     LnnConnectionFsm *connFsm = NULL;
605     int32_t ret = SOFTBUS_OK;
606     if (para == NULL) {
607         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "addr is null");
608         return SOFTBUS_INVALID_PARAM;
609     }
610     connFsm = FindConnectionFsmByAddr(&para->addr);
611     if (connFsm == NULL || connFsm->isDead) {
612         if (TryPendingJoinRequest(para, needReportFailure)) {
613             LLOGI("join request is pending, peer%s", LnnPrintConnectionAddr(&para->addr));
614             SoftBusFree((void *)para);
615             return SOFTBUS_OK;
616         }
617         ret = PostJoinRequestToConnFsm(connFsm, &para->addr, para->pkgName, para->isNeedConnect, needReportFailure);
618         SoftBusFree((void *)para);
619         return ret;
620     }
621     connFsm->connInfo.flag |=
622         (needReportFailure ? LNN_CONN_INFO_FLAG_JOIN_REQUEST : LNN_CONN_INFO_FLAG_JOIN_AUTO);
623     if ((connFsm->connInfo.flag & LNN_CONN_INFO_FLAG_ONLINE) != 0) {
624         if ((LnnSendJoinRequestToConnFsm(connFsm) != SOFTBUS_OK) && needReportFailure) {
625             LLOGE("online status, process join lnn request failed");
626             LnnNotifyJoinResult((ConnectionAddr *)&para->addr, NULL, SOFTBUS_ERR);
627         }
628     }
629     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "addr same to before, peer%s", LnnPrintConnectionAddr(&para->addr));
630     SoftBusFree((void *)para);
631     return SOFTBUS_OK;
632 }
633 
TrySendJoinMetaNodeRequest(const ConnectionAddrKey * addrDataKey,bool needReportFailure)634 static int32_t TrySendJoinMetaNodeRequest(const ConnectionAddrKey *addrDataKey, bool needReportFailure)
635 {
636     if (addrDataKey == NULL) {
637         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: addrDataKey is NULL");
638         return SOFTBUS_INVALID_PARAM;
639     }
640     const ConnectionAddr *addr = &addrDataKey->addr;
641     CustomData customData = addrDataKey->customData;
642     MetaJoinRequestNode *metaJoinNode = NULL;
643     int32_t rc;
644     metaJoinNode = FindMetaNodeByAddr(addr);
645     if (metaJoinNode == NULL) {
646         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "TrySendJoinMetaNodeRequest not find metaJoinNode");
647         metaJoinNode = TryJoinRequestMetaNode(addrDataKey->pkgName, addr, addrDataKey->callingPid, needReportFailure);
648         if (metaJoinNode == NULL) {
649             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "join request is pending");
650             SoftBusFree((void *)addrDataKey);
651             return SOFTBUS_ERR;
652         }
653     }
654     rc = PostJoinRequestToMetaNode(metaJoinNode, addr, &customData, needReportFailure);
655     SoftBusFree((void *)addrDataKey);
656     return rc;
657 }
658 
ProcessJoinLNNRequest(const void * para)659 static int32_t ProcessJoinLNNRequest(const void *para)
660 {
661     return TrySendJoinLNNRequest((const JoinLnnMsgPara *)para, true);
662 }
663 
ProcessJoinMetaNodeRequest(const void * para)664 static int32_t ProcessJoinMetaNodeRequest(const void *para)
665 {
666     return TrySendJoinMetaNodeRequest((const ConnectionAddrKey *)para, true);
667 }
668 
ProcessDevDiscoveryRequest(const void * para)669 static int32_t ProcessDevDiscoveryRequest(const void *para)
670 {
671     return TrySendJoinLNNRequest((const JoinLnnMsgPara *)para, false);
672 }
673 
InitiateNewNetworkOnline(ConnectionAddrType addrType,const char * networkId)674 static void InitiateNewNetworkOnline(ConnectionAddrType addrType, const char *networkId)
675 {
676     LnnConnectionFsm *item = NULL;
677     int32_t rc;
678 
679     // find target connfsm, then notify it online
680     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
681         if (strcmp(networkId, item->connInfo.peerNetworkId) != 0) {
682             continue;
683         }
684         if (item->isDead) {
685             continue;
686         }
687         if (addrType != CONNECTION_ADDR_MAX && addrType != item->connInfo.addr.type) {
688             continue;
689         }
690         rc = LnnSendNewNetworkOnlineToConnFsm(item);
691         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
692             "initiate new network online to connection fsm[id=%u], rc=%d", item->id, rc);
693     }
694 }
695 
TryInitiateNewNetworkOnline(const LnnConnectionFsm * connFsm)696 static void TryInitiateNewNetworkOnline(const LnnConnectionFsm *connFsm)
697 {
698     LnnConnectionFsm *item = NULL;
699     LnnInvalidCleanInfo *cleanInfo = connFsm->connInfo.cleanInfo;
700 
701     if ((connFsm->connInfo.flag & LNN_CONN_INFO_FLAG_INITIATE_ONLINE) == 0) {
702         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "[id=%u]no need initiate new network online", connFsm->id);
703         return;
704     }
705     // let last invalid connfsm notify new network online after it clean
706     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
707         if (strcmp(connFsm->connInfo.peerNetworkId, item->connInfo.peerNetworkId) != 0) {
708             continue;
709         }
710         if ((item->connInfo.flag & LNN_CONN_INFO_FLAG_INITIATE_ONLINE) == 0) {
711             continue;
712         }
713         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
714             "[id=%u]wait last connfsm clean, then initiate new network online", connFsm->id);
715         return;
716     }
717     InitiateNewNetworkOnline(cleanInfo->addrType, cleanInfo->networkId);
718 }
719 
TryDisconnectAllConnection(const LnnConnectionFsm * connFsm)720 static void TryDisconnectAllConnection(const LnnConnectionFsm *connFsm)
721 {
722     LnnConnectionFsm *item = NULL;
723     const ConnectionAddr *addr1 = &connFsm->connInfo.addr;
724     const ConnectionAddr *addr2 = NULL;
725     ConnectOption option;
726 
727     // Not really leaving lnn
728     if ((connFsm->connInfo.flag & LNN_CONN_INFO_FLAG_ONLINE) == 0) {
729         return;
730     }
731     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
732         addr2 = &item->connInfo.addr;
733         if (addr1->type != addr2->type) {
734             continue;
735         }
736         if (addr1->type == CONNECTION_ADDR_BR || addr1->type == CONNECTION_ADDR_BLE) {
737             if (strncmp(item->connInfo.addr.info.br.brMac, addr2->info.br.brMac, BT_MAC_LEN) == 0) {
738                 return;
739             }
740         } else if (addr1->type == CONNECTION_ADDR_WLAN || addr1->type == CONNECTION_ADDR_ETH) {
741             if (strncmp(addr1->info.ip.ip, addr2->info.ip.ip, strlen(addr1->info.ip.ip)) == 0) {
742                 return;
743             }
744         }
745     }
746     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "[id=%u]disconnect all connection for type=%d",
747         connFsm->id, addr1->type);
748     if (LnnConvertAddrToOption(addr1, &option)) {
749         ConnDisconnectDeviceAllConn(&option);
750     }
751 }
752 
TryNotifyAllTypeOffline(const LnnConnectionFsm * connFsm)753 static void TryNotifyAllTypeOffline(const LnnConnectionFsm *connFsm)
754 {
755     LnnConnectionFsm *item = NULL;
756     const ConnectionAddr *addr1 = &connFsm->connInfo.addr;
757     const ConnectionAddr *addr2 = NULL;
758 
759     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
760         addr2 = &item->connInfo.addr;
761         if (addr1->type == addr2->type) {
762             return;
763         }
764     }
765     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "[id=%u]notify all connection offline for type=%d",
766         connFsm->id, addr1->type);
767     (void)LnnNotifyAllTypeOffline(addr1->type);
768 }
769 
CleanConnectionFsm(LnnConnectionFsm * connFsm)770 static void CleanConnectionFsm(LnnConnectionFsm *connFsm)
771 {
772     if (connFsm == NULL) {
773         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "connection fsm is null");
774         return;
775     }
776     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "connection fsm[id=%u] is cleaned", connFsm->id);
777     LnnDestroyConnectionFsm(connFsm);
778 }
779 
StopConnectionFsm(LnnConnectionFsm * connFsm)780 static void StopConnectionFsm(LnnConnectionFsm *connFsm)
781 {
782     if (LnnStopConnectionFsm(connFsm, CleanConnectionFsm) != SOFTBUS_OK) {
783         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "stop connection fsm[id=%u] failed", connFsm->id);
784     }
785     ListDelete(&connFsm->node);
786     --g_netBuilder.connCount;
787 }
788 
ProcessCleanConnectionFsm(const void * para)789 static int32_t ProcessCleanConnectionFsm(const void *para)
790 {
791     uint16_t connFsmId;
792     LnnConnectionFsm *connFsm = NULL;
793     int32_t rc = SOFTBUS_ERR;
794 
795     if (para == NULL) {
796         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "connFsmId is null");
797         return SOFTBUS_INVALID_PARAM;
798     }
799     connFsmId = *(uint16_t *)para;
800     do {
801         connFsm = FindConnectionFsmByConnFsmId(connFsmId);
802         if (connFsm == NULL) {
803             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "can not find connection fsm");
804             break;
805         }
806         StopConnectionFsm(connFsm);
807         TryInitiateNewNetworkOnline(connFsm);
808         TryDisconnectAllConnection(connFsm);
809         TryNotifyAllTypeOffline(connFsm);
810         TryRemovePendingJoinRequest();
811         rc = SOFTBUS_OK;
812     } while (false);
813     SoftBusFree((void *)para);
814     return rc;
815 }
816 
ProcessVerifyResult(const void * para)817 static int32_t ProcessVerifyResult(const void *para)
818 {
819     int32_t rc;
820     LnnConnectionFsm *connFsm = NULL;
821     const VerifyResultMsgPara *msgPara = (const VerifyResultMsgPara *)para;
822 
823     if (msgPara == NULL) {
824         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "para is null");
825         return SOFTBUS_INVALID_PARAM;
826     }
827 
828     if (msgPara->retCode == SOFTBUS_OK && msgPara->nodeInfo == NULL) {
829         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "msgPara node Info is null");
830         SoftBusFree((void *)msgPara);
831         return SOFTBUS_INVALID_PARAM;
832     }
833 
834     do {
835         connFsm = FindConnectionFsmByRequestId(msgPara->requestId);
836         if (connFsm == NULL || connFsm->isDead) {
837             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR,
838                 "can not find connection fsm by requestId: %u", msgPara->requestId);
839             rc = SOFTBUS_ERR;
840             break;
841         }
842         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "[id=%u]connection fsm auth done: authId=%" PRId64 ", retCode=%d",
843             connFsm->id, msgPara->authId, msgPara->retCode);
844         if (msgPara->retCode == SOFTBUS_OK) {
845             connFsm->connInfo.authId = msgPara->authId;
846             connFsm->connInfo.nodeInfo = msgPara->nodeInfo;
847         }
848         if (LnnSendAuthResultMsgToConnFsm(connFsm, msgPara->retCode) != SOFTBUS_OK) {
849             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "send auth result to connection fsm[id=%u] failed",
850                 connFsm->id);
851             connFsm->connInfo.nodeInfo = NULL;
852             rc = SOFTBUS_ERR;
853             break;
854         }
855         rc = SOFTBUS_OK;
856     } while (false);
857 
858     if (rc != SOFTBUS_OK && msgPara->nodeInfo != NULL) {
859         SoftBusFree((void *)msgPara->nodeInfo);
860     }
861     SoftBusFree((void *)msgPara);
862     return rc;
863 }
864 
CreatePassiveConnectionFsm(const DeviceVerifyPassMsgPara * msgPara)865 static int32_t CreatePassiveConnectionFsm(const DeviceVerifyPassMsgPara *msgPara)
866 {
867     LnnConnectionFsm *connFsm = NULL;
868     connFsm = StartNewConnectionFsm(&msgPara->addr, DEFAULT_PKG_NAME, true);
869     if (connFsm == NULL) {
870         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR,
871             "start new connection fsm fail: %" PRId64, msgPara->authId);
872         return SOFTBUS_ERR;
873     }
874     connFsm->connInfo.authId = msgPara->authId;
875     connFsm->connInfo.nodeInfo = msgPara->nodeInfo;
876     connFsm->connInfo.flag |= LNN_CONN_INFO_FLAG_JOIN_PASSIVE;
877     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
878         "[id=%u]start a passive connection fsm, authId=%" PRId64, connFsm->id, msgPara->authId);
879     if (LnnSendAuthResultMsgToConnFsm(connFsm, SOFTBUS_OK) != SOFTBUS_OK) {
880         connFsm->connInfo.nodeInfo = NULL;
881         StopConnectionFsm(connFsm);
882         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR,
883             "[id=%u]post auth result to connection fsm fail: %" PRId64, connFsm->id, msgPara->authId);
884         return SOFTBUS_ERR;
885     }
886     return SOFTBUS_OK;
887 }
888 
ProcessDeviceVerifyPass(const void * para)889 static int32_t ProcessDeviceVerifyPass(const void *para)
890 {
891     int32_t rc;
892     LnnConnectionFsm *connFsm = NULL;
893     const DeviceVerifyPassMsgPara *msgPara = (const DeviceVerifyPassMsgPara *)para;
894 
895     if (msgPara == NULL) {
896         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "para is null");
897         return SOFTBUS_INVALID_PARAM;
898     }
899     if (msgPara->nodeInfo == NULL) {
900         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "msgPara nodeInfo is null");
901         SoftBusFree((void *)msgPara);
902         return SOFTBUS_INVALID_PARAM;
903     }
904 
905     do {
906         connFsm = FindConnectionFsmByAuthId(msgPara->authId);
907         if (connFsm == NULL || connFsm->isDead) {
908             rc = CreatePassiveConnectionFsm(msgPara);
909             break;
910         }
911         if (strcmp(connFsm->connInfo.peerNetworkId, msgPara->nodeInfo->networkId) != 0) {
912             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
913                 "[id=%u]networkId changed: %" PRId64, connFsm->id, msgPara->authId);
914             rc = CreatePassiveConnectionFsm(msgPara);
915             break;
916         }
917         msgPara->nodeInfo->discoveryType = 1 << (uint32_t)LnnConvAddrTypeToDiscType(msgPara->addr.type);
918         if (LnnUpdateNodeInfo(msgPara->nodeInfo) != SOFTBUS_OK) {
919             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "LnnUpdateNodeInfo failed!");
920         }
921         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
922             "[id=%u]connection fsm exist, ignore VerifyPass event: %" PRId64, connFsm->id, msgPara->authId);
923         rc = SOFTBUS_ERR;
924     } while (false);
925 
926     if (rc != SOFTBUS_OK && msgPara->nodeInfo != NULL) {
927         SoftBusFree((void *)msgPara->nodeInfo);
928     }
929     SoftBusFree((void *)msgPara);
930     return rc;
931 }
932 
ProcessDeviceDisconnect(const void * para)933 static int32_t ProcessDeviceDisconnect(const void *para)
934 {
935     int32_t rc;
936     LnnConnectionFsm *connFsm = NULL;
937     const int64_t *authId = (const int64_t *)para;
938 
939     if (authId == NULL) {
940         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "authId is null");
941         return SOFTBUS_INVALID_PARAM;
942     }
943 
944     do {
945         connFsm = FindConnectionFsmByAuthId(*authId);
946         if (connFsm == NULL || connFsm->isDead) {
947             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR,
948                 "can not find connection fsm by authId: %" PRId64, *authId);
949             rc = SOFTBUS_ERR;
950             break;
951         }
952         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
953             "[id=%u]device disconnect, authId: %" PRId64, connFsm->id, *authId);
954         if (LnnSendDisconnectMsgToConnFsm(connFsm) != SOFTBUS_OK) {
955             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR,
956                 "send disconnect to connection fsm[id=%u] failed", connFsm->id);
957             rc = SOFTBUS_ERR;
958             break;
959         }
960         rc = SOFTBUS_OK;
961     } while (false);
962     SoftBusFree((void *)authId);
963     return rc;
964 }
965 
ProcessDeviceNotTrusted(const void * para)966 static int32_t ProcessDeviceNotTrusted(const void *para)
967 {
968     int32_t rc;
969     const char *udid = NULL;
970     LnnConnectionFsm *item = NULL;
971     const char *peerUdid = (const char *)para;
972 
973     if (peerUdid == NULL) {
974         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "peer udid is null");
975         return SOFTBUS_INVALID_PARAM;
976     }
977 
978     do {
979         char networkId[NETWORK_ID_BUF_LEN] = {0};
980         if (LnnGetNetworkIdByUdid(peerUdid, networkId, sizeof(networkId)) == SOFTBUS_OK) {
981             LnnRequestLeaveSpecific(networkId, CONNECTION_ADDR_MAX);
982             break;
983         }
984         LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
985             udid = LnnGetDeviceUdid(item->connInfo.nodeInfo);
986             if (udid == NULL || strcmp(peerUdid, udid) != 0) {
987                 continue;
988             }
989             rc = LnnSendNotTrustedToConnFsm(item);
990             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
991                 "[id=%u]send not trusted msg to connection fsm result: %d", item->id, rc);
992         }
993     } while (false);
994     SoftBusFree((void *)peerUdid);
995     return SOFTBUS_OK;
996 }
997 
ProcessLeaveLNNRequest(const void * para)998 static int32_t ProcessLeaveLNNRequest(const void *para)
999 {
1000     const char *networkId = (const char *)para;
1001     LnnConnectionFsm *item = NULL;
1002     int rc = SOFTBUS_ERR;
1003 
1004     if (networkId == NULL) {
1005         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "leave networkId is null");
1006         return SOFTBUS_INVALID_PARAM;
1007     }
1008 
1009     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
1010         if (strcmp(networkId, item->connInfo.peerNetworkId) != 0 || item->isDead) {
1011             continue;
1012         }
1013         if (LnnSendLeaveRequestToConnFsm(item) != SOFTBUS_OK) {
1014             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "send leave LNN msg to connection fsm[id=%u] failed",
1015                 item->id);
1016         } else {
1017             rc = SOFTBUS_OK;
1018             item->connInfo.flag |= LNN_CONN_INFO_FLAG_LEAVE_REQUEST;
1019             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "send leave LNN msg to connection fsm[id=%u] success",
1020                 item->id);
1021         }
1022     }
1023     if (rc != SOFTBUS_OK) {
1024         LnnNotifyLeaveResult(networkId, SOFTBUS_ERR);
1025     }
1026     SoftBusFree((void *)networkId);
1027     return rc;
1028 }
1029 
LeaveMetaInfoToLedger(const MetaJoinRequestNode * metaInfo,const char * networkId)1030 static void LeaveMetaInfoToLedger(const MetaJoinRequestNode *metaInfo, const char *networkId)
1031 {
1032     NodeInfo info;
1033     (void)memset_s(&info, sizeof(NodeInfo), 0, sizeof(NodeInfo));
1034     const char *udid = NULL;
1035     if (LnnGetRemoteNodeInfoById(networkId, CATEGORY_NETWORK_ID, &info) != SOFTBUS_OK) {
1036         return;
1037     }
1038     udid = LnnGetDeviceUdid(&info);
1039     if (LnnDeleteMetaInfo(udid, metaInfo->addr.type) != SOFTBUS_OK) {
1040         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "LnnDeleteMetaInfo error");
1041     }
1042 }
1043 
ProcessLeaveMetaNodeRequest(const void * para)1044 static int32_t ProcessLeaveMetaNodeRequest(const void *para)
1045 {
1046     const char *networkId = (const char *)para;
1047     MetaJoinRequestNode *item = NULL;
1048     MetaJoinRequestNode *next = NULL;
1049     int rc = SOFTBUS_ERR;
1050     if (networkId == NULL) {
1051         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "leave networkId is null");
1052         return SOFTBUS_INVALID_PARAM;
1053     }
1054     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_netBuilder.metaNodeList, MetaJoinRequestNode, node) {
1055         if (strcmp(networkId, item->networkId) != 0) {
1056             continue;
1057         }
1058         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "ProcessLeaveMetaNodeRequest can find networkId");
1059         AuthMetaReleaseVerify(item->authId);
1060         LeaveMetaInfoToLedger(item, networkId);
1061         ListDelete(&item->node);
1062         SoftBusFree(item);
1063     }
1064     MetaNodeNotifyLeaveResult(networkId, SOFTBUS_OK);
1065     SoftBusFree((void *)networkId);
1066     return rc;
1067 }
1068 
ProcessSyncOfflineFinish(const void * para)1069 static int32_t ProcessSyncOfflineFinish(const void *para)
1070 {
1071     const char *networkId = (const char *)para;
1072     LnnConnectionFsm *item = NULL;
1073     int rc = SOFTBUS_OK;
1074 
1075     if (networkId == NULL) {
1076         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "sync offline finish networkId is null");
1077         return SOFTBUS_INVALID_PARAM;
1078     }
1079     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
1080         if (strcmp(networkId, item->connInfo.peerNetworkId) != 0 || item->isDead) {
1081             continue;
1082         }
1083         rc = LnnSendSyncOfflineFinishToConnFsm(item);
1084         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "send sync offline msg to connection fsm[id=%u] result: %d",
1085             item->id, rc);
1086     }
1087     SoftBusFree((void *)networkId);
1088     return rc;
1089 }
1090 
IsInvalidConnectionFsm(const LnnConnectionFsm * connFsm,const LeaveInvalidConnMsgPara * msgPara)1091 static bool IsInvalidConnectionFsm(const LnnConnectionFsm *connFsm, const LeaveInvalidConnMsgPara *msgPara)
1092 {
1093     if (strcmp(msgPara->oldNetworkId, connFsm->connInfo.peerNetworkId) != 0) {
1094         return false;
1095     }
1096     if (connFsm->isDead) {
1097         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "[id=%u]connection is dead", connFsm->id);
1098         return false;
1099     }
1100     if (msgPara->addrType != CONNECTION_ADDR_MAX && msgPara->addrType != connFsm->connInfo.addr.type) {
1101         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "[id=%u]connection type not match %d,%d",
1102             connFsm->id, msgPara->addrType, connFsm->connInfo.addr.type);
1103         return false;
1104     }
1105     if ((connFsm->connInfo.flag & LNN_CONN_INFO_FLAG_ONLINE) == 0) {
1106         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "[id=%u]connection is not online", connFsm->id);
1107         return false;
1108     }
1109     if ((connFsm->connInfo.flag & LNN_CONN_INFO_FLAG_INITIATE_ONLINE) != 0) {
1110         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "[id=%u]connection is already in leaving", connFsm->id);
1111         return false;
1112     }
1113     return true;
1114 }
1115 
ProcessLeaveInvalidConn(const void * para)1116 static int32_t ProcessLeaveInvalidConn(const void *para)
1117 {
1118     LnnConnectionFsm *item = NULL;
1119     int32_t rc = SOFTBUS_OK;
1120     int32_t count = 0;
1121     const LeaveInvalidConnMsgPara *msgPara = (const LeaveInvalidConnMsgPara *)para;
1122 
1123     if (msgPara == NULL) {
1124         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "leave invalid connection msg para is null");
1125         return SOFTBUS_INVALID_PARAM;
1126     }
1127     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
1128         if (!IsInvalidConnectionFsm(item, msgPara)) {
1129             continue;
1130         }
1131         // The new connFsm should timeout when following errors occur
1132         ++count;
1133         item->connInfo.cleanInfo = (LnnInvalidCleanInfo *)SoftBusMalloc(sizeof(LnnInvalidCleanInfo));
1134         if (item->connInfo.cleanInfo == NULL) {
1135             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "[id=%u]malloc invalid clena info failed", item->id);
1136             continue;
1137         }
1138         item->connInfo.cleanInfo->addrType = msgPara->addrType;
1139         if (strncpy_s(item->connInfo.cleanInfo->networkId, NETWORK_ID_BUF_LEN,
1140             msgPara->newNetworkId, strlen(msgPara->newNetworkId)) != EOK) {
1141             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "[id=%u]copy new networkId failed", item->id);
1142             rc = SOFTBUS_ERR;
1143             SoftBusFree(item->connInfo.cleanInfo);
1144             item->connInfo.cleanInfo = NULL;
1145             continue;
1146         }
1147         rc = LnnSendLeaveRequestToConnFsm(item);
1148         if (rc == SOFTBUS_OK) {
1149             item->connInfo.flag |= LNN_CONN_INFO_FLAG_INITIATE_ONLINE;
1150             item->connInfo.flag |= LNN_CONN_INFO_FLAG_LEAVE_AUTO;
1151         } else {
1152             SoftBusFree(item->connInfo.cleanInfo);
1153             item->connInfo.cleanInfo = NULL;
1154         }
1155         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
1156             "send leave LNN msg to invalid connection fsm[id=%u] result: %d", item->id, rc);
1157     }
1158     if (count == 0) {
1159         InitiateNewNetworkOnline(msgPara->addrType, msgPara->newNetworkId);
1160     }
1161     SoftBusFree((void *)msgPara);
1162     return rc;
1163 }
1164 
TryElectMasterNodeOnline(const LnnConnectionFsm * connFsm)1165 static int32_t TryElectMasterNodeOnline(const LnnConnectionFsm *connFsm)
1166 {
1167     char peerMasterUdid[UDID_BUF_LEN] = {0};
1168     char localMasterUdid[UDID_BUF_LEN] = {0};
1169     int32_t peerMasterWeight, localMasterWeight;
1170     int32_t rc;
1171 
1172     // get local master node info
1173     if (LnnGetLocalStrInfo(STRING_KEY_MASTER_NODE_UDID, localMasterUdid, UDID_BUF_LEN) != SOFTBUS_OK ||
1174         LnnGetLocalNumInfo(NUM_KEY_MASTER_NODE_WEIGHT, &localMasterWeight) != SOFTBUS_OK) {
1175         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get local master node info from ledger failed");
1176         return SOFTBUS_ERR;
1177     }
1178     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "local master(id=%u) weight=%d", connFsm->id, localMasterWeight);
1179     if (LnnGetRemoteStrInfo(connFsm->connInfo.peerNetworkId, STRING_KEY_MASTER_NODE_UDID,
1180         peerMasterUdid, UDID_BUF_LEN) != SOFTBUS_OK ||
1181         LnnGetRemoteNumInfo(connFsm->connInfo.peerNetworkId, NUM_KEY_MASTER_NODE_WEIGHT,
1182             &peerMasterWeight) != SOFTBUS_OK) {
1183         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "peer node info(%u) is not found", connFsm->id);
1184         return SOFTBUS_ERR;
1185     }
1186     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "peer master(id=%u) weight=%d", connFsm->id, peerMasterWeight);
1187     rc = LnnCompareNodeWeight(localMasterWeight, localMasterUdid, peerMasterWeight, peerMasterUdid);
1188     if (rc >= 0) {
1189         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
1190             "online node(%u) weight less than current(compare result: %d), no need elect again",
1191             connFsm->id, rc);
1192         return SOFTBUS_OK;
1193     }
1194     UpdateLocalMasterNode(false, peerMasterUdid, peerMasterWeight);
1195     SendElectMessageToAll(connFsm->connInfo.peerNetworkId);
1196     return SOFTBUS_OK;
1197 }
1198 
TryElectMasterNodeOffline(const LnnConnectionFsm * connFsm)1199 static int32_t TryElectMasterNodeOffline(const LnnConnectionFsm *connFsm)
1200 {
1201     char localUdid[UDID_BUF_LEN] = {0};
1202     char localMasterUdid[UDID_BUF_LEN] = {0};
1203 
1204     if (LnnGetLocalStrInfo(STRING_KEY_MASTER_NODE_UDID, localMasterUdid, UDID_BUF_LEN) != SOFTBUS_OK) {
1205         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get local master node info from ledger failed");
1206         return SOFTBUS_ERR;
1207     }
1208     LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, localUdid, UDID_BUF_LEN);
1209     if (strcmp(localMasterUdid, localUdid) == 0) {
1210         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "local is master node(id=%u), no need elect again", connFsm->id);
1211     } else {
1212         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "maybe master node(id=%u) offline, elect again", connFsm->id);
1213         UpdateLocalMasterNode(true, localUdid, LnnGetLocalWeight());
1214         SendElectMessageToAll(connFsm->connInfo.peerNetworkId);
1215     }
1216     return SOFTBUS_OK;
1217 }
1218 
IsSupportMasterNodeElect(SoftBusVersion version)1219 static bool IsSupportMasterNodeElect(SoftBusVersion version)
1220 {
1221     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_DBG, "IsSupportMasterNodeElect SoftBusVersion:%d", version);
1222     return version >= SOFTBUS_NEW_V1;
1223 }
1224 
TryElectAsMasterState(const char * networkId,bool isOnline)1225 static void TryElectAsMasterState(const char *networkId, bool isOnline)
1226 {
1227     if (networkId == NULL) {
1228         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid networkId");
1229         return;
1230     }
1231     if (isOnline) {
1232         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_DBG, "restore master state ignore online process");
1233         return;
1234     }
1235     char masterUdid[UDID_BUF_LEN] = {0};
1236     char localUdid[UDID_BUF_LEN] = {0};
1237     if (LnnGetLocalStrInfo(STRING_KEY_MASTER_NODE_UDID, masterUdid, UDID_BUF_LEN) != SOFTBUS_OK) {
1238         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get local master node info from ledger failed");
1239         return;
1240     }
1241     const char *peerUdid = LnnConvertDLidToUdid(networkId, CATEGORY_NETWORK_ID);
1242     if (peerUdid == NULL) {
1243         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get invalid peerUdid, networkId:%s",
1244             AnonymizesNetworkID(networkId));
1245         return;
1246     }
1247     if (strcmp(masterUdid, peerUdid) != 0) {
1248         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_DBG, "offline node(peerUdid:%s) is not master node(masterUdid:%s)",
1249             AnonymizesUDID(peerUdid), AnonymizesUDID(masterUdid));
1250         return;
1251     }
1252     if (LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, localUdid, UDID_BUF_LEN) != SOFTBUS_OK) {
1253         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get local udid failed");
1254         return;
1255     }
1256     UpdateLocalMasterNode(true, localUdid, LnnGetLocalWeight());
1257 }
1258 
ProcessNodeStateChanged(const void * para)1259 static int32_t ProcessNodeStateChanged(const void *para)
1260 {
1261     const ConnectionAddr *addr = (const ConnectionAddr *)para;
1262     LnnConnectionFsm *connFsm = NULL;
1263     int32_t rc = SOFTBUS_ERR;
1264     bool isOnline = false;
1265 
1266     if (addr == NULL) {
1267         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "node state changed msg is null");
1268         return SOFTBUS_INVALID_PARAM;
1269     }
1270     do {
1271         connFsm = FindConnectionFsmByAddr(addr);
1272         if (connFsm == NULL) {
1273             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR,
1274                 "can't find connection fsm when node online state changed");
1275             break;
1276         }
1277         isOnline = IsNodeOnline(connFsm->connInfo.peerNetworkId);
1278         TryElectAsMasterState(connFsm->connInfo.peerNetworkId, isOnline);
1279         if (!IsSupportMasterNodeElect(connFsm->connInfo.version)) {
1280             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "[id=%u]peer not support master node elect", connFsm->id);
1281             rc = SOFTBUS_OK;
1282             break;
1283         }
1284         rc = isOnline ? TryElectMasterNodeOnline(connFsm) : TryElectMasterNodeOffline(connFsm);
1285     } while (false);
1286     SoftBusFree((void *)addr);
1287     if (isOnline) {
1288         TryRemovePendingJoinRequest();
1289     }
1290     return rc;
1291 }
1292 
ProcessMasterElect(const void * para)1293 static int32_t ProcessMasterElect(const void *para)
1294 {
1295     const ElectMsgPara *msgPara = (const ElectMsgPara *)para;
1296     LnnConnectionFsm *connFsm = NULL;
1297     char localMasterUdid[UDID_BUF_LEN] = {0};
1298     int32_t localMasterWeight, compareRet;
1299     int32_t rc = SOFTBUS_ERR;
1300 
1301     if (msgPara == NULL) {
1302         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "elect msg para is null");
1303         return SOFTBUS_INVALID_PARAM;
1304     }
1305     do {
1306         connFsm = FindConnectionFsmByNetworkId(msgPara->networkId);
1307         if (connFsm == NULL || connFsm->isDead) {
1308             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "can't find connection fsm when receive elect node");
1309             break;
1310         }
1311         if (!IsNodeOnline(connFsm->connInfo.peerNetworkId)) {
1312             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "peer node(%u) is already offline", connFsm->id);
1313             break;
1314         }
1315         if (LnnGetLocalStrInfo(STRING_KEY_MASTER_NODE_UDID, localMasterUdid, UDID_BUF_LEN) != SOFTBUS_OK ||
1316             LnnGetLocalNumInfo(NUM_KEY_MASTER_NODE_WEIGHT, &localMasterWeight) != SOFTBUS_OK) {
1317             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get local master node(%u) info from ledger failed",
1318                 connFsm->id);
1319             break;
1320         }
1321         compareRet = LnnCompareNodeWeight(localMasterWeight, localMasterUdid,
1322             msgPara->masterWeight, msgPara->masterUdid);
1323         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "[id=%u]weight compare result: %d", connFsm->id, compareRet);
1324         if (compareRet != 0) {
1325             if (compareRet < 0) {
1326                 UpdateLocalMasterNode(false, msgPara->masterUdid, msgPara->masterWeight);
1327                 SendElectMessageToAll(connFsm->connInfo.peerNetworkId);
1328             } else {
1329                 rc = SyncElectMessage(connFsm->connInfo.peerNetworkId);
1330                 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "sync elect info to connFsm(%u) result:%d",
1331                     connFsm->id, rc);
1332             }
1333         }
1334         rc = SOFTBUS_OK;
1335     } while (false);
1336     SoftBusFree((void *)msgPara);
1337     return rc;
1338 }
1339 
ProcessLeaveByAddrType(const void * para)1340 static int32_t ProcessLeaveByAddrType(const void *para)
1341 {
1342     bool *addrType = NULL;
1343     LnnConnectionFsm *item = NULL;
1344     int32_t rc;
1345     bool notify = true;
1346 
1347     if (para == NULL) {
1348         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "leave by addr type msg para is null");
1349         return SOFTBUS_INVALID_PARAM;
1350     }
1351 
1352     addrType = (bool *)para;
1353     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
1354         if (!addrType[item->connInfo.addr.type]) {
1355             continue;
1356         }
1357         // if there are any same addr type, let last one send notify
1358         notify = false;
1359         if (item->isDead) {
1360             continue;
1361         }
1362         rc = LnnSendLeaveRequestToConnFsm(item);
1363         LLOGI("leave connFsm[id=%u] by addr type:%d rc=%d", item->id, item->connInfo.addr.type, rc);
1364         if (rc == SOFTBUS_OK) {
1365             item->connInfo.flag |= LNN_CONN_INFO_FLAG_LEAVE_AUTO;
1366         }
1367     }
1368     if (notify) {
1369         (void)LnnNotifyAllTypeOffline(CONNECTION_ADDR_MAX);
1370     }
1371     RemovePendingRequestByAddrType(addrType, CONNECTION_ADDR_MAX);
1372     SoftBusFree((void *)para);
1373     return SOFTBUS_OK;
1374 }
1375 
ProcessLeaveSpecific(const void * para)1376 static int32_t ProcessLeaveSpecific(const void *para)
1377 {
1378     const SpecificLeaveMsgPara *msgPara = (const SpecificLeaveMsgPara *)para;
1379     LnnConnectionFsm *item = NULL;
1380 
1381     if (msgPara == NULL) {
1382         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "leave specific msg is null");
1383         return SOFTBUS_INVALID_PARAM;
1384     }
1385 
1386     int32_t rc;
1387     bool deviceLeave = false;
1388     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
1389         if (strcmp(item->connInfo.peerNetworkId, msgPara->networkId) != 0 ||
1390             (item->connInfo.addr.type != msgPara->addrType &&
1391             msgPara->addrType != CONNECTION_ADDR_MAX)) {
1392             continue;
1393         }
1394         deviceLeave = true;
1395         rc = LnnSendLeaveRequestToConnFsm(item);
1396         if (rc == SOFTBUS_OK) {
1397             item->connInfo.flag |= LNN_CONN_INFO_FLAG_LEAVE_AUTO;
1398         }
1399         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
1400             "send leave LNN msg to connection fsm[id=%u] result: %d", item->id, rc);
1401     }
1402 
1403     if (deviceLeave) {
1404         SoftBusFree((void*)msgPara);
1405         return SOFTBUS_OK;
1406     }
1407 
1408     do {
1409         NodeInfo nodeInfo;
1410         (void)memset_s(&nodeInfo, sizeof(NodeInfo), 0, sizeof(NodeInfo));
1411         if (LnnGetRemoteNodeInfoById(msgPara->networkId, CATEGORY_NETWORK_ID, &nodeInfo)) {
1412             break;
1413         }
1414 
1415         if (nodeInfo.deviceInfo.deviceTypeId != TYPE_PC_ID ||
1416             strcmp(nodeInfo.networkId, nodeInfo.deviceInfo.deviceUdid) != 0) {
1417             break;
1418         }
1419 
1420         (void)LnnClearDiscoveryType(&nodeInfo, LnnConvAddrTypeToDiscType(msgPara->addrType));
1421         if (nodeInfo.discoveryType != 0) {
1422             LLOGI("pc without softbus has another discovery type");
1423             break;
1424         }
1425 
1426         LLOGI("pc without softbus offline");
1427         DeleteFromProfile(nodeInfo.deviceInfo.deviceUdid);
1428         LnnRemoveNode(nodeInfo.deviceInfo.deviceUdid);
1429     } while (false);
1430     SoftBusFree((void *)msgPara);
1431     return SOFTBUS_OK;
1432 }
1433 
DupNodeInfo(const NodeInfo * nodeInfo)1434 static NodeInfo *DupNodeInfo(const NodeInfo *nodeInfo)
1435 {
1436     NodeInfo *node = (NodeInfo *)SoftBusMalloc(sizeof(NodeInfo));
1437     if (node == NULL) {
1438         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc NodeInfo fail");
1439         return NULL;
1440     }
1441     if (memcpy_s(node, sizeof(NodeInfo), nodeInfo, sizeof(NodeInfo)) != EOK) {
1442         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy NodeInfo fail");
1443         SoftBusFree(node);
1444         return NULL;
1445     }
1446     return node;
1447 }
1448 
FillNodeInfo(MetaJoinRequestNode * metaNode,NodeInfo * info)1449 static int32_t FillNodeInfo(MetaJoinRequestNode *metaNode, NodeInfo *info)
1450 {
1451     if (metaNode == NULL || info ==NULL) {
1452         return SOFTBUS_ERR;
1453     }
1454     info->discoveryType = 1 << (uint32_t)LnnConvAddrTypeToDiscType(metaNode->addr.type);
1455     info->authSeqNum = metaNode->authId;
1456     info->authSeq[LnnConvAddrTypeToDiscType(metaNode->addr.type)] = metaNode->authId;
1457     info->authChannelId[metaNode->addr.type] = (int32_t)metaNode->authId;
1458     info->relation[metaNode->addr.type]++;
1459     if (AuthGetDeviceUuid(metaNode->authId, info->uuid, sizeof(info->uuid)) != SOFTBUS_OK ||
1460         info->uuid[0] == '\0') {
1461         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fill uuid fail");
1462         return SOFTBUS_ERR;
1463     }
1464     if (metaNode->addr.type == CONNECTION_ADDR_ETH || metaNode->addr.type == CONNECTION_ADDR_WLAN) {
1465         if (strcpy_s(info->connectInfo.deviceIp, MAX_ADDR_LEN, metaNode->addr.info.ip.ip) != EOK) {
1466             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fill deviceIp fail");
1467             return SOFTBUS_MEM_ERR;
1468         }
1469     }
1470     info->metaInfo.metaDiscType = 1 << (uint32_t)LnnConvAddrTypeToDiscType(metaNode->addr.type);
1471     info->metaInfo.isMetaNode = true;
1472     return SOFTBUS_OK;
1473 }
1474 
ProcessOnAuthMetaVerifyPassed(const void * para)1475 static int32_t ProcessOnAuthMetaVerifyPassed(const void *para)
1476 {
1477     if (para == NULL) {
1478         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: para is NULL");
1479         return SOFTBUS_ERR;
1480     }
1481     MetaAuthInfo *meta = (MetaAuthInfo *)para;
1482     MetaJoinRequestNode *metaNode = meta->metaJoinNode;
1483     int64_t authMetaId = meta->authMetaId;
1484     NodeInfo *info = &meta->info;
1485     int32_t ret = SOFTBUS_ERR;
1486     do {
1487         if (strcpy_s(metaNode->networkId, sizeof(metaNode->networkId), info->networkId) != EOK) {
1488             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "ProcessOnAuthMetaVerifyPassed copy networkId error");
1489             break;
1490         }
1491         metaNode->authId = authMetaId;
1492         NodeInfo *newInfo = DupNodeInfo(info);
1493         if (newInfo == NULL) {
1494             break;
1495         }
1496         if (FillNodeInfo(metaNode, newInfo) != SOFTBUS_OK) {
1497             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "ProcessOnAuthMetaVerifyPassed FillNodeInfo error");
1498             SoftBusFree(newInfo);
1499             break;
1500         }
1501         ret = LnnAddMetaInfo(newInfo);
1502         SoftBusFree(newInfo);
1503     } while (0);
1504     if (ret == SOFTBUS_OK) {
1505         MetaNodeNotifyJoinResult(&metaNode->addr, info->networkId, SOFTBUS_OK);
1506     } else {
1507         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "ProcessOnAuthMetaVerifyPassed error");
1508         MetaNodeNotifyJoinResult(&metaNode->addr, NULL, SOFTBUS_ERR);
1509         ListDelete(&metaNode->node);
1510         SoftBusFree(metaNode);
1511     }
1512     SoftBusFree(meta);
1513     return ret;
1514 }
1515 
ProcessOnAuthMetaVerifyFailed(const void * para)1516 static int32_t ProcessOnAuthMetaVerifyFailed(const void *para)
1517 {
1518     if (para == NULL) {
1519         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: para is NULL");
1520         return SOFTBUS_ERR;
1521     }
1522     MetaReason *mataReason = (MetaReason *)para;
1523     MetaJoinRequestNode *metaNode = mataReason->metaJoinNode;
1524     MetaNodeNotifyJoinResult(&metaNode->addr, NULL, mataReason->reason);
1525     ListDelete(&metaNode->node);
1526     SoftBusFree(metaNode);
1527     SoftBusFree(mataReason);
1528     return SOFTBUS_OK;
1529 }
1530 
1531 static NetBuilderMessageProcess g_messageProcessor[MSG_TYPE_MAX] = {
1532     ProcessJoinLNNRequest,
1533     ProcessDevDiscoveryRequest,
1534     ProcessCleanConnectionFsm,
1535     ProcessVerifyResult,
1536     ProcessDeviceVerifyPass,
1537     ProcessDeviceDisconnect,
1538     ProcessDeviceNotTrusted,
1539     ProcessLeaveLNNRequest,
1540     ProcessSyncOfflineFinish,
1541     ProcessNodeStateChanged,
1542     ProcessMasterElect,
1543     ProcessLeaveInvalidConn,
1544     ProcessLeaveByAddrType,
1545     ProcessLeaveSpecific,
1546     ProcessJoinMetaNodeRequest,
1547     ProcessOnAuthMetaVerifyPassed,
1548     ProcessLeaveMetaNodeRequest,
1549     ProcessOnAuthMetaVerifyFailed,
1550 };
1551 
NetBuilderMessageHandler(SoftBusMessage * msg)1552 NO_SANITIZE("cfi") static void NetBuilderMessageHandler(SoftBusMessage *msg)
1553 {
1554     int32_t ret;
1555 
1556     if (msg == NULL) {
1557         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "msg is null in net builder handler");
1558         return;
1559     }
1560     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "net builder process msg: %d", msg->what);
1561     if (msg->what >= MSG_TYPE_MAX) {
1562         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid msg type");
1563         return;
1564     }
1565     ret = g_messageProcessor[msg->what](msg->obj);
1566     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_DBG, "net builder process msg(%d) done, ret=%d", msg->what, ret);
1567 }
1568 
GetCurrentConnectType(void)1569 static ConnectionAddrType GetCurrentConnectType(void)
1570 {
1571     char ifCurrentName[NET_IF_NAME_LEN] = {0};
1572     ConnectionAddrType type = CONNECTION_ADDR_MAX;
1573 
1574     if (LnnGetLocalStrInfo(STRING_KEY_NET_IF_NAME, ifCurrentName, NET_IF_NAME_LEN) != SOFTBUS_OK) {
1575         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "LnnGetLocalStrInfo getCurrentConnectType failed");
1576         return type;
1577     }
1578     if (LnnGetAddrTypeByIfName(ifCurrentName, &type) != SOFTBUS_OK) {
1579         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "getCurrentConnectType unknown connect type");
1580     }
1581     return type;
1582 }
1583 
OnDeviceVerifyPass(int64_t authId,const NodeInfo * info)1584 static void OnDeviceVerifyPass(int64_t authId, const NodeInfo *info)
1585 {
1586     AuthConnInfo connInfo;
1587     DeviceVerifyPassMsgPara *para = NULL;
1588     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "verify passed passively, authId=%" PRId64, authId);
1589     if (AuthGetConnInfo(authId, &connInfo) != SOFTBUS_OK) {
1590         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get AuthConnInfo fail, authId: %" PRId64, authId);
1591         return;
1592     }
1593     para = (DeviceVerifyPassMsgPara *)SoftBusMalloc(sizeof(DeviceVerifyPassMsgPara));
1594     if (para == NULL) {
1595         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc DeviceVerifyPassMsgPara fail");
1596         return;
1597     }
1598     if (!LnnConvertAuthConnInfoToAddr(&para->addr, &connInfo, GetCurrentConnectType())) {
1599         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "convert connInfo to addr fail");
1600         SoftBusFree(para);
1601         return;
1602     }
1603     para->authId = authId;
1604     para->nodeInfo = DupNodeInfo(info);
1605     if (para->nodeInfo == NULL) {
1606         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "dup NodeInfo fail");
1607         SoftBusFree(para);
1608         return;
1609     }
1610     if (PostMessageToHandler(MSG_TYPE_DEVICE_VERIFY_PASS, para) != SOFTBUS_OK) {
1611         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post DEVICE_VERIFY_PASS msg fail");
1612         SoftBusFree(para->nodeInfo);
1613         SoftBusFree(para);
1614     }
1615     if (info != NULL) {
1616         LnnNotifyDeviceVerified(info->deviceInfo.deviceUdid);
1617     }
1618 }
1619 
OnDeviceDisconnect(int64_t authId)1620 static void OnDeviceDisconnect(int64_t authId)
1621 {
1622     int64_t *para = NULL;
1623     para = (int64_t *)SoftBusMalloc(sizeof(int64_t));
1624     if (para == NULL) {
1625         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc DeviceDisconnect para fail");
1626         return;
1627     }
1628     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "auth device disconnect, authId: %" PRId64, authId);
1629     *para = authId;
1630     if (PostMessageToHandler(MSG_TYPE_DEVICE_DISCONNECT, para) != SOFTBUS_OK) {
1631         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post DEVICE_DISCONNECT msg fail");
1632         SoftBusFree(para);
1633     }
1634 }
1635 
OnLnnProcessNotTrustedMsgDelay(void * para)1636 static void OnLnnProcessNotTrustedMsgDelay(void *para)
1637 {
1638     if (para == NULL) {
1639         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid info para");
1640         return;
1641     }
1642     int64_t authSeq[DISCOVERY_TYPE_COUNT] = {0};
1643     NotTrustedDelayInfo *info = (NotTrustedDelayInfo *)para;
1644     if (!LnnGetOnlineStateById(info->udid, CATEGORY_UDID)) {
1645         LLOGI("[offline] device is offline");
1646         SoftBusFree(info);
1647         return;
1648     }
1649     if (LnnGetAllAuthSeq(info->udid, authSeq, DISCOVERY_TYPE_COUNT) != SOFTBUS_OK) {
1650         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "[offline] LnnGetAllAuthSeq fail.");
1651         SoftBusFree(info);
1652         return;
1653     }
1654     char networkId[NETWORK_ID_BUF_LEN] = {0};
1655     if (LnnConvertDlId(info->udid, CATEGORY_UDID, CATEGORY_NETWORK_ID, networkId, NETWORK_ID_BUF_LEN) != SOFTBUS_OK) {
1656         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "[offline] LnnGetAllAuthSeq fail");
1657         SoftBusFree(info);
1658         return;
1659     }
1660     uint32_t type;
1661     for (type = DISCOVERY_TYPE_WIFI; type < DISCOVERY_TYPE_P2P; type++) {
1662         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
1663             "OnLnnProcessNotTrustedMsgDelay: authSeq %" PRId64 "-> %" PRId64,  info->authSeq[type], authSeq[type]);
1664         if (authSeq[type] == info->authSeq[type] && authSeq[type] != 0 && info->authSeq[type] != 0) {
1665             LLOGI("[offline][networkId:%s] LnnRequestLeaveSpecific type:%d", AnonymizesNetworkID(networkId), type);
1666             LnnRequestLeaveSpecific(networkId, LnnDiscTypeToConnAddrType((DiscoveryType)type));
1667             continue;
1668         }
1669         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "after 5s authSeq=%" PRId64, authSeq[type]);
1670     }
1671     SoftBusFree(info);
1672 }
1673 
LnnProcessCompleteNotTrustedMsg(LnnSyncInfoType syncType,const char * networkId,const uint8_t * msg,uint32_t len)1674 static void LnnProcessCompleteNotTrustedMsg(LnnSyncInfoType syncType, const char *networkId,
1675     const uint8_t *msg, uint32_t len)
1676 {
1677     if (networkId == NULL || syncType != LNN_INFO_TYPE_NOT_TRUSTED || msg == NULL) {
1678         LLOGE("para is invalid");
1679         return;
1680     }
1681     if (!LnnGetOnlineStateById(networkId, CATEGORY_NETWORK_ID)) {
1682         LLOGI("[offline] device is offline");
1683         return;
1684     }
1685     JsonObj *json = JSON_Parse((const char *)msg, len);
1686     if (json == NULL) {
1687         LLOGE("json parse fail");
1688         return;
1689     }
1690     int64_t authSeq[DISCOVERY_TYPE_COUNT] = {0};
1691     (void)JSON_GetInt64FromOject(json, NETWORK_TYPE_WIFI, &authSeq[DISCOVERY_TYPE_WIFI]);
1692     (void)JSON_GetInt64FromOject(json, NETWORK_TYPE_BLE, &authSeq[DISCOVERY_TYPE_BLE]);
1693     (void)JSON_GetInt64FromOject(json, NETWORK_TYPE_BR, &authSeq[DISCOVERY_TYPE_BR]);
1694     JSON_Delete(json);
1695     int64_t curAuthSeq[DISCOVERY_TYPE_COUNT] = {0};
1696     char udid[UDID_BUF_LEN] = {0};
1697     (void)LnnConvertDlId(networkId, CATEGORY_NETWORK_ID, CATEGORY_UDID, udid, UDID_BUF_LEN);
1698     if (LnnGetAllAuthSeq(udid, curAuthSeq, DISCOVERY_TYPE_COUNT) != SOFTBUS_OK) {
1699         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "[offline] device is already offline.");
1700         return;
1701     }
1702     uint32_t type;
1703     for (type = DISCOVERY_TYPE_WIFI; type < DISCOVERY_TYPE_P2P; type++) {
1704         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
1705             "LnnProcessCompleteNotTrustedMsg: authSeq %" PRId64 "-> %" PRId64,  curAuthSeq[type], authSeq[type]);
1706         if (authSeq[type] == curAuthSeq[type] && authSeq[type] != 0 && curAuthSeq[type] != 0) {
1707             LLOGI("[offline][networkId:%s] LnnRequestLeaveSpecific type:%d", AnonymizesNetworkID(networkId), type);
1708             LnnRequestLeaveSpecific(networkId, LnnDiscTypeToConnAddrType((DiscoveryType)type));
1709             continue;
1710         }
1711         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
1712             "[offline] after send not trust msg, authSeq=%" PRId64, authSeq[type]);
1713     }
1714 }
1715 
DeletePcNodeInfo(const char * peerUdid)1716 static bool DeletePcNodeInfo(const char *peerUdid)
1717 {
1718     NodeInfo *localNodeInfo = NULL;
1719     NodeInfo remoteNodeInfo;
1720     (void)memset_s(&remoteNodeInfo, sizeof(NodeInfo), 0, sizeof(NodeInfo));
1721     if (LnnGetRemoteNodeInfoById(peerUdid, CATEGORY_UDID, &remoteNodeInfo)) {
1722         LLOGE("get nodeInfo fail");
1723         return false;
1724     }
1725     if (strcmp(remoteNodeInfo.deviceInfo.deviceUdid, remoteNodeInfo.uuid) != 0) {
1726         LLOGW("isn't pc without softbus");
1727         return false;
1728     }
1729     localNodeInfo = (NodeInfo *)LnnGetLocalNodeInfo();
1730     if (localNodeInfo == NULL) {
1731         LLOGE("get localinfo fail");
1732         return false;
1733     }
1734     if (remoteNodeInfo.accountId == localNodeInfo->accountId) {
1735         LLOGI("exist sameAccount, don't handle offline");
1736         return false;
1737     }
1738     LLOGI("device not trust, delete pc online node");
1739     DeleteFromProfile(remoteNodeInfo.deviceInfo.deviceUdid);
1740     LnnRemoveNode(remoteNodeInfo.deviceInfo.deviceUdid);
1741     return true;
1742 }
1743 
SelectUseUdid(const char * peerUdid,const char * lowerUdid)1744 static const char *SelectUseUdid(const char *peerUdid, const char *lowerUdid)
1745 {
1746     if (LnnGetOnlineStateById(peerUdid, CATEGORY_UDID)) {
1747         LLOGI("not trusted device online! peerUdid:%s", AnonymizesUDID(peerUdid));
1748         return peerUdid;
1749     } else if (LnnGetOnlineStateById(lowerUdid, CATEGORY_UDID)) {
1750         LLOGI("not trusted device online! peerUdid:%s", AnonymizesUDID(lowerUdid));
1751         return lowerUdid;
1752     } else {
1753         LLOGI("not trusted device not online! peerUdid:%s", AnonymizesUDID(peerUdid));
1754         return NULL;
1755     }
1756 }
1757 
OnDeviceNotTrusted(const char * peerUdid)1758 static void OnDeviceNotTrusted(const char *peerUdid)
1759 {
1760     if (peerUdid == NULL) {
1761         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "peer udid is NULL");
1762         return;
1763     }
1764     uint32_t udidLen = strlen(peerUdid) + 1;
1765     if (udidLen > UDID_BUF_LEN) {
1766         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "not trusted udid is too long");
1767         return;
1768     }
1769     if (DeletePcNodeInfo(peerUdid)) {
1770         LLOGI("is pc without softbus, handle offline");
1771         return;
1772     }
1773     const char *useUdid = NULL;
1774     char udid[UDID_BUF_LEN] =  {0};
1775     if (StringToLowerCase(peerUdid, udid, UDID_BUF_LEN) != SOFTBUS_OK) {
1776         return;
1777     }
1778     useUdid = SelectUseUdid(peerUdid, udid);
1779     if (useUdid == NULL) {
1780         return;
1781     }
1782     NotTrustedDelayInfo *info  = (NotTrustedDelayInfo *)SoftBusCalloc(sizeof(NotTrustedDelayInfo));
1783     if (info == NULL) {
1784         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc NotTrustedDelayInfo fail");
1785         return;
1786     }
1787     if (LnnGetAllAuthSeq(useUdid, info->authSeq, DISCOVERY_TYPE_COUNT) != SOFTBUS_OK) {
1788         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "[offline]LnnGetAllAuthSeq fail");
1789         SoftBusFree(info);
1790         return;
1791     }
1792     if (strcpy_s(info->udid, UDID_BUF_LEN, useUdid) != EOK) {
1793         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy udid fail");
1794         SoftBusFree(info);
1795         return;
1796     }
1797     if (LnnSendNotTrustedInfo(info, DISCOVERY_TYPE_COUNT, LnnProcessCompleteNotTrustedMsg) != SOFTBUS_OK) {
1798         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "[offline]LnnSendNotTrustedInfo fail");
1799         OnLnnProcessNotTrustedMsgDelay((void *)info);
1800         return;
1801     }
1802     if (LnnAsyncCallbackDelayHelper(GetLooper(LOOP_TYPE_DEFAULT), OnLnnProcessNotTrustedMsgDelay,
1803         (void *)info, NOT_TRUSTED_DEVICE_MSG_DELAY) != SOFTBUS_OK) {
1804         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "async not trusted msg delay fail");
1805     }
1806 }
1807 
1808 static AuthVerifyListener g_verifyListener = {
1809     .onDeviceVerifyPass = OnDeviceVerifyPass,
1810     .onDeviceNotTrusted = OnDeviceNotTrusted,
1811     .onDeviceDisconnect = OnDeviceDisconnect,
1812 };
1813 
PostVerifyResult(uint32_t requestId,int32_t retCode,int64_t authId,const NodeInfo * info)1814 static void PostVerifyResult(uint32_t requestId, int32_t retCode, int64_t authId, const NodeInfo *info)
1815 {
1816     VerifyResultMsgPara *para = NULL;
1817     para = (VerifyResultMsgPara *)SoftBusCalloc(sizeof(VerifyResultMsgPara));
1818     if (para == NULL) {
1819         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc verify result msg para fail");
1820         return;
1821     }
1822     para->requestId = requestId;
1823     para->retCode = retCode;
1824     if (retCode == SOFTBUS_OK) {
1825         para->nodeInfo = DupNodeInfo(info);
1826         if (para->nodeInfo == NULL) {
1827             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "dup NodeInfo fail");
1828             SoftBusFree(para);
1829             return;
1830         }
1831         para->authId = authId;
1832     }
1833     if (PostMessageToHandler(MSG_TYPE_VERIFY_RESULT, para) != SOFTBUS_OK) {
1834         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post verify result message failed");
1835         SoftBusFree(para->nodeInfo);
1836         SoftBusFree(para);
1837     }
1838     if (info != NULL && retCode == SOFTBUS_OK) {
1839         LnnNotifyDeviceVerified(info->deviceInfo.deviceUdid);
1840     }
1841 }
1842 
OnVerifyPassed(uint32_t requestId,int64_t authId,const NodeInfo * info)1843 static void OnVerifyPassed(uint32_t requestId, int64_t authId, const NodeInfo *info)
1844 {
1845     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
1846         "verify passed: requestId=%u, authId=%" PRId64, requestId, authId);
1847     if (info == NULL) {
1848         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post verify result message failed");
1849         return;
1850     }
1851     PostVerifyResult(requestId, SOFTBUS_OK, authId, info);
1852 }
1853 
OnVerifyFailed(uint32_t requestId,int32_t reason)1854 static void OnVerifyFailed(uint32_t requestId, int32_t reason)
1855 {
1856     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
1857         "verify failed: requestId=%u, reason=%d", requestId, reason);
1858     PostVerifyResult(requestId, reason, AUTH_INVALID_ID, NULL);
1859 }
1860 
1861 static AuthVerifyCallback g_verifyCallback = {
1862     .onVerifyPassed = OnVerifyPassed,
1863     .onVerifyFailed = OnVerifyFailed,
1864 };
1865 
LnnGetVerifyCallback(void)1866 NO_SANITIZE("cfi") AuthVerifyCallback *LnnGetVerifyCallback(void)
1867 {
1868     return &g_verifyCallback;
1869 }
1870 
OnReAuthVerifyPassed(uint32_t requestId,int64_t authId,const NodeInfo * info)1871 static void OnReAuthVerifyPassed(uint32_t requestId, int64_t authId, const NodeInfo *info)
1872 {
1873     LLOGI("reAuth verify passed: requestId=%u, authId=%" PRId64, requestId, authId);
1874     if (info == NULL) {
1875         LLOGE("reAuth verify result error");
1876         return;
1877     }
1878     AuthRequest authRequest = {0};
1879     if (GetAuthRequest(requestId, &authRequest) != SOFTBUS_OK) {
1880         LLOGE("auth request not found");
1881         return;
1882     }
1883     ConnectionAddr addr;
1884     (void)memset_s(&addr, sizeof(ConnectionAddr), 0, sizeof(ConnectionAddr));
1885     if (!LnnConvertAuthConnInfoToAddr(&addr, &authRequest.connInfo, GetCurrentConnectType())) {
1886         LLOGE("ConvertToConnectionAddr failed");
1887         return;
1888     }
1889     int32_t ret = SoftBusGenerateStrHash((unsigned char *)info->deviceInfo.deviceUdid,
1890         strlen(info->deviceInfo.deviceUdid), (unsigned char *)addr.info.ble.udidHash);
1891     if (ret != SOFTBUS_OK) {
1892         LLOGE("gen udidHash fail");
1893         return;
1894     }
1895     LnnConnectionFsm *connFsm = FindConnectionFsmByAddr(&addr);
1896     if (connFsm != NULL && ((connFsm->connInfo.flag & LNN_CONN_INFO_FLAG_JOIN_PASSIVE) == 0)) {
1897         if (info != NULL && LnnUpdateGroupType(info) == SOFTBUS_OK && LnnUpdateAccountInfo(info) == SOFTBUS_OK) {
1898             UpdateProfile(info);
1899             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "reauth finish and updateProfile");
1900         }
1901     } else {
1902         connFsm = StartNewConnectionFsm(&addr, DEFAULT_PKG_NAME, true);
1903         if (connFsm == NULL) {
1904             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR,
1905                 "start new connection fsm fail: %" PRId64, authId);
1906             return;
1907         }
1908         connFsm->connInfo.authId = authId;
1909         connFsm->connInfo.nodeInfo = DupNodeInfo(info);
1910         connFsm->connInfo.flag |= LNN_CONN_INFO_FLAG_JOIN_AUTO;
1911         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
1912             "[id=%u]start a connection fsm, authId=%" PRId64, connFsm->id, authId);
1913         if (LnnSendAuthResultMsgToConnFsm(connFsm, SOFTBUS_OK) != SOFTBUS_OK) {
1914             connFsm->connInfo.nodeInfo = NULL;
1915             StopConnectionFsm(connFsm);
1916             SoftBusFree(connFsm->connInfo.nodeInfo);
1917             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR,
1918                 "[id=%u]post auth result to connection fsm fail: %" PRId64, connFsm->id, authId);
1919         }
1920     }
1921 }
1922 
OnReAuthVerifyFailed(uint32_t requestId,int32_t reason)1923 static void OnReAuthVerifyFailed(uint32_t requestId, int32_t reason)
1924 {
1925     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
1926         "verify failed: requestId=%u, reason=%d", requestId, reason);
1927     if (reason != SOFTBUS_AUTH_HICHAIN_AUTH_ERROR) {
1928         return;
1929     }
1930     PostVerifyResult(requestId, reason, AUTH_INVALID_ID, NULL);
1931 }
1932 
1933 static AuthVerifyCallback g_reAuthVerifyCallback = {
1934     .onVerifyPassed = OnReAuthVerifyPassed,
1935     .onVerifyFailed = OnReAuthVerifyFailed,
1936 };
1937 
LnnGetReAuthVerifyCallback(void)1938 NO_SANITIZE("cfi") AuthVerifyCallback *LnnGetReAuthVerifyCallback(void)
1939 {
1940     return &g_reAuthVerifyCallback;
1941 }
1942 
OnAuthMetaVerifyPassed(uint32_t requestId,int64_t authMetaId,const NodeInfo * info)1943 void OnAuthMetaVerifyPassed(uint32_t requestId, int64_t authMetaId, const NodeInfo *info)
1944 {
1945     if (info == NULL) {
1946         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "OnAuthMetaVerifyPassed info = NULL");
1947         return;
1948     }
1949     MetaJoinRequestNode *metaNode = FindMetaNodeByRequestId(requestId);
1950     if (metaNode == NULL) {
1951         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "OnAuthMetaVerifyPassed not find metaNode");
1952         return;
1953     }
1954     MetaAuthInfo *meta = (MetaAuthInfo *)SoftBusMalloc(sizeof(MetaAuthInfo));
1955     if (meta == NULL) {
1956         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "OnAuthMetaVerifyPassed meta = NULL");
1957         return;
1958     }
1959     meta->authMetaId = authMetaId;
1960     meta->metaJoinNode = metaNode;
1961     meta->info = *info;
1962     if (PostMessageToHandler(MSG_TYPE_JOIN_METANODE_AUTH_PASS, meta) != SOFTBUS_OK) {
1963         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post join metanode auth pass message failed");
1964         SoftBusFree(meta);
1965         return;
1966     }
1967 }
1968 
OnAuthMetaVerifyFailed(uint32_t requestId,int32_t reason)1969 void OnAuthMetaVerifyFailed(uint32_t requestId, int32_t reason)
1970 {
1971     MetaJoinRequestNode *metaJoinNode = FindMetaNodeByRequestId(requestId);
1972     MetaReason *para = (MetaReason *)SoftBusMalloc(sizeof(MetaReason));
1973     if (para == NULL) {
1974         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "OnAuthMetaVerifyFailed para = NULL");
1975         return;
1976     }
1977     para->metaJoinNode = metaJoinNode;
1978     para->reason = reason;
1979     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "OnAuthMetaVerifyFailed can find metaNode");
1980     if (PostMessageToHandler(MSG_TYPE_JOIN_METANODE_AUTH_FAIL, para) != SOFTBUS_OK) {
1981         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post join metanode authfail message failed");
1982         SoftBusFree(para);
1983         return;
1984     }
1985 }
1986 
1987 static AuthVerifyCallback g_metaVerifyCallback = {
1988     .onVerifyPassed = OnAuthMetaVerifyPassed,
1989     .onVerifyFailed = OnAuthMetaVerifyFailed,
1990 };
1991 
LnnGetMetaVerifyCallback(void)1992 NO_SANITIZE("cfi") AuthVerifyCallback *LnnGetMetaVerifyCallback(void)
1993 {
1994     return &g_metaVerifyCallback;
1995 }
1996 
FindNodeInfoByRquestId(uint32_t requestId)1997 NodeInfo *FindNodeInfoByRquestId(uint32_t requestId)
1998 {
1999     LnnConnectionFsm *connFsm = FindConnectionFsmByRequestId(requestId);
2000     if (connFsm == NULL || connFsm->isDead) {
2001         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR,
2002             "can not find connection fsm by requestId: %u", requestId);
2003         return NULL;
2004     }
2005     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "find connFsm success");
2006     if (connFsm->connInfo.nodeInfo == NULL) {
2007         return NULL;
2008     }
2009     return connFsm->connInfo.nodeInfo;
2010 }
2011 
FindRequestIdByAddr(ConnectionAddr * connetionAddr,uint32_t * requestId)2012 int32_t FindRequestIdByAddr(ConnectionAddr *connetionAddr, uint32_t *requestId)
2013 {
2014     LnnConnectionFsm *connFsm = FindConnectionFsmByAddr(connetionAddr);
2015     if (connFsm == NULL || connFsm->isDead) {
2016         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR,
2017             "can not find connection fsm by addr");
2018         return SOFTBUS_ERR;
2019     }
2020     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "find connFsm success");
2021     *requestId = connFsm->connInfo.requestId;
2022     return SOFTBUS_OK;
2023 }
2024 
CreateConnectionAddrMsgPara(const ConnectionAddr * addr)2025 static ConnectionAddr *CreateConnectionAddrMsgPara(const ConnectionAddr *addr)
2026 {
2027     ConnectionAddr *para = NULL;
2028 
2029     if (addr == NULL) {
2030         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "addr is null");
2031         return NULL;
2032     }
2033     para = (ConnectionAddr *)SoftBusCalloc(sizeof(ConnectionAddr));
2034     if (para == NULL) {
2035         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc connecton addr message fail");
2036         return NULL;
2037     }
2038     *para = *addr;
2039     return para;
2040 }
2041 
CreateJoinLnnMsgPara(const ConnectionAddr * addr,const char * pkgName,bool isNeedConnect)2042 static JoinLnnMsgPara *CreateJoinLnnMsgPara(const ConnectionAddr *addr, const char *pkgName, bool isNeedConnect)
2043 {
2044     JoinLnnMsgPara *para = NULL;
2045 
2046     if (addr == NULL || pkgName == NULL) {
2047         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "create join lnn msg para is null");
2048         return NULL;
2049     }
2050     para = (JoinLnnMsgPara *)SoftBusCalloc(sizeof(JoinLnnMsgPara));
2051     if (para == NULL) {
2052         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc connecton addr message fail");
2053         return NULL;
2054     }
2055     if (strcpy_s(para->pkgName, PKG_NAME_SIZE_MAX, pkgName) != EOK) {
2056         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy pkgName fail");
2057         SoftBusFree(para);
2058         return NULL;
2059     }
2060     para->isNeedConnect = isNeedConnect;
2061     para->addr = *addr;
2062     return para;
2063 }
2064 
CreateConnectionAddrMsgParaKey(const ConnectionAddrKey * addrDataKey)2065 static ConnectionAddrKey *CreateConnectionAddrMsgParaKey(const ConnectionAddrKey *addrDataKey)
2066 {
2067     ConnectionAddrKey *para = NULL;
2068 
2069     if (addrDataKey == NULL) {
2070         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "addrDataKey is null");
2071         return NULL;
2072     }
2073     para = (ConnectionAddrKey *)SoftBusCalloc(sizeof(ConnectionAddrKey));
2074     if (para == NULL) {
2075         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc connecton addrKey message fail");
2076         return NULL;
2077     }
2078     *para = *addrDataKey;
2079     return para;
2080 }
2081 
CreateNetworkIdMsgPara(const char * networkId)2082 static char *CreateNetworkIdMsgPara(const char *networkId)
2083 {
2084     char *para = NULL;
2085 
2086     if (networkId == NULL) {
2087         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "networkId is null");
2088         return NULL;
2089     }
2090     para = (char *)SoftBusMalloc(NETWORK_ID_BUF_LEN);
2091     if (para == NULL) {
2092         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc networkId message fail");
2093         return NULL;
2094     }
2095     if (strncpy_s(para, NETWORK_ID_BUF_LEN, networkId, strlen(networkId)) != EOK) {
2096         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy network id fail");
2097         SoftBusFree(para);
2098         return NULL;
2099     }
2100     return para;
2101 }
2102 
ConifgLocalLedger(void)2103 static int32_t ConifgLocalLedger(void)
2104 {
2105     char uuid[UUID_BUF_LEN] = {0};
2106     char networkId[NETWORK_ID_BUF_LEN] = {0};
2107 
2108     // set local uuid and networkId
2109     if (LnnGenLocalNetworkId(networkId, NETWORK_ID_BUF_LEN) != SOFTBUS_OK ||
2110         LnnGenLocalUuid(uuid, UUID_BUF_LEN) != SOFTBUS_OK) {
2111         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get local id fail");
2112         return SOFTBUS_ERR;
2113     }
2114     LnnSetLocalStrInfo(STRING_KEY_UUID, uuid);
2115     LnnSetLocalStrInfo(STRING_KEY_NETWORKID, networkId);
2116     return SOFTBUS_OK;
2117 }
2118 
OnReceiveMasterElectMsg(LnnSyncInfoType type,const char * networkId,const uint8_t * msg,uint32_t len)2119 static void OnReceiveMasterElectMsg(LnnSyncInfoType type, const char *networkId, const uint8_t *msg, uint32_t len)
2120 {
2121     JsonObj *json = NULL;
2122     ElectMsgPara *para = NULL;
2123 
2124     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "recv master elect msg, type:%d, len: %d", type, len);
2125     if (g_netBuilder.isInit == false) {
2126         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no init");
2127         return;
2128     }
2129     if (type != LNN_INFO_TYPE_MASTER_ELECT) {
2130         return;
2131     }
2132     json = JSON_Parse((char *)msg, len);
2133     if (json == NULL) {
2134         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "parse elect msg json fail");
2135         return;
2136     }
2137     para = (ElectMsgPara *)SoftBusMalloc(sizeof(ElectMsgPara));
2138     if (para == NULL) {
2139         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc elect msg para fail");
2140         JSON_Delete(json);
2141         return;
2142     }
2143     if (!JSON_GetInt32FromOject(json, JSON_KEY_MASTER_WEIGHT, &para->masterWeight) ||
2144         !JSON_GetStringFromOject(json, JSON_KEY_MASTER_UDID, para->masterUdid, UDID_BUF_LEN)) {
2145         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "parse master info json fail");
2146         JSON_Delete(json);
2147         SoftBusFree(para);
2148         return;
2149     }
2150     JSON_Delete(json);
2151     if (strcpy_s(para->networkId, NETWORK_ID_BUF_LEN, networkId) != EOK) {
2152         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy network id fail");
2153         SoftBusFree(para);
2154         return;
2155     }
2156     if (PostMessageToHandler(MSG_TYPE_MASTER_ELECT, para) != SOFTBUS_OK) {
2157         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post elect message fail");
2158         SoftBusFree(para);
2159     }
2160 }
2161 
LnnUnpackNodeAddr(const uint8_t * data,uint32_t dataLen,LnnNodeAddr * addr)2162 static int32_t LnnUnpackNodeAddr(const uint8_t *data, uint32_t dataLen, LnnNodeAddr *addr)
2163 {
2164     cJSON *json = cJSON_Parse((char *)data);
2165     if (json == NULL) {
2166         LLOGE("json parse failed");
2167         return SOFTBUS_ERR;
2168     }
2169     if (!GetJsonObjectNumberItem(json, JSON_KEY_NODE_CODE, &addr->code) ||
2170         !GetJsonObjectStringItem(json, JSON_KEY_NODE_ADDR, addr->nodeAddr, SHORT_ADDRESS_MAX_LEN) ||
2171         !GetJsonObjectNumberItem(json, JSON_KEY_NODE_PROXY_PORT, &addr->proxyPort) ||
2172         !GetJsonObjectNumberItem(json, JSON_KEY_NODE_SESSION_PORT, &addr->sessionPort)) {
2173         LLOGE("parse addr info failed");
2174         cJSON_Delete(json);
2175         return SOFTBUS_ERR;
2176     }
2177 
2178     cJSON_Delete(json);
2179     return SOFTBUS_OK;
2180 }
2181 
OnReceiveNodeAddrChangedMsg(LnnSyncInfoType type,const char * networkId,const uint8_t * msg,uint32_t size)2182 static void OnReceiveNodeAddrChangedMsg(LnnSyncInfoType type, const char *networkId,
2183     const uint8_t *msg, uint32_t size)
2184 {
2185     if (type != LNN_INFO_TYPE_NODE_ADDR) {
2186         return;
2187     }
2188     size_t addrLen = strnlen((const char *)msg, size);
2189     if (addrLen != size - 1 || addrLen == 0) {
2190         return;
2191     }
2192     LLOGI("networkId=%s", AnonymizesNetworkID(networkId));
2193 
2194     LnnNodeAddr addr;
2195     (void)memset_s(&addr, sizeof(LnnNodeAddr), 0, sizeof(LnnNodeAddr));
2196     if (LnnUnpackNodeAddr(msg, size, &addr) != SOFTBUS_OK) {
2197         return;
2198     }
2199 
2200     SfcSyncNodeAddrHandle(networkId, addr.code);
2201 
2202     if (LnnSetDLNodeAddr(networkId, CATEGORY_NETWORK_ID, addr.nodeAddr) != SOFTBUS_OK) {
2203         return;
2204     }
2205 
2206     if (addr.proxyPort > 0) {
2207         (void)LnnSetDLProxyPort(networkId, CATEGORY_NETWORK_ID, addr.proxyPort);
2208     }
2209 
2210     if (addr.sessionPort > 0) {
2211         (void)LnnSetDLSessionPort(networkId, CATEGORY_NETWORK_ID, addr.sessionPort);
2212     }
2213 
2214     if (addr.authPort > 0) {
2215         (void)LnnSetDLAuthPort(networkId, CATEGORY_NETWORK_ID, addr.authPort);
2216     }
2217 
2218     LnnNotifyNodeAddressChanged(addr.nodeAddr, networkId, false);
2219 }
2220 
LnnUpdateNodeAddr(const char * addr)2221 NO_SANITIZE("cfi") int32_t LnnUpdateNodeAddr(const char *addr)
2222 {
2223     if (addr == NULL) {
2224         return SOFTBUS_INVALID_PARAM;
2225     }
2226 
2227     int32_t ret = LnnSetLocalStrInfo(STRING_KEY_NODE_ADDR, addr);
2228     if (ret != SOFTBUS_OK) {
2229         LLOGE("set local node addr failed");
2230         return ret;
2231     }
2232 
2233     char localNetworkId[NETWORK_ID_BUF_LEN] = {0};
2234     ret = LnnGetLocalStrInfo(STRING_KEY_NETWORKID, localNetworkId, sizeof(localNetworkId));
2235     if (ret != SOFTBUS_OK) {
2236         LLOGE("get local network id failed");
2237         return SOFTBUS_ERR;
2238     }
2239     LnnNotifyNodeAddressChanged(addr, localNetworkId, true);
2240 
2241     return SOFTBUS_OK;
2242 }
2243 
NodeInfoSync(void)2244 NO_SANITIZE("cfi") int32_t NodeInfoSync(void)
2245 {
2246     if (LnnInitP2p() != SOFTBUS_OK) {
2247         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "init lnn p2p fail");
2248         return SOFTBUS_ERR;
2249     }
2250     if (LnnInitNetworkInfo() != SOFTBUS_OK) {
2251         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "LnnInitNetworkInfo fail");
2252         return SOFTBUS_ERR;
2253     }
2254     if (LnnInitDevicename() != SOFTBUS_OK) {
2255         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "LnnInitDeviceName fail");
2256         return SOFTBUS_ERR;
2257     }
2258     if (LnnInitOffline() != SOFTBUS_OK) {
2259         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "LnnInitOffline fail");
2260         return SOFTBUS_ERR;
2261     }
2262     if (LnnInitBatteryInfo() != SOFTBUS_OK) {
2263         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "LnnInitBatteryInfo fail");
2264         return SOFTBUS_ERR;
2265     }
2266     if (LnnInitCipherKeyManager() != SOFTBUS_OK) {
2267         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "LnnInitCipherKeyManager fail");
2268         return SOFTBUS_ERR;
2269     }
2270     return SOFTBUS_OK;
2271 }
2272 
UpdatePCInfoWithoutSoftbus(void)2273 static void UpdatePCInfoWithoutSoftbus(void)
2274 {
2275     int32_t onlineNum = 0;
2276     NodeBasicInfo *info = NULL;
2277     if (LnnGetAllOnlineNodeInfo(&info, &onlineNum) != 0) {
2278         LLOGE("LnnGetAllOnlineNodeInfo failed!");
2279         return;
2280     }
2281     if (info == NULL || onlineNum == 0) {
2282         LLOGW("not online node");
2283         return;
2284     }
2285     // mark-- remove pc offline
2286     SoftBusFree(info);
2287 }
2288 
AccountStateChangeHandler(const LnnEventBasicInfo * info)2289 static void AccountStateChangeHandler(const LnnEventBasicInfo *info)
2290 {
2291     if (info == NULL || info->event != LNN_EVENT_ACCOUNT_CHANGED) {
2292         LLOGE("invalid param");
2293         return;
2294     }
2295     const LnnMonitorHbStateChangedEvent *event = (const LnnMonitorHbStateChangedEvent *)info;
2296     SoftBusAccountState accountState = (SoftBusAccountState)event->status;
2297     switch (accountState) {
2298         case SOFTBUS_ACCOUNT_LOG_IN:
2299             LLOGI("ignore SOFTBUS_ACCOUNT_LOG_IN");
2300             break;
2301         case SOFTBUS_ACCOUNT_LOG_OUT:
2302             LLOGI("handle SOFTBUS_ACCOUNT_LOG_OUT");
2303             UpdatePCInfoWithoutSoftbus();
2304             break;
2305         default:
2306             return;
2307     }
2308 }
2309 
LnnInitNetBuilder(void)2310 int32_t LnnInitNetBuilder(void)
2311 {
2312     if (g_netBuilder.isInit == true) {
2313         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "init net builder repeatly");
2314         return SOFTBUS_OK;
2315     }
2316     if (LnnInitSyncInfoManager() != SOFTBUS_OK) {
2317         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "init sync info manager fail");
2318         return SOFTBUS_ERR;
2319     }
2320     LnnInitTopoManager();
2321     NodeInfoSync();
2322     NetBuilderConfigInit();
2323     if (RegAuthVerifyListener(&g_verifyListener) != SOFTBUS_OK) {
2324         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "register auth verify listener fail");
2325         return SOFTBUS_ERR;
2326     }
2327     if (LnnRegSyncInfoHandler(LNN_INFO_TYPE_MASTER_ELECT, OnReceiveMasterElectMsg) != SOFTBUS_OK) {
2328         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "register sync master elect msg fail");
2329         return SOFTBUS_ERR;
2330     }
2331     if (LnnRegSyncInfoHandler(LNN_INFO_TYPE_NODE_ADDR, OnReceiveNodeAddrChangedMsg) != SOFTBUS_OK) {
2332         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "register node addr changed msg fail");
2333         return SOFTBUS_ERR;
2334     }
2335     if (ConifgLocalLedger() != SOFTBUS_OK) {
2336         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "config local ledger fail");
2337         return SOFTBUS_ERR;
2338     }
2339     if (LnnRegisterEventHandler(LNN_EVENT_ACCOUNT_CHANGED, AccountStateChangeHandler) != SOFTBUS_OK) {
2340         LLOGE("regist account change evt handler fail!");
2341         return SOFTBUS_ERR;
2342     }
2343     ListInit(&g_netBuilder.fsmList);
2344     ListInit(&g_netBuilder.pendingList);
2345     ListInit(&g_netBuilder.metaNodeList);
2346     g_netBuilder.nodeType = NODE_TYPE_L;
2347     g_netBuilder.looper = GetLooper(LOOP_TYPE_DEFAULT);
2348     if (g_netBuilder.looper == NULL) {
2349         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get default looper fail");
2350         return SOFTBUS_ERR;
2351     }
2352     g_netBuilder.handler.name = (char *)"NetBuilderHandler";
2353     g_netBuilder.handler.looper = g_netBuilder.looper;
2354     g_netBuilder.handler.HandleMessage = NetBuilderMessageHandler;
2355     g_netBuilder.isInit = true;
2356     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "init net builder success");
2357     return SOFTBUS_OK;
2358 }
2359 
LnnInitNetBuilderDelay(void)2360 int32_t LnnInitNetBuilderDelay(void)
2361 {
2362     char udid[UDID_BUF_LEN] = {0};
2363     // set master weight and master udid
2364     if (LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, udid, UDID_BUF_LEN) != SOFTBUS_OK) {
2365         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "get local udid error!");
2366         return SOFTBUS_ERR;
2367     }
2368     LnnSetLocalStrInfo(STRING_KEY_MASTER_NODE_UDID, udid);
2369     LnnSetLocalNumInfo(NUM_KEY_MASTER_NODE_WEIGHT, LnnGetLocalWeight());
2370     if (LnnInitFastOffline() != SOFTBUS_OK) {
2371         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fast offline init fail!");
2372         return SOFTBUS_ERR;
2373     }
2374     return SOFTBUS_OK;
2375 }
2376 
LnnDeinitNetBuilder(void)2377 NO_SANITIZE("cfi") void LnnDeinitNetBuilder(void)
2378 {
2379     LnnConnectionFsm *item = NULL;
2380     LnnConnectionFsm *nextItem = NULL;
2381 
2382     if (!g_netBuilder.isInit) {
2383         return;
2384     }
2385     LIST_FOR_EACH_ENTRY_SAFE(item, nextItem, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
2386         StopConnectionFsm(item);
2387     }
2388     LnnUnregSyncInfoHandler(LNN_INFO_TYPE_MASTER_ELECT, OnReceiveMasterElectMsg);
2389     UnregAuthVerifyListener();
2390     LnnDeinitTopoManager();
2391     LnnDeinitP2p();
2392     LnnDeinitSyncInfoManager();
2393     LnnDeinitFastOffline();
2394     LnnDeinitBatteryInfo();
2395     LnnDeinitOffline();
2396     LnnDeinitCipherKeyManager();
2397     g_netBuilder.isInit = false;
2398 }
2399 
LnnServerJoin(ConnectionAddr * addr,const char * pkgName)2400 NO_SANITIZE("cfi") int32_t LnnServerJoin(ConnectionAddr *addr, const char *pkgName)
2401 {
2402     JoinLnnMsgPara *para = NULL;
2403 
2404     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "LnnServerJoin enter!");
2405     if (g_netBuilder.isInit == false) {
2406         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no init");
2407         return SOFTBUS_NO_INIT;
2408     }
2409     para = CreateJoinLnnMsgPara(addr, pkgName, true);
2410     if (para == NULL) {
2411         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "prepare join lnn message fail");
2412         return SOFTBUS_MALLOC_ERR;
2413     }
2414     if (PostMessageToHandler(MSG_TYPE_JOIN_LNN, para) != SOFTBUS_OK) {
2415         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post join lnn message failed");
2416         SoftBusFree(para);
2417         return SOFTBUS_NETWORK_LOOPER_ERR;
2418     }
2419     return SOFTBUS_OK;
2420 }
2421 
MetaNodeServerJoin(const char * pkgName,int32_t callingPid,ConnectionAddr * addr,CustomData * customData)2422 NO_SANITIZE("cfi") int32_t MetaNodeServerJoin(const char *pkgName, int32_t callingPid,
2423     ConnectionAddr *addr, CustomData *customData)
2424 {
2425     ConnectionAddrKey addrDataKey = {
2426         .addr = *addr,
2427         .customData = *customData,
2428         .callingPid = callingPid,
2429     };
2430     if (memcpy_s(addrDataKey.pkgName, PKG_NAME_SIZE_MAX, pkgName, strlen(pkgName)) != EOK) {
2431         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "memcpy_s error");
2432         return SOFTBUS_ERR;
2433     }
2434     ConnectionAddrKey *para = NULL;
2435     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "MetaNodeServerJoin enter!");
2436     if (g_netBuilder.isInit == false) {
2437         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no init");
2438         return SOFTBUS_NO_INIT;
2439     }
2440     para = CreateConnectionAddrMsgParaKey(&addrDataKey);
2441     if (para == NULL) {
2442         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "prepare join lnn message fail");
2443         return SOFTBUS_MALLOC_ERR;
2444     }
2445     if (PostMessageToHandler(MSG_TYPE_JOIN_METANODE, para) != SOFTBUS_OK) {
2446         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post join lnn message failed");
2447         SoftBusFree(para);
2448         return SOFTBUS_NETWORK_LOOPER_ERR;
2449     }
2450     return SOFTBUS_OK;
2451 }
2452 
LnnServerLeave(const char * networkId,const char * pkgName)2453 NO_SANITIZE("cfi") int32_t LnnServerLeave(const char *networkId, const char *pkgName)
2454 {
2455     (void)pkgName;
2456     char *para = NULL;
2457 
2458     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "LnnServerLeave enter!");
2459     if (g_netBuilder.isInit == false) {
2460         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no init");
2461         return SOFTBUS_NO_INIT;
2462     }
2463     para = CreateNetworkIdMsgPara(networkId);
2464     if (para == NULL) {
2465         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "prepare leave lnn message fail");
2466         return SOFTBUS_MALLOC_ERR;
2467     }
2468     if (PostMessageToHandler(MSG_TYPE_LEAVE_LNN, para) != SOFTBUS_OK) {
2469         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post leave lnn message failed");
2470         SoftBusFree(para);
2471         return SOFTBUS_NETWORK_LOOPER_ERR;
2472     }
2473     return SOFTBUS_OK;
2474 }
2475 
MetaNodeServerLeave(const char * networkId)2476 NO_SANITIZE("cfi") int32_t MetaNodeServerLeave(const char *networkId)
2477 {
2478     char *para = NULL;
2479 
2480     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "MetaNodeServerLeave enter!");
2481     if (g_netBuilder.isInit == false) {
2482         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no init");
2483         return SOFTBUS_NO_INIT;
2484     }
2485     para = CreateNetworkIdMsgPara(networkId);
2486     if (para == NULL) {
2487         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "prepare leave lnn message fail");
2488         return SOFTBUS_MALLOC_ERR;
2489     }
2490     if (PostMessageToHandler(MSG_TYPE_LEAVE_METANODE, para) != SOFTBUS_OK) {
2491         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post leave lnn message failed");
2492         SoftBusFree(para);
2493         return SOFTBUS_NETWORK_LOOPER_ERR;
2494     }
2495     return SOFTBUS_OK;
2496 }
2497 
LnnNotifyDiscoveryDevice(const ConnectionAddr * addr,bool isNeedConnect)2498 NO_SANITIZE("cfi") int32_t LnnNotifyDiscoveryDevice(const ConnectionAddr *addr, bool isNeedConnect)
2499 {
2500     JoinLnnMsgPara *para = NULL;
2501 
2502     LLOGI("notify discovery device enter! isNeedConnect = %d", isNeedConnect);
2503     if (g_netBuilder.isInit == false) {
2504         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no init");
2505         return SOFTBUS_ERR;
2506     }
2507     para = CreateJoinLnnMsgPara(addr, DEFAULT_PKG_NAME, isNeedConnect);
2508     if (para == NULL) {
2509         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc discovery device message fail");
2510         return SOFTBUS_MALLOC_ERR;
2511     }
2512     if (PostMessageToHandler(MSG_TYPE_DISCOVERY_DEVICE, para) != SOFTBUS_OK) {
2513         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post notify discovery device message failed");
2514         SoftBusFree(para);
2515         return SOFTBUS_ERR;
2516     }
2517     return SOFTBUS_OK;
2518 }
2519 
LnnRequestLeaveInvalidConn(const char * oldNetworkId,ConnectionAddrType addrType,const char * newNetworkId)2520 NO_SANITIZE("cfi") int32_t LnnRequestLeaveInvalidConn(const char *oldNetworkId, ConnectionAddrType addrType,
2521     const char *newNetworkId)
2522 {
2523     LeaveInvalidConnMsgPara *para = NULL;
2524 
2525     if (g_netBuilder.isInit == false) {
2526         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no init");
2527         return SOFTBUS_ERR;
2528     }
2529     para = (LeaveInvalidConnMsgPara *)SoftBusMalloc(sizeof(LeaveInvalidConnMsgPara));
2530     if (para == NULL) {
2531         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "prepare leave invalid connection message fail");
2532         return SOFTBUS_MALLOC_ERR;
2533     }
2534     if (strncpy_s(para->oldNetworkId, NETWORK_ID_BUF_LEN, oldNetworkId, strlen(oldNetworkId)) != EOK ||
2535         strncpy_s(para->newNetworkId, NETWORK_ID_BUF_LEN, newNetworkId, strlen(newNetworkId)) != EOK) {
2536         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy old networkId or new networkId fail");
2537         SoftBusFree(para);
2538         return SOFTBUS_MALLOC_ERR;
2539     }
2540     para->addrType = addrType;
2541     if (PostMessageToHandler(MSG_TYPE_LEAVE_INVALID_CONN, para) != SOFTBUS_OK) {
2542         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post leave invalid connection message failed");
2543         SoftBusFree(para);
2544         return SOFTBUS_ERR;
2545     }
2546     return SOFTBUS_OK;
2547 }
2548 
LnnRequestCleanConnFsm(uint16_t connFsmId)2549 NO_SANITIZE("cfi") int32_t LnnRequestCleanConnFsm(uint16_t connFsmId)
2550 {
2551     uint16_t *para = NULL;
2552 
2553     if (g_netBuilder.isInit == false) {
2554         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no init");
2555         return SOFTBUS_ERR;
2556     }
2557     para = (uint16_t *)SoftBusMalloc(sizeof(uint16_t));
2558     if (para == NULL) {
2559         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc clean connection fsm msg failed");
2560         return SOFTBUS_MALLOC_ERR;
2561     }
2562     *para = connFsmId;
2563     if (PostMessageToHandler(MSG_TYPE_CLEAN_CONN_FSM, para) != SOFTBUS_OK) {
2564         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post request clean connectionlnn message failed");
2565         SoftBusFree(para);
2566         return SOFTBUS_ERR;
2567     }
2568     return SOFTBUS_OK;
2569 }
2570 
LnnSyncOfflineComplete(LnnSyncInfoType type,const char * networkId,const uint8_t * msg,uint32_t len)2571 void LnnSyncOfflineComplete(LnnSyncInfoType type, const char *networkId, const uint8_t *msg, uint32_t len)
2572 {
2573     char *para = NULL;
2574 
2575     (void)type;
2576     (void)msg;
2577     (void)len;
2578     if (g_netBuilder.isInit == false) {
2579         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no init");
2580         return;
2581     }
2582     para = CreateNetworkIdMsgPara(networkId);
2583     if (para == NULL) {
2584         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "prepare notify sync offline message fail");
2585         return;
2586     }
2587     if (PostMessageToHandler(MSG_TYPE_SYNC_OFFLINE_FINISH, para) != SOFTBUS_OK) {
2588         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post sync offline finish message failed");
2589         SoftBusFree(para);
2590     }
2591 }
2592 
LnnNotifyNodeStateChanged(const ConnectionAddr * addr)2593 int32_t LnnNotifyNodeStateChanged(const ConnectionAddr *addr)
2594 {
2595     ConnectionAddr *para = NULL;
2596 
2597     if (g_netBuilder.isInit == false) {
2598         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no init");
2599         return SOFTBUS_ERR;
2600     }
2601     para = CreateConnectionAddrMsgPara(addr);
2602     if (para == NULL) {
2603         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "create node state changed msg failed");
2604         return SOFTBUS_MALLOC_ERR;
2605     }
2606     if (PostMessageToHandler(MSG_TYPE_NODE_STATE_CHANGED, para) != SOFTBUS_OK) {
2607         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post node state changed message failed");
2608         SoftBusFree(para);
2609         return SOFTBUS_ERR;
2610     }
2611     return SOFTBUS_OK;
2612 }
2613 
LnnNotifyMasterElect(const char * networkId,const char * masterUdid,int32_t masterWeight)2614 NO_SANITIZE("cfi") int32_t LnnNotifyMasterElect(const char *networkId, const char *masterUdid, int32_t masterWeight)
2615 {
2616     ElectMsgPara *para = NULL;
2617 
2618     if (g_netBuilder.isInit == false) {
2619         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no init");
2620         return SOFTBUS_ERR;
2621     }
2622     if (networkId == NULL || masterUdid == NULL) {
2623         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid elect msg para");
2624         return SOFTBUS_INVALID_PARAM;
2625     }
2626     para = (ElectMsgPara *)SoftBusMalloc(sizeof(ElectMsgPara));
2627     if (para == NULL) {
2628         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc elect msg para failed");
2629         return SOFTBUS_MEM_ERR;
2630     }
2631     if (strncpy_s(para->networkId, NETWORK_ID_BUF_LEN, networkId, strlen(networkId)) != EOK ||
2632         strncpy_s(para->masterUdid, UDID_BUF_LEN, masterUdid, strlen(masterUdid)) != EOK) {
2633         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy udid and maser udid failed");
2634         SoftBusFree(para);
2635         return SOFTBUS_ERR;
2636     }
2637     para->masterWeight = masterWeight;
2638     if (PostMessageToHandler(MSG_TYPE_MASTER_ELECT, para) != SOFTBUS_OK) {
2639         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post elect message failed");
2640         SoftBusFree(para);
2641         return SOFTBUS_ERR;
2642     }
2643     return SOFTBUS_OK;
2644 }
2645 
2646 /* Note: must called in connection fsm. */
LnnNotifyAuthHandleLeaveLNN(int64_t authId)2647 NO_SANITIZE("cfi") int32_t LnnNotifyAuthHandleLeaveLNN(int64_t authId)
2648 {
2649     LnnConnectionFsm *item = NULL;
2650 
2651     if (g_netBuilder.isInit == false) {
2652         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no init");
2653         return SOFTBUS_ERR;
2654     }
2655 
2656     LIST_FOR_EACH_ENTRY(item, &g_netBuilder.fsmList, LnnConnectionFsm, node) {
2657         if (item->isDead) {
2658             continue;
2659         }
2660         if (item->connInfo.authId == authId) {
2661             SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO,
2662                 "[id=%u]connection fsm already use authId: %" PRId64, item->id, authId);
2663             return SOFTBUS_OK;
2664         }
2665     }
2666     AuthHandleLeaveLNN(authId);
2667     return SOFTBUS_OK;
2668 }
2669 
LnnRequestLeaveByAddrType(const bool * type,uint32_t typeLen)2670 NO_SANITIZE("cfi") int32_t LnnRequestLeaveByAddrType(const bool *type, uint32_t typeLen)
2671 {
2672     if (type == NULL) {
2673         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "%s: para is null", __func__);
2674         return SOFTBUS_INVALID_PARAM;
2675     }
2676     bool *para = NULL;
2677     if (typeLen != CONNECTION_ADDR_MAX) {
2678         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid typeLen");
2679         return SOFTBUS_ERR;
2680     }
2681     SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_DBG, "LnnRequestLeaveByAddrType [wlan:%d][br:%d][ble:%d][eth:%d]",
2682         type[CONNECTION_ADDR_WLAN], type[CONNECTION_ADDR_BR], type[CONNECTION_ADDR_BLE], type[CONNECTION_ADDR_ETH]);
2683     if (g_netBuilder.isInit == false) {
2684         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no init");
2685         return SOFTBUS_ERR;
2686     }
2687     para = (bool *)SoftBusMalloc(sizeof(bool) * typeLen);
2688     if (para == NULL) {
2689         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc leave by addr type msg para failed");
2690         return SOFTBUS_MEM_ERR;
2691     }
2692     if (memcpy_s(para, sizeof(bool) * typeLen, type, sizeof(bool) * typeLen) != EOK) {
2693         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "memcopy para fail");
2694         SoftBusFree(para);
2695         return SOFTBUS_ERR;
2696     }
2697     if (PostMessageToHandler(MSG_TYPE_LEAVE_BY_ADDR_TYPE, para) != SOFTBUS_OK) {
2698         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post leave by addr type message failed");
2699         SoftBusFree(para);
2700         return SOFTBUS_ERR;
2701     }
2702     return SOFTBUS_OK;
2703 }
2704 
LnnRequestLeaveSpecific(const char * networkId,ConnectionAddrType addrType)2705 NO_SANITIZE("cfi") int32_t LnnRequestLeaveSpecific(const char *networkId, ConnectionAddrType addrType)
2706 {
2707     SpecificLeaveMsgPara *para = NULL;
2708 
2709     if (networkId == NULL) {
2710         return SOFTBUS_INVALID_PARAM;
2711     }
2712     if (g_netBuilder.isInit == false) {
2713         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "no init");
2714         return SOFTBUS_NO_INIT;
2715     }
2716     para = (SpecificLeaveMsgPara *)SoftBusCalloc(sizeof(SpecificLeaveMsgPara));
2717     if (para == NULL) {
2718         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "malloc specific msg fail");
2719         return SOFTBUS_MALLOC_ERR;
2720     }
2721     if (strcpy_s(para->networkId, NETWORK_ID_BUF_LEN, networkId) != EOK) {
2722         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "copy networkId fail");
2723         SoftBusFree(para);
2724         return SOFTBUS_ERR;
2725     }
2726     para->addrType = addrType;
2727     if (PostMessageToHandler(MSG_TYPE_LEAVE_SPECIFIC, para) != SOFTBUS_OK) {
2728         SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "post leave specific msg failed");
2729         SoftBusFree(para);
2730         return SOFTBUS_ERR;
2731     }
2732     return SOFTBUS_OK;
2733 }
2734 
LnnRequestLeaveAllOnlineNodes(void)2735 void LnnRequestLeaveAllOnlineNodes(void)
2736 {
2737     int32_t onlineNum;
2738     NodeBasicInfo *info;
2739     char *para = NULL;
2740     if (LnnGetAllOnlineNodeInfo(&info, &onlineNum) != 0) {
2741         LLOGE("LnnGetAllOnlineNodeInfo failed!");
2742         return;
2743     }
2744     if (info == NULL || onlineNum == 0) {
2745         LLOGW("none online node");
2746         return;
2747     }
2748     for (int32_t i = 0; i < onlineNum; i++) {
2749         para = CreateNetworkIdMsgPara(info[i].networkId);
2750         if (para == NULL) {
2751             LLOGE("prepare leave lnn message fail");
2752             break;
2753         }
2754         if (PostMessageToHandler(MSG_TYPE_LEAVE_LNN, para) != SOFTBUS_OK) {
2755             LLOGE("post leave lnn message failed");
2756             SoftBusFree(para);
2757             break;
2758         }
2759     }
2760     SoftBusFree(info);
2761 }