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_lane_dfx.h"
17
18 #include "securec.h"
19
20 #include "lnn_log.h"
21 #include "softbus_adapter_mem.h"
22 #include "softbus_def.h"
23 #include "softbus_error_code.h"
24
25 static SoftBusList g_laneProcessInfo;
26
LaneEventLock(void)27 static int32_t LaneEventLock(void)
28 {
29 return SoftBusMutexLock(&g_laneProcessInfo.lock);
30 }
31
LaneEventUnLock(void)32 static void LaneEventUnLock(void)
33 {
34 (void)SoftBusMutexUnlock(&g_laneProcessInfo.lock);
35 }
36
GetLaneEventWithoutLock(uint32_t laneHandle)37 static LaneProcess* GetLaneEventWithoutLock(uint32_t laneHandle)
38 {
39 if (laneHandle == INVALID_LANE_REQ_ID) {
40 LNN_LOGE(LNN_LANE, "laneHandle is invalid parameter");
41 return NULL;
42 }
43 LaneProcess *laneProcess = NULL;
44 LIST_FOR_EACH_ENTRY(laneProcess, &g_laneProcessInfo.list, LaneProcess, node) {
45 if (laneProcess->laneProcessList32Bit[EVENT_LANE_HANDLE] == laneHandle) {
46 return laneProcess;
47 }
48 }
49 LNN_LOGE(LNN_LANE, "not found laneProcess, laneHandle=%{public}u", laneHandle);
50 return NULL;
51 }
52
CreateLaneEventInfo(const LaneProcess * processInfo)53 int32_t CreateLaneEventInfo(const LaneProcess *processInfo)
54 {
55 if (processInfo == NULL) {
56 LNN_LOGE(LNN_LANE, "param processInfo is null");
57 return SOFTBUS_INVALID_PARAM;
58 }
59 LaneProcess *info = (LaneProcess *)SoftBusCalloc(sizeof(LaneProcess));
60 if (info == NULL) {
61 LNN_LOGE(LNN_LANE, "processInfo calloc fail");
62 return SOFTBUS_MALLOC_ERR;
63 }
64 if (memcpy_s(info->laneProcessList32Bit, EVENT_32_BIT_MAX, processInfo->laneProcessList32Bit, EVENT_32_BIT_MAX) !=
65 EOK ||
66 memcpy_s(info->laneProcessList64Bit, EVENT_64_BIT_MAX, processInfo->laneProcessList64Bit, EVENT_64_BIT_MAX) !=
67 EOK ||
68 memcpy_s(info->peerNetWorkId, NETWORK_ID_BUF_LEN, processInfo->peerNetWorkId, NETWORK_ID_BUF_LEN) != EOK) {
69 LNN_LOGE(LNN_LANE, "copy processInfo fail");
70 SoftBusFree(info);
71 return SOFTBUS_MEM_ERR;
72 }
73 if (LaneEventLock() != SOFTBUS_OK) {
74 LNN_LOGE(LNN_LANE, "lane lock fail");
75 SoftBusFree(info);
76 return SOFTBUS_LOCK_ERR;
77 }
78 ListAdd(&g_laneProcessInfo.list, &info->node);
79 g_laneProcessInfo.cnt++;
80 LaneEventUnLock();
81 return SOFTBUS_OK;
82 }
83
DeleteLaneEventInfo(uint32_t laneHandle)84 static int32_t DeleteLaneEventInfo(uint32_t laneHandle)
85 {
86 if (LaneEventLock() != SOFTBUS_OK) {
87 LNN_LOGE(LNN_LANE, "lane lock fail");
88 return SOFTBUS_LOCK_ERR;
89 }
90 LaneProcess *next = NULL;
91 LaneProcess *item = NULL;
92 LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_laneProcessInfo.list, LaneProcess, node) {
93 if (item->laneProcessList32Bit[EVENT_LANE_HANDLE] == laneHandle) {
94 ListDelete(&item->node);
95 SoftBusFree(item);
96 if (g_laneProcessInfo.cnt != 0) {
97 g_laneProcessInfo.cnt--;
98 }
99 LaneEventUnLock();
100 return SOFTBUS_OK;
101 }
102 }
103 LaneEventUnLock();
104 LNN_LOGE(LNN_LANE, "not found laneProcess, laneHandle=%{public}u", laneHandle);
105 return SOFTBUS_LANE_NOT_FOUND;
106 }
107
UpdateLaneEventInfo(uint32_t laneHandle,uint32_t eventType,LaneProcessValueType valueType,void * arg)108 int32_t UpdateLaneEventInfo(uint32_t laneHandle, uint32_t eventType, LaneProcessValueType valueType, void *arg)
109 {
110 if (arg == NULL || valueType == LANE_PROCESS_TYPE_BUTT ||
111 (valueType == LANE_PROCESS_TYPE_UINT32 && eventType >= EVENT_32_BIT_MAX) ||
112 (valueType == LANE_PROCESS_TYPE_UINT64 && eventType >= EVENT_64_BIT_MAX) ||
113 laneHandle == INVALID_LANE_REQ_ID) {
114 LNN_LOGE(LNN_LANE, "invalid parameter, laneHandle=%{public}u, eventType=%{public}u, valueType=%{public}u",
115 laneHandle, eventType, valueType);
116 return SOFTBUS_INVALID_PARAM;
117 }
118 LaneProcess *info = NULL;
119 if (LaneEventLock() != SOFTBUS_OK) {
120 LNN_LOGE(LNN_LANE, "lane lock fail");
121 return SOFTBUS_LOCK_ERR;
122 }
123 info = GetLaneEventWithoutLock(laneHandle);
124 if (info == NULL) {
125 LaneEventUnLock();
126 return SOFTBUS_LANE_NOT_FOUND;
127 }
128 if (valueType == LANE_PROCESS_TYPE_UINT32) {
129 info->laneProcessList32Bit[eventType] = *((uint32_t *)arg);
130 } else if (valueType == LANE_PROCESS_TYPE_UINT64) {
131 info->laneProcessList64Bit[eventType] = *((uint64_t *)arg);
132 }
133 LaneEventUnLock();
134 return SOFTBUS_OK;
135 }
136
GetLaneEventInfo(uint32_t laneHandle,LaneProcess * laneProcess)137 int32_t GetLaneEventInfo(uint32_t laneHandle, LaneProcess *laneProcess)
138 {
139 if (laneHandle == INVALID_LANE_REQ_ID || laneProcess == NULL) {
140 LNN_LOGE(LNN_LANE, "invalid parameter");
141 return SOFTBUS_INVALID_PARAM;
142 }
143 if (LaneEventLock() != SOFTBUS_OK) {
144 LNN_LOGE(LNN_LANE, "lane lock fail");
145 return SOFTBUS_LOCK_ERR;
146 }
147 LaneProcess *info = NULL;
148 info = GetLaneEventWithoutLock(laneHandle);
149 if (info == NULL) {
150 LaneEventUnLock();
151 return SOFTBUS_LANE_NOT_FOUND;
152 }
153 if (memcpy_s(laneProcess, sizeof(LaneProcess), info, sizeof(LaneProcess)) != EOK) {
154 LNN_LOGE(LNN_LANE, "memcpy LaneProcess fail");
155 LaneEventUnLock();
156 return SOFTBUS_MEM_ERR;
157 }
158 LaneEventUnLock();
159 return SOFTBUS_OK;
160 }
161
ReportLaneEventInfo(uint32_t laneHandle,int32_t result)162 int32_t ReportLaneEventInfo(uint32_t laneHandle, int32_t result)
163 {
164 if (laneHandle == INVALID_LANE_REQ_ID) {
165 LNN_LOGE(LNN_LANE, "laneHandle is invalid parameter");
166 return SOFTBUS_INVALID_PARAM;
167 }
168 if (LaneEventLock() != SOFTBUS_OK) {
169 LNN_LOGE(LNN_LANE, "lane lock fail");
170 return SOFTBUS_LOCK_ERR;
171 }
172 LaneProcess info = { 0 };
173 LaneProcess *laneProcess = NULL;
174 laneProcess = GetLaneEventWithoutLock(laneHandle);
175 if (laneProcess == NULL) {
176 LaneEventUnLock();
177 return SOFTBUS_LANE_NOT_FOUND;
178 }
179 if (memcpy_s(&info, sizeof(LaneProcess), laneProcess, sizeof(LaneProcess)) != EOK) {
180 LNN_LOGE(LNN_LANE, "memcpy LaneProcess fail");
181 LaneEventUnLock();
182 return SOFTBUS_MEM_ERR;
183 }
184 LaneEventUnLock();
185 LnnEventExtra extra = {
186 .result = EVENT_STAGE_RESULT_OK,
187 .errcode = result,
188 .laneStage = info.laneProcessList32Bit[EVENT_LANE_STAGE],
189 .laneHandle = info.laneProcessList32Bit[EVENT_LANE_HANDLE],
190 .laneId = info.laneProcessList64Bit[EVENT_LANE_ID],
191 .laneLinkType = (int32_t)info.laneProcessList32Bit[EVENT_LANE_LINK_TYPE],
192 .minBW = info.laneProcessList32Bit[EVENT_LANE_MIN_BW],
193 .maxLaneLatency = info.laneProcessList32Bit[EVENT_LANE_MAX_LANE_LATENCY],
194 .minLaneLatency = info.laneProcessList32Bit[EVENT_LANE_MIN_LANE_LATENCY],
195 .rttLevel = info.laneProcessList32Bit[EVENT_LANE_RTT_LEVEL],
196 .peerNetworkId = (const char *)info.peerNetWorkId,
197 .transType = info.laneProcessList32Bit[EVENT_TRANS_TYPE],
198 .localDynamicCap = info.laneProcessList32Bit[EVENT_LOCAL_CAP],
199 .remoteDynamicCap = info.laneProcessList32Bit[EVENT_REMOTE_CAP],
200 .onlineType = info.laneProcessList32Bit[EVENT_ONLINE_STATE],
201 .guideType = (int32_t)info.laneProcessList32Bit[EVENT_GUIDE_TYPE],
202 .isGuideRetry = info.laneProcessList32Bit[EVENT_GUIDE_RETRY],
203 .wifiDetectState = info.laneProcessList32Bit[EVENT_WIFI_DETECT_STATE],
204 .wifiDetectTime = info.laneProcessList64Bit[EVENT_WIFI_DETECT_TIME],
205 .buildLinkTime = info.laneProcessList64Bit[EVENT_BUILD_LINK_TIME],
206 .isHmlReuse = info.laneProcessList32Bit[EVENT_HML_REUSE],
207 .isDelayFree = info.laneProcessList32Bit[EVENT_DELAY_FREE],
208 .freeLinkTime = info.laneProcessList64Bit[EVENT_FREE_LINK_TIME],
209 };
210 LNN_EVENT(EVENT_SCENE_LNN, EVENT_STAGE_LNN_LANE_SELECT_END, extra);
211 return DeleteLaneEventInfo(laneHandle);
212 }
213
InitLaneEvent(void)214 int32_t InitLaneEvent(void)
215 {
216 ListInit(&g_laneProcessInfo.list);
217 if (SoftBusMutexInit(&g_laneProcessInfo.lock, NULL) != SOFTBUS_OK) {
218 LNN_LOGE(LNN_LANE, "lane process info mutex init fail");
219 return SOFTBUS_NO_INIT;
220 }
221 g_laneProcessInfo.cnt = 0;
222 return SOFTBUS_OK;
223 }
224
DeinitLaneEvent(void)225 void DeinitLaneEvent(void)
226 {
227 if (LaneEventLock() != SOFTBUS_OK) {
228 LNN_LOGE(LNN_LANE, "lane lock fail");
229 return;
230 }
231 LaneProcess *next = NULL;
232 LaneProcess *item = NULL;
233 LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_laneProcessInfo.list, LaneProcess, node) {
234 ListDelete(&item->node);
235 SoftBusFree(item);
236 }
237 g_laneProcessInfo.cnt = 0;
238 LaneEventUnLock();
239 (void)SoftBusMutexDestroy(&g_laneProcessInfo.lock);
240 }
241