• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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