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(¶->addr);
611 if (connFsm == NULL || connFsm->isDead) {
612 if (TryPendingJoinRequest(para, needReportFailure)) {
613 LLOGI("join request is pending, peer%s", LnnPrintConnectionAddr(¶->addr));
614 SoftBusFree((void *)para);
615 return SOFTBUS_OK;
616 }
617 ret = PostJoinRequestToConnFsm(connFsm, ¶->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 *)¶->addr, NULL, SOFTBUS_ERR);
627 }
628 }
629 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_INFO, "addr same to before, peer%s", LnnPrintConnectionAddr(¶->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(¶->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, ¶->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 }