1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2022-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#include "wlan_common_cmd.h"
16094332d3Sopenharmony_ci#include <securec.h>
17094332d3Sopenharmony_ci#include <hdf_base.h>
18094332d3Sopenharmony_ci#include <hdf_log.h>
19094332d3Sopenharmony_ci#include <osal_time.h>
20094332d3Sopenharmony_ci#include <osal_mem.h>
21094332d3Sopenharmony_ci#include "wlan_extend_cmd.h"
22094332d3Sopenharmony_ci#include "v1_3/iwlan_callback.h"
23094332d3Sopenharmony_ci#include "v1_3/iwlan_interface.h"
24094332d3Sopenharmony_ci
25094332d3Sopenharmony_cistruct IWiFi *g_wifi = NULL;
26094332d3Sopenharmony_cistruct IWiFiAp *g_apFeature = NULL;
27094332d3Sopenharmony_cistruct IWiFiSta *g_staFeature = NULL;
28094332d3Sopenharmony_cistruct IWiFiP2p *g_p2pFeature = NULL;
29094332d3Sopenharmony_cistruct IWiFiBaseFeature *g_baseFeature = NULL;
30094332d3Sopenharmony_cistatic uint32_t g_wifiCount = 0;
31094332d3Sopenharmony_cistatic uint32_t g_apFeatureCount = 0;
32094332d3Sopenharmony_cistatic uint32_t g_staFeatureCount = 0;
33094332d3Sopenharmony_cistatic uint32_t g_p2pFeatureCount = 0;
34094332d3Sopenharmony_ciconst uint32_t RESET_TIME = 3;
35094332d3Sopenharmony_ci#define DEFAULT_COMBO_SIZE 10
36094332d3Sopenharmony_ci#define WLAN_FREQ_MAX_NUM 14
37094332d3Sopenharmony_ci#define WLAN_MAX_NUM_STA_WITH_AP 4
38094332d3Sopenharmony_ci#define ETH_ADDR_LEN 6
39094332d3Sopenharmony_ci
40094332d3Sopenharmony_cistruct HdfWlanStubData *HdfStubDriver(void)
41094332d3Sopenharmony_ci{
42094332d3Sopenharmony_ci    static struct HdfWlanStubData registerManager;
43094332d3Sopenharmony_ci    return &registerManager;
44094332d3Sopenharmony_ci}
45094332d3Sopenharmony_ci
46094332d3Sopenharmony_ciint32_t WlanInterfaceStart(struct IWlanInterface *self)
47094332d3Sopenharmony_ci{
48094332d3Sopenharmony_ci    int32_t ret;
49094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
50094332d3Sopenharmony_ci    (void)self;
51094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->start == NULL) {
52094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: g_wifi or g_wifi->start is NULL", __func__);
53094332d3Sopenharmony_ci        return HDF_FAILURE;
54094332d3Sopenharmony_ci    }
55094332d3Sopenharmony_ci    ret = g_wifi->start(g_wifi);
56094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
57094332d3Sopenharmony_ci        HDF_LOGE("%{public}s start WiFi failed! error code: %{public}d", __func__, ret);
58094332d3Sopenharmony_ci    } else {
59094332d3Sopenharmony_ci        g_wifiCount++;
60094332d3Sopenharmony_ci    }
61094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, g_wifiCount:%{public}u", __FUNCTION__, g_wifiCount);
62094332d3Sopenharmony_ci    return ret;
63094332d3Sopenharmony_ci}
64094332d3Sopenharmony_ci
65094332d3Sopenharmony_ciint32_t WlanInterfaceStop(struct IWlanInterface *self)
66094332d3Sopenharmony_ci{
67094332d3Sopenharmony_ci    int32_t ret;
68094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
69094332d3Sopenharmony_ci    (void)self;
70094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->stop == NULL) {
71094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: g_wifi or g_wifi->stop is NULL", __func__);
72094332d3Sopenharmony_ci        return HDF_FAILURE;
73094332d3Sopenharmony_ci    }
74094332d3Sopenharmony_ci    g_wifiCount--;
75094332d3Sopenharmony_ci    if (g_wifiCount > 0) {
76094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: g_wifi is used!", __func__);
77094332d3Sopenharmony_ci        return HDF_SUCCESS;
78094332d3Sopenharmony_ci    }
79094332d3Sopenharmony_ci    ret = g_wifi->stop(g_wifi);
80094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
81094332d3Sopenharmony_ci        HDF_LOGE("%{public}s stop WiFi failed! error code: %{public}d", __func__, ret);
82094332d3Sopenharmony_ci    }
83094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, g_wifiCount:%{public}u", __FUNCTION__, g_wifiCount);
84094332d3Sopenharmony_ci    return ret;
85094332d3Sopenharmony_ci}
86094332d3Sopenharmony_ci
87094332d3Sopenharmony_ciint32_t WlanInterfaceCreateFeature(struct IWlanInterface *self, int32_t type, struct HdfFeatureInfo *ifeature)
88094332d3Sopenharmony_ci{
89094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
90094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s type:%{public}d", __FUNCTION__, type);
91094332d3Sopenharmony_ci    (void)self;
92094332d3Sopenharmony_ci    if (ifeature == NULL) {
93094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: input parameter invalid!", __func__);
94094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
95094332d3Sopenharmony_ci    }
96094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->createFeature == NULL) {
97094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: g_wifi or g_wifi->createFeature is NULL", __func__);
98094332d3Sopenharmony_ci        return HDF_FAILURE;
99094332d3Sopenharmony_ci    }
100094332d3Sopenharmony_ci    if (type == PROTOCOL_80211_IFTYPE_AP) {
101094332d3Sopenharmony_ci        ret = g_wifi->createFeature(type, (struct IWiFiBaseFeature **)&g_apFeature);
102094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
103094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: createAPFeature failed, error code: %{public}d", __func__, ret);
104094332d3Sopenharmony_ci            return HDF_FAILURE;
105094332d3Sopenharmony_ci        }
106094332d3Sopenharmony_ci        if (g_apFeature != NULL) {
107094332d3Sopenharmony_ci            g_apFeatureCount++;
108094332d3Sopenharmony_ci            ifeature->type = g_apFeature->baseFeature.type;
109094332d3Sopenharmony_ci            ifeature->ifName = strdup((g_apFeature->baseFeature).ifName);
110094332d3Sopenharmony_ci        }
111094332d3Sopenharmony_ci    } else if (type == PROTOCOL_80211_IFTYPE_STATION) {
112094332d3Sopenharmony_ci        ret = g_wifi->createFeature(type, (struct IWiFiBaseFeature **)&g_staFeature);
113094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
114094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: createSTAFeature failed, error code: %{public}d", __func__, ret);
115094332d3Sopenharmony_ci            return HDF_FAILURE;
116094332d3Sopenharmony_ci        }
117094332d3Sopenharmony_ci        if (g_staFeature != NULL) {
118094332d3Sopenharmony_ci            g_staFeatureCount++;
119094332d3Sopenharmony_ci            ifeature->type = g_staFeature->baseFeature.type;
120094332d3Sopenharmony_ci            ifeature->ifName = strdup((g_staFeature->baseFeature).ifName);
121094332d3Sopenharmony_ci        }
122094332d3Sopenharmony_ci    } else if (type == PROTOCOL_80211_IFTYPE_P2P_DEVICE) {
123094332d3Sopenharmony_ci        ret = g_wifi->createFeature(type, (struct IWiFiBaseFeature **)&g_p2pFeature);
124094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
125094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: failed to create p2p feature, errorCode: %{public}d", __func__, ret);
126094332d3Sopenharmony_ci            return HDF_FAILURE;
127094332d3Sopenharmony_ci        }
128094332d3Sopenharmony_ci        if (g_p2pFeature != NULL) {
129094332d3Sopenharmony_ci            g_p2pFeatureCount++;
130094332d3Sopenharmony_ci            ifeature->type = g_p2pFeature->baseFeature.type;
131094332d3Sopenharmony_ci            ifeature->ifName = strdup((g_p2pFeature->baseFeature).ifName);
132094332d3Sopenharmony_ci        }
133094332d3Sopenharmony_ci    }
134094332d3Sopenharmony_ci    if (ifeature->ifName == NULL) {
135094332d3Sopenharmony_ci        return HDF_FAILURE;
136094332d3Sopenharmony_ci    }
137094332d3Sopenharmony_ci    HDF_LOGI("ap:%{public}u sta:%{public}u p2p:%{public}u", g_apFeatureCount, g_staFeatureCount, g_p2pFeatureCount);
138094332d3Sopenharmony_ci    return ret;
139094332d3Sopenharmony_ci}
140094332d3Sopenharmony_ci
141094332d3Sopenharmony_ciint32_t WlanInterfaceDestroyFeature(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature)
142094332d3Sopenharmony_ci{
143094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
144094332d3Sopenharmony_ci
145094332d3Sopenharmony_ci    (void)self;
146094332d3Sopenharmony_ci    if (ifeature == NULL || ifeature->ifName == NULL) {
147094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
148094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
149094332d3Sopenharmony_ci    }
150094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->destroyFeature == NULL) {
151094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: g_wifi or g_wifi->destroyFeature is NULL", __func__);
152094332d3Sopenharmony_ci        return HDF_FAILURE;
153094332d3Sopenharmony_ci    }
154094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s type:%{public}d", __FUNCTION__, ifeature->type);
155094332d3Sopenharmony_ci    if (ifeature->type == PROTOCOL_80211_IFTYPE_AP) {
156094332d3Sopenharmony_ci        if (g_apFeature == NULL) {
157094332d3Sopenharmony_ci            HDF_LOGE("%{public}s g_apFeature is NULL!", __func__);
158094332d3Sopenharmony_ci            return HDF_FAILURE;
159094332d3Sopenharmony_ci        }
160094332d3Sopenharmony_ci        g_apFeatureCount--;
161094332d3Sopenharmony_ci        if (g_apFeatureCount > 0) {
162094332d3Sopenharmony_ci            HDF_LOGI("%{public}s: apFeature is used!", __func__);
163094332d3Sopenharmony_ci            return HDF_SUCCESS;
164094332d3Sopenharmony_ci        }
165094332d3Sopenharmony_ci        ret = strcpy_s((g_apFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName);
166094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
167094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: strcpy_s apFeature ifName is failed!", __func__);
168094332d3Sopenharmony_ci            return HDF_FAILURE;
169094332d3Sopenharmony_ci        }
170094332d3Sopenharmony_ci        ret = g_wifi->destroyFeature(&(g_apFeature->baseFeature));
171094332d3Sopenharmony_ci        g_apFeature = NULL;
172094332d3Sopenharmony_ci    } else if (ifeature->type == PROTOCOL_80211_IFTYPE_STATION) {
173094332d3Sopenharmony_ci        if (g_staFeature == NULL) {
174094332d3Sopenharmony_ci            HDF_LOGE("%{public}s g_staFeature is NULL!", __func__);
175094332d3Sopenharmony_ci            return HDF_FAILURE;
176094332d3Sopenharmony_ci        }
177094332d3Sopenharmony_ci        g_staFeatureCount--;
178094332d3Sopenharmony_ci        if (g_staFeatureCount > 0) {
179094332d3Sopenharmony_ci            HDF_LOGI("%{public}s: staFeature is used!", __func__);
180094332d3Sopenharmony_ci            return HDF_SUCCESS;
181094332d3Sopenharmony_ci        }
182094332d3Sopenharmony_ci        ret = strcpy_s((g_staFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName);
183094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
184094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: strcpy_s staFeature ifName is failed!", __func__);
185094332d3Sopenharmony_ci            return HDF_FAILURE;
186094332d3Sopenharmony_ci        }
187094332d3Sopenharmony_ci        ret = g_wifi->destroyFeature(&(g_staFeature->baseFeature));
188094332d3Sopenharmony_ci        g_staFeature = NULL;
189094332d3Sopenharmony_ci    } else if (ifeature->type == PROTOCOL_80211_IFTYPE_P2P_DEVICE) {
190094332d3Sopenharmony_ci        if (g_p2pFeature == NULL) {
191094332d3Sopenharmony_ci            HDF_LOGE("%{public}s g_p2pFeature is NULL!", __func__);
192094332d3Sopenharmony_ci            return HDF_FAILURE;
193094332d3Sopenharmony_ci        }
194094332d3Sopenharmony_ci        g_p2pFeatureCount--;
195094332d3Sopenharmony_ci        if (g_p2pFeatureCount > 0) {
196094332d3Sopenharmony_ci            HDF_LOGI("%{public}s: p2pFeature is used!", __func__);
197094332d3Sopenharmony_ci            return HDF_SUCCESS;
198094332d3Sopenharmony_ci        }
199094332d3Sopenharmony_ci        ret = strcpy_s((g_p2pFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName);
200094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
201094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: failed to copy the ifName! ret: %{public}d", __func__, ret);
202094332d3Sopenharmony_ci            return HDF_FAILURE;
203094332d3Sopenharmony_ci        }
204094332d3Sopenharmony_ci        ret = g_wifi->destroyFeature(&(g_p2pFeature->baseFeature));
205094332d3Sopenharmony_ci        g_p2pFeature = NULL;
206094332d3Sopenharmony_ci    } else {
207094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: wlan type is invalid", __func__);
208094332d3Sopenharmony_ci    }
209094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, apFeatureCount:%{public}u staFeatureCount:%{public}u p2pFeatureCount:%{public}u",
210094332d3Sopenharmony_ci        __FUNCTION__, g_apFeatureCount, g_staFeatureCount, g_p2pFeatureCount);
211094332d3Sopenharmony_ci    return ret;
212094332d3Sopenharmony_ci}
213094332d3Sopenharmony_ci
214094332d3Sopenharmony_ciint32_t WlanInterfaceGetAssociatedStas(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
215094332d3Sopenharmony_ci    struct HdfStaInfo *staInfo, uint32_t *staInfoLen, uint32_t *num)
216094332d3Sopenharmony_ci{
217094332d3Sopenharmony_ci    int32_t ret;
218094332d3Sopenharmony_ci
219094332d3Sopenharmony_ci    (void)self;
220094332d3Sopenharmony_ci    if (ifeature == NULL || ifeature->ifName == NULL || staInfo == NULL || staInfoLen == NULL || num == NULL)  {
221094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:input parameter invalid!", __func__);
222094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
223094332d3Sopenharmony_ci    }
224094332d3Sopenharmony_ci    if (g_apFeature == NULL || g_apFeature->getAssociatedStas == NULL) {
225094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_apFeature or g_apFeature->getAssociatedStas is NULL!", __func__);
226094332d3Sopenharmony_ci        return HDF_FAILURE;
227094332d3Sopenharmony_ci    }
228094332d3Sopenharmony_ci    ret = strcpy_s((g_apFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName);
229094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
230094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: strcpy_s apFeature ifName is failed!", __func__);
231094332d3Sopenharmony_ci        return HDF_FAILURE;
232094332d3Sopenharmony_ci    }
233094332d3Sopenharmony_ci
234094332d3Sopenharmony_ci    struct StaInfo *wifiStaInfo = (struct StaInfo *)OsalMemCalloc(sizeof(struct StaInfo) * (*staInfoLen));
235094332d3Sopenharmony_ci    if (wifiStaInfo == NULL) {
236094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:OsalMemCalloc failed!", __func__);
237094332d3Sopenharmony_ci        return HDF_FAILURE;
238094332d3Sopenharmony_ci    }
239094332d3Sopenharmony_ci    ret = g_apFeature->getAssociatedStas(g_apFeature, wifiStaInfo, *staInfoLen, num);
240094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
241094332d3Sopenharmony_ci        HDF_LOGE("%{public}s get associated sta failed!, error code: %{public}d", __func__, ret);
242094332d3Sopenharmony_ci        OsalMemFree(wifiStaInfo);
243094332d3Sopenharmony_ci        return ret;
244094332d3Sopenharmony_ci    }
245094332d3Sopenharmony_ci    for (uint32_t i = 0; i < (*num); i++) {
246094332d3Sopenharmony_ci        staInfo[i].mac = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * ETH_ADDR_LEN);
247094332d3Sopenharmony_ci        if (staInfo[i].mac != NULL) {
248094332d3Sopenharmony_ci            if (memcpy_s(staInfo[i].mac, WIFI_MAC_ADDR_LENGTH, wifiStaInfo[i].mac, WIFI_MAC_ADDR_LENGTH) != EOK) {
249094332d3Sopenharmony_ci                HDF_LOGE("%{public}s fail : memcpy_s mac fail!", __func__);
250094332d3Sopenharmony_ci                ret = HDF_FAILURE;
251094332d3Sopenharmony_ci                break;
252094332d3Sopenharmony_ci            }
253094332d3Sopenharmony_ci            staInfo[i].macLen = WIFI_MAC_ADDR_LENGTH;
254094332d3Sopenharmony_ci        }
255094332d3Sopenharmony_ci    }
256094332d3Sopenharmony_ci    OsalMemFree(wifiStaInfo);
257094332d3Sopenharmony_ci    return ret;
258094332d3Sopenharmony_ci}
259094332d3Sopenharmony_ci
260094332d3Sopenharmony_cistatic int32_t GetBasefeature(const struct HdfFeatureInfo *ifeature, struct IWiFiBaseFeature **baseFeature)
261094332d3Sopenharmony_ci{
262094332d3Sopenharmony_ci    if (ifeature->type == PROTOCOL_80211_IFTYPE_AP) {
263094332d3Sopenharmony_ci        if (g_apFeature == NULL) {
264094332d3Sopenharmony_ci            HDF_LOGE("%{public}s g_apFeature is NULL!", __func__);
265094332d3Sopenharmony_ci            return HDF_FAILURE;
266094332d3Sopenharmony_ci        }
267094332d3Sopenharmony_ci        *baseFeature = &(g_apFeature->baseFeature);
268094332d3Sopenharmony_ci    } else if (ifeature->type == PROTOCOL_80211_IFTYPE_STATION) {
269094332d3Sopenharmony_ci        if (g_staFeature == NULL) {
270094332d3Sopenharmony_ci            HDF_LOGE("%{public}s g_staFeature is NULL!", __func__);
271094332d3Sopenharmony_ci            return HDF_FAILURE;
272094332d3Sopenharmony_ci        }
273094332d3Sopenharmony_ci        *baseFeature = &(g_staFeature->baseFeature);
274094332d3Sopenharmony_ci    } else if (ifeature->type == PROTOCOL_80211_IFTYPE_P2P_DEVICE) {
275094332d3Sopenharmony_ci        if (g_p2pFeature == NULL) {
276094332d3Sopenharmony_ci            HDF_LOGE("%{public}s g_p2pFeature is NULL!", __func__);
277094332d3Sopenharmony_ci            return HDF_FAILURE;
278094332d3Sopenharmony_ci        }
279094332d3Sopenharmony_ci        *baseFeature = &(g_p2pFeature->baseFeature);
280094332d3Sopenharmony_ci    } else {
281094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: wlan type is Invalid, featureType is %{public}d", __func__, ifeature->type);
282094332d3Sopenharmony_ci        return HDF_FAILURE;
283094332d3Sopenharmony_ci    }
284094332d3Sopenharmony_ci    return HDF_SUCCESS;
285094332d3Sopenharmony_ci}
286094332d3Sopenharmony_ci
287094332d3Sopenharmony_ciint32_t WlanInterfaceGetChipId(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, uint8_t *chipId)
288094332d3Sopenharmony_ci{
289094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
290094332d3Sopenharmony_ci    struct IWiFiBaseFeature *baseFeature = NULL;
291094332d3Sopenharmony_ci
292094332d3Sopenharmony_ci    (void)self;
293094332d3Sopenharmony_ci    if (ifeature == NULL || ifeature->ifName == NULL || chipId == NULL) {
294094332d3Sopenharmony_ci        HDF_LOGE("%{public}s ifeature or ifName is NULL!", __func__);
295094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
296094332d3Sopenharmony_ci    }
297094332d3Sopenharmony_ci    ret = GetBasefeature(ifeature, &baseFeature);
298094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
299094332d3Sopenharmony_ci        HDF_LOGE("%{public}s GetBasefeature failed!", __func__);
300094332d3Sopenharmony_ci        return HDF_FAILURE;
301094332d3Sopenharmony_ci    }
302094332d3Sopenharmony_ci    ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName);
303094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
304094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
305094332d3Sopenharmony_ci        return HDF_FAILURE;
306094332d3Sopenharmony_ci    }
307094332d3Sopenharmony_ci
308094332d3Sopenharmony_ci    return baseFeature->getChipId(baseFeature, chipId);
309094332d3Sopenharmony_ci}
310094332d3Sopenharmony_ci
311094332d3Sopenharmony_ciint32_t WlanInterfaceGetDeviceMacAddress(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
312094332d3Sopenharmony_ci    uint8_t *mac, uint32_t *macLen, uint8_t len)
313094332d3Sopenharmony_ci{
314094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
315094332d3Sopenharmony_ci    struct IWiFiBaseFeature *baseFeature = NULL;
316094332d3Sopenharmony_ci
317094332d3Sopenharmony_ci    (void)self;
318094332d3Sopenharmony_ci    if (ifeature == NULL || ifeature->ifName == NULL || mac == NULL || macLen == NULL) {
319094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
320094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
321094332d3Sopenharmony_ci    }
322094332d3Sopenharmony_ci    ret = GetBasefeature(ifeature, &baseFeature);
323094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
324094332d3Sopenharmony_ci        HDF_LOGE("%{public}s GetBasefeature failed!", __func__);
325094332d3Sopenharmony_ci        return HDF_FAILURE;
326094332d3Sopenharmony_ci    }
327094332d3Sopenharmony_ci    ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName);
328094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
329094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
330094332d3Sopenharmony_ci        return HDF_FAILURE;
331094332d3Sopenharmony_ci    }
332094332d3Sopenharmony_ci    ret = baseFeature->getDeviceMacAddress(baseFeature, mac, len);
333094332d3Sopenharmony_ci    *macLen = ETH_ADDR_LEN;
334094332d3Sopenharmony_ci    return ret;
335094332d3Sopenharmony_ci}
336094332d3Sopenharmony_ci
337094332d3Sopenharmony_ciint32_t WlanInterfaceGetFeatureByIfName(struct IWlanInterface *self, const char *ifName,
338094332d3Sopenharmony_ci    struct HdfFeatureInfo *ifeature)
339094332d3Sopenharmony_ci{
340094332d3Sopenharmony_ci    int32_t ret;
341094332d3Sopenharmony_ci    struct IWiFiBaseFeature *baseFeature = NULL;
342094332d3Sopenharmony_ci
343094332d3Sopenharmony_ci    (void)self;
344094332d3Sopenharmony_ci    if (ifName == NULL || ifeature == NULL) {
345094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
346094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
347094332d3Sopenharmony_ci    }
348094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->getFeatureByIfName == NULL) {
349094332d3Sopenharmony_ci        HDF_LOGE("%{public}s gwifi or g_wifi->getFeatureByIfName is NULL!", __func__);
350094332d3Sopenharmony_ci        return HDF_FAILURE;
351094332d3Sopenharmony_ci    }
352094332d3Sopenharmony_ci    ret = g_wifi->getFeatureByIfName(ifName, (struct IWiFiBaseFeature **)&baseFeature);
353094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
354094332d3Sopenharmony_ci        HDF_LOGE("%{public}s get FeatureByIfName failed!, error code: %{public}d", __func__, ret);
355094332d3Sopenharmony_ci        return ret;
356094332d3Sopenharmony_ci    }
357094332d3Sopenharmony_ci    if (baseFeature == NULL) {
358094332d3Sopenharmony_ci        HDF_LOGE("%{public}s baseFeature is NULL!", __func__);
359094332d3Sopenharmony_ci        return HDF_FAILURE;
360094332d3Sopenharmony_ci    }
361094332d3Sopenharmony_ci    ifeature->type = baseFeature->type;
362094332d3Sopenharmony_ci    ifeature->ifName = strdup(baseFeature->ifName);
363094332d3Sopenharmony_ci    if (!ifeature->ifName) {
364094332d3Sopenharmony_ci        HDF_LOGE("ifName is NULL!");
365094332d3Sopenharmony_ci        return HDF_FAILURE;
366094332d3Sopenharmony_ci    }
367094332d3Sopenharmony_ci
368094332d3Sopenharmony_ci    return ret;
369094332d3Sopenharmony_ci}
370094332d3Sopenharmony_ci
371094332d3Sopenharmony_ciint32_t WlanInterfaceGetFeatureType(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
372094332d3Sopenharmony_ci    int32_t *featureType)
373094332d3Sopenharmony_ci{
374094332d3Sopenharmony_ci    (void)self;
375094332d3Sopenharmony_ci    int32_t ret;
376094332d3Sopenharmony_ci    int32_t type;
377094332d3Sopenharmony_ci    struct IWiFiBaseFeature *baseFeature = NULL;
378094332d3Sopenharmony_ci
379094332d3Sopenharmony_ci    if (ifeature == NULL || featureType == NULL) {
380094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
381094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
382094332d3Sopenharmony_ci    }
383094332d3Sopenharmony_ci    ret = GetBasefeature(ifeature, &baseFeature);
384094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
385094332d3Sopenharmony_ci        HDF_LOGE("%{public}s GetBasefeature failed!", __func__);
386094332d3Sopenharmony_ci        return HDF_FAILURE;
387094332d3Sopenharmony_ci    }
388094332d3Sopenharmony_ci    baseFeature->type = ifeature->type;
389094332d3Sopenharmony_ci    type = baseFeature->getFeatureType(baseFeature);
390094332d3Sopenharmony_ci    *featureType = type;
391094332d3Sopenharmony_ci    return HDF_SUCCESS;
392094332d3Sopenharmony_ci}
393094332d3Sopenharmony_ci
394094332d3Sopenharmony_ciint32_t WlanInterfaceGetFreqsWithBand(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
395094332d3Sopenharmony_ci    const struct HdfWifiInfo *wifiInfo, int32_t *freq, uint32_t *freqLen)
396094332d3Sopenharmony_ci{
397094332d3Sopenharmony_ci    int32_t ret;
398094332d3Sopenharmony_ci    struct IWiFiBaseFeature *baseFeature = NULL;
399094332d3Sopenharmony_ci
400094332d3Sopenharmony_ci    (void)self;
401094332d3Sopenharmony_ci    if (ifeature == NULL || ifeature->ifName == NULL || freq == NULL || freqLen == NULL || wifiInfo == NULL) {
402094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
403094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
404094332d3Sopenharmony_ci    }
405094332d3Sopenharmony_ci    ret = GetBasefeature(ifeature, &baseFeature);
406094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
407094332d3Sopenharmony_ci        HDF_LOGE("%{public}s GetBasefeature failed!", __func__);
408094332d3Sopenharmony_ci        return HDF_FAILURE;
409094332d3Sopenharmony_ci    }
410094332d3Sopenharmony_ci    ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName);
411094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
412094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
413094332d3Sopenharmony_ci        return HDF_FAILURE;
414094332d3Sopenharmony_ci    }
415094332d3Sopenharmony_ci
416094332d3Sopenharmony_ci    return baseFeature->getValidFreqsWithBand(baseFeature, wifiInfo->band, freq, wifiInfo->size, freqLen);
417094332d3Sopenharmony_ci}
418094332d3Sopenharmony_ci
419094332d3Sopenharmony_ciint32_t WlanInterfaceGetIfNamesByChipId(struct IWlanInterface *self, uint8_t chipId, char *ifName,
420094332d3Sopenharmony_ci    uint32_t ifNameLen, uint32_t *num)
421094332d3Sopenharmony_ci{
422094332d3Sopenharmony_ci    int32_t ret;
423094332d3Sopenharmony_ci
424094332d3Sopenharmony_ci    (void)self;
425094332d3Sopenharmony_ci    if (ifName == NULL || num == NULL) {
426094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
427094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
428094332d3Sopenharmony_ci    }
429094332d3Sopenharmony_ci    char *name = NULL;
430094332d3Sopenharmony_ci
431094332d3Sopenharmony_ci    if (g_staFeature != NULL) {
432094332d3Sopenharmony_ci        HDF_LOGD("%{public}s g_staFeature is not NULL!", __func__);
433094332d3Sopenharmony_ci        ret = g_staFeature->baseFeature.getIfNamesByChipId(chipId, &name, num);
434094332d3Sopenharmony_ci    } else if (g_apFeature != NULL) {
435094332d3Sopenharmony_ci        HDF_LOGD("%{public}s g_apFeature is not NULL!", __func__);
436094332d3Sopenharmony_ci        ret = g_apFeature->baseFeature.getIfNamesByChipId(chipId, &name, num);
437094332d3Sopenharmony_ci    } else if (g_p2pFeature != NULL) {
438094332d3Sopenharmony_ci        HDF_LOGD("%{public}s g_p2pFeature is not NULL!", __func__);
439094332d3Sopenharmony_ci        ret = g_p2pFeature->baseFeature.getIfNamesByChipId(chipId, &name, num);
440094332d3Sopenharmony_ci    } else {
441094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: ap and sta feature is Invalid.", __func__);
442094332d3Sopenharmony_ci        ret = HDF_FAILURE;
443094332d3Sopenharmony_ci    }
444094332d3Sopenharmony_ci
445094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
446094332d3Sopenharmony_ci        HDF_LOGE("%{public}s get name failed!, error code: %{public}d", __func__, ret);
447094332d3Sopenharmony_ci        return ret;
448094332d3Sopenharmony_ci    }
449094332d3Sopenharmony_ci
450094332d3Sopenharmony_ci    if (name != NULL) {
451094332d3Sopenharmony_ci        if (strcpy_s(ifName, ifNameLen, name) != EOK) {
452094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: copy ifName failed!", __func__);
453094332d3Sopenharmony_ci            return HDF_FAILURE;
454094332d3Sopenharmony_ci        }
455094332d3Sopenharmony_ci    }
456094332d3Sopenharmony_ci    return ret;
457094332d3Sopenharmony_ci}
458094332d3Sopenharmony_ci
459094332d3Sopenharmony_ciint32_t WlanInterfaceGetNetworkIfaceName(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
460094332d3Sopenharmony_ci    char *ifName, uint32_t ifNameLen)
461094332d3Sopenharmony_ci{
462094332d3Sopenharmony_ci    int32_t ret;
463094332d3Sopenharmony_ci    const char *name = NULL;
464094332d3Sopenharmony_ci    struct IWiFiBaseFeature *baseFeature = NULL;
465094332d3Sopenharmony_ci
466094332d3Sopenharmony_ci    (void)self;
467094332d3Sopenharmony_ci    if (ifeature == NULL || ifeature->ifName == NULL || ifName == NULL) {
468094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
469094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
470094332d3Sopenharmony_ci    }
471094332d3Sopenharmony_ci    ret = GetBasefeature(ifeature, &baseFeature);
472094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
473094332d3Sopenharmony_ci        HDF_LOGE("%{public}s GetBasefeature failed!", __func__);
474094332d3Sopenharmony_ci        return HDF_FAILURE;
475094332d3Sopenharmony_ci    }
476094332d3Sopenharmony_ci    ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName);
477094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
478094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
479094332d3Sopenharmony_ci        return HDF_FAILURE;
480094332d3Sopenharmony_ci    }
481094332d3Sopenharmony_ci    name = baseFeature->getNetworkIfaceName(baseFeature);
482094332d3Sopenharmony_ci    if (name == NULL) {
483094332d3Sopenharmony_ci        HDF_LOGE("%{public}s get network iface name failed!", __func__);
484094332d3Sopenharmony_ci        return HDF_FAILURE;
485094332d3Sopenharmony_ci    }
486094332d3Sopenharmony_ci    if (strcpy_s(ifName, ifNameLen, name) != EOK) {
487094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: copy ifName failed!", __func__);
488094332d3Sopenharmony_ci        return HDF_FAILURE;
489094332d3Sopenharmony_ci    }
490094332d3Sopenharmony_ci    return HDF_SUCCESS;
491094332d3Sopenharmony_ci}
492094332d3Sopenharmony_ci
493094332d3Sopenharmony_ciint32_t WlanInterfaceGetSupportCombo(struct IWlanInterface *self, uint64_t *combo)
494094332d3Sopenharmony_ci{
495094332d3Sopenharmony_ci    int32_t ret;
496094332d3Sopenharmony_ci
497094332d3Sopenharmony_ci    (void)self;
498094332d3Sopenharmony_ci    if (combo == NULL) {
499094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
500094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
501094332d3Sopenharmony_ci    }
502094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->getSupportCombo == NULL) {
503094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_wifi or g_wifi->getSupportCombo is NULL!", __func__);
504094332d3Sopenharmony_ci        return HDF_FAILURE;
505094332d3Sopenharmony_ci    }
506094332d3Sopenharmony_ci    ret = g_wifi->getSupportCombo(combo, DEFAULT_COMBO_SIZE);
507094332d3Sopenharmony_ci    if (ret == HDF_ERR_NOT_SUPPORT) {
508094332d3Sopenharmony_ci        HDF_LOGW("%{public}s: not support to getting combo!, error code: %{public}d", __func__, ret);
509094332d3Sopenharmony_ci    }
510094332d3Sopenharmony_ci    return ret;
511094332d3Sopenharmony_ci}
512094332d3Sopenharmony_ci
513094332d3Sopenharmony_ciint32_t WlanInterfaceGetSupportFeature(struct IWlanInterface *self, uint8_t *supType, uint32_t *supTypeLen)
514094332d3Sopenharmony_ci{
515094332d3Sopenharmony_ci    int32_t ret;
516094332d3Sopenharmony_ci
517094332d3Sopenharmony_ci    (void)self;
518094332d3Sopenharmony_ci    if (supType == NULL || supTypeLen == NULL) {
519094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
520094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
521094332d3Sopenharmony_ci    }
522094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->getSupportFeature == NULL) {
523094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_wifi or g_wifi->getSupportFeature is NULL!", __func__);
524094332d3Sopenharmony_ci        return HDF_FAILURE;
525094332d3Sopenharmony_ci    }
526094332d3Sopenharmony_ci    ret = g_wifi->getSupportFeature(supType, *supTypeLen);
527094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
528094332d3Sopenharmony_ci        HDF_LOGE("%{public}s get support feature failed! error code: %{public}d", __func__, ret);
529094332d3Sopenharmony_ci    }
530094332d3Sopenharmony_ci    return ret;
531094332d3Sopenharmony_ci}
532094332d3Sopenharmony_ci
533094332d3Sopenharmony_cistatic int32_t HdfWlanAddRemoteObj(struct IWlanCallback *self)
534094332d3Sopenharmony_ci{
535094332d3Sopenharmony_ci    struct HdfWlanRemoteNode *pos = NULL;
536094332d3Sopenharmony_ci    struct DListHead *head = &HdfStubDriver()->remoteListHead;
537094332d3Sopenharmony_ci
538094332d3Sopenharmony_ci    if (self == NULL) {
539094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:self == NULL", __func__);
540094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
541094332d3Sopenharmony_ci    }
542094332d3Sopenharmony_ci    if (!DListIsEmpty(head)) {
543094332d3Sopenharmony_ci        DLIST_FOR_EACH_ENTRY(pos, head, struct HdfWlanRemoteNode, node) {
544094332d3Sopenharmony_ci            if (pos->service == self->AsObject(self)) {
545094332d3Sopenharmony_ci                HDF_LOGE("%{public}s: pos->service == self", __func__);
546094332d3Sopenharmony_ci                return HDF_FAILURE;
547094332d3Sopenharmony_ci            }
548094332d3Sopenharmony_ci        }
549094332d3Sopenharmony_ci    }
550094332d3Sopenharmony_ci
551094332d3Sopenharmony_ci    struct HdfWlanRemoteNode *newRemoteNode =
552094332d3Sopenharmony_ci        (struct HdfWlanRemoteNode *)OsalMemCalloc(sizeof(struct HdfWlanRemoteNode));
553094332d3Sopenharmony_ci    if (newRemoteNode == NULL) {
554094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:newRemoteNode is NULL", __func__);
555094332d3Sopenharmony_ci        return HDF_FAILURE;
556094332d3Sopenharmony_ci    }
557094332d3Sopenharmony_ci
558094332d3Sopenharmony_ci    newRemoteNode->callbackObj = self;
559094332d3Sopenharmony_ci    newRemoteNode->service = self->AsObject(self);
560094332d3Sopenharmony_ci    DListInsertTail(&newRemoteNode->node, head);
561094332d3Sopenharmony_ci    return HDF_SUCCESS;
562094332d3Sopenharmony_ci}
563094332d3Sopenharmony_ci
564094332d3Sopenharmony_cistatic int32_t FillData(uint8_t **dst, uint32_t *dstLen, uint8_t *src, uint32_t srcLen)
565094332d3Sopenharmony_ci{
566094332d3Sopenharmony_ci    if (src == NULL || dst == NULL || dstLen == NULL) {
567094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: Invalid parameter!", __func__);
568094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
569094332d3Sopenharmony_ci    }
570094332d3Sopenharmony_ci    *dst = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * srcLen);
571094332d3Sopenharmony_ci    if (*dst == NULL) {
572094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: OsalMemCalloc fail!", __func__);
573094332d3Sopenharmony_ci        return HDF_FAILURE;
574094332d3Sopenharmony_ci    }
575094332d3Sopenharmony_ci    if (memcpy_s(*dst, srcLen, src, srcLen) != EOK) {
576094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: memcpy_s fail!", __func__);
577094332d3Sopenharmony_ci        OsalMemFree(*dst);
578094332d3Sopenharmony_ci        *dst = NULL;
579094332d3Sopenharmony_ci        return HDF_FAILURE;
580094332d3Sopenharmony_ci    }
581094332d3Sopenharmony_ci    *dstLen = srcLen;
582094332d3Sopenharmony_ci    return HDF_SUCCESS;
583094332d3Sopenharmony_ci}
584094332d3Sopenharmony_ci
585094332d3Sopenharmony_cistatic int32_t WlanFillScanResultInfo(WifiScanResult *wifiScanResult, struct HdfWifiScanResult *scanResult)
586094332d3Sopenharmony_ci{
587094332d3Sopenharmony_ci    int32_t ret = HDF_SUCCESS;
588094332d3Sopenharmony_ci    if (wifiScanResult == NULL || scanResult == NULL) {
589094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: wifiScanResult or scanResult is NULL!", __func__);
590094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
591094332d3Sopenharmony_ci    }
592094332d3Sopenharmony_ci    scanResult->flags = wifiScanResult->flags;
593094332d3Sopenharmony_ci    scanResult->caps = wifiScanResult->caps;
594094332d3Sopenharmony_ci    scanResult->freq = wifiScanResult->freq;
595094332d3Sopenharmony_ci    scanResult->beaconInt = wifiScanResult->beaconInt;
596094332d3Sopenharmony_ci    scanResult->qual = wifiScanResult->qual;
597094332d3Sopenharmony_ci    scanResult->level = wifiScanResult->level;
598094332d3Sopenharmony_ci    scanResult->age = wifiScanResult->age;
599094332d3Sopenharmony_ci    do {
600094332d3Sopenharmony_ci        if (wifiScanResult->bssid != NULL &&
601094332d3Sopenharmony_ci            FillData(&scanResult->bssid, &scanResult->bssidLen, wifiScanResult->bssid, ETH_ADDR_LEN) != HDF_SUCCESS) {
602094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: fill bssid fail!", __func__);
603094332d3Sopenharmony_ci            ret = HDF_FAILURE;
604094332d3Sopenharmony_ci            break;
605094332d3Sopenharmony_ci        }
606094332d3Sopenharmony_ci        if ((wifiScanResult->ie != NULL) && (wifiScanResult->ieLen != 0) &&
607094332d3Sopenharmony_ci            FillData(&scanResult->ie, &scanResult->ieLen, wifiScanResult->ie, wifiScanResult->ieLen) != HDF_SUCCESS) {
608094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: fill ie fail!", __func__);
609094332d3Sopenharmony_ci            ret = HDF_FAILURE;
610094332d3Sopenharmony_ci            break;
611094332d3Sopenharmony_ci        }
612094332d3Sopenharmony_ci        if ((wifiScanResult->beaconIe != NULL) && (wifiScanResult->beaconIeLen != 0) &&
613094332d3Sopenharmony_ci            FillData(&scanResult->beaconIe, &scanResult->beaconIeLen, wifiScanResult->beaconIe,
614094332d3Sopenharmony_ci                wifiScanResult->beaconIeLen) != HDF_SUCCESS) {
615094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: fill beaconIe fail!", __func__);
616094332d3Sopenharmony_ci            ret = HDF_FAILURE;
617094332d3Sopenharmony_ci        }
618094332d3Sopenharmony_ci    } while (0);
619094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
620094332d3Sopenharmony_ci        if (scanResult->bssid != NULL) {
621094332d3Sopenharmony_ci            OsalMemFree(scanResult->bssid);
622094332d3Sopenharmony_ci        }
623094332d3Sopenharmony_ci        if (scanResult->ie != NULL) {
624094332d3Sopenharmony_ci            OsalMemFree(scanResult->ie);
625094332d3Sopenharmony_ci        }
626094332d3Sopenharmony_ci        if (scanResult->beaconIe != NULL) {
627094332d3Sopenharmony_ci            OsalMemFree(scanResult->beaconIe);
628094332d3Sopenharmony_ci        }
629094332d3Sopenharmony_ci    }
630094332d3Sopenharmony_ci    return ret;
631094332d3Sopenharmony_ci}
632094332d3Sopenharmony_ci
633094332d3Sopenharmony_cistatic int32_t WlanFillScanResultInfoExt(WifiScanResult *wifiScanResult, struct HdfWifiScanResultExt *scanResult)
634094332d3Sopenharmony_ci{
635094332d3Sopenharmony_ci    int32_t ret = HDF_SUCCESS;
636094332d3Sopenharmony_ci    if (wifiScanResult == NULL || scanResult == NULL) {
637094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: wifiScanResult or scanResult is NULL!", __func__);
638094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
639094332d3Sopenharmony_ci    }
640094332d3Sopenharmony_ci    scanResult->flags = wifiScanResult->flags;
641094332d3Sopenharmony_ci    scanResult->caps = wifiScanResult->caps;
642094332d3Sopenharmony_ci    scanResult->freq = wifiScanResult->freq;
643094332d3Sopenharmony_ci    scanResult->beaconInt = wifiScanResult->beaconInt;
644094332d3Sopenharmony_ci    scanResult->qual = wifiScanResult->qual;
645094332d3Sopenharmony_ci    scanResult->level = wifiScanResult->level;
646094332d3Sopenharmony_ci    scanResult->age = wifiScanResult->age;
647094332d3Sopenharmony_ci    scanResult->tsf = wifiScanResult->tsf;
648094332d3Sopenharmony_ci    do {
649094332d3Sopenharmony_ci        if (wifiScanResult->bssid != NULL &&
650094332d3Sopenharmony_ci            FillData(&scanResult->bssid, &scanResult->bssidLen, wifiScanResult->bssid, ETH_ADDR_LEN) != HDF_SUCCESS) {
651094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: fill bssid fail!", __func__);
652094332d3Sopenharmony_ci            ret = HDF_FAILURE;
653094332d3Sopenharmony_ci            break;
654094332d3Sopenharmony_ci        }
655094332d3Sopenharmony_ci        if ((wifiScanResult->ie != NULL) && (wifiScanResult->ieLen != 0) &&
656094332d3Sopenharmony_ci            FillData(&scanResult->ie, &scanResult->ieLen, wifiScanResult->ie, wifiScanResult->ieLen) != HDF_SUCCESS) {
657094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: fill ie fail!", __func__);
658094332d3Sopenharmony_ci            ret = HDF_FAILURE;
659094332d3Sopenharmony_ci            break;
660094332d3Sopenharmony_ci        }
661094332d3Sopenharmony_ci        if ((wifiScanResult->beaconIe != NULL) && (wifiScanResult->beaconIeLen != 0) &&
662094332d3Sopenharmony_ci            FillData(&scanResult->beaconIe, &scanResult->beaconIeLen, wifiScanResult->beaconIe,
663094332d3Sopenharmony_ci                wifiScanResult->beaconIeLen) != HDF_SUCCESS) {
664094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: fill beaconIe fail!", __func__);
665094332d3Sopenharmony_ci            ret = HDF_FAILURE;
666094332d3Sopenharmony_ci        }
667094332d3Sopenharmony_ci    } while (0);
668094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
669094332d3Sopenharmony_ci        if (scanResult->bssid != NULL) {
670094332d3Sopenharmony_ci            OsalMemFree(scanResult->bssid);
671094332d3Sopenharmony_ci        }
672094332d3Sopenharmony_ci        if (scanResult->ie != NULL) {
673094332d3Sopenharmony_ci            OsalMemFree(scanResult->ie);
674094332d3Sopenharmony_ci        }
675094332d3Sopenharmony_ci        if (scanResult->beaconIe != NULL) {
676094332d3Sopenharmony_ci            OsalMemFree(scanResult->beaconIe);
677094332d3Sopenharmony_ci        }
678094332d3Sopenharmony_ci    }
679094332d3Sopenharmony_ci    return ret;
680094332d3Sopenharmony_ci}
681094332d3Sopenharmony_ci
682094332d3Sopenharmony_cistatic int32_t WlanFillScanResultsInfo(WifiScanResults *wifiScanResults, struct HdfWifiScanResults *scanResults)
683094332d3Sopenharmony_ci{
684094332d3Sopenharmony_ci    uint32_t i;
685094332d3Sopenharmony_ci    if (wifiScanResults == NULL || scanResults == NULL) {
686094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: wifiScanResults or scanResults is NULL!", __func__);
687094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
688094332d3Sopenharmony_ci    }
689094332d3Sopenharmony_ci    for (i = 0; i < wifiScanResults->num; i++) {
690094332d3Sopenharmony_ci        if (WlanFillScanResultInfoExt(&wifiScanResults->scanResult[i], &scanResults->res[i]) != HDF_SUCCESS) {
691094332d3Sopenharmony_ci            return HDF_FAILURE;
692094332d3Sopenharmony_ci        }
693094332d3Sopenharmony_ci    }
694094332d3Sopenharmony_ci    scanResults->resLen = wifiScanResults->num;
695094332d3Sopenharmony_ci    return HDF_SUCCESS;
696094332d3Sopenharmony_ci}
697094332d3Sopenharmony_ci
698094332d3Sopenharmony_cistatic int32_t ProcessEventScanResult(struct HdfWlanRemoteNode *node, uint32_t event, WifiScanResult *wifiScanResult,
699094332d3Sopenharmony_ci    const char *ifName)
700094332d3Sopenharmony_ci{
701094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName);
702094332d3Sopenharmony_ci    struct HdfWifiScanResult *scanResult = NULL;
703094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
704094332d3Sopenharmony_ci
705094332d3Sopenharmony_ci    if (node == NULL || node->callbackObj == NULL || node->callbackObj->ScanResult == NULL) {
706094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL!", __func__);
707094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
708094332d3Sopenharmony_ci    }
709094332d3Sopenharmony_ci    scanResult = (struct HdfWifiScanResult *)OsalMemCalloc(sizeof(struct HdfWifiScanResult));
710094332d3Sopenharmony_ci    if ((scanResult == NULL) || (WlanFillScanResultInfo(wifiScanResult, scanResult) != HDF_SUCCESS)) {
711094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: scanResult is NULL or WlanFillScanResultInfo fialed!", __func__);
712094332d3Sopenharmony_ci    } else {
713094332d3Sopenharmony_ci        ret = node->callbackObj->ScanResult(node->callbackObj, event, scanResult, ifName);
714094332d3Sopenharmony_ci    }
715094332d3Sopenharmony_ci    HdfWifiScanResultFree(scanResult, true);
716094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s", __FUNCTION__);
717094332d3Sopenharmony_ci    return ret;
718094332d3Sopenharmony_ci}
719094332d3Sopenharmony_ci
720094332d3Sopenharmony_cistatic int32_t ProcessEventScanResults(struct HdfWlanRemoteNode *node, uint32_t event,
721094332d3Sopenharmony_ci    WifiScanResults *wifiScanResults, const char *ifName)
722094332d3Sopenharmony_ci{
723094332d3Sopenharmony_ci    HDF_LOGD("hal enter %{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName);
724094332d3Sopenharmony_ci    struct HdfWifiScanResults *scanResults = NULL;
725094332d3Sopenharmony_ci    uint32_t size;
726094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
727094332d3Sopenharmony_ci
728094332d3Sopenharmony_ci    if (node == NULL || node->callbackObj == NULL || node->callbackObj->ScanResults == NULL) {
729094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL!", __func__);
730094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
731094332d3Sopenharmony_ci    }
732094332d3Sopenharmony_ci    scanResults = (struct HdfWifiScanResults *)OsalMemCalloc(sizeof(struct HdfWifiScanResults));
733094332d3Sopenharmony_ci    if (scanResults == NULL) {
734094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: scanResults is NULL!", __func__);
735094332d3Sopenharmony_ci        return HDF_ERR_MALLOC_FAIL;
736094332d3Sopenharmony_ci    }
737094332d3Sopenharmony_ci    if (wifiScanResults->num == 0) {
738094332d3Sopenharmony_ci        scanResults->res = NULL;
739094332d3Sopenharmony_ci        scanResults->resLen = 0;
740094332d3Sopenharmony_ci        ret = node->callbackObj->ScanResults(node->callbackObj, event, scanResults, ifName);
741094332d3Sopenharmony_ci        HdfWifiScanResultsFree(scanResults, true);
742094332d3Sopenharmony_ci        HDF_LOGD("%{public}s: scanResults num is 0!", __func__);
743094332d3Sopenharmony_ci        return ret;
744094332d3Sopenharmony_ci    }
745094332d3Sopenharmony_ci    scanResults->resLen = wifiScanResults->num;
746094332d3Sopenharmony_ci    size = sizeof(struct HdfWifiScanResultExt);
747094332d3Sopenharmony_ci    scanResults->res = (struct HdfWifiScanResultExt *)OsalMemCalloc(size * scanResults->resLen);
748094332d3Sopenharmony_ci    if ((scanResults->res == NULL) || (WlanFillScanResultsInfo(wifiScanResults, scanResults) != HDF_SUCCESS)) {
749094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: scanResults->res is NULL or WlanFillScanResultsInfo fialed!", __func__);
750094332d3Sopenharmony_ci    } else {
751094332d3Sopenharmony_ci        ret = node->callbackObj->ScanResults(node->callbackObj, event, scanResults, ifName);
752094332d3Sopenharmony_ci    }
753094332d3Sopenharmony_ci    HdfWifiScanResultsFree(scanResults, true);
754094332d3Sopenharmony_ci    HDF_LOGD("hal exit %{public}s, wifiScanResults num:%{public}u", __FUNCTION__, wifiScanResults->num);
755094332d3Sopenharmony_ci    return ret;
756094332d3Sopenharmony_ci}
757094332d3Sopenharmony_ci
758094332d3Sopenharmony_cistatic int32_t ProcessEventScanAborted(struct HdfWlanRemoteNode *node, uint32_t event, const char *ifName)
759094332d3Sopenharmony_ci{
760094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName);
761094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
762094332d3Sopenharmony_ci    struct HdfWifiScanResults scanResults = {0};
763094332d3Sopenharmony_ci
764094332d3Sopenharmony_ci    if (node == NULL || node->callbackObj == NULL || node->callbackObj->ScanResults == NULL) {
765094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL!", __func__);
766094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
767094332d3Sopenharmony_ci    }
768094332d3Sopenharmony_ci    ret = node->callbackObj->ScanResults(node->callbackObj, event, &scanResults, ifName);
769094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ScanResults ret:%{public}d", __FUNCTION__, ret);
770094332d3Sopenharmony_ci    return ret;
771094332d3Sopenharmony_ci}
772094332d3Sopenharmony_ci
773094332d3Sopenharmony_cistatic int32_t ProcessEventActionReceived(struct HdfWlanRemoteNode *node, uint32_t event,
774094332d3Sopenharmony_ci    WifiActionData *wifiActionData, const char *ifName)
775094332d3Sopenharmony_ci{
776094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName);
777094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
778094332d3Sopenharmony_ci
779094332d3Sopenharmony_ci    if (node == NULL || wifiActionData == NULL || ifName == NULL || node->callbackObj == NULL ||
780094332d3Sopenharmony_ci        node->callbackObj->WifiNetlinkMessage == NULL) {
781094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL!", __func__);
782094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
783094332d3Sopenharmony_ci    }
784094332d3Sopenharmony_ci    ret = node->callbackObj->WifiNetlinkMessage(node->callbackObj, wifiActionData->data, wifiActionData->dataLen);
785094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, WifiNetlinkMessage ret:%{public}d", __FUNCTION__, ret);
786094332d3Sopenharmony_ci    return ret;
787094332d3Sopenharmony_ci}
788094332d3Sopenharmony_ci
789094332d3Sopenharmony_cistatic int32_t ProcessEventDataFrameReceived(struct HdfWlanRemoteNode *node, uint32_t event,
790094332d3Sopenharmony_ci    WifiDataFrame *dataFrame, const char *ifName)
791094332d3Sopenharmony_ci{
792094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName);
793094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
794094332d3Sopenharmony_ci
795094332d3Sopenharmony_ci    if ((node == NULL) || (dataFrame == NULL) || (ifName == NULL) || (node->callbackObj == NULL) ||
796094332d3Sopenharmony_ci        (node->callbackObj->WifiNetlinkMessage == NULL)) {
797094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL!", __func__);
798094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
799094332d3Sopenharmony_ci    }
800094332d3Sopenharmony_ci    ret = node->callbackObj->WifiNetlinkMessage(node->callbackObj, dataFrame->data, dataFrame->dataLen);
801094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, WifiNetlinkMessage ret:%{public}d", __FUNCTION__, ret);
802094332d3Sopenharmony_ci    return ret;
803094332d3Sopenharmony_ci}
804094332d3Sopenharmony_ci
805094332d3Sopenharmony_cistatic int32_t HandleWifiEvent(uint32_t event, void *data, const char *ifName, struct HdfWlanRemoteNode *pos)
806094332d3Sopenharmony_ci{
807094332d3Sopenharmony_ci    int ret = HDF_FAILURE;
808094332d3Sopenharmony_ci    int32_t *code = NULL;
809094332d3Sopenharmony_ci    if (data == NULL || ifName == NULL || pos == NULL) {
810094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: invalid input", __func__);
811094332d3Sopenharmony_ci        return ret;
812094332d3Sopenharmony_ci    }
813094332d3Sopenharmony_ci    switch (event) {
814094332d3Sopenharmony_ci        case WIFI_EVENT_RESET_DRIVER:
815094332d3Sopenharmony_ci            code = (int32_t *)data;
816094332d3Sopenharmony_ci            ret = pos->callbackObj->ResetDriverResult(pos->callbackObj, event, *code, ifName);
817094332d3Sopenharmony_ci            break;
818094332d3Sopenharmony_ci        case WIFI_EVENT_SCAN_RESULT:
819094332d3Sopenharmony_ci            ret = ProcessEventScanResult(pos, event, (WifiScanResult *)data, ifName);
820094332d3Sopenharmony_ci            break;
821094332d3Sopenharmony_ci        case WIFI_EVENT_SCAN_RESULTS:
822094332d3Sopenharmony_ci            ret = ProcessEventScanResults(pos, event, (WifiScanResults *)data, ifName);
823094332d3Sopenharmony_ci            break;
824094332d3Sopenharmony_ci        case WIFI_EVENT_SCAN_ABORTED:
825094332d3Sopenharmony_ci            ret = ProcessEventScanAborted(pos, event, ifName);
826094332d3Sopenharmony_ci            break;
827094332d3Sopenharmony_ci        case WIFI_EVENT_ACTION_RECEIVED:
828094332d3Sopenharmony_ci            ret = ProcessEventActionReceived(pos, event, (WifiActionData *)data, ifName);
829094332d3Sopenharmony_ci            break;
830094332d3Sopenharmony_ci        case WIFI_EVENT_DATA_FRAME_RECEIVED:
831094332d3Sopenharmony_ci            ret = ProcessEventDataFrameReceived(pos, event, (WifiDataFrame *)data, ifName);
832094332d3Sopenharmony_ci            break;
833094332d3Sopenharmony_ci        default:
834094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: unknown eventId:%{public}d", __func__, event);
835094332d3Sopenharmony_ci            break;
836094332d3Sopenharmony_ci    }
837094332d3Sopenharmony_ci    return ret;
838094332d3Sopenharmony_ci}
839094332d3Sopenharmony_ci
840094332d3Sopenharmony_cistatic int32_t HdfWLanCallbackFun(uint32_t event, void *data, const char *ifName)
841094332d3Sopenharmony_ci{
842094332d3Sopenharmony_ci    HDF_LOGD("%{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName);
843094332d3Sopenharmony_ci    struct HdfWlanRemoteNode *pos = NULL;
844094332d3Sopenharmony_ci    struct DListHead *head = NULL;
845094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
846094332d3Sopenharmony_ci    (void)OsalMutexLock(&HdfStubDriver()->mutex);
847094332d3Sopenharmony_ci    head = &HdfStubDriver()->remoteListHead;
848094332d3Sopenharmony_ci
849094332d3Sopenharmony_ci    if (data == NULL || ifName == NULL) {
850094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: data or ifName is NULL!", __func__);
851094332d3Sopenharmony_ci        (void)OsalMutexUnlock(&HdfStubDriver()->mutex);
852094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
853094332d3Sopenharmony_ci    }
854094332d3Sopenharmony_ci    DLIST_FOR_EACH_ENTRY(pos, head, struct HdfWlanRemoteNode, node) {
855094332d3Sopenharmony_ci        if (pos == NULL) {
856094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: pos is NULL", __func__);
857094332d3Sopenharmony_ci            break;
858094332d3Sopenharmony_ci        }
859094332d3Sopenharmony_ci        if (pos->service == NULL || pos->callbackObj == NULL) {
860094332d3Sopenharmony_ci            HDF_LOGW("%{public}s: pos->service or pos->callbackObj NULL", __func__);
861094332d3Sopenharmony_ci            continue;
862094332d3Sopenharmony_ci        }
863094332d3Sopenharmony_ci        ret = HandleWifiEvent(event, data, ifName, pos);
864094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
865094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: dispatch code fialed, error code: %{public}d", __func__, ret);
866094332d3Sopenharmony_ci        }
867094332d3Sopenharmony_ci    }
868094332d3Sopenharmony_ci    (void)OsalMutexUnlock(&HdfStubDriver()->mutex);
869094332d3Sopenharmony_ci    return ret;
870094332d3Sopenharmony_ci}
871094332d3Sopenharmony_ci
872094332d3Sopenharmony_cistatic int32_t HdfWlanNetlinkCallbackFun(const uint8_t *recvMsg, uint32_t recvMsgLen)
873094332d3Sopenharmony_ci{
874094332d3Sopenharmony_ci    struct HdfWlanRemoteNode *pos = NULL;
875094332d3Sopenharmony_ci    struct DListHead *head = NULL;
876094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
877094332d3Sopenharmony_ci    (void)OsalMutexLock(&HdfStubDriver()->mutex);
878094332d3Sopenharmony_ci    head = &HdfStubDriver()->remoteListHead;
879094332d3Sopenharmony_ci
880094332d3Sopenharmony_ci    if (recvMsg == NULL) {
881094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: recvMsg or ifName is NULL!", __func__);
882094332d3Sopenharmony_ci        (void)OsalMutexUnlock(&HdfStubDriver()->mutex);
883094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
884094332d3Sopenharmony_ci    }
885094332d3Sopenharmony_ci    DLIST_FOR_EACH_ENTRY(pos, head, struct HdfWlanRemoteNode, node) {
886094332d3Sopenharmony_ci        if (pos->service == NULL || pos->callbackObj == NULL) {
887094332d3Sopenharmony_ci            HDF_LOGW("%{public}s: pos->service or pos->callbackObj NULL", __func__);
888094332d3Sopenharmony_ci            continue;
889094332d3Sopenharmony_ci        }
890094332d3Sopenharmony_ci        ret = pos->callbackObj->WifiNetlinkMessage(pos->callbackObj, recvMsg, recvMsgLen);
891094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
892094332d3Sopenharmony_ci            HDF_LOGD("%{public}s: dispatch code fialed, error code: %{public}d", __func__, ret);
893094332d3Sopenharmony_ci        }
894094332d3Sopenharmony_ci    }
895094332d3Sopenharmony_ci    (void)OsalMutexUnlock(&HdfStubDriver()->mutex);
896094332d3Sopenharmony_ci    return ret;
897094332d3Sopenharmony_ci}
898094332d3Sopenharmony_ci
899094332d3Sopenharmony_cistatic void HdfWlanDelRemoteObj(struct IWlanCallback *self)
900094332d3Sopenharmony_ci{
901094332d3Sopenharmony_ci    struct HdfWlanRemoteNode *pos = NULL;
902094332d3Sopenharmony_ci    struct HdfWlanRemoteNode *tmp = NULL;
903094332d3Sopenharmony_ci    struct DListHead *head = &HdfStubDriver()->remoteListHead;
904094332d3Sopenharmony_ci
905094332d3Sopenharmony_ci    DLIST_FOR_EACH_ENTRY_SAFE(pos, tmp, head, struct HdfWlanRemoteNode, node) {
906094332d3Sopenharmony_ci        if (pos->service->index == self->AsObject(self)->index) {
907094332d3Sopenharmony_ci            DListRemove(&(pos->node));
908094332d3Sopenharmony_ci            IWlanCallbackRelease(pos->callbackObj);
909094332d3Sopenharmony_ci            OsalMemFree(pos);
910094332d3Sopenharmony_ci            break;
911094332d3Sopenharmony_ci        }
912094332d3Sopenharmony_ci    }
913094332d3Sopenharmony_ci    IWlanCallbackRelease(self);
914094332d3Sopenharmony_ci}
915094332d3Sopenharmony_ci
916094332d3Sopenharmony_ciint32_t WlanInterfaceRegisterEventCallback(struct IWlanInterface *self, struct IWlanCallback *cbFunc,
917094332d3Sopenharmony_ci    const char *ifName)
918094332d3Sopenharmony_ci{
919094332d3Sopenharmony_ci    int32_t ret;
920094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s, ifName:%{public}s", __FUNCTION__, ifName);
921094332d3Sopenharmony_ci    (void)self;
922094332d3Sopenharmony_ci    if (cbFunc == NULL || ifName == NULL) {
923094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: input parameter invalid!", __func__);
924094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
925094332d3Sopenharmony_ci    }
926094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->registerEventCallback == NULL) {
927094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_wifi or g_wifi->registerEventCallback is NULL!", __func__);
928094332d3Sopenharmony_ci        return HDF_FAILURE;
929094332d3Sopenharmony_ci    }
930094332d3Sopenharmony_ci    (void)OsalMutexLock(&HdfStubDriver()->mutex);
931094332d3Sopenharmony_ci
932094332d3Sopenharmony_ci    do {
933094332d3Sopenharmony_ci        ret = HdfWlanAddRemoteObj(cbFunc);
934094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
935094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: HdfSensorAddRemoteObj false", __func__);
936094332d3Sopenharmony_ci            break;
937094332d3Sopenharmony_ci        }
938094332d3Sopenharmony_ci        ret = g_wifi->registerEventCallback(HdfWLanCallbackFun, ifName);
939094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
940094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: Register failed!, error code: %{public}d", __func__, ret);
941094332d3Sopenharmony_ci            HdfWlanDelRemoteObj(cbFunc);
942094332d3Sopenharmony_ci            break;
943094332d3Sopenharmony_ci        }
944094332d3Sopenharmony_ci        ret = WlanInterfaceRegisterHid2dCallback(HdfWlanNetlinkCallbackFun, ifName);
945094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
946094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: Register failed!, error code: %{public}d", __func__, ret);
947094332d3Sopenharmony_ci            g_wifi->unregisterEventCallback(HdfWLanCallbackFun, ifName);
948094332d3Sopenharmony_ci            HdfWlanDelRemoteObj(cbFunc);
949094332d3Sopenharmony_ci        }
950094332d3Sopenharmony_ci    } while (0);
951094332d3Sopenharmony_ci
952094332d3Sopenharmony_ci    (void)OsalMutexUnlock(&HdfStubDriver()->mutex);
953094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
954094332d3Sopenharmony_ci    return ret;
955094332d3Sopenharmony_ci}
956094332d3Sopenharmony_ci
957094332d3Sopenharmony_ciint32_t WlanInterfaceUnregisterEventCallback(struct IWlanInterface *self, struct IWlanCallback *cbFunc,
958094332d3Sopenharmony_ci    const char *ifName)
959094332d3Sopenharmony_ci{
960094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s, ifName:%{public}s", __FUNCTION__, ifName);
961094332d3Sopenharmony_ci    int32_t ret;
962094332d3Sopenharmony_ci
963094332d3Sopenharmony_ci    (void)self;
964094332d3Sopenharmony_ci    if (cbFunc == NULL || ifName == NULL) {
965094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: input parameter invalid!", __func__);
966094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
967094332d3Sopenharmony_ci    }
968094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->unregisterEventCallback == NULL) {
969094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_wifi or g_wifi->unregisterEventCallback is NULL!", __func__);
970094332d3Sopenharmony_ci        return HDF_FAILURE;
971094332d3Sopenharmony_ci    }
972094332d3Sopenharmony_ci    (void)OsalMutexLock(&HdfStubDriver()->mutex);
973094332d3Sopenharmony_ci    HdfWlanDelRemoteObj(cbFunc);
974094332d3Sopenharmony_ci    if (DListIsEmpty(&HdfStubDriver()->remoteListHead)) {
975094332d3Sopenharmony_ci        ret = g_wifi->unregisterEventCallback(HdfWLanCallbackFun, ifName);
976094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
977094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: Unregister failed!, error code: %{public}d", __func__, ret);
978094332d3Sopenharmony_ci        }
979094332d3Sopenharmony_ci        ret = WlanInterfaceUnregisterHid2dCallback(HdfWlanNetlinkCallbackFun, ifName);
980094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
981094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: Unregister Hid2dCallback failed!, error code: %{public}d", __func__, ret);
982094332d3Sopenharmony_ci        }
983094332d3Sopenharmony_ci    }
984094332d3Sopenharmony_ci    (void)OsalMutexUnlock(&HdfStubDriver()->mutex);
985094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s", __FUNCTION__);
986094332d3Sopenharmony_ci    return HDF_SUCCESS;
987094332d3Sopenharmony_ci}
988094332d3Sopenharmony_ci
989094332d3Sopenharmony_ciint32_t WlanInterfaceResetDriver(struct IWlanInterface *self, uint8_t chipId, const char *ifName)
990094332d3Sopenharmony_ci{
991094332d3Sopenharmony_ci    int32_t ret;
992094332d3Sopenharmony_ci
993094332d3Sopenharmony_ci    (void)self;
994094332d3Sopenharmony_ci    if (ifName == NULL) {
995094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: input parameter invalid!", __func__);
996094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
997094332d3Sopenharmony_ci    }
998094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->resetDriver == NULL) {
999094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_wifi or g_wifi->resetDriver is NULL!", __func__);
1000094332d3Sopenharmony_ci        return HDF_FAILURE;
1001094332d3Sopenharmony_ci    }
1002094332d3Sopenharmony_ci    ret = g_wifi->resetDriver(chipId, ifName);
1003094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1004094332d3Sopenharmony_ci        HDF_LOGE("%{public}s reset driver failed! error code: %{public}d", __func__, ret);
1005094332d3Sopenharmony_ci        return ret;
1006094332d3Sopenharmony_ci    }
1007094332d3Sopenharmony_ci    OsalMSleep(RESET_TIME);
1008094332d3Sopenharmony_ci    return ret;
1009094332d3Sopenharmony_ci}
1010094332d3Sopenharmony_ci
1011094332d3Sopenharmony_ciint32_t WlanInterfaceSetCountryCode(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
1012094332d3Sopenharmony_ci    const char *code, uint32_t len)
1013094332d3Sopenharmony_ci{
1014094332d3Sopenharmony_ci    int32_t ret;
1015094332d3Sopenharmony_ci
1016094332d3Sopenharmony_ci    (void)self;
1017094332d3Sopenharmony_ci    if (ifeature == NULL || ifeature->ifName == NULL || code == NULL) {
1018094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1019094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1020094332d3Sopenharmony_ci    }
1021094332d3Sopenharmony_ci    if (g_apFeature == NULL || g_apFeature->setCountryCode == NULL) {
1022094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_apFeature or g_apFeature->setCountryCode is NULL!", __func__);
1023094332d3Sopenharmony_ci        return HDF_FAILURE;
1024094332d3Sopenharmony_ci    }
1025094332d3Sopenharmony_ci    ret = strcpy_s((g_apFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName);
1026094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1027094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: strcpy_s apFeature ifName is failed!", __func__);
1028094332d3Sopenharmony_ci        return HDF_FAILURE;
1029094332d3Sopenharmony_ci    }
1030094332d3Sopenharmony_ci    ret = g_apFeature->setCountryCode(g_apFeature, code, strlen(code));
1031094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1032094332d3Sopenharmony_ci        HDF_LOGE("%{public}s set country code failed!, error code: %{public}d", __func__, ret);
1033094332d3Sopenharmony_ci    }
1034094332d3Sopenharmony_ci    return ret;
1035094332d3Sopenharmony_ci}
1036094332d3Sopenharmony_ci
1037094332d3Sopenharmony_ciint32_t WlanInterfaceSetMacAddress(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
1038094332d3Sopenharmony_ci    const uint8_t *mac, uint32_t macLen)
1039094332d3Sopenharmony_ci{
1040094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
1041094332d3Sopenharmony_ci    struct IWiFiBaseFeature *baseFeature = NULL;
1042094332d3Sopenharmony_ci
1043094332d3Sopenharmony_ci    (void)self;
1044094332d3Sopenharmony_ci    if (ifeature == NULL || mac == NULL || ifeature->ifName == NULL) {
1045094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1046094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1047094332d3Sopenharmony_ci    }
1048094332d3Sopenharmony_ci    ret = GetBasefeature(ifeature, &baseFeature);
1049094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1050094332d3Sopenharmony_ci        HDF_LOGE("%{public}s GetBasefeature failed!", __func__);
1051094332d3Sopenharmony_ci        return HDF_FAILURE;
1052094332d3Sopenharmony_ci    }
1053094332d3Sopenharmony_ci    ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName);
1054094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1055094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
1056094332d3Sopenharmony_ci        return HDF_FAILURE;
1057094332d3Sopenharmony_ci    }
1058094332d3Sopenharmony_ci    return baseFeature->setMacAddress(baseFeature, (uint8_t *)mac, ETH_ADDR_LEN);
1059094332d3Sopenharmony_ci}
1060094332d3Sopenharmony_ci
1061094332d3Sopenharmony_ciint32_t WlanInterfaceSetScanningMacAddress(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
1062094332d3Sopenharmony_ci    const uint8_t *scanMac, uint32_t scanMacLen)
1063094332d3Sopenharmony_ci{
1064094332d3Sopenharmony_ci    int32_t ret;
1065094332d3Sopenharmony_ci
1066094332d3Sopenharmony_ci    (void)self;
1067094332d3Sopenharmony_ci    if (ifeature == NULL || ifeature->ifName == NULL || scanMac == NULL) {
1068094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1069094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1070094332d3Sopenharmony_ci    }
1071094332d3Sopenharmony_ci    if (g_staFeature == NULL || g_staFeature->setScanningMacAddress == NULL) {
1072094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_staFeature or g_staFeature->setScanningMacAddress is NULL!", __func__);
1073094332d3Sopenharmony_ci        return HDF_FAILURE;
1074094332d3Sopenharmony_ci    }
1075094332d3Sopenharmony_ci    ret = strcpy_s((g_staFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName);
1076094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1077094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
1078094332d3Sopenharmony_ci        return HDF_FAILURE;
1079094332d3Sopenharmony_ci    }
1080094332d3Sopenharmony_ci    ret = g_staFeature->setScanningMacAddress(g_staFeature, (uint8_t *)scanMac, (uint8_t)scanMacLen);
1081094332d3Sopenharmony_ci
1082094332d3Sopenharmony_ci    return ret;
1083094332d3Sopenharmony_ci}
1084094332d3Sopenharmony_ci
1085094332d3Sopenharmony_ciint32_t WlanInterfaceSetTxPower(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, int32_t power)
1086094332d3Sopenharmony_ci{
1087094332d3Sopenharmony_ci    int32_t ret;
1088094332d3Sopenharmony_ci    struct IWiFiBaseFeature *baseFeature = NULL;
1089094332d3Sopenharmony_ci
1090094332d3Sopenharmony_ci    (void)self;
1091094332d3Sopenharmony_ci    if (ifeature == NULL || ifeature->ifName == NULL) {
1092094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1093094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1094094332d3Sopenharmony_ci    }
1095094332d3Sopenharmony_ci    ret = GetBasefeature(ifeature, &baseFeature);
1096094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1097094332d3Sopenharmony_ci        HDF_LOGE("%{public}s GetBasefeature failed!", __func__);
1098094332d3Sopenharmony_ci        return HDF_FAILURE;
1099094332d3Sopenharmony_ci    }
1100094332d3Sopenharmony_ci    ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName);
1101094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1102094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
1103094332d3Sopenharmony_ci        return HDF_FAILURE;
1104094332d3Sopenharmony_ci    }
1105094332d3Sopenharmony_ci
1106094332d3Sopenharmony_ci    return baseFeature->setTxPower(baseFeature, power);
1107094332d3Sopenharmony_ci}
1108094332d3Sopenharmony_ci
1109094332d3Sopenharmony_ciint32_t WlanInterfaceGetNetDevInfo(struct IWlanInterface *self, struct HdfNetDeviceInfoResult *netDeviceInfoResult)
1110094332d3Sopenharmony_ci{
1111094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
1112094332d3Sopenharmony_ci
1113094332d3Sopenharmony_ci    (void)self;
1114094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->getNetDevInfo == NULL ||netDeviceInfoResult == NULL) {
1115094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: input parameter invalid!", __func__);
1116094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1117094332d3Sopenharmony_ci    }
1118094332d3Sopenharmony_ci    struct NetDeviceInfoResult *netDeviceInfo =
1119094332d3Sopenharmony_ci        (struct NetDeviceInfoResult *)OsalMemCalloc(sizeof(struct NetDeviceInfoResult));
1120094332d3Sopenharmony_ci    if (netDeviceInfo == NULL) {
1121094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:OsalMemCalloc failed!", __func__);
1122094332d3Sopenharmony_ci        return HDF_FAILURE;
1123094332d3Sopenharmony_ci    }
1124094332d3Sopenharmony_ci    ret = g_wifi->getNetDevInfo(netDeviceInfo);
1125094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1126094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get netdev info failed!, error code: %{public}d", __func__, ret);
1127094332d3Sopenharmony_ci        OsalMemFree(netDeviceInfo);
1128094332d3Sopenharmony_ci        return HDF_FAILURE;
1129094332d3Sopenharmony_ci    }
1130094332d3Sopenharmony_ci
1131094332d3Sopenharmony_ci    netDeviceInfoResult->deviceInfos =
1132094332d3Sopenharmony_ci        (struct HdfNetDeviceInfo *)OsalMemCalloc(sizeof(struct HdfNetDeviceInfo) * MAX_NETDEVICE_COUNT);
1133094332d3Sopenharmony_ci    if (netDeviceInfoResult->deviceInfos == NULL) {
1134094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:netDeviceInfoResult->deviceInfos OsalMemCalloc failed", __func__);
1135094332d3Sopenharmony_ci        OsalMemFree(netDeviceInfo);
1136094332d3Sopenharmony_ci        return HDF_FAILURE;
1137094332d3Sopenharmony_ci    }
1138094332d3Sopenharmony_ci    netDeviceInfoResult->deviceInfosLen = MAX_NETDEVICE_COUNT;
1139094332d3Sopenharmony_ci    for (uint32_t i = 0; i < netDeviceInfoResult->deviceInfosLen; i++) {
1140094332d3Sopenharmony_ci        netDeviceInfoResult->deviceInfos[i].index = netDeviceInfo->deviceInfos[i].index;
1141094332d3Sopenharmony_ci        netDeviceInfoResult->deviceInfos[i].iftype = netDeviceInfo->deviceInfos[i].iftype;
1142094332d3Sopenharmony_ci        netDeviceInfoResult->deviceInfos[i].ifName = (char *)OsalMemCalloc(sizeof(char) * IFNAMSIZ);
1143094332d3Sopenharmony_ci        if (netDeviceInfoResult->deviceInfos != NULL) {
1144094332d3Sopenharmony_ci            if (memcpy_s(netDeviceInfoResult->deviceInfos[i].ifName, IFNAMSIZ, netDeviceInfo->deviceInfos[i].ifName,
1145094332d3Sopenharmony_ci                IFNAMSIZ) != EOK) {
1146094332d3Sopenharmony_ci                OsalMemFree(netDeviceInfoResult->deviceInfos[i].ifName);
1147094332d3Sopenharmony_ci                break;
1148094332d3Sopenharmony_ci            }
1149094332d3Sopenharmony_ci            netDeviceInfoResult->deviceInfos[i].ifNameLen = IFNAMSIZ;
1150094332d3Sopenharmony_ci        }
1151094332d3Sopenharmony_ci        netDeviceInfoResult->deviceInfos[i].mac = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * ETH_ADDR_LEN);
1152094332d3Sopenharmony_ci        if (netDeviceInfoResult->deviceInfos[i].mac != NULL) {
1153094332d3Sopenharmony_ci            if (memcpy_s(netDeviceInfoResult->deviceInfos[i].mac, ETH_ADDR_LEN, netDeviceInfo->deviceInfos[i].mac,
1154094332d3Sopenharmony_ci                ETH_ADDR_LEN) != EOK) {
1155094332d3Sopenharmony_ci                OsalMemFree(netDeviceInfoResult->deviceInfos[i].mac);
1156094332d3Sopenharmony_ci                break;
1157094332d3Sopenharmony_ci            }
1158094332d3Sopenharmony_ci            netDeviceInfoResult->deviceInfos[i].macLen = ETH_ADDR_LEN;
1159094332d3Sopenharmony_ci        }
1160094332d3Sopenharmony_ci    }
1161094332d3Sopenharmony_ci    OsalMemFree(netDeviceInfo);
1162094332d3Sopenharmony_ci    return ret;
1163094332d3Sopenharmony_ci}
1164094332d3Sopenharmony_ci
1165094332d3Sopenharmony_cistatic int32_t WLanFillSsid(WifiScan *wifiScan, const struct HdfWifiScan *scan)
1166094332d3Sopenharmony_ci{
1167094332d3Sopenharmony_ci    uint32_t loop;
1168094332d3Sopenharmony_ci
1169094332d3Sopenharmony_ci    for (loop = 0; loop < scan->ssidsLen; loop++) {
1170094332d3Sopenharmony_ci        if (scan->ssids[loop].ssidLen > MAX_SSID_LEN) {
1171094332d3Sopenharmony_ci            HDF_LOGW("%{public}s fail : ssidLen is invalid!", __func__);
1172094332d3Sopenharmony_ci            scan->ssids[loop].ssidLen = MAX_SSID_LEN - 1;
1173094332d3Sopenharmony_ci        }
1174094332d3Sopenharmony_ci        if (memcpy_s(wifiScan->ssids[loop].ssid, scan->ssids[loop].ssidLen, scan->ssids[loop].ssid,
1175094332d3Sopenharmony_ci            scan->ssids[loop].ssidLen) != EOK) {
1176094332d3Sopenharmony_ci            HDF_LOGE("%{public}s fail : memcpy_s ssids fail!", __func__);
1177094332d3Sopenharmony_ci            return HDF_FAILURE;
1178094332d3Sopenharmony_ci        }
1179094332d3Sopenharmony_ci        wifiScan->ssids[loop].ssidLen = (uint32_t)(scan->ssids[loop].ssidLen);
1180094332d3Sopenharmony_ci    }
1181094332d3Sopenharmony_ci    return HDF_SUCCESS;
1182094332d3Sopenharmony_ci}
1183094332d3Sopenharmony_ci
1184094332d3Sopenharmony_cistatic int32_t WLanFillScanData(WifiScan *wifiScan, const struct HdfWifiScan *scan)
1185094332d3Sopenharmony_ci{
1186094332d3Sopenharmony_ci    if ((scan->ssids != NULL) && (scan->ssidsLen != 0)) {
1187094332d3Sopenharmony_ci        wifiScan->ssids = (WifiDriverScanSsid *)OsalMemCalloc(sizeof(WifiDriverScanSsid) * scan->ssidsLen);
1188094332d3Sopenharmony_ci        if (wifiScan->ssids != NULL) {
1189094332d3Sopenharmony_ci            if (WLanFillSsid(wifiScan, scan) != HDF_SUCCESS) {
1190094332d3Sopenharmony_ci                HDF_LOGE("%{public}s fail : fill ssids fail!", __func__);
1191094332d3Sopenharmony_ci                OsalMemFree(wifiScan->ssids);
1192094332d3Sopenharmony_ci                return HDF_FAILURE;
1193094332d3Sopenharmony_ci            }
1194094332d3Sopenharmony_ci            wifiScan->numSsids = scan->ssidsLen;
1195094332d3Sopenharmony_ci        }
1196094332d3Sopenharmony_ci    }
1197094332d3Sopenharmony_ci
1198094332d3Sopenharmony_ci    if ((scan->freqs != NULL) && (scan->freqsLen != 0)) {
1199094332d3Sopenharmony_ci        wifiScan->freqs = (int32_t *)OsalMemCalloc(sizeof(int32_t) * scan->freqsLen);
1200094332d3Sopenharmony_ci        if (wifiScan->freqs != NULL) {
1201094332d3Sopenharmony_ci            if (memcpy_s(wifiScan->freqs, sizeof(int32_t) * (scan->freqsLen), scan->freqs,
1202094332d3Sopenharmony_ci                sizeof(int32_t) * (scan->freqsLen)) != EOK) {
1203094332d3Sopenharmony_ci                HDF_LOGE("%{public}s fail : memcpy_s freqs fail!", __func__);
1204094332d3Sopenharmony_ci                OsalMemFree(wifiScan->freqs);
1205094332d3Sopenharmony_ci                return HDF_FAILURE;
1206094332d3Sopenharmony_ci            }
1207094332d3Sopenharmony_ci            wifiScan->numFreqs = scan->freqsLen;
1208094332d3Sopenharmony_ci        }
1209094332d3Sopenharmony_ci    }
1210094332d3Sopenharmony_ci
1211094332d3Sopenharmony_ci    if ((scan->bssid != NULL) && (scan->bssidLen != 0)) {
1212094332d3Sopenharmony_ci        wifiScan->bssid = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * scan->bssidLen);
1213094332d3Sopenharmony_ci        if (wifiScan->bssid != NULL) {
1214094332d3Sopenharmony_ci            if (memcpy_s(wifiScan->bssid, sizeof(uint8_t) * (scan->bssidLen), scan->bssid,
1215094332d3Sopenharmony_ci                sizeof(uint8_t) * (scan->bssidLen)) != EOK) {
1216094332d3Sopenharmony_ci                HDF_LOGE("%{public}s fail : memcpy_s bssid fail!", __func__);
1217094332d3Sopenharmony_ci                OsalMemFree(wifiScan->bssid);
1218094332d3Sopenharmony_ci                return HDF_FAILURE;
1219094332d3Sopenharmony_ci            }
1220094332d3Sopenharmony_ci        }
1221094332d3Sopenharmony_ci    }
1222094332d3Sopenharmony_ci    if ((scan->extraIes != NULL) && (scan->extraIesLen != 0)) {
1223094332d3Sopenharmony_ci        wifiScan->extraIes = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * scan->extraIesLen);
1224094332d3Sopenharmony_ci        if (wifiScan->extraIes != NULL) {
1225094332d3Sopenharmony_ci            if (memcpy_s(wifiScan->extraIes, sizeof(uint8_t) * (scan->extraIesLen), scan->extraIes,
1226094332d3Sopenharmony_ci                sizeof(uint8_t) * (scan->extraIesLen)) != EOK) {
1227094332d3Sopenharmony_ci                HDF_LOGE("%{public}s fail : memcpy_s extraIes fail!", __func__);
1228094332d3Sopenharmony_ci                OsalMemFree(wifiScan->extraIes);
1229094332d3Sopenharmony_ci                return HDF_FAILURE;
1230094332d3Sopenharmony_ci            }
1231094332d3Sopenharmony_ci            wifiScan->extraIesLen = scan->extraIesLen;
1232094332d3Sopenharmony_ci        }
1233094332d3Sopenharmony_ci    }
1234094332d3Sopenharmony_ci
1235094332d3Sopenharmony_ci    wifiScan->prefixSsidScanFlag = scan->prefixSsidScanFlag;
1236094332d3Sopenharmony_ci    wifiScan->fastConnectFlag = scan->fastConnectFlag;
1237094332d3Sopenharmony_ci    return HDF_SUCCESS;
1238094332d3Sopenharmony_ci}
1239094332d3Sopenharmony_ci
1240094332d3Sopenharmony_cistatic void WifiScanFree(WifiScan *dataBlock)
1241094332d3Sopenharmony_ci{
1242094332d3Sopenharmony_ci    if (dataBlock == NULL) {
1243094332d3Sopenharmony_ci        return;
1244094332d3Sopenharmony_ci    }
1245094332d3Sopenharmony_ci
1246094332d3Sopenharmony_ci    if (dataBlock->ssids != NULL) {
1247094332d3Sopenharmony_ci        OsalMemFree(dataBlock->ssids);
1248094332d3Sopenharmony_ci        dataBlock->ssids = NULL;
1249094332d3Sopenharmony_ci    }
1250094332d3Sopenharmony_ci    if (dataBlock->freqs != NULL) {
1251094332d3Sopenharmony_ci        OsalMemFree(dataBlock->freqs);
1252094332d3Sopenharmony_ci        dataBlock->freqs = NULL;
1253094332d3Sopenharmony_ci    }
1254094332d3Sopenharmony_ci    if (dataBlock->bssid != NULL) {
1255094332d3Sopenharmony_ci        OsalMemFree(dataBlock->bssid);
1256094332d3Sopenharmony_ci        dataBlock->bssid = NULL;
1257094332d3Sopenharmony_ci    }
1258094332d3Sopenharmony_ci    if (dataBlock->extraIes != NULL) {
1259094332d3Sopenharmony_ci        OsalMemFree(dataBlock->extraIes);
1260094332d3Sopenharmony_ci        dataBlock->extraIes = NULL;
1261094332d3Sopenharmony_ci    }
1262094332d3Sopenharmony_ci    OsalMemFree(dataBlock);
1263094332d3Sopenharmony_ci}
1264094332d3Sopenharmony_ci
1265094332d3Sopenharmony_ciint32_t WlanInterfaceStartScan(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
1266094332d3Sopenharmony_ci    const struct HdfWifiScan *scan)
1267094332d3Sopenharmony_ci{
1268094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s", __FUNCTION__);
1269094332d3Sopenharmony_ci    int32_t ret = HDF_FAILURE;
1270094332d3Sopenharmony_ci
1271094332d3Sopenharmony_ci    (void)self;
1272094332d3Sopenharmony_ci    if (ifeature == NULL || ifeature->ifName == NULL || scan == NULL) {
1273094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1274094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1275094332d3Sopenharmony_ci    }
1276094332d3Sopenharmony_ci    WifiScan *wifiScan = (WifiScan *)OsalMemCalloc(sizeof(WifiScan));
1277094332d3Sopenharmony_ci    if (wifiScan == NULL) {
1278094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
1279094332d3Sopenharmony_ci        return HDF_FAILURE;
1280094332d3Sopenharmony_ci    }
1281094332d3Sopenharmony_ci    if (WLanFillScanData(wifiScan, scan) != HDF_SUCCESS) {
1282094332d3Sopenharmony_ci        HDF_LOGE("%{public}s fail : fill scan data fail!", __func__);
1283094332d3Sopenharmony_ci        WifiScanFree(wifiScan);
1284094332d3Sopenharmony_ci        return HDF_FAILURE;
1285094332d3Sopenharmony_ci    }
1286094332d3Sopenharmony_ci    if (g_staFeature == NULL || g_staFeature->startScan == NULL) {
1287094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_staFeature or g_staFeature->startScan is NULL!", __func__);
1288094332d3Sopenharmony_ci        WifiScanFree(wifiScan);
1289094332d3Sopenharmony_ci        return HDF_FAILURE;
1290094332d3Sopenharmony_ci    }
1291094332d3Sopenharmony_ci    ret = g_staFeature->startScan(ifeature->ifName, wifiScan);
1292094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1293094332d3Sopenharmony_ci        HDF_LOGE("%{public}s start scan failed!, error code: %{public}d", __func__, ret);
1294094332d3Sopenharmony_ci    }
1295094332d3Sopenharmony_ci    WifiScanFree(wifiScan);
1296094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
1297094332d3Sopenharmony_ci    return ret;
1298094332d3Sopenharmony_ci}
1299094332d3Sopenharmony_ci
1300094332d3Sopenharmony_ciint32_t WlanInterfaceGetPowerMode(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, uint8_t *mode)
1301094332d3Sopenharmony_ci{
1302094332d3Sopenharmony_ci    int32_t ret;
1303094332d3Sopenharmony_ci
1304094332d3Sopenharmony_ci    (void)self;
1305094332d3Sopenharmony_ci    if (ifeature == NULL || ifeature->ifName == NULL || mode == NULL) {
1306094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1307094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1308094332d3Sopenharmony_ci    }
1309094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->getPowerMode == NULL) {
1310094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_wifi or g_wifi->getPowerMode is NULL!", __func__);
1311094332d3Sopenharmony_ci        return HDF_FAILURE;
1312094332d3Sopenharmony_ci    }
1313094332d3Sopenharmony_ci    ret = g_wifi->getPowerMode(ifeature->ifName, mode);
1314094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1315094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get power mode failed!, error code: %{public}d", __func__, ret);
1316094332d3Sopenharmony_ci    }
1317094332d3Sopenharmony_ci    return ret;
1318094332d3Sopenharmony_ci}
1319094332d3Sopenharmony_ci
1320094332d3Sopenharmony_ciint32_t WlanInterfaceSetPowerMode(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, uint8_t mode)
1321094332d3Sopenharmony_ci{
1322094332d3Sopenharmony_ci    int32_t ret;
1323094332d3Sopenharmony_ci
1324094332d3Sopenharmony_ci    (void)self;
1325094332d3Sopenharmony_ci    if (ifeature == NULL || ifeature->ifName == NULL) {
1326094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1327094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1328094332d3Sopenharmony_ci    }
1329094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->setPowerMode == NULL) {
1330094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_wifi or g_wifi->setPowerMode is NULL!", __func__);
1331094332d3Sopenharmony_ci        return HDF_FAILURE;
1332094332d3Sopenharmony_ci    }
1333094332d3Sopenharmony_ci    ret = g_wifi->setPowerMode(ifeature->ifName, mode);
1334094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1335094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get power mode failed!, error code: %{public}d", __func__, ret);
1336094332d3Sopenharmony_ci    }
1337094332d3Sopenharmony_ci    return ret;
1338094332d3Sopenharmony_ci}
1339094332d3Sopenharmony_ci
1340094332d3Sopenharmony_ciint32_t WlanInterfaceSetProjectionScreenParam(struct IWlanInterface *self, const char *ifName,
1341094332d3Sopenharmony_ci    const struct ProjectionScreenCmdParam *param)
1342094332d3Sopenharmony_ci{
1343094332d3Sopenharmony_ci    int32_t ret;
1344094332d3Sopenharmony_ci    ProjectionScreenParam *projectionScreenParam = NULL;
1345094332d3Sopenharmony_ci
1346094332d3Sopenharmony_ci    (void)self;
1347094332d3Sopenharmony_ci    if (ifName == NULL || param == NULL) {
1348094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1349094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1350094332d3Sopenharmony_ci    }
1351094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->setProjectionScreenParam == NULL) {
1352094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_wifi or g_wifi->setProjectionScreenParam is NULL!", __func__);
1353094332d3Sopenharmony_ci        return HDF_FAILURE;
1354094332d3Sopenharmony_ci    }
1355094332d3Sopenharmony_ci
1356094332d3Sopenharmony_ci    projectionScreenParam = OsalMemCalloc(sizeof(ProjectionScreenParam) + param->bufLen);
1357094332d3Sopenharmony_ci    if (projectionScreenParam == NULL) {
1358094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
1359094332d3Sopenharmony_ci        return HDF_FAILURE;
1360094332d3Sopenharmony_ci    }
1361094332d3Sopenharmony_ci    projectionScreenParam->cmdId = param->cmdId;
1362094332d3Sopenharmony_ci    projectionScreenParam->bufLen = param->bufLen;
1363094332d3Sopenharmony_ci    do {
1364094332d3Sopenharmony_ci        if (memcpy_s(projectionScreenParam->buf, projectionScreenParam->bufLen, param->buf, param->bufLen) != EOK) {
1365094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: memcpy_s failed", __func__);
1366094332d3Sopenharmony_ci            ret = HDF_FAILURE;
1367094332d3Sopenharmony_ci            break;
1368094332d3Sopenharmony_ci        }
1369094332d3Sopenharmony_ci        ret = g_wifi->setProjectionScreenParam(ifName, projectionScreenParam);
1370094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
1371094332d3Sopenharmony_ci            HDF_LOGE("%{public}s: get channel meas result failed!, error code: %{public}d", __func__, ret);
1372094332d3Sopenharmony_ci        }
1373094332d3Sopenharmony_ci    } while (0);
1374094332d3Sopenharmony_ci
1375094332d3Sopenharmony_ci    OsalMemFree(projectionScreenParam);
1376094332d3Sopenharmony_ci    return ret;
1377094332d3Sopenharmony_ci}
1378094332d3Sopenharmony_ci
1379094332d3Sopenharmony_ciint32_t WlanInterfaceGetStaInfo(struct IWlanInterface *self, const char *ifName, struct WifiStationInfo *info,
1380094332d3Sopenharmony_ci    const uint8_t *mac, uint32_t macLen)
1381094332d3Sopenharmony_ci{
1382094332d3Sopenharmony_ci    int32_t ret;
1383094332d3Sopenharmony_ci
1384094332d3Sopenharmony_ci    (void)self;
1385094332d3Sopenharmony_ci    if (ifName == NULL || info == NULL || mac == NULL) {
1386094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1387094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1388094332d3Sopenharmony_ci    }
1389094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->getStationInfo == NULL) {
1390094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_wifi or g_wifi->getStationInfo is NULL!", __func__);
1391094332d3Sopenharmony_ci        return HDF_FAILURE;
1392094332d3Sopenharmony_ci    }
1393094332d3Sopenharmony_ci    ret = g_wifi->getStationInfo(ifName, (StationInfo *)info, mac, macLen);
1394094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1395094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get station information failed!, error code: %{public}d", __func__, ret);
1396094332d3Sopenharmony_ci    }
1397094332d3Sopenharmony_ci    return ret;
1398094332d3Sopenharmony_ci}
1399094332d3Sopenharmony_ci
1400094332d3Sopenharmony_cistatic int32_t FillPnoSettings(WifiPnoSettings *wifiPnoSettings, const struct PnoSettings *pnoSettings)
1401094332d3Sopenharmony_ci{
1402094332d3Sopenharmony_ci    wifiPnoSettings->min2gRssi = pnoSettings->min2gRssi;
1403094332d3Sopenharmony_ci    wifiPnoSettings->min5gRssi = pnoSettings->min5gRssi;
1404094332d3Sopenharmony_ci    wifiPnoSettings->scanIntervalMs = pnoSettings->scanIntervalMs;
1405094332d3Sopenharmony_ci    wifiPnoSettings->scanIterations = pnoSettings->scanIterations;
1406094332d3Sopenharmony_ci
1407094332d3Sopenharmony_ci    if ((pnoSettings->pnoNetworks == NULL) || (pnoSettings->pnoNetworksLen == 0)) {
1408094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: scan networks is NULL.", __func__);
1409094332d3Sopenharmony_ci        return HDF_FAILURE;
1410094332d3Sopenharmony_ci    }
1411094332d3Sopenharmony_ci
1412094332d3Sopenharmony_ci    wifiPnoSettings->pnoNetworksLen = pnoSettings->pnoNetworksLen;
1413094332d3Sopenharmony_ci    wifiPnoSettings->pnoNetworks =
1414094332d3Sopenharmony_ci        (WifiPnoNetwork *)OsalMemCalloc(sizeof(WifiPnoNetwork) * (pnoSettings->pnoNetworksLen));
1415094332d3Sopenharmony_ci    if (wifiPnoSettings->pnoNetworks == NULL) {
1416094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
1417094332d3Sopenharmony_ci        return HDF_FAILURE;
1418094332d3Sopenharmony_ci    }
1419094332d3Sopenharmony_ci    for (uint32_t i = 0; i < pnoSettings->pnoNetworksLen; i++) {
1420094332d3Sopenharmony_ci        wifiPnoSettings->pnoNetworks[i].isHidden = pnoSettings->pnoNetworks[i].isHidden;
1421094332d3Sopenharmony_ci        wifiPnoSettings->pnoNetworks[i].ssid.ssidLen = (uint32_t)(pnoSettings->pnoNetworks[i].ssid.ssidLen);
1422094332d3Sopenharmony_ci        if (memcpy_s(wifiPnoSettings->pnoNetworks[i].ssid.ssid, MAX_SSID_LEN, pnoSettings->pnoNetworks[i].ssid.ssid,
1423094332d3Sopenharmony_ci                pnoSettings->pnoNetworks[i].ssid.ssidLen) != EOK) {
1424094332d3Sopenharmony_ci            HDF_LOGE("%{public}s fail : memcpy_s ssids fail!", __func__);
1425094332d3Sopenharmony_ci            return HDF_FAILURE;
1426094332d3Sopenharmony_ci        }
1427094332d3Sopenharmony_ci        if (pnoSettings->pnoNetworks[i].freqsLen != 0) {
1428094332d3Sopenharmony_ci            wifiPnoSettings->pnoNetworks[i].freqs =
1429094332d3Sopenharmony_ci                (int32_t *)OsalMemCalloc(sizeof(int32_t) * (pnoSettings->pnoNetworks[i].freqsLen));
1430094332d3Sopenharmony_ci            if (wifiPnoSettings->pnoNetworks[i].freqs == NULL) {
1431094332d3Sopenharmony_ci                HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
1432094332d3Sopenharmony_ci                return HDF_FAILURE;
1433094332d3Sopenharmony_ci            }
1434094332d3Sopenharmony_ci            wifiPnoSettings->pnoNetworks[i].freqsLen = pnoSettings->pnoNetworks[i].freqsLen;
1435094332d3Sopenharmony_ci            if (memcpy_s(wifiPnoSettings->pnoNetworks[i].freqs,
1436094332d3Sopenharmony_ci                    sizeof(int32_t) * (pnoSettings->pnoNetworks[i].freqsLen), pnoSettings->pnoNetworks[i].freqs,
1437094332d3Sopenharmony_ci                    sizeof(int32_t) * (pnoSettings->pnoNetworks[i].freqsLen)) != EOK) {
1438094332d3Sopenharmony_ci                HDF_LOGE("%{public}s fail : memcpy_s freqs fail!", __func__);
1439094332d3Sopenharmony_ci                return HDF_FAILURE;
1440094332d3Sopenharmony_ci            }
1441094332d3Sopenharmony_ci        }
1442094332d3Sopenharmony_ci    }
1443094332d3Sopenharmony_ci    return HDF_SUCCESS;
1444094332d3Sopenharmony_ci}
1445094332d3Sopenharmony_ci
1446094332d3Sopenharmony_cistatic void WifiPnoSettingsFree(WifiPnoSettings *wifiPnoSettings)
1447094332d3Sopenharmony_ci{
1448094332d3Sopenharmony_ci    if (wifiPnoSettings == NULL) {
1449094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1450094332d3Sopenharmony_ci        return;
1451094332d3Sopenharmony_ci    }
1452094332d3Sopenharmony_ci    for (uint32_t i = 0; i < wifiPnoSettings->pnoNetworksLen; i++) {
1453094332d3Sopenharmony_ci        if (wifiPnoSettings->pnoNetworks[i].freqs != NULL) {
1454094332d3Sopenharmony_ci            OsalMemFree(wifiPnoSettings->pnoNetworks[i].freqs);
1455094332d3Sopenharmony_ci            wifiPnoSettings->pnoNetworks[i].freqs = NULL;
1456094332d3Sopenharmony_ci        }
1457094332d3Sopenharmony_ci    }
1458094332d3Sopenharmony_ci    OsalMemFree(wifiPnoSettings->pnoNetworks);
1459094332d3Sopenharmony_ci    wifiPnoSettings->pnoNetworks = NULL;
1460094332d3Sopenharmony_ci    OsalMemFree(wifiPnoSettings);
1461094332d3Sopenharmony_ci}
1462094332d3Sopenharmony_ci
1463094332d3Sopenharmony_ciint32_t WlanInterfaceStartPnoScan(struct IWlanInterface *self, const char *ifName,
1464094332d3Sopenharmony_ci    const struct PnoSettings *pnoSettings)
1465094332d3Sopenharmony_ci{
1466094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s ifName:%{public}s", __FUNCTION__, ifName);
1467094332d3Sopenharmony_ci    int32_t ret;
1468094332d3Sopenharmony_ci    (void)self;
1469094332d3Sopenharmony_ci
1470094332d3Sopenharmony_ci    if (ifName == NULL || pnoSettings == NULL) {
1471094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1472094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1473094332d3Sopenharmony_ci    }
1474094332d3Sopenharmony_ci    if (g_staFeature == NULL || g_staFeature->startPnoScan == NULL) {
1475094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_staFeature or g_staFeature->startPnoScan is NULL!", __func__);
1476094332d3Sopenharmony_ci        return HDF_FAILURE;
1477094332d3Sopenharmony_ci    }
1478094332d3Sopenharmony_ci    WifiPnoSettings *wifiPnoSettings = (WifiPnoSettings *)OsalMemCalloc(sizeof(WifiPnoSettings));
1479094332d3Sopenharmony_ci    if (wifiPnoSettings == NULL) {
1480094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
1481094332d3Sopenharmony_ci        return HDF_FAILURE;
1482094332d3Sopenharmony_ci    }
1483094332d3Sopenharmony_ci    if (FillPnoSettings(wifiPnoSettings, pnoSettings) != HDF_SUCCESS) {
1484094332d3Sopenharmony_ci        HDF_LOGE("%{public}s fail : memcpy_s ssids fail!", __func__);
1485094332d3Sopenharmony_ci        WifiPnoSettingsFree(wifiPnoSettings);
1486094332d3Sopenharmony_ci        return HDF_FAILURE;
1487094332d3Sopenharmony_ci    }
1488094332d3Sopenharmony_ci
1489094332d3Sopenharmony_ci    ret = strcpy_s((g_staFeature->baseFeature).ifName, IFNAMSIZ, ifName);
1490094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1491094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
1492094332d3Sopenharmony_ci        WifiPnoSettingsFree(wifiPnoSettings);
1493094332d3Sopenharmony_ci        return HDF_FAILURE;
1494094332d3Sopenharmony_ci    }
1495094332d3Sopenharmony_ci    ret = g_staFeature->startPnoScan(ifName, wifiPnoSettings);
1496094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1497094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: startPnoScan failed!, error code: %{public}d", __func__, ret);
1498094332d3Sopenharmony_ci    }
1499094332d3Sopenharmony_ci    WifiPnoSettingsFree(wifiPnoSettings);
1500094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s", __FUNCTION__);
1501094332d3Sopenharmony_ci    return ret;
1502094332d3Sopenharmony_ci}
1503094332d3Sopenharmony_ci
1504094332d3Sopenharmony_ciint32_t WlanInterfaceStopPnoScan(struct IWlanInterface *self, const char *ifName)
1505094332d3Sopenharmony_ci{
1506094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s ifName:%{public}s", __FUNCTION__, ifName);
1507094332d3Sopenharmony_ci    int32_t ret;
1508094332d3Sopenharmony_ci    (void)self;
1509094332d3Sopenharmony_ci
1510094332d3Sopenharmony_ci    if (ifName == NULL) {
1511094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1512094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1513094332d3Sopenharmony_ci    }
1514094332d3Sopenharmony_ci    if (g_staFeature == NULL || g_staFeature->stopPnoScan == NULL) {
1515094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_staFeature or g_staFeature->stopPnoScan is NULL!", __func__);
1516094332d3Sopenharmony_ci        return HDF_FAILURE;
1517094332d3Sopenharmony_ci    }
1518094332d3Sopenharmony_ci    ret = strcpy_s((g_staFeature->baseFeature).ifName, IFNAMSIZ, ifName);
1519094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1520094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
1521094332d3Sopenharmony_ci        return HDF_FAILURE;
1522094332d3Sopenharmony_ci    }
1523094332d3Sopenharmony_ci    ret = g_staFeature->stopPnoScan(ifName);
1524094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1525094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: stopPnoScan failed!, error code: %{public}d", __func__, ret);
1526094332d3Sopenharmony_ci    }
1527094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s", __FUNCTION__);
1528094332d3Sopenharmony_ci    return ret;
1529094332d3Sopenharmony_ci}
1530094332d3Sopenharmony_ci
1531094332d3Sopenharmony_ciint32_t WlanInterfaceGetSignalPollInfo(struct IWlanInterface *self, const char *ifName,
1532094332d3Sopenharmony_ci    struct SignalPollResult *signalResult)
1533094332d3Sopenharmony_ci{
1534094332d3Sopenharmony_ci    int32_t ret;
1535094332d3Sopenharmony_ci    (void)self;
1536094332d3Sopenharmony_ci
1537094332d3Sopenharmony_ci    if (ifName == NULL || signalResult == NULL) {
1538094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1539094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1540094332d3Sopenharmony_ci    }
1541094332d3Sopenharmony_ci    if (g_staFeature == NULL || g_staFeature->getSignalPollInfo == NULL) {
1542094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_staFeature or g_staFeature->getSignalPollInfo is NULL!", __func__);
1543094332d3Sopenharmony_ci        return HDF_FAILURE;
1544094332d3Sopenharmony_ci    }
1545094332d3Sopenharmony_ci    ret = strcpy_s((g_staFeature->baseFeature).ifName, IFNAMSIZ, ifName);
1546094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1547094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
1548094332d3Sopenharmony_ci        return HDF_FAILURE;
1549094332d3Sopenharmony_ci    }
1550094332d3Sopenharmony_ci    ret = g_staFeature->getSignalPollInfo(ifName, (struct SignalResult *)signalResult);
1551094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1552094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get signal information failed!, error code: %{public}d", __func__, ret);
1553094332d3Sopenharmony_ci    }
1554094332d3Sopenharmony_ci    return ret;
1555094332d3Sopenharmony_ci}
1556094332d3Sopenharmony_ci
1557094332d3Sopenharmony_ciint32_t WlanInterfaceGetApBandwidth(struct IWlanInterface *self, const char *ifName,
1558094332d3Sopenharmony_ci    uint8_t *bandwidth)
1559094332d3Sopenharmony_ci{
1560094332d3Sopenharmony_ci    int32_t ret;
1561094332d3Sopenharmony_ci    (void)self;
1562094332d3Sopenharmony_ci
1563094332d3Sopenharmony_ci    if (ifName == NULL || bandwidth == NULL) {
1564094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1565094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1566094332d3Sopenharmony_ci    }
1567094332d3Sopenharmony_ci    if (g_apFeature == NULL || g_apFeature->getApBandwidth == NULL) {
1568094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_apFeature or g_staFeature->getApBandwidth is NULL!", __func__);
1569094332d3Sopenharmony_ci        return HDF_FAILURE;
1570094332d3Sopenharmony_ci    }
1571094332d3Sopenharmony_ci    ret = g_apFeature->getApBandwidth(ifName, bandwidth);
1572094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1573094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: get signal information failed!, error code: %d", __func__, ret);
1574094332d3Sopenharmony_ci    }
1575094332d3Sopenharmony_ci    return ret;
1576094332d3Sopenharmony_ci}
1577094332d3Sopenharmony_ci
1578094332d3Sopenharmony_ciint32_t WlanInterfaceResetToFactoryMacAddress(struct IWlanInterface *self, const char *ifName)
1579094332d3Sopenharmony_ci{
1580094332d3Sopenharmony_ci    int32_t ret;
1581094332d3Sopenharmony_ci
1582094332d3Sopenharmony_ci    (void)self;
1583094332d3Sopenharmony_ci    if (ifName == NULL) {
1584094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1585094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1586094332d3Sopenharmony_ci    }
1587094332d3Sopenharmony_ci
1588094332d3Sopenharmony_ci    if (g_staFeature != NULL) {
1589094332d3Sopenharmony_ci        HDF_LOGD("%{public}s g_staFeature is not NULL!", __func__);
1590094332d3Sopenharmony_ci        ret = g_staFeature->baseFeature.resetToFactoryMacAddress(ifName);
1591094332d3Sopenharmony_ci    } else if (g_apFeature != NULL) {
1592094332d3Sopenharmony_ci        HDF_LOGD("%{public}s g_apFeature is not NULL!", __func__);
1593094332d3Sopenharmony_ci        ret = g_apFeature->baseFeature.resetToFactoryMacAddress(ifName);
1594094332d3Sopenharmony_ci    } else {
1595094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: ap and sta feature is Invalid.", __func__);
1596094332d3Sopenharmony_ci        ret = HDF_FAILURE;
1597094332d3Sopenharmony_ci    }
1598094332d3Sopenharmony_ci
1599094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1600094332d3Sopenharmony_ci        HDF_LOGE("%{public}s get name failed!, error code: %{public}d", __func__, ret);
1601094332d3Sopenharmony_ci    }
1602094332d3Sopenharmony_ci    return ret;
1603094332d3Sopenharmony_ci}
1604094332d3Sopenharmony_ci
1605094332d3Sopenharmony_ciint32_t WlanInterfaceSendActionFrame(struct IWlanInterface *self, const char *ifName, uint32_t freq,
1606094332d3Sopenharmony_ci    const uint8_t *frameData, uint32_t frameDataLen)
1607094332d3Sopenharmony_ci{
1608094332d3Sopenharmony_ci    int32_t ret;
1609094332d3Sopenharmony_ci    (void)self;
1610094332d3Sopenharmony_ci    if (ifName == NULL || freq == 0 || frameData == NULL || frameDataLen == 0) {
1611094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1612094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1613094332d3Sopenharmony_ci    }
1614094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->sendActionFrame == NULL) {
1615094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_wifi or g_wifi->sendActionFrame is NULL!", __func__);
1616094332d3Sopenharmony_ci        return HDF_FAILURE;
1617094332d3Sopenharmony_ci    }
1618094332d3Sopenharmony_ci    ret = g_wifi->sendActionFrame(ifName, freq, frameData, frameDataLen);
1619094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1620094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed!, error code: %{public}d", __func__, ret);
1621094332d3Sopenharmony_ci    }
1622094332d3Sopenharmony_ci    return ret;
1623094332d3Sopenharmony_ci}
1624094332d3Sopenharmony_ci
1625094332d3Sopenharmony_ciint32_t WlanInterfaceRegisterActionFrameReceiver(struct IWlanInterface *self, const char *ifName,
1626094332d3Sopenharmony_ci    const uint8_t *match, uint32_t matchLen)
1627094332d3Sopenharmony_ci{
1628094332d3Sopenharmony_ci    int32_t ret;
1629094332d3Sopenharmony_ci    (void)self;
1630094332d3Sopenharmony_ci    if (ifName == NULL || match == NULL || matchLen == 0) {
1631094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1632094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1633094332d3Sopenharmony_ci    }
1634094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->registerActionFrameReceiver == NULL) {
1635094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_wifi or g_wifi->registerActionFrameReceiver is NULL!", __func__);
1636094332d3Sopenharmony_ci        return HDF_FAILURE;
1637094332d3Sopenharmony_ci    }
1638094332d3Sopenharmony_ci    ret = g_wifi->registerActionFrameReceiver(ifName, match, matchLen);
1639094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1640094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed!, error code: %{public}d", __func__, ret);
1641094332d3Sopenharmony_ci    }
1642094332d3Sopenharmony_ci    return ret;
1643094332d3Sopenharmony_ci}
1644094332d3Sopenharmony_ci
1645094332d3Sopenharmony_ciint32_t WlanInterfaceSetPowerSaveMode(struct IWlanInterface *self, const char * ifName, int32_t frequency, int32_t mode)
1646094332d3Sopenharmony_ci{
1647094332d3Sopenharmony_ci    int32_t ret;
1648094332d3Sopenharmony_ci    (void)self;
1649094332d3Sopenharmony_ci
1650094332d3Sopenharmony_ci    HDF_LOGI("Enter %{public}s.", __FUNCTION__);
1651094332d3Sopenharmony_ci    if (ifName == NULL) {
1652094332d3Sopenharmony_ci        HDF_LOGE("%{public}s input parameter invalid!", __func__);
1653094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1654094332d3Sopenharmony_ci    }
1655094332d3Sopenharmony_ci
1656094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->setPowerSaveMode == NULL) {
1657094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_wifi or g_wifi->setPowerSaveMode is NULL!", __func__);
1658094332d3Sopenharmony_ci        return HDF_FAILURE;
1659094332d3Sopenharmony_ci    }
1660094332d3Sopenharmony_ci
1661094332d3Sopenharmony_ci    ret = g_wifi->setPowerSaveMode(ifName, frequency, mode);
1662094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1663094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed!, error code: %{public}d", __func__, ret);
1664094332d3Sopenharmony_ci    }
1665094332d3Sopenharmony_ci    return ret;
1666094332d3Sopenharmony_ci}
1667094332d3Sopenharmony_ci
1668094332d3Sopenharmony_ciint32_t WlanInterfaceSetDpiMarkRule(struct IWlanInterface *self, int32_t uid, int32_t protocol, int32_t enable)
1669094332d3Sopenharmony_ci{
1670094332d3Sopenharmony_ci    int32_t ret;
1671094332d3Sopenharmony_ci    (void)self;
1672094332d3Sopenharmony_ci
1673094332d3Sopenharmony_ci    HDF_LOGI("Enter %{public}s.", __FUNCTION__);
1674094332d3Sopenharmony_ci    if (g_wifi == NULL || g_wifi->setDpiMarkRule == NULL) {
1675094332d3Sopenharmony_ci        HDF_LOGE("%{public}s g_wifi or g_wifi->setDpiMarkRule is NULL!", __func__);
1676094332d3Sopenharmony_ci        return HDF_FAILURE;
1677094332d3Sopenharmony_ci    }
1678094332d3Sopenharmony_ci
1679094332d3Sopenharmony_ci    ret = g_wifi->setDpiMarkRule(uid, protocol, enable);
1680094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1681094332d3Sopenharmony_ci        HDF_LOGE("%{public}s failed!, error code: %{public}d", __func__, ret);
1682094332d3Sopenharmony_ci    }
1683094332d3Sopenharmony_ci    return ret;
1684094332d3Sopenharmony_ci}
1685094332d3Sopenharmony_ci
1686094332d3Sopenharmony_ciint32_t WlanInterfaceWifiConstruct(void)
1687094332d3Sopenharmony_ci{
1688094332d3Sopenharmony_ci    int32_t ret;
1689094332d3Sopenharmony_ci
1690094332d3Sopenharmony_ci    ret = WifiConstruct(&g_wifi);
1691094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1692094332d3Sopenharmony_ci        HDF_LOGE("%{public}s construct WiFi failed! error code: %{public}d", __func__, ret);
1693094332d3Sopenharmony_ci    }
1694094332d3Sopenharmony_ci    return ret;
1695094332d3Sopenharmony_ci}
1696094332d3Sopenharmony_ci
1697094332d3Sopenharmony_ciint32_t WlanInterfaceWifiDestruct(void)
1698094332d3Sopenharmony_ci{
1699094332d3Sopenharmony_ci    int32_t ret;
1700094332d3Sopenharmony_ci
1701094332d3Sopenharmony_ci    ret = WifiDestruct(&g_wifi);
1702094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
1703094332d3Sopenharmony_ci        HDF_LOGE("%{public}s destruct WiFi failed! error code: %{public}d", __func__, ret);
1704094332d3Sopenharmony_ci    }
1705094332d3Sopenharmony_ci    return ret;
1706094332d3Sopenharmony_ci}
1707