1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "wifi_hal_cmd.h"
17094332d3Sopenharmony_ci#include <osal_mem.h>
18094332d3Sopenharmony_ci#include "hdf_log.h"
19094332d3Sopenharmony_ci#include "securec.h"
20094332d3Sopenharmony_ci#include "wifi_hal_sta_feature.h"
21094332d3Sopenharmony_ci
22094332d3Sopenharmony_ci#ifdef __cplusplus
23094332d3Sopenharmony_ci#if __cplusplus
24094332d3Sopenharmony_ciextern "C" {
25094332d3Sopenharmony_ci#endif
26094332d3Sopenharmony_ci#endif
27094332d3Sopenharmony_ci
28094332d3Sopenharmony_cistatic struct DListHead g_networkHead = {0};
29094332d3Sopenharmony_ci
30094332d3Sopenharmony_cistruct DListHead *GetNetworkHead(void)
31094332d3Sopenharmony_ci{
32094332d3Sopenharmony_ci    return &g_networkHead;
33094332d3Sopenharmony_ci}
34094332d3Sopenharmony_ci
35094332d3Sopenharmony_ciint32_t HalCmdGetAvailableNetwork(void)
36094332d3Sopenharmony_ci{
37094332d3Sopenharmony_ci    int32_t ret;
38094332d3Sopenharmony_ci    struct NetworkInfoResult networkInfo = { 0 };
39094332d3Sopenharmony_ci    uint32_t i;
40094332d3Sopenharmony_ci
41094332d3Sopenharmony_ci    ret = GetUsableNetworkInfo(&networkInfo);
42094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
43094332d3Sopenharmony_ci        HDF_LOGE("%s: get network info failed", __FUNCTION__);
44094332d3Sopenharmony_ci        return ret;
45094332d3Sopenharmony_ci    }
46094332d3Sopenharmony_ci    if (!DListIsEmpty(&g_networkHead)) {
47094332d3Sopenharmony_ci        ClearIWiFiList();
48094332d3Sopenharmony_ci    }
49094332d3Sopenharmony_ci    for (i = 0; i < networkInfo.nums; i++) {
50094332d3Sopenharmony_ci        struct IWiFiList *networkList = (struct IWiFiList *)malloc(sizeof(struct IWiFiList));
51094332d3Sopenharmony_ci        if (networkList == NULL) {
52094332d3Sopenharmony_ci            HDF_LOGE("%s: malloc failed, line: %d", __FUNCTION__, __LINE__);
53094332d3Sopenharmony_ci            ClearIWiFiList();
54094332d3Sopenharmony_ci            return HDF_FAILURE;
55094332d3Sopenharmony_ci        }
56094332d3Sopenharmony_ci        (void)memset_s(networkList, sizeof(struct IWiFiList), 0, sizeof(struct IWiFiList));
57094332d3Sopenharmony_ci        DListInsertTail(&networkList->entry, &g_networkHead);
58094332d3Sopenharmony_ci        if (memcpy_s(networkList->ifName, IFNAME_MAX_LEN, networkInfo.infos[i].name,
59094332d3Sopenharmony_ci            strlen(networkInfo.infos[i].name)) != EOK) {
60094332d3Sopenharmony_ci            HDF_LOGE("%s: memcpy_s failed, line: %d", __FUNCTION__, __LINE__);
61094332d3Sopenharmony_ci            ClearIWiFiList();
62094332d3Sopenharmony_ci            return HDF_FAILURE;
63094332d3Sopenharmony_ci        }
64094332d3Sopenharmony_ci        if (memcpy_s(networkList->supportMode, PROTOCOL_80211_IFTYPE_NUM,
65094332d3Sopenharmony_ci            networkInfo.infos[i].supportMode, PROTOCOL_80211_IFTYPE_NUM) != EOK) {
66094332d3Sopenharmony_ci            HDF_LOGE("%s: memcpy_s failed, line: %d", __FUNCTION__, __LINE__);
67094332d3Sopenharmony_ci            ClearIWiFiList();
68094332d3Sopenharmony_ci            return HDF_FAILURE;
69094332d3Sopenharmony_ci        }
70094332d3Sopenharmony_ci        networkList->ifeature = NULL;
71094332d3Sopenharmony_ci    }
72094332d3Sopenharmony_ci    return ret;
73094332d3Sopenharmony_ci}
74094332d3Sopenharmony_ci
75094332d3Sopenharmony_cistatic void GetSupportTypeByList(uint8_t *supType)
76094332d3Sopenharmony_ci{
77094332d3Sopenharmony_ci    int32_t i;
78094332d3Sopenharmony_ci    struct IWiFiList *networkList = NULL;
79094332d3Sopenharmony_ci
80094332d3Sopenharmony_ci    DLIST_FOR_EACH_ENTRY(networkList, &g_networkHead, struct IWiFiList, entry) {
81094332d3Sopenharmony_ci        for (i = 0; i < PROTOCOL_80211_IFTYPE_NUM; i++) {
82094332d3Sopenharmony_ci            if (networkList->supportMode[i] == 1) {
83094332d3Sopenharmony_ci                supType[i] = 1;
84094332d3Sopenharmony_ci            }
85094332d3Sopenharmony_ci        }
86094332d3Sopenharmony_ci    }
87094332d3Sopenharmony_ci}
88094332d3Sopenharmony_ci
89094332d3Sopenharmony_ciint32_t HalCmdGetSupportType(uint8_t *supType)
90094332d3Sopenharmony_ci{
91094332d3Sopenharmony_ci    int32_t ret;
92094332d3Sopenharmony_ci    uint8_t isComboValid;
93094332d3Sopenharmony_ci
94094332d3Sopenharmony_ci    GetSupportTypeByList(supType);
95094332d3Sopenharmony_ci    ret = IsSupportCombo(&isComboValid);
96094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
97094332d3Sopenharmony_ci        HDF_LOGE("%s:IsSupportCombo failed, line: %d", __FUNCTION__, __LINE__);
98094332d3Sopenharmony_ci        return ret;
99094332d3Sopenharmony_ci    }
100094332d3Sopenharmony_ci    supType[PROTOCOL_80211_IFTYPE_NUM] = isComboValid;
101094332d3Sopenharmony_ci
102094332d3Sopenharmony_ci    return ret;
103094332d3Sopenharmony_ci}
104094332d3Sopenharmony_ci
105094332d3Sopenharmony_ciint32_t HalCmdGetSupportCombo(uint64_t *supCombo, uint32_t size)
106094332d3Sopenharmony_ci{
107094332d3Sopenharmony_ci    int32_t ret;
108094332d3Sopenharmony_ci
109094332d3Sopenharmony_ci    ret = GetComboInfo(supCombo, size);
110094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
111094332d3Sopenharmony_ci        HDF_LOGE("%s: GetComboInfo failed, line: %d", __FUNCTION__, __LINE__);
112094332d3Sopenharmony_ci    }
113094332d3Sopenharmony_ci    return ret;
114094332d3Sopenharmony_ci}
115094332d3Sopenharmony_ci
116094332d3Sopenharmony_ciint32_t HalCmdGetDevMacAddr(const char *ifName, int32_t type, unsigned char *mac, uint8_t len)
117094332d3Sopenharmony_ci{
118094332d3Sopenharmony_ci    int32_t ret;
119094332d3Sopenharmony_ci
120094332d3Sopenharmony_ci    ret = GetDevMacAddr(ifName, type, (uint8_t *)mac, len);
121094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
122094332d3Sopenharmony_ci        HDF_LOGE("%s:GetDevMacAddr failed, line: %d", __FUNCTION__, __LINE__);
123094332d3Sopenharmony_ci    }
124094332d3Sopenharmony_ci    return ret;
125094332d3Sopenharmony_ci}
126094332d3Sopenharmony_ci
127094332d3Sopenharmony_ciint32_t HalCmdSetMacAddr(const char *ifName, unsigned char *mac, uint8_t len)
128094332d3Sopenharmony_ci{
129094332d3Sopenharmony_ci    int32_t ret;
130094332d3Sopenharmony_ci
131094332d3Sopenharmony_ci    ret = SetMacAddr(ifName, mac, len);
132094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
133094332d3Sopenharmony_ci        HDF_LOGE("%s: SetMacAddr failed, ret = %{public}d", __FUNCTION__, ret);
134094332d3Sopenharmony_ci    }
135094332d3Sopenharmony_ci    return ret;
136094332d3Sopenharmony_ci}
137094332d3Sopenharmony_ci
138094332d3Sopenharmony_ciint32_t HalCmdGetValidFreqWithBand(const char *ifName, int32_t band, int32_t *freqs,
139094332d3Sopenharmony_ci    uint32_t size, uint32_t *num)
140094332d3Sopenharmony_ci{
141094332d3Sopenharmony_ci    int32_t ret;
142094332d3Sopenharmony_ci    struct FreqInfoResult result;
143094332d3Sopenharmony_ci
144094332d3Sopenharmony_ci    result.freqs = OsalMemCalloc(size * sizeof(uint32_t));
145094332d3Sopenharmony_ci    if (result.freqs == NULL) {
146094332d3Sopenharmony_ci        HDF_LOGE("%s: OsalMemCalloc failed", __FUNCTION__);
147094332d3Sopenharmony_ci        return HDF_FAILURE;
148094332d3Sopenharmony_ci    }
149094332d3Sopenharmony_ci
150094332d3Sopenharmony_ci    result.txPower = OsalMemCalloc(size * sizeof(uint32_t));
151094332d3Sopenharmony_ci    if (result.txPower == NULL) {
152094332d3Sopenharmony_ci        HDF_LOGE("%s: OsalMemCalloc failed", __FUNCTION__);
153094332d3Sopenharmony_ci        OsalMemFree(result.freqs);
154094332d3Sopenharmony_ci        return HDF_FAILURE;
155094332d3Sopenharmony_ci    }
156094332d3Sopenharmony_ci
157094332d3Sopenharmony_ci    do {
158094332d3Sopenharmony_ci        ret = GetValidFreqByBand(ifName, band, &result, size);
159094332d3Sopenharmony_ci        if (ret != HDF_SUCCESS) {
160094332d3Sopenharmony_ci            HDF_LOGE("%s: GetValidFreqByBand failed", __FUNCTION__);
161094332d3Sopenharmony_ci            break;
162094332d3Sopenharmony_ci        }
163094332d3Sopenharmony_ci        if (memcpy_s(freqs, size * sizeof(uint32_t), result.freqs, result.nums * sizeof(uint32_t)) != EOK) {
164094332d3Sopenharmony_ci            HDF_LOGE("%s: memcpy failed, line: %d", __FUNCTION__, __LINE__);
165094332d3Sopenharmony_ci            ret = HDF_FAILURE;
166094332d3Sopenharmony_ci            break;
167094332d3Sopenharmony_ci        }
168094332d3Sopenharmony_ci        *num = result.nums;
169094332d3Sopenharmony_ci    } while (0);
170094332d3Sopenharmony_ci
171094332d3Sopenharmony_ci    OsalMemFree(result.txPower);
172094332d3Sopenharmony_ci    OsalMemFree(result.freqs);
173094332d3Sopenharmony_ci    return ret;
174094332d3Sopenharmony_ci}
175094332d3Sopenharmony_ci
176094332d3Sopenharmony_ciint32_t HalCmdSetTxPower(const char *ifName, int32_t power)
177094332d3Sopenharmony_ci{
178094332d3Sopenharmony_ci    int32_t ret;
179094332d3Sopenharmony_ci    ret = SetTxPower(ifName, power);
180094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
181094332d3Sopenharmony_ci        HDF_LOGE("%s: SetTxPower failed", __FUNCTION__);
182094332d3Sopenharmony_ci    }
183094332d3Sopenharmony_ci    return ret;
184094332d3Sopenharmony_ci}
185094332d3Sopenharmony_ci
186094332d3Sopenharmony_ciint32_t HalCmdGetAssociatedStas(const char *ifName, struct StaInfo *staInfo, uint32_t count, uint32_t *num)
187094332d3Sopenharmony_ci{
188094332d3Sopenharmony_ci    if (num == NULL) {
189094332d3Sopenharmony_ci        HDF_LOGE("%s: HalCmdGetAssociatedStas num NULL!", __FUNCTION__);
190094332d3Sopenharmony_ci        return HDF_FAILURE;
191094332d3Sopenharmony_ci    }
192094332d3Sopenharmony_ci    int32_t ret;
193094332d3Sopenharmony_ci    struct AssocStaInfoResult result;
194094332d3Sopenharmony_ci
195094332d3Sopenharmony_ci    ret = GetAssociatedStas(ifName, &result);
196094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
197094332d3Sopenharmony_ci        HDF_LOGE("%s: GetAssociatedStas failed", __FUNCTION__);
198094332d3Sopenharmony_ci        return ret;
199094332d3Sopenharmony_ci    }
200094332d3Sopenharmony_ci    if (memcpy_s(staInfo, count * sizeof(*staInfo), result.infos,
201094332d3Sopenharmony_ci        result.num * sizeof(struct AssocStaInfo)) != EOK) {
202094332d3Sopenharmony_ci        HDF_LOGE("%s: memcpy staInfo failed", __FUNCTION__);
203094332d3Sopenharmony_ci        return HDF_FAILURE;
204094332d3Sopenharmony_ci    }
205094332d3Sopenharmony_ci    *num = result.num;
206094332d3Sopenharmony_ci    return ret;
207094332d3Sopenharmony_ci}
208094332d3Sopenharmony_ci
209094332d3Sopenharmony_ciint32_t HalCmdSetCountryCode(const char *ifName, const char *code, uint32_t len)
210094332d3Sopenharmony_ci{
211094332d3Sopenharmony_ci    int32_t ret;
212094332d3Sopenharmony_ci    ret = WifiSetCountryCode(ifName, code, len);
213094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
214094332d3Sopenharmony_ci        HDF_LOGE("%s: WifiSetCountryCode failed", __FUNCTION__);
215094332d3Sopenharmony_ci    }
216094332d3Sopenharmony_ci    return ret;
217094332d3Sopenharmony_ci}
218094332d3Sopenharmony_ci
219094332d3Sopenharmony_ciint32_t HalCmdSetScanningMacAddress(const char *ifName, unsigned char *scanMac, uint8_t len)
220094332d3Sopenharmony_ci{
221094332d3Sopenharmony_ci    int32_t ret;
222094332d3Sopenharmony_ci    ret = SetScanMacAddr(ifName, scanMac, len);
223094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
224094332d3Sopenharmony_ci        HDF_LOGE("%s: SetScanMacAddr failed", __FUNCTION__);
225094332d3Sopenharmony_ci    }
226094332d3Sopenharmony_ci    return ret;
227094332d3Sopenharmony_ci}
228094332d3Sopenharmony_ci
229094332d3Sopenharmony_ciint32_t HalCmdStartScanInner(const char *ifName, WifiScan *scan)
230094332d3Sopenharmony_ci{
231094332d3Sopenharmony_ci    int32_t ret;
232094332d3Sopenharmony_ci    ret = WifiCmdScan(ifName, (WifiScan *)scan);
233094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
234094332d3Sopenharmony_ci        HDF_LOGE("%s: WifiStartScan failed", __FUNCTION__);
235094332d3Sopenharmony_ci    }
236094332d3Sopenharmony_ci    return ret;
237094332d3Sopenharmony_ci}
238094332d3Sopenharmony_ci
239094332d3Sopenharmony_ciint32_t HalCmdGetChipId(const char *ifName, uint8_t *chipId)
240094332d3Sopenharmony_ci{
241094332d3Sopenharmony_ci    int32_t ret;
242094332d3Sopenharmony_ci    ret = AcquireChipId(ifName, chipId);
243094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
244094332d3Sopenharmony_ci        HDF_LOGE("%s: AcquireChipId failed", __FUNCTION__);
245094332d3Sopenharmony_ci    }
246094332d3Sopenharmony_ci    return ret;
247094332d3Sopenharmony_ci}
248094332d3Sopenharmony_ci
249094332d3Sopenharmony_ciint32_t HalCmdGetIfNamesByChipId(const uint8_t chipId, char **ifNames, uint32_t *num)
250094332d3Sopenharmony_ci{
251094332d3Sopenharmony_ci    int32_t ret;
252094332d3Sopenharmony_ci    ret = GetIfNamesByChipId(chipId, ifNames, num);
253094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
254094332d3Sopenharmony_ci        HDF_LOGE("%s: GetIfNamesByChipId failed", __FUNCTION__);
255094332d3Sopenharmony_ci    }
256094332d3Sopenharmony_ci    return ret;
257094332d3Sopenharmony_ci}
258094332d3Sopenharmony_ci
259094332d3Sopenharmony_ciint32_t HalCmdStartPnoScan(const char *ifName, const WifiPnoSettings *pnoSettings)
260094332d3Sopenharmony_ci{
261094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s ifName:%{public}s", __FUNCTION__, ifName);
262094332d3Sopenharmony_ci    int32_t ret;
263094332d3Sopenharmony_ci    ret = WifiStartPnoScan(ifName, pnoSettings);
264094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
265094332d3Sopenharmony_ci        HDF_LOGE("%s: WifiStartPnoScan failed", __FUNCTION__);
266094332d3Sopenharmony_ci    }
267094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s ret:%{public}d", __FUNCTION__, ret);
268094332d3Sopenharmony_ci    return ret;
269094332d3Sopenharmony_ci}
270094332d3Sopenharmony_ci
271094332d3Sopenharmony_ciint32_t HalCmdStopPnoScan(const char *ifName)
272094332d3Sopenharmony_ci{
273094332d3Sopenharmony_ci    HDF_LOGI("hal enter %{public}s ifName:%{public}s", __FUNCTION__, ifName);
274094332d3Sopenharmony_ci    int32_t ret;
275094332d3Sopenharmony_ci    ret = WifiStopPnoScan(ifName);
276094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
277094332d3Sopenharmony_ci        HDF_LOGE("%s: WifiStopPnoScan failed", __FUNCTION__);
278094332d3Sopenharmony_ci    }
279094332d3Sopenharmony_ci    HDF_LOGI("hal exit %{public}s ret:%{public}d", __FUNCTION__, ret);
280094332d3Sopenharmony_ci    return ret;
281094332d3Sopenharmony_ci}
282094332d3Sopenharmony_ci
283094332d3Sopenharmony_ciint32_t HalCmdGetSignalPollInfo(const char *ifName, struct SignalResult *signalResult)
284094332d3Sopenharmony_ci{
285094332d3Sopenharmony_ci    int32_t ret;
286094332d3Sopenharmony_ci    ret = WifiGetSignalPollInfo(ifName, signalResult);
287094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
288094332d3Sopenharmony_ci        HDF_LOGE("%s: WifiGetSignalInfo failed", __FUNCTION__);
289094332d3Sopenharmony_ci    }
290094332d3Sopenharmony_ci    return ret;
291094332d3Sopenharmony_ci}
292094332d3Sopenharmony_ci
293094332d3Sopenharmony_ciint32_t HalCmdSetResetDriver(const uint8_t chipId, const char *ifName)
294094332d3Sopenharmony_ci{
295094332d3Sopenharmony_ci    int32_t ret;
296094332d3Sopenharmony_ci    ret = SetResetDriver(chipId, ifName);
297094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
298094332d3Sopenharmony_ci        HDF_LOGE("%s: SetResetDriver failed", __FUNCTION__);
299094332d3Sopenharmony_ci    }
300094332d3Sopenharmony_ci    return ret;
301094332d3Sopenharmony_ci}
302094332d3Sopenharmony_ci
303094332d3Sopenharmony_ciint32_t HalCmdGetFeatureByIfName(const char *ifName, struct IWiFiBaseFeature **ifeature)
304094332d3Sopenharmony_ci{
305094332d3Sopenharmony_ci    struct DListHead *networkHead = GetNetworkHead();
306094332d3Sopenharmony_ci    struct IWiFiList *networkNode = NULL;
307094332d3Sopenharmony_ci
308094332d3Sopenharmony_ci    if (ifName == NULL || ifeature == NULL) {
309094332d3Sopenharmony_ci        HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__);
310094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
311094332d3Sopenharmony_ci    }
312094332d3Sopenharmony_ci    DLIST_FOR_EACH_ENTRY(networkNode, networkHead, struct IWiFiList, entry) {
313094332d3Sopenharmony_ci        if (networkNode == NULL) {
314094332d3Sopenharmony_ci            HDF_LOGE("%s: networkNode is NULL, line: %d", __FUNCTION__, __LINE__);
315094332d3Sopenharmony_ci            return HDF_FAILURE;
316094332d3Sopenharmony_ci        }
317094332d3Sopenharmony_ci        if (strcmp(networkNode->ifName, ifName) == HDF_SUCCESS) {
318094332d3Sopenharmony_ci            *ifeature = networkNode->ifeature;
319094332d3Sopenharmony_ci            return HDF_SUCCESS;
320094332d3Sopenharmony_ci        }
321094332d3Sopenharmony_ci    }
322094332d3Sopenharmony_ci    HDF_LOGE("%s: cannot find feature by ifName, line: %d", __FUNCTION__, __LINE__);
323094332d3Sopenharmony_ci    return HDF_FAILURE;
324094332d3Sopenharmony_ci}
325094332d3Sopenharmony_ci
326094332d3Sopenharmony_ciint32_t HalCmdGetApBandwidth(const char *ifName, uint8_t *bandwidth)
327094332d3Sopenharmony_ci{
328094332d3Sopenharmony_ci    int32_t ret = ClientGetApBandwidth(ifName, bandwidth);
329094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
330094332d3Sopenharmony_ci        HDF_LOGE("%s: get ap bandwidth failed, code=%d", __FUNCTION__, ret);
331094332d3Sopenharmony_ci    }
332094332d3Sopenharmony_ci    return ret;
333094332d3Sopenharmony_ci}
334094332d3Sopenharmony_ci
335094332d3Sopenharmony_ciint32_t HalCmdResetToFactoryMacAddress(const char *ifName)
336094332d3Sopenharmony_ci{
337094332d3Sopenharmony_ci    int32_t ret;
338094332d3Sopenharmony_ci    struct IWiFiBaseFeature *ifeature = NULL;
339094332d3Sopenharmony_ci    ret = HalCmdGetFeatureByIfName(ifName, &ifeature);
340094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS || ifeature == NULL) {
341094332d3Sopenharmony_ci        HDF_LOGE("%s: hal cmd get devmac addr failed, code=%d", __FUNCTION__, ret);
342094332d3Sopenharmony_ci        return ret;
343094332d3Sopenharmony_ci    }
344094332d3Sopenharmony_ci
345094332d3Sopenharmony_ci    unsigned char mac[ETH_ADDR_LEN] = {0};
346094332d3Sopenharmony_ci    ret = HalCmdGetDevMacAddr(ifName, ifeature->type, mac, ETH_ADDR_LEN);
347094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
348094332d3Sopenharmony_ci        HDF_LOGE("%s: hal cmd get devmac addr failed, code=%d", __FUNCTION__, ret);
349094332d3Sopenharmony_ci        return ret;
350094332d3Sopenharmony_ci    }
351094332d3Sopenharmony_ci
352094332d3Sopenharmony_ci    ret = HalCmdSetMacAddr(ifName, mac, ETH_ADDR_LEN);
353094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
354094332d3Sopenharmony_ci        HDF_LOGE("%s: hal cmd set mac addr failed, code=%d", __FUNCTION__, ret);
355094332d3Sopenharmony_ci    }
356094332d3Sopenharmony_ci    return ret;
357094332d3Sopenharmony_ci}
358094332d3Sopenharmony_ci
359094332d3Sopenharmony_civoid ClearIWiFiList(void)
360094332d3Sopenharmony_ci{
361094332d3Sopenharmony_ci    struct IWiFiList *networkList = NULL;
362094332d3Sopenharmony_ci    struct IWiFiList *tmp = NULL;
363094332d3Sopenharmony_ci
364094332d3Sopenharmony_ci    DLIST_FOR_EACH_ENTRY_SAFE(networkList, tmp, &g_networkHead, struct IWiFiList, entry) {
365094332d3Sopenharmony_ci        DListRemove(&networkList->entry);
366094332d3Sopenharmony_ci        free(networkList);
367094332d3Sopenharmony_ci        networkList = NULL;
368094332d3Sopenharmony_ci    }
369094332d3Sopenharmony_ci    InitIWiFiList();
370094332d3Sopenharmony_ci}
371094332d3Sopenharmony_ci
372094332d3Sopenharmony_civoid InitIWiFiList(void)
373094332d3Sopenharmony_ci{
374094332d3Sopenharmony_ci    DListHeadInit(&g_networkHead);
375094332d3Sopenharmony_ci}
376094332d3Sopenharmony_ci
377094332d3Sopenharmony_ci#ifdef __cplusplus
378094332d3Sopenharmony_ci#if __cplusplus
379094332d3Sopenharmony_ci}
380094332d3Sopenharmony_ci#endif
381094332d3Sopenharmony_ci#endif