xref: /drivers/peripheral/wlan/hal/src/wifi_hal.c (revision 094332d3)
1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "wifi_hal.h"
17094332d3Sopenharmony_ci#include <stdbool.h>
18094332d3Sopenharmony_ci#include "securec.h"
19094332d3Sopenharmony_ci#include "unistd.h"
20094332d3Sopenharmony_ci#include "hdf_log.h"
21094332d3Sopenharmony_ci#include "wifi_hal_cmd.h"
22094332d3Sopenharmony_ci#include "wifi_hal_common.h"
23094332d3Sopenharmony_ci#include "wifi_hal_util.h"
24094332d3Sopenharmony_ci#include "wifi_driver_client.h"
25094332d3Sopenharmony_ci
26094332d3Sopenharmony_ci#ifdef __cplusplus
27094332d3Sopenharmony_ci#if __cplusplus
28094332d3Sopenharmony_ciextern "C" {
29094332d3Sopenharmony_ci#endif
30094332d3Sopenharmony_ci#endif
31094332d3Sopenharmony_ci
32094332d3Sopenharmony_cistatic bool g_wifiIsStarted = false;
33094332d3Sopenharmony_ci
34094332d3Sopenharmony_cistatic int32_t StartInner(const struct IWiFi *iwifi)
35094332d3Sopenharmony_ci{
36094332d3Sopenharmony_ci    int32_t ret;
37094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
38094332d3Sopenharmony_ci    if (iwifi == NULL) {
39094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
40094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
41094332d3Sopenharmony_ci    }
42094332d3Sopenharmony_ci    if (g_wifiIsStarted) {
43094332d3Sopenharmony_ci        HDF_LOGI("%s: wifi has started already, line: %d", __FUNCTION__, __LINE__);
44094332d3Sopenharmony_ci        return HDF_SUCCESS;
45094332d3Sopenharmony_ci    }
46094332d3Sopenharmony_ci    ret = WifiDriverClientInit();
47094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
48094332d3Sopenharmony_ci        HDF_LOGE("%s: WifiDriverClientInit failed, line: %d, error no: %d", __FUNCTION__, __LINE__, ret);
49094332d3Sopenharmony_ci        return ret;
50094332d3Sopenharmony_ci    }
51094332d3Sopenharmony_ci
52094332d3Sopenharmony_ci    ret = HalCmdGetAvailableNetwork();
53094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
54094332d3Sopenharmony_ci        HDF_LOGE("%s: HalCmdGetAvailableNetwork failed, line: %d, error no: %d", __FUNCTION__, __LINE__, ret);
55094332d3Sopenharmony_ci        WifiDriverClientDeinit();
56094332d3Sopenharmony_ci        return ret;
57094332d3Sopenharmony_ci    }
58094332d3Sopenharmony_ci    g_wifiIsStarted = true;
59094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s", __FUNCTION__);
60094332d3Sopenharmony_ci    return ret;
61094332d3Sopenharmony_ci}
62094332d3Sopenharmony_ci
63094332d3Sopenharmony_cistatic int32_t StopInner(const struct IWiFi *iwifi)
64094332d3Sopenharmony_ci{
65094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
66094332d3Sopenharmony_ci    if (iwifi == NULL) {
67094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
68094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
69094332d3Sopenharmony_ci    }
70094332d3Sopenharmony_ci    if (!g_wifiIsStarted) {
71094332d3Sopenharmony_ci        HDF_LOGI("%s: wifi has stopped already, line: %d", __FUNCTION__, __LINE__);
72094332d3Sopenharmony_ci        return HDF_SUCCESS;
73094332d3Sopenharmony_ci    }
74094332d3Sopenharmony_ci    WifiDriverClientDeinit();
75094332d3Sopenharmony_ci    ClearIWiFiList();
76094332d3Sopenharmony_ci    g_wifiIsStarted = false;
77094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s", __FUNCTION__);
78094332d3Sopenharmony_ci    return HDF_SUCCESS;
79094332d3Sopenharmony_ci}
80094332d3Sopenharmony_ci
81094332d3Sopenharmony_cistatic int32_t GetSupportFeatureInner(uint8_t *supType, uint32_t size)
82094332d3Sopenharmony_ci{
83094332d3Sopenharmony_ci    if (supType == NULL || size <= PROTOCOL_80211_IFTYPE_NUM) {
84094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
85094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
86094332d3Sopenharmony_ci    }
87094332d3Sopenharmony_ci    return HalCmdGetSupportType(supType);
88094332d3Sopenharmony_ci}
89094332d3Sopenharmony_ci
90094332d3Sopenharmony_cistatic int32_t GetSupportComboInner(uint64_t *combo, uint32_t size)
91094332d3Sopenharmony_ci{
92094332d3Sopenharmony_ci    if (combo == NULL) {
93094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
94094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
95094332d3Sopenharmony_ci    }
96094332d3Sopenharmony_ci    return HalCmdGetSupportCombo(combo, size);
97094332d3Sopenharmony_ci}
98094332d3Sopenharmony_ci
99094332d3Sopenharmony_cistatic int32_t InitFeatureByType(int32_t type, struct IWiFiBaseFeature **ifeature)
100094332d3Sopenharmony_ci{
101094332d3Sopenharmony_ci    int32_t ret;
102094332d3Sopenharmony_ci
103094332d3Sopenharmony_ci    switch (type) {
104094332d3Sopenharmony_ci        case PROTOCOL_80211_IFTYPE_AP:
105094332d3Sopenharmony_ci            *ifeature = (struct IWiFiBaseFeature *)malloc(sizeof(struct IWiFiAp));
106094332d3Sopenharmony_ci            if (*ifeature == NULL) {
107094332d3Sopenharmony_ci                HDF_LOGE("%s: malloc failed, line: %d", __FUNCTION__, __LINE__);
108094332d3Sopenharmony_ci                return HDF_FAILURE;
109094332d3Sopenharmony_ci            }
110094332d3Sopenharmony_ci            (void)memset_s(*ifeature, sizeof(struct IWiFiAp), 0, sizeof(struct IWiFiAp));
111094332d3Sopenharmony_ci            ret = InitApFeature((struct IWiFiAp **)ifeature);
112094332d3Sopenharmony_ci            break;
113094332d3Sopenharmony_ci        case PROTOCOL_80211_IFTYPE_STATION:
114094332d3Sopenharmony_ci            *ifeature = (struct IWiFiBaseFeature *)malloc(sizeof(struct IWiFiSta));
115094332d3Sopenharmony_ci            if (*ifeature == NULL) {
116094332d3Sopenharmony_ci                HDF_LOGE("%s: malloc failed, line: %d", __FUNCTION__, __LINE__);
117094332d3Sopenharmony_ci                return HDF_FAILURE;
118094332d3Sopenharmony_ci            }
119094332d3Sopenharmony_ci            (void)memset_s(*ifeature, sizeof(struct IWiFiSta), 0, sizeof(struct IWiFiSta));
120094332d3Sopenharmony_ci            ret = InitStaFeature((struct IWiFiSta **)ifeature);
121094332d3Sopenharmony_ci            break;
122094332d3Sopenharmony_ci        case PROTOCOL_80211_IFTYPE_P2P_DEVICE:
123094332d3Sopenharmony_ci            *ifeature = (struct IWiFiBaseFeature *)malloc(sizeof(struct IWiFiP2p));
124094332d3Sopenharmony_ci            if (*ifeature == NULL) {
125094332d3Sopenharmony_ci                HDF_LOGE("%s: malloc failed, line: %d", __FUNCTION__, __LINE__);
126094332d3Sopenharmony_ci                return HDF_FAILURE;
127094332d3Sopenharmony_ci            }
128094332d3Sopenharmony_ci            (void)memset_s(*ifeature, sizeof(struct IWiFiP2p), 0, sizeof(struct IWiFiP2p));
129094332d3Sopenharmony_ci            ret = InitP2pFeature((struct IWiFiP2p **)ifeature);
130094332d3Sopenharmony_ci            break;
131094332d3Sopenharmony_ci        default:
132094332d3Sopenharmony_ci            HDF_LOGE("%s: type not support, line: %d", __FUNCTION__, __LINE__);
133094332d3Sopenharmony_ci            return HDF_FAILURE;
134094332d3Sopenharmony_ci    }
135094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
136094332d3Sopenharmony_ci        free(*ifeature);
137094332d3Sopenharmony_ci        *ifeature = NULL;
138094332d3Sopenharmony_ci    }
139094332d3Sopenharmony_ci    return ret;
140094332d3Sopenharmony_ci}
141094332d3Sopenharmony_ci
142094332d3Sopenharmony_cistatic int32_t FindValidNetwork(int32_t type, struct IWiFiBaseFeature **feature)
143094332d3Sopenharmony_ci{
144094332d3Sopenharmony_ci    struct DListHead *networkHead = GetNetworkHead();
145094332d3Sopenharmony_ci    struct IWiFiList *networkNode = NULL;
146094332d3Sopenharmony_ci
147094332d3Sopenharmony_ci    DLIST_FOR_EACH_ENTRY(networkNode, networkHead, struct IWiFiList, entry) {
148094332d3Sopenharmony_ci        if (networkNode == NULL) {
149094332d3Sopenharmony_ci            HDF_LOGE("%s: networkNode is NULL, line: %d", __FUNCTION__, __LINE__);
150094332d3Sopenharmony_ci            break;
151094332d3Sopenharmony_ci        }
152094332d3Sopenharmony_ci        if (networkNode->ifeature != NULL && networkNode->ifeature->type == type) {
153094332d3Sopenharmony_ci            HDF_LOGI("%s: feature is existed. type: %d", __FUNCTION__, type);
154094332d3Sopenharmony_ci            if (memcpy_s((*feature)->ifName, IFNAME_MAX_LEN, networkNode->ifName, strlen(networkNode->ifName)) != EOK) {
155094332d3Sopenharmony_ci                HDF_LOGE("%s: memcpy_s failed, line: %d", __FUNCTION__, __LINE__);
156094332d3Sopenharmony_ci                return HDF_FAILURE;
157094332d3Sopenharmony_ci            }
158094332d3Sopenharmony_ci            (*feature)->type = type;
159094332d3Sopenharmony_ci            return HDF_SUCCESS;
160094332d3Sopenharmony_ci        }
161094332d3Sopenharmony_ci        if (networkNode->ifeature == NULL && networkNode->supportMode[type] == 1) {
162094332d3Sopenharmony_ci            if (memcpy_s((*feature)->ifName, IFNAME_MAX_LEN, networkNode->ifName, strlen(networkNode->ifName)) != EOK) {
163094332d3Sopenharmony_ci                HDF_LOGE("%s: memcpy_s failed, line: %d", __FUNCTION__, __LINE__);
164094332d3Sopenharmony_ci                return HDF_FAILURE;
165094332d3Sopenharmony_ci            }
166094332d3Sopenharmony_ci            (*feature)->type = type;
167094332d3Sopenharmony_ci            networkNode->ifeature = *feature;
168094332d3Sopenharmony_ci            return HDF_SUCCESS;
169094332d3Sopenharmony_ci        }
170094332d3Sopenharmony_ci    }
171094332d3Sopenharmony_ci    HDF_LOGE("%s: cannot find available network, line: %d", __FUNCTION__, __LINE__);
172094332d3Sopenharmony_ci    return HDF_FAILURE;
173094332d3Sopenharmony_ci}
174094332d3Sopenharmony_ci
175094332d3Sopenharmony_cistatic int32_t CreateFeatureInner(int32_t type, struct IWiFiBaseFeature **ifeature)
176094332d3Sopenharmony_ci{
177094332d3Sopenharmony_ci    int32_t ret;
178094332d3Sopenharmony_ci
179094332d3Sopenharmony_ci    if (ifeature == NULL) {
180094332d3Sopenharmony_ci        HDF_LOGE("%s: ifeature is null, line: %d", __FUNCTION__, __LINE__);
181094332d3Sopenharmony_ci        return HDF_FAILURE;
182094332d3Sopenharmony_ci    }
183094332d3Sopenharmony_ci    ret = InitFeatureByType(type, ifeature);
184094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
185094332d3Sopenharmony_ci        HDF_LOGE("%s: init feature failed, line: %d, error no: %d", __FUNCTION__, __LINE__, ret);
186094332d3Sopenharmony_ci        return ret;
187094332d3Sopenharmony_ci    }
188094332d3Sopenharmony_ci
189094332d3Sopenharmony_ci    ret = FindValidNetwork(type, ifeature);
190094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
191094332d3Sopenharmony_ci        HDF_LOGE("%s: create feature failed, line: %d, error no: %d", __FUNCTION__, __LINE__, ret);
192094332d3Sopenharmony_ci        if (*ifeature != NULL) {
193094332d3Sopenharmony_ci            free(*ifeature);
194094332d3Sopenharmony_ci            *ifeature = NULL;
195094332d3Sopenharmony_ci        }
196094332d3Sopenharmony_ci        return ret;
197094332d3Sopenharmony_ci    }
198094332d3Sopenharmony_ci    return HDF_SUCCESS;
199094332d3Sopenharmony_ci}
200094332d3Sopenharmony_ci
201094332d3Sopenharmony_cistatic int32_t DestroyFeatureInner(struct IWiFiBaseFeature *ifeature)
202094332d3Sopenharmony_ci{
203094332d3Sopenharmony_ci    struct DListHead *networkHead = GetNetworkHead();
204094332d3Sopenharmony_ci    struct IWiFiList *networkNode = NULL;
205094332d3Sopenharmony_ci
206094332d3Sopenharmony_ci    if (ifeature == NULL) {
207094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
208094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
209094332d3Sopenharmony_ci    }
210094332d3Sopenharmony_ci
211094332d3Sopenharmony_ci    DLIST_FOR_EACH_ENTRY(networkNode, networkHead, struct IWiFiList, entry) {
212094332d3Sopenharmony_ci        if (strcmp(networkNode->ifName, ifeature->ifName) == HDF_SUCCESS) {
213094332d3Sopenharmony_ci            free(ifeature);
214094332d3Sopenharmony_ci            networkNode->ifeature = NULL;
215094332d3Sopenharmony_ci            return HDF_SUCCESS;
216094332d3Sopenharmony_ci        }
217094332d3Sopenharmony_ci    }
218094332d3Sopenharmony_ci    HDF_LOGE("%s: cannot find feature to destroy, line: %d", __FUNCTION__, __LINE__);
219094332d3Sopenharmony_ci    return HDF_FAILURE;
220094332d3Sopenharmony_ci}
221094332d3Sopenharmony_ci
222094332d3Sopenharmony_cistatic int32_t RegisterEventCallbackInner(OnReceiveFunc onRecFunc, const char *ifName)
223094332d3Sopenharmony_ci{
224094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
225094332d3Sopenharmony_ci    if (onRecFunc == NULL || ifName == NULL) {
226094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
227094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
228094332d3Sopenharmony_ci    }
229094332d3Sopenharmony_ci    if (WifiRegisterEventCallback(onRecFunc, WIFI_KERNEL_TO_HAL_CLIENT, ifName) != HDF_SUCCESS) {
230094332d3Sopenharmony_ci        HDF_LOGE("%s: callback function has been registered, line: %d", __FUNCTION__, __LINE__);
231094332d3Sopenharmony_ci        return HDF_FAILURE;
232094332d3Sopenharmony_ci    }
233094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s", __FUNCTION__);
234094332d3Sopenharmony_ci    return HDF_SUCCESS;
235094332d3Sopenharmony_ci}
236094332d3Sopenharmony_ci
237094332d3Sopenharmony_cistatic int32_t UnregisterEventCallbackInner(OnReceiveFunc onRecFunc, const char *ifName)
238094332d3Sopenharmony_ci{
239094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
240094332d3Sopenharmony_ci    if (onRecFunc == NULL || ifName == NULL) {
241094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
242094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
243094332d3Sopenharmony_ci    }
244094332d3Sopenharmony_ci    WifiUnregisterEventCallback(onRecFunc, WIFI_KERNEL_TO_HAL_CLIENT, ifName);
245094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s", __FUNCTION__);
246094332d3Sopenharmony_ci    return HDF_SUCCESS;
247094332d3Sopenharmony_ci}
248094332d3Sopenharmony_ci
249094332d3Sopenharmony_cistatic int32_t RegisterHid2dCallbackInner(Hid2dCallback func, const char *ifName)
250094332d3Sopenharmony_ci{
251094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
252094332d3Sopenharmony_ci    int32_t ret;
253094332d3Sopenharmony_ci    if (func == NULL || ifName == NULL) {
254094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
255094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
256094332d3Sopenharmony_ci    }
257094332d3Sopenharmony_ci    ret = WifiRegisterHid2dCallback(func, ifName);
258094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
259094332d3Sopenharmony_ci        HDF_LOGE("%s: register hid2d callback fail!", __FUNCTION__);
260094332d3Sopenharmony_ci    }
261094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s", __FUNCTION__);
262094332d3Sopenharmony_ci    return ret;
263094332d3Sopenharmony_ci}
264094332d3Sopenharmony_ci
265094332d3Sopenharmony_cistatic int32_t UnregisterHid2dCallbackInner(Hid2dCallback func, const char *ifName)
266094332d3Sopenharmony_ci{
267094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
268094332d3Sopenharmony_ci    if (func == NULL || ifName == NULL) {
269094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
270094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
271094332d3Sopenharmony_ci    }
272094332d3Sopenharmony_ci    WifiUnregisterHid2dCallback(func, ifName);
273094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s", __FUNCTION__);
274094332d3Sopenharmony_ci    return HDF_SUCCESS;
275094332d3Sopenharmony_ci}
276094332d3Sopenharmony_ci
277094332d3Sopenharmony_cistatic int32_t ResetDriverInner(uint8_t chipId, const char *ifName)
278094332d3Sopenharmony_ci{
279094332d3Sopenharmony_ci    if (ifName == NULL || chipId >= MAX_WLAN_DEVICE) {
280094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d, chipId = %u", __FUNCTION__, __LINE__, chipId);
281094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
282094332d3Sopenharmony_ci    }
283094332d3Sopenharmony_ci    return HalCmdSetResetDriver(chipId, ifName);
284094332d3Sopenharmony_ci}
285094332d3Sopenharmony_ci
286094332d3Sopenharmony_cistatic int32_t GetNetDevInfoInner(struct NetDeviceInfoResult *netDeviceInfoResult)
287094332d3Sopenharmony_ci{
288094332d3Sopenharmony_ci    if (netDeviceInfoResult == NULL) {
289094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
290094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
291094332d3Sopenharmony_ci    }
292094332d3Sopenharmony_ci    return GetNetDeviceInfo(netDeviceInfoResult);
293094332d3Sopenharmony_ci}
294094332d3Sopenharmony_ci
295094332d3Sopenharmony_cistatic int32_t GetPowerModeInner(const char *ifName, uint8_t *mode)
296094332d3Sopenharmony_ci{
297094332d3Sopenharmony_ci    if (ifName == NULL || mode == NULL) {
298094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
299094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
300094332d3Sopenharmony_ci    }
301094332d3Sopenharmony_ci
302094332d3Sopenharmony_ci    return GetCurrentPowerMode(ifName, mode);
303094332d3Sopenharmony_ci}
304094332d3Sopenharmony_ci
305094332d3Sopenharmony_cistatic int32_t SetPowerModeInner(const char *ifName, uint8_t mode)
306094332d3Sopenharmony_ci{
307094332d3Sopenharmony_ci    if (ifName == NULL || mode >= WIFI_POWER_MODE_NUM) {
308094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
309094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
310094332d3Sopenharmony_ci    }
311094332d3Sopenharmony_ci    return SetPowerMode(ifName, mode);
312094332d3Sopenharmony_ci}
313094332d3Sopenharmony_ci
314094332d3Sopenharmony_cistatic int32_t StartChannelMeasInner(const char *ifName, const struct MeasParam *measParam)
315094332d3Sopenharmony_ci{
316094332d3Sopenharmony_ci    if (ifName == NULL || measParam == NULL || measParam->channelId < 0) {
317094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
318094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
319094332d3Sopenharmony_ci    }
320094332d3Sopenharmony_ci    return StartChannelMeas(ifName, measParam);
321094332d3Sopenharmony_ci}
322094332d3Sopenharmony_ci
323094332d3Sopenharmony_cistatic int32_t GetChannelMeasResultInner(const char *ifName, struct MeasResult *measResult)
324094332d3Sopenharmony_ci{
325094332d3Sopenharmony_ci    if (ifName == NULL || measResult == NULL) {
326094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
327094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
328094332d3Sopenharmony_ci    }
329094332d3Sopenharmony_ci    return HDF_ERR_NOT_SUPPORT;
330094332d3Sopenharmony_ci}
331094332d3Sopenharmony_ci
332094332d3Sopenharmony_cistatic int32_t SetProjectionScreenParamInner(const char *ifName, const ProjectionScreenParam *param)
333094332d3Sopenharmony_ci{
334094332d3Sopenharmony_ci    if (ifName == NULL || param == NULL) {
335094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
336094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
337094332d3Sopenharmony_ci    }
338094332d3Sopenharmony_ci    return SetProjectionScreenParam(ifName, param);
339094332d3Sopenharmony_ci}
340094332d3Sopenharmony_ci
341094332d3Sopenharmony_cistatic int32_t SendCmdIoctlInner(const char *ifName, int32_t cmdId, const int8_t *paramBuf, uint32_t paramBufLen)
342094332d3Sopenharmony_ci{
343094332d3Sopenharmony_ci    if (ifName == NULL || paramBuf == NULL) {
344094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
345094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
346094332d3Sopenharmony_ci    }
347094332d3Sopenharmony_ci    return SendCmdIoctl(ifName, cmdId, paramBuf, paramBufLen);
348094332d3Sopenharmony_ci}
349094332d3Sopenharmony_ci
350094332d3Sopenharmony_cistatic int32_t GetStationInfoInner(const char *ifName, StationInfo *info, const uint8_t *mac, uint32_t macLen)
351094332d3Sopenharmony_ci{
352094332d3Sopenharmony_ci    if (ifName == NULL || info == NULL || mac == NULL || macLen != ETH_ADDR_LEN) {
353094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
354094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
355094332d3Sopenharmony_ci    }
356094332d3Sopenharmony_ci    return GetStationInfo(ifName, info, mac, macLen);
357094332d3Sopenharmony_ci}
358094332d3Sopenharmony_ci
359094332d3Sopenharmony_cistatic int32_t SendActionFrameInner(const char *ifName, uint32_t freq, const uint8_t *frameData, uint32_t frameDataLen)
360094332d3Sopenharmony_ci{
361094332d3Sopenharmony_ci    if (ifName == NULL || freq == 0 || frameData == NULL || frameDataLen == 0) {
362094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
363094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
364094332d3Sopenharmony_ci    }
365094332d3Sopenharmony_ci    return WifiSendActionFrame(ifName, freq, frameData, frameDataLen);
366094332d3Sopenharmony_ci}
367094332d3Sopenharmony_ci
368094332d3Sopenharmony_cistatic int32_t RegisterActionFrameReceiverInner(const char *ifName, const uint8_t *match, uint32_t matchLen)
369094332d3Sopenharmony_ci{
370094332d3Sopenharmony_ci    if (ifName == NULL || match == NULL || matchLen == 0) {
371094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
372094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
373094332d3Sopenharmony_ci    }
374094332d3Sopenharmony_ci    return WifiRegisterActionFrameReceiver(ifName, match, matchLen);
375094332d3Sopenharmony_ci}
376094332d3Sopenharmony_ci
377094332d3Sopenharmony_cistatic int32_t SetPowerSaveModeInner(const char *ifName, int32_t frequency, int32_t mode)
378094332d3Sopenharmony_ci{
379094332d3Sopenharmony_ci    if (ifName == NULL) {
380094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
381094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
382094332d3Sopenharmony_ci    }
383094332d3Sopenharmony_ci    return WifiSetPowerSaveMode(ifName, frequency, mode);
384094332d3Sopenharmony_ci}
385094332d3Sopenharmony_ci
386094332d3Sopenharmony_cistatic int32_t SetPowerSaveMode(const char *ifName, int32_t frequency, int32_t mode)
387094332d3Sopenharmony_ci{
388094332d3Sopenharmony_ci    HalMutexLock();
389094332d3Sopenharmony_ci    int32_t ret = SetPowerSaveModeInner(ifName, frequency, mode);
390094332d3Sopenharmony_ci    HalMutexUnlock();
391094332d3Sopenharmony_ci    return ret;
392094332d3Sopenharmony_ci}
393094332d3Sopenharmony_ci
394094332d3Sopenharmony_cistatic int32_t SetDpiMarkRuleInner(int32_t uid, int32_t protocol, int32_t enable)
395094332d3Sopenharmony_ci{
396094332d3Sopenharmony_ci    return WifiSetDpiMarkRule(uid, protocol, enable);
397094332d3Sopenharmony_ci}
398094332d3Sopenharmony_ci
399094332d3Sopenharmony_cistatic int32_t SetDpiMarkRule(int32_t uid, int32_t protocol, int32_t enable)
400094332d3Sopenharmony_ci{
401094332d3Sopenharmony_ci    HalMutexLock();
402094332d3Sopenharmony_ci    int32_t ret = SetDpiMarkRuleInner(uid, protocol, enable);
403094332d3Sopenharmony_ci    HalMutexUnlock();
404094332d3Sopenharmony_ci    return ret;
405094332d3Sopenharmony_ci}
406094332d3Sopenharmony_ci
407094332d3Sopenharmony_cistatic int32_t Start(struct IWiFi *iwifi)
408094332d3Sopenharmony_ci{
409094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
410094332d3Sopenharmony_ci    HalMutexLock();
411094332d3Sopenharmony_ci    int32_t ret = StartInner(iwifi);
412094332d3Sopenharmony_ci    HalMutexUnlock();
413094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
414094332d3Sopenharmony_ci    return ret;
415094332d3Sopenharmony_ci}
416094332d3Sopenharmony_ci
417094332d3Sopenharmony_cistatic int32_t Stop(struct IWiFi *iwifi)
418094332d3Sopenharmony_ci{
419094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
420094332d3Sopenharmony_ci    HalMutexLock();
421094332d3Sopenharmony_ci    int32_t ret = StopInner(iwifi);
422094332d3Sopenharmony_ci    HalMutexUnlock();
423094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
424094332d3Sopenharmony_ci    return ret;
425094332d3Sopenharmony_ci}
426094332d3Sopenharmony_ci
427094332d3Sopenharmony_cistatic int32_t GetSupportFeature(uint8_t *supType, uint32_t size)
428094332d3Sopenharmony_ci{
429094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
430094332d3Sopenharmony_ci    HalMutexLock();
431094332d3Sopenharmony_ci    int32_t ret = GetSupportFeatureInner(supType, size);
432094332d3Sopenharmony_ci    HalMutexUnlock();
433094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
434094332d3Sopenharmony_ci    return ret;
435094332d3Sopenharmony_ci}
436094332d3Sopenharmony_ci
437094332d3Sopenharmony_cistatic int32_t GetSupportCombo(uint64_t *combo, uint32_t size)
438094332d3Sopenharmony_ci{
439094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
440094332d3Sopenharmony_ci    HalMutexLock();
441094332d3Sopenharmony_ci    int32_t ret = GetSupportComboInner(combo, size);
442094332d3Sopenharmony_ci    HalMutexUnlock();
443094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
444094332d3Sopenharmony_ci    return ret;
445094332d3Sopenharmony_ci}
446094332d3Sopenharmony_ci
447094332d3Sopenharmony_cistatic int32_t CreateFeature(int32_t type, struct IWiFiBaseFeature **ifeature)
448094332d3Sopenharmony_ci{
449094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
450094332d3Sopenharmony_ci    HalMutexLock();
451094332d3Sopenharmony_ci    int32_t ret = CreateFeatureInner(type, ifeature);
452094332d3Sopenharmony_ci    HalMutexUnlock();
453094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
454094332d3Sopenharmony_ci    return ret;
455094332d3Sopenharmony_ci}
456094332d3Sopenharmony_ci
457094332d3Sopenharmony_cistatic int32_t GetFeatureByIfName(const char *ifName, struct IWiFiBaseFeature **ifeature)
458094332d3Sopenharmony_ci{
459094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
460094332d3Sopenharmony_ci    HalMutexLock();
461094332d3Sopenharmony_ci    int32_t ret = HalCmdGetFeatureByIfName(ifName, ifeature);
462094332d3Sopenharmony_ci    HalMutexUnlock();
463094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
464094332d3Sopenharmony_ci    return ret;
465094332d3Sopenharmony_ci}
466094332d3Sopenharmony_ci
467094332d3Sopenharmony_cistatic int32_t DestroyFeature(struct IWiFiBaseFeature *ifeature)
468094332d3Sopenharmony_ci{
469094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
470094332d3Sopenharmony_ci    HalMutexLock();
471094332d3Sopenharmony_ci    int32_t ret = DestroyFeatureInner(ifeature);
472094332d3Sopenharmony_ci    HalMutexUnlock();
473094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
474094332d3Sopenharmony_ci    return ret;
475094332d3Sopenharmony_ci}
476094332d3Sopenharmony_ci
477094332d3Sopenharmony_cistatic int32_t HalRegisterEventCallback(OnReceiveFunc onRecFunc, const char *ifName)
478094332d3Sopenharmony_ci{
479094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
480094332d3Sopenharmony_ci    HalMutexLock();
481094332d3Sopenharmony_ci    int32_t ret = RegisterEventCallbackInner(onRecFunc, ifName);
482094332d3Sopenharmony_ci    HalMutexUnlock();
483094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
484094332d3Sopenharmony_ci    return ret;
485094332d3Sopenharmony_ci}
486094332d3Sopenharmony_ci
487094332d3Sopenharmony_cistatic int32_t HalUnregisterEventCallback(OnReceiveFunc onRecFunc, const char *ifName)
488094332d3Sopenharmony_ci{
489094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
490094332d3Sopenharmony_ci    HalMutexLock();
491094332d3Sopenharmony_ci    int32_t ret = UnregisterEventCallbackInner(onRecFunc, ifName);
492094332d3Sopenharmony_ci    HalMutexUnlock();
493094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
494094332d3Sopenharmony_ci    return ret;
495094332d3Sopenharmony_ci}
496094332d3Sopenharmony_ci
497094332d3Sopenharmony_cistatic int32_t HalRegisterHid2dCallback(Hid2dCallback func, const char *ifName)
498094332d3Sopenharmony_ci{
499094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
500094332d3Sopenharmony_ci    HalMutexLock();
501094332d3Sopenharmony_ci    int32_t ret = RegisterHid2dCallbackInner(func, ifName);
502094332d3Sopenharmony_ci    HalMutexUnlock();
503094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
504094332d3Sopenharmony_ci    return ret;
505094332d3Sopenharmony_ci}
506094332d3Sopenharmony_ci
507094332d3Sopenharmony_cistatic int32_t HalUnregisterHid2dCallback(Hid2dCallback func, const char *ifName)
508094332d3Sopenharmony_ci{
509094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
510094332d3Sopenharmony_ci    HalMutexLock();
511094332d3Sopenharmony_ci    int32_t ret = UnregisterHid2dCallbackInner(func, ifName);
512094332d3Sopenharmony_ci    HalMutexUnlock();
513094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
514094332d3Sopenharmony_ci    return ret;
515094332d3Sopenharmony_ci}
516094332d3Sopenharmony_ci
517094332d3Sopenharmony_cistatic int32_t ResetDriver(const uint8_t chipId, const char *ifName)
518094332d3Sopenharmony_ci{
519094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
520094332d3Sopenharmony_ci    HalMutexLock();
521094332d3Sopenharmony_ci    int32_t ret = ResetDriverInner(chipId, ifName);
522094332d3Sopenharmony_ci    HalMutexUnlock();
523094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
524094332d3Sopenharmony_ci    return ret;
525094332d3Sopenharmony_ci}
526094332d3Sopenharmony_ci
527094332d3Sopenharmony_cistatic int32_t GetNetDevInfo(struct NetDeviceInfoResult *netDeviceInfoResult)
528094332d3Sopenharmony_ci{
529094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
530094332d3Sopenharmony_ci    HalMutexLock();
531094332d3Sopenharmony_ci    int32_t ret = GetNetDevInfoInner(netDeviceInfoResult);
532094332d3Sopenharmony_ci    HalMutexUnlock();
533094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
534094332d3Sopenharmony_ci    return ret;
535094332d3Sopenharmony_ci}
536094332d3Sopenharmony_ci
537094332d3Sopenharmony_cistatic int32_t WifiGetPowerMode(const char *ifName, uint8_t *mode)
538094332d3Sopenharmony_ci{
539094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
540094332d3Sopenharmony_ci    HalMutexLock();
541094332d3Sopenharmony_ci    int32_t ret = GetPowerModeInner(ifName, mode);
542094332d3Sopenharmony_ci    HalMutexUnlock();
543094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
544094332d3Sopenharmony_ci    return ret;
545094332d3Sopenharmony_ci}
546094332d3Sopenharmony_ci
547094332d3Sopenharmony_cistatic int32_t WifiSetPowerMode(const char *ifName, uint8_t mode)
548094332d3Sopenharmony_ci{
549094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
550094332d3Sopenharmony_ci    HalMutexLock();
551094332d3Sopenharmony_ci    int32_t ret = SetPowerModeInner(ifName, mode);
552094332d3Sopenharmony_ci    HalMutexUnlock();
553094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
554094332d3Sopenharmony_ci    return ret;
555094332d3Sopenharmony_ci}
556094332d3Sopenharmony_ci
557094332d3Sopenharmony_cistatic int32_t WifiStartChannelMeas(const char *ifName, const struct MeasParam *measParam)
558094332d3Sopenharmony_ci{
559094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
560094332d3Sopenharmony_ci    HalMutexLock();
561094332d3Sopenharmony_ci    int32_t ret = StartChannelMeasInner(ifName, measParam);
562094332d3Sopenharmony_ci    HalMutexUnlock();
563094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
564094332d3Sopenharmony_ci    return ret;
565094332d3Sopenharmony_ci}
566094332d3Sopenharmony_ci
567094332d3Sopenharmony_cistatic int32_t WifiGetChannelMeasResult(const char *ifName, struct MeasResult *measResult)
568094332d3Sopenharmony_ci{
569094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
570094332d3Sopenharmony_ci    HalMutexLock();
571094332d3Sopenharmony_ci    int32_t ret = GetChannelMeasResultInner(ifName, measResult);
572094332d3Sopenharmony_ci    HalMutexUnlock();
573094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
574094332d3Sopenharmony_ci    return ret;
575094332d3Sopenharmony_ci}
576094332d3Sopenharmony_ci
577094332d3Sopenharmony_cistatic int32_t WifiSetProjectionScreenParam(const char *ifName, const ProjectionScreenParam *param)
578094332d3Sopenharmony_ci{
579094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
580094332d3Sopenharmony_ci    HalMutexLock();
581094332d3Sopenharmony_ci    int32_t ret = SetProjectionScreenParamInner(ifName, param);
582094332d3Sopenharmony_ci    HalMutexUnlock();
583094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
584094332d3Sopenharmony_ci    return ret;
585094332d3Sopenharmony_ci}
586094332d3Sopenharmony_ci
587094332d3Sopenharmony_cistatic int32_t WifiSendCmdIoctl(const char *ifName, int32_t cmdId, const int8_t *paramBuf, uint32_t paramBufLen)
588094332d3Sopenharmony_ci{
589094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
590094332d3Sopenharmony_ci    HalMutexLock();
591094332d3Sopenharmony_ci    int32_t ret = SendCmdIoctlInner(ifName, cmdId, paramBuf, paramBufLen);
592094332d3Sopenharmony_ci    HalMutexUnlock();
593094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
594094332d3Sopenharmony_ci    return ret;
595094332d3Sopenharmony_ci}
596094332d3Sopenharmony_ci
597094332d3Sopenharmony_cistatic int32_t WifiGetStationInfo(const char *ifName, StationInfo *info, const uint8_t *mac, uint32_t macLen)
598094332d3Sopenharmony_ci{
599094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
600094332d3Sopenharmony_ci    HalMutexLock();
601094332d3Sopenharmony_ci    int32_t ret = GetStationInfoInner(ifName, info, mac, macLen);
602094332d3Sopenharmony_ci    HalMutexUnlock();
603094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
604094332d3Sopenharmony_ci    return ret;
605094332d3Sopenharmony_ci}
606094332d3Sopenharmony_ci
607094332d3Sopenharmony_cistatic int32_t SendActionFrame(const char *ifName, uint32_t freq, const uint8_t *frameData, uint32_t frameDataLen)
608094332d3Sopenharmony_ci{
609094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
610094332d3Sopenharmony_ci    HalMutexLock();
611094332d3Sopenharmony_ci    int32_t ret = SendActionFrameInner(ifName, freq, frameData, frameDataLen);
612094332d3Sopenharmony_ci    HalMutexUnlock();
613094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
614094332d3Sopenharmony_ci    return ret;
615094332d3Sopenharmony_ci}
616094332d3Sopenharmony_ci
617094332d3Sopenharmony_cistatic int32_t RegisterActionFrameReceiver(const char *ifName, const uint8_t *match, uint32_t matchLen)
618094332d3Sopenharmony_ci{
619094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
620094332d3Sopenharmony_ci    HalMutexLock();
621094332d3Sopenharmony_ci    int32_t ret = RegisterActionFrameReceiverInner(ifName, match, matchLen);
622094332d3Sopenharmony_ci    HalMutexUnlock();
623094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
624094332d3Sopenharmony_ci    return ret;
625094332d3Sopenharmony_ci}
626094332d3Sopenharmony_ci
627094332d3Sopenharmony_ciint32_t WifiConstruct(struct IWiFi **wifiInstance)
628094332d3Sopenharmony_ci{
629094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
630094332d3Sopenharmony_ci    static bool isInited = false;
631094332d3Sopenharmony_ci    static struct IWiFi singleWifiInstance;
632094332d3Sopenharmony_ci
633094332d3Sopenharmony_ci    if (!isInited) {
634094332d3Sopenharmony_ci        if (HalMutexInit() != HDF_SUCCESS) {
635094332d3Sopenharmony_ci            HDF_LOGE("%s: HalMutexInit failed, line: %d", __FUNCTION__, __LINE__);
636094332d3Sopenharmony_ci            return HDF_FAILURE;
637094332d3Sopenharmony_ci        }
638094332d3Sopenharmony_ci
639094332d3Sopenharmony_ci        singleWifiInstance.start = Start;
640094332d3Sopenharmony_ci        singleWifiInstance.stop = Stop;
641094332d3Sopenharmony_ci        singleWifiInstance.getSupportFeature = GetSupportFeature;
642094332d3Sopenharmony_ci        singleWifiInstance.getSupportCombo = GetSupportCombo;
643094332d3Sopenharmony_ci        singleWifiInstance.createFeature = CreateFeature;
644094332d3Sopenharmony_ci        singleWifiInstance.getFeatureByIfName = GetFeatureByIfName;
645094332d3Sopenharmony_ci        singleWifiInstance.destroyFeature = DestroyFeature;
646094332d3Sopenharmony_ci        singleWifiInstance.registerEventCallback = HalRegisterEventCallback;
647094332d3Sopenharmony_ci        singleWifiInstance.unregisterEventCallback = HalUnregisterEventCallback;
648094332d3Sopenharmony_ci        singleWifiInstance.resetDriver = ResetDriver;
649094332d3Sopenharmony_ci        singleWifiInstance.getNetDevInfo = GetNetDevInfo;
650094332d3Sopenharmony_ci        singleWifiInstance.getPowerMode = WifiGetPowerMode;
651094332d3Sopenharmony_ci        singleWifiInstance.setPowerMode = WifiSetPowerMode;
652094332d3Sopenharmony_ci        singleWifiInstance.startChannelMeas = WifiStartChannelMeas;
653094332d3Sopenharmony_ci        singleWifiInstance.getChannelMeasResult = WifiGetChannelMeasResult;
654094332d3Sopenharmony_ci        singleWifiInstance.setProjectionScreenParam = WifiSetProjectionScreenParam;
655094332d3Sopenharmony_ci        singleWifiInstance.sendCmdIoctl = WifiSendCmdIoctl;
656094332d3Sopenharmony_ci        singleWifiInstance.registerHid2dCallback = HalRegisterHid2dCallback;
657094332d3Sopenharmony_ci        singleWifiInstance.unregisterHid2dCallback = HalUnregisterHid2dCallback;
658094332d3Sopenharmony_ci        singleWifiInstance.getStationInfo = WifiGetStationInfo;
659094332d3Sopenharmony_ci        singleWifiInstance.sendActionFrame = SendActionFrame;
660094332d3Sopenharmony_ci        singleWifiInstance.registerActionFrameReceiver = RegisterActionFrameReceiver;
661094332d3Sopenharmony_ci        singleWifiInstance.setPowerSaveMode = SetPowerSaveMode;
662094332d3Sopenharmony_ci        singleWifiInstance.setDpiMarkRule = SetDpiMarkRule;
663094332d3Sopenharmony_ci        InitIWiFiList();
664094332d3Sopenharmony_ci        isInited = true;
665094332d3Sopenharmony_ci    }
666094332d3Sopenharmony_ci    (*wifiInstance) = &singleWifiInstance;
667094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, isInited:%{public}d", __FUNCTION__, isInited);
668094332d3Sopenharmony_ci    return HDF_SUCCESS;
669094332d3Sopenharmony_ci}
670094332d3Sopenharmony_ci
671094332d3Sopenharmony_ciint32_t WifiDestruct(struct IWiFi **wifiInstance)
672094332d3Sopenharmony_ci{
673094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
674094332d3Sopenharmony_ci    if (wifiInstance == NULL) {
675094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
676094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
677094332d3Sopenharmony_ci    }
678094332d3Sopenharmony_ci    *wifiInstance = NULL;
679094332d3Sopenharmony_ci    if (HalMutexDestroy() != HDF_SUCCESS) {
680094332d3Sopenharmony_ci        HDF_LOGE("%s: HalMutexDestroy failed, line: %d", __FUNCTION__, __LINE__);
681094332d3Sopenharmony_ci        return HDF_FAILURE;
682094332d3Sopenharmony_ci    }
683094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s", __FUNCTION__);
684094332d3Sopenharmony_ci    return HDF_SUCCESS;
685094332d3Sopenharmony_ci}
686094332d3Sopenharmony_ci
687094332d3Sopenharmony_ci#ifdef __cplusplus
688094332d3Sopenharmony_ci#if __cplusplus
689094332d3Sopenharmony_ci}
690094332d3Sopenharmony_ci#endif
691094332d3Sopenharmony_ci#endif
692