1 /*
2 * Copyright (c) 2025 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_connection_fsm_process.h"
17
18 #include <securec.h>
19
20 #include "anonymizer.h"
21 #include "auth_hichain.h"
22 #include "auth_interface.h"
23 #include "auth_pre_link.h"
24 #include "auth_deviceprofile.h"
25 #include "bus_center_event.h"
26 #include "bus_center_manager.h"
27 #include "lnn_async_callback_utils.h"
28 #include "lnn_connection_addr_utils.h"
29 #include "lnn_connection_fsm.h"
30 #include "lnn_connId_callback_manager.h"
31 #include "lnn_decision_db.h"
32 #include "lnn_devicename_info.h"
33 #include "lnn_device_info.h"
34
35 #include "lnn_distributed_net_ledger.h"
36 #include "lnn_event.h"
37 #include "lnn_heartbeat_ctrl.h"
38 #include "lnn_heartbeat_utils.h"
39
40 #include "lnn_local_net_ledger.h"
41 #include "lnn_log.h"
42 #include "lnn_net_builder.h"
43 #include "lnn_net_builder_init.h"
44 #include "lnn_sync_item_info.h"
45 #include "softbus_adapter_bt_common.h"
46 #include "lnn_feature_capability.h"
47 #include "lnn_deviceinfo_to_profile.h"
48 #include "softbus_adapter_mem.h"
49 #include "softbus_adapter_socket.h"
50 #include "softbus_adapter_timer.h"
51 #include "softbus_error_code.h"
52 #include "softbus_utils.h"
53 #include "lnn_async_callback_utils.h"
54 #include "trans_channel_manager.h"
55
CheckInterfaceCommonArgs(const LnnConnectionFsm * connFsm,bool needCheckDead)56 bool CheckInterfaceCommonArgs(const LnnConnectionFsm *connFsm, bool needCheckDead)
57 {
58 if (connFsm == NULL) {
59 LNN_LOGE(LNN_BUILDER, "connection fsm is null");
60 return false;
61 }
62 if (needCheckDead && connFsm->isDead) {
63 LNN_LOGE(LNN_BUILDER, "connection fsm is already dead. [id=%{public}u]", connFsm->id);
64 return false;
65 }
66 return true;
67 }
68
NotifyJoinResult(LnnConnectionFsm * connFsm,const char * networkId,int32_t retCode)69 void NotifyJoinResult(LnnConnectionFsm *connFsm, const char *networkId, int32_t retCode)
70 {
71 if (connFsm == NULL) {
72 LNN_LOGE(LNN_BUILDER, "connection fsm is null");
73 return;
74 }
75 LnnConntionInfo *connInfo = &connFsm->connInfo;
76 if ((connInfo->flag & LNN_CONN_INFO_FLAG_JOIN_REQUEST) != 0) {
77 LnnNotifyJoinResult(&connInfo->addr, networkId, retCode);
78 connInfo->flag &= ~LNN_CONN_INFO_FLAG_JOIN_ACTIVE;
79 return;
80 }
81 NodeInfo *nodeInfo = connInfo->nodeInfo;
82 if (retCode == SOFTBUS_OK && nodeInfo != NULL) {
83 if (connInfo->addr.type == CONNECTION_ADDR_WLAN || connInfo->addr.type == CONNECTION_ADDR_NCM) {
84 int32_t ifIdx = (connInfo->addr.type == CONNECTION_ADDR_NCM) ? USB_IF : WLAN_IF;
85 if (connInfo->addr.info.ip.port != nodeInfo->connectInfo.ifInfo[ifIdx].authPort) {
86 LNN_LOGI(LNN_BUILDER, "before port =%{public}d, after port=%{public}d",
87 connInfo->addr.info.ip.port, nodeInfo->connectInfo.ifInfo[ifIdx].authPort);
88 connInfo->addr.info.ip.port = nodeInfo->connectInfo.ifInfo[ifIdx].authPort;
89 }
90 }
91 LnnNotifyJoinResult(&connInfo->addr, networkId, retCode);
92 }
93 connInfo->flag &= ~LNN_CONN_INFO_FLAG_JOIN_ACTIVE;
94 }
95
FreeUnhandledMessage(int32_t msgType,void * para)96 void FreeUnhandledMessage(int32_t msgType, void *para)
97 {
98 LNN_LOGI(LNN_BUILDER, "free unhandled msg. msgType=%{public}d", msgType);
99 if (para != NULL) {
100 SoftBusFree(para);
101 }
102 }
103
ReportDeviceOnlineEvt(const char * udid,NodeBasicInfo * peerDevInfo)104 void ReportDeviceOnlineEvt(const char *udid, NodeBasicInfo *peerDevInfo)
105 {
106 if (peerDevInfo == NULL) {
107 LNN_LOGE(LNN_BUILDER, "peer deviceinfo is null");
108 return;
109 }
110 LNN_LOGI(LNN_BUILDER, "report device online evt enter");
111 int32_t infoNum = 0;
112 NodeBasicInfo *basic = NULL;
113 NodeInfo nodeInfo;
114 (void)memset_s(&nodeInfo, sizeof(NodeInfo), 0, sizeof(NodeInfo));
115 OnlineDeviceInfo info;
116 (void)memset_s(&info, sizeof(OnlineDeviceInfo), 0, sizeof(OnlineDeviceInfo));
117 if (LnnGetAllOnlineNodeInfo(&basic, &infoNum) != SOFTBUS_OK) {
118 LNN_LOGE(LNN_BUILDER, "get online node fail");
119 return;
120 }
121 if (basic == NULL || infoNum == 0) {
122 LNN_LOGI(LNN_BUILDER, "report online evt get none online node");
123 return;
124 }
125 info.onlineDevNum = (uint32_t)infoNum;
126 for (int32_t i = 0; i < infoNum; i++) {
127 if (LnnGetRemoteNodeInfoById(basic[i].networkId, CATEGORY_NETWORK_ID, &nodeInfo) != SOFTBUS_OK) {
128 continue;
129 }
130 if (LnnHasDiscoveryType(&nodeInfo, DISCOVERY_TYPE_WIFI)) {
131 info.wifiOnlineDevNum++;
132 }
133 if (LnnHasDiscoveryType(&nodeInfo, DISCOVERY_TYPE_BLE) || LnnHasDiscoveryType(&nodeInfo, DISCOVERY_TYPE_BR)) {
134 info.btOnlineDevNum++;
135 }
136 }
137 SoftBusFree(basic);
138 info.peerDevType = peerDevInfo->deviceTypeId;
139 if (LnnGetRemoteStrInfo(peerDevInfo->networkId, STRING_KEY_DEV_NAME, info.peerDevName,
140 SOFTBUS_HISYSEVT_NAME_LEN) != SOFTBUS_OK) {
141 LNN_LOGE(LNN_BUILDER, "get remote device name fail");
142 }
143 if (LnnGetRemoteStrInfo(peerDevInfo->networkId, STRING_KEY_HICE_VERSION, info.peerSoftBusVer,
144 SOFTBUS_HISYSEVT_NAME_LEN) != SOFTBUS_OK) {
145 LNN_LOGE(LNN_BUILDER, "get remote softbus version fail");
146 }
147 info.insertFileResult = true;
148 if (SoftBusReportDevOnlineEvt(&info, udid) != SOFTBUS_OK) {
149 LNN_LOGE(LNN_BUILDER, "report device online evt fail");
150 }
151 }