• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "wlan_common_cmd.h"
16 #include <securec.h>
17 #include <hdf_base.h>
18 #include <hdf_log.h>
19 #include <osal_time.h>
20 #include <osal_mem.h>
21 #include "wlan_extend_cmd.h"
22 #include "v1_2/iwlan_callback.h"
23 #include "v1_2/iwlan_interface.h"
24 
25 struct IWiFi *g_wifi = NULL;
26 struct IWiFiAp *g_apFeature = NULL;
27 struct IWiFiSta *g_staFeature = NULL;
28 struct IWiFiP2p *g_p2pFeature = NULL;
29 struct IWiFiBaseFeature *g_baseFeature = NULL;
30 static uint32_t g_wifiCount = 0;
31 static uint32_t g_apFeatureCount = 0;
32 static uint32_t g_staFeatureCount = 0;
33 static uint32_t g_p2pFeatureCount = 0;
34 const uint32_t RESET_TIME = 3;
35 #define DEFAULT_COMBO_SIZE 10
36 #define WLAN_FREQ_MAX_NUM 14
37 #define WLAN_MAX_NUM_STA_WITH_AP 4
38 #define ETH_ADDR_LEN 6
39 
HdfStubDriver(void)40 struct HdfWlanStubData *HdfStubDriver(void)
41 {
42     static struct HdfWlanStubData registerManager;
43     return &registerManager;
44 }
45 
WlanInterfaceStart(struct IWlanInterface * self)46 int32_t WlanInterfaceStart(struct IWlanInterface *self)
47 {
48     int32_t ret;
49     HDF_LOGI("hal enter %{public}s", __FUNCTION__);
50     (void)self;
51     if (g_wifi == NULL || g_wifi->start == NULL) {
52         HDF_LOGE("%{public}s: g_wifi or g_wifi->start is NULL", __func__);
53         return HDF_FAILURE;
54     }
55     ret = g_wifi->start(g_wifi);
56     if (ret != HDF_SUCCESS) {
57         HDF_LOGE("%{public}s start WiFi failed! error code: %{public}d", __func__, ret);
58     } else {
59         g_wifiCount++;
60     }
61     HDF_LOGI("hal exit %{public}s, g_wifiCount:%{public}u", __FUNCTION__, g_wifiCount);
62     return ret;
63 }
64 
WlanInterfaceStop(struct IWlanInterface * self)65 int32_t WlanInterfaceStop(struct IWlanInterface *self)
66 {
67     int32_t ret;
68     HDF_LOGI("hal enter %{public}s", __FUNCTION__);
69     (void)self;
70     if (g_wifi == NULL || g_wifi->stop == NULL) {
71         HDF_LOGE("%{public}s: g_wifi or g_wifi->stop is NULL", __func__);
72         return HDF_FAILURE;
73     }
74     g_wifiCount--;
75     if (g_wifiCount > 0) {
76         HDF_LOGE("%{public}s: g_wifi is used!", __func__);
77         return HDF_SUCCESS;
78     }
79     ret = g_wifi->stop(g_wifi);
80     if (ret != HDF_SUCCESS) {
81         HDF_LOGE("%{public}s stop WiFi failed! error code: %{public}d", __func__, ret);
82     }
83     HDF_LOGI("hal exit %{public}s, g_wifiCount:%{public}u", __FUNCTION__, g_wifiCount);
84     return ret;
85 }
86 
WlanInterfaceCreateFeature(struct IWlanInterface * self,int32_t type,struct HdfFeatureInfo * ifeature)87 int32_t WlanInterfaceCreateFeature(struct IWlanInterface *self, int32_t type, struct HdfFeatureInfo *ifeature)
88 {
89     int32_t ret = HDF_FAILURE;
90     HDF_LOGI("hal enter %{public}s type:%{public}d", __FUNCTION__, type);
91     (void)self;
92     if (ifeature == NULL) {
93         HDF_LOGE("%{public}s: input parameter invalid!", __func__);
94         return HDF_ERR_INVALID_PARAM;
95     }
96     if (g_wifi == NULL || g_wifi->createFeature == NULL) {
97         HDF_LOGE("%{public}s: g_wifi or g_wifi->createFeature is NULL", __func__);
98         return HDF_FAILURE;
99     }
100     if (type == PROTOCOL_80211_IFTYPE_AP) {
101         ret = g_wifi->createFeature(type, (struct IWiFiBaseFeature **)&g_apFeature);
102         if (ret != HDF_SUCCESS) {
103             HDF_LOGE("%{public}s: createAPFeature failed, error code: %{public}d", __func__, ret);
104             return HDF_FAILURE;
105         }
106         if (g_apFeature != NULL) {
107             g_apFeatureCount++;
108             ifeature->type = g_apFeature->baseFeature.type;
109             ifeature->ifName = strdup((g_apFeature->baseFeature).ifName);
110         }
111     } else if (type == PROTOCOL_80211_IFTYPE_STATION) {
112         ret = g_wifi->createFeature(type, (struct IWiFiBaseFeature **)&g_staFeature);
113         if (ret != HDF_SUCCESS) {
114             HDF_LOGE("%{public}s: createSTAFeature failed, error code: %{public}d", __func__, ret);
115             return HDF_FAILURE;
116         }
117         if (g_staFeature != NULL) {
118             g_staFeatureCount++;
119             ifeature->type = g_staFeature->baseFeature.type;
120             ifeature->ifName = strdup((g_staFeature->baseFeature).ifName);
121         }
122     } else if (type == PROTOCOL_80211_IFTYPE_P2P_DEVICE) {
123         ret = g_wifi->createFeature(type, (struct IWiFiBaseFeature **)&g_p2pFeature);
124         if (ret != HDF_SUCCESS) {
125             HDF_LOGE("%{public}s: failed to create p2p feature, errorCode: %{public}d", __func__, ret);
126             return HDF_FAILURE;
127         }
128         if (g_p2pFeature != NULL) {
129             g_p2pFeatureCount++;
130             ifeature->type = g_p2pFeature->baseFeature.type;
131             ifeature->ifName = strdup((g_p2pFeature->baseFeature).ifName);
132         }
133     } else {
134         HDF_LOGE("%{public}s: wlan type is Invalid", __func__);
135     }
136     HDF_LOGI("hal exit %{public}s, apFeatureCount:%{public}u staFeatureCount:%{public}u p2pFeatureCount:%{public}u",
137         __FUNCTION__, g_apFeatureCount, g_staFeatureCount, g_p2pFeatureCount);
138     return ret;
139 }
140 
WlanInterfaceDestroyFeature(struct IWlanInterface * self,const struct HdfFeatureInfo * ifeature)141 int32_t WlanInterfaceDestroyFeature(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature)
142 {
143     int32_t ret = HDF_FAILURE;
144 
145     (void)self;
146     if (ifeature == NULL || ifeature->ifName == NULL) {
147         HDF_LOGE("%{public}s input parameter invalid!", __func__);
148         return HDF_ERR_INVALID_PARAM;
149     }
150     if (g_wifi == NULL || g_wifi->destroyFeature == NULL) {
151         HDF_LOGE("%{public}s: g_wifi or g_wifi->destroyFeature is NULL", __func__);
152         return HDF_FAILURE;
153     }
154     HDF_LOGI("hal enter %{public}s type:%{public}d", __FUNCTION__, ifeature->type);
155     if (ifeature->type == PROTOCOL_80211_IFTYPE_AP) {
156         if (g_apFeature == NULL) {
157             HDF_LOGE("%{public}s g_apFeature is NULL!", __func__);
158             return HDF_FAILURE;
159         }
160         g_apFeatureCount--;
161         if (g_apFeatureCount > 0) {
162             HDF_LOGI("%{public}s: apFeature is used!", __func__);
163             return HDF_SUCCESS;
164         }
165         ret = strcpy_s((g_apFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName);
166         if (ret != HDF_SUCCESS) {
167             HDF_LOGE("%{public}s: strcpy_s apFeature ifName is failed!", __func__);
168             return HDF_FAILURE;
169         }
170         ret = g_wifi->destroyFeature(&(g_apFeature->baseFeature));
171         g_apFeature = NULL;
172     } else if (ifeature->type == PROTOCOL_80211_IFTYPE_STATION) {
173         if (g_staFeature == NULL) {
174             HDF_LOGE("%{public}s g_staFeature is NULL!", __func__);
175             return HDF_FAILURE;
176         }
177         g_staFeatureCount--;
178         if (g_staFeatureCount > 0) {
179             HDF_LOGI("%{public}s: staFeature is used!", __func__);
180             return HDF_SUCCESS;
181         }
182         ret = strcpy_s((g_staFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName);
183         if (ret != HDF_SUCCESS) {
184             HDF_LOGE("%{public}s: strcpy_s staFeature ifName is failed!", __func__);
185             return HDF_FAILURE;
186         }
187         ret = g_wifi->destroyFeature(&(g_staFeature->baseFeature));
188         g_staFeature = NULL;
189     } else if (ifeature->type == PROTOCOL_80211_IFTYPE_P2P_DEVICE) {
190         if (g_p2pFeature == NULL) {
191             HDF_LOGE("%{public}s g_p2pFeature is NULL!", __func__);
192             return HDF_FAILURE;
193         }
194         g_p2pFeatureCount--;
195         if (g_p2pFeatureCount > 0) {
196             HDF_LOGI("%{public}s: p2pFeature is used!", __func__);
197             return HDF_SUCCESS;
198         }
199         ret = strcpy_s((g_p2pFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName);
200         if (ret != HDF_SUCCESS) {
201             HDF_LOGE("%{public}s: failed to copy the ifName! ret: %{public}d", __func__, ret);
202             return HDF_FAILURE;
203         }
204         ret = g_wifi->destroyFeature(&(g_p2pFeature->baseFeature));
205         g_p2pFeature = NULL;
206     } else {
207         HDF_LOGE("%{public}s: wlan type is invalid", __func__);
208     }
209     HDF_LOGI("hal exit %{public}s, apFeatureCount:%{public}u staFeatureCount:%{public}u p2pFeatureCount:%{public}u",
210         __FUNCTION__, g_apFeatureCount, g_staFeatureCount, g_p2pFeatureCount);
211     return ret;
212 }
213 
WlanInterfaceGetAssociatedStas(struct IWlanInterface * self,const struct HdfFeatureInfo * ifeature,struct HdfStaInfo * staInfo,uint32_t * staInfoLen,uint32_t * num)214 int32_t WlanInterfaceGetAssociatedStas(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
215     struct HdfStaInfo *staInfo, uint32_t *staInfoLen, uint32_t *num)
216 {
217     int32_t ret;
218 
219     (void)self;
220     if (ifeature == NULL || ifeature->ifName == NULL || staInfo == NULL || staInfoLen == NULL || num == NULL)  {
221         HDF_LOGE("%{public}s:input parameter invalid!", __func__);
222         return HDF_ERR_INVALID_PARAM;
223     }
224     if (g_apFeature == NULL || g_apFeature->getAssociatedStas == NULL) {
225         HDF_LOGE("%{public}s g_apFeature or g_apFeature->getAssociatedStas is NULL!", __func__);
226         return HDF_FAILURE;
227     }
228     ret = strcpy_s((g_apFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName);
229     if (ret != HDF_SUCCESS) {
230         HDF_LOGE("%{public}s: strcpy_s apFeature ifName is failed!", __func__);
231         return HDF_FAILURE;
232     }
233 
234     struct StaInfo *wifiStaInfo = (struct StaInfo *)OsalMemCalloc(sizeof(struct StaInfo) * (*staInfoLen));
235     if (wifiStaInfo == NULL) {
236         HDF_LOGE("%{public}s:OsalMemCalloc failed!", __func__);
237         return HDF_FAILURE;
238     }
239     ret = g_apFeature->getAssociatedStas(g_apFeature, wifiStaInfo, *staInfoLen, num);
240     if (ret != HDF_SUCCESS) {
241         HDF_LOGE("%{public}s get associated sta failed!, error code: %{public}d", __func__, ret);
242         OsalMemFree(wifiStaInfo);
243         return ret;
244     }
245     for (uint32_t i = 0; i < (*num); i++) {
246         staInfo[i].mac = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * ETH_ADDR_LEN);
247         if (staInfo[i].mac != NULL) {
248             if (memcpy_s(staInfo[i].mac, WIFI_MAC_ADDR_LENGTH, wifiStaInfo[i].mac, WIFI_MAC_ADDR_LENGTH) != EOK) {
249                 HDF_LOGE("%{public}s fail : memcpy_s mac fail!", __func__);
250                 ret = HDF_FAILURE;
251                 break;
252             }
253             staInfo[i].macLen = WIFI_MAC_ADDR_LENGTH;
254         }
255     }
256     OsalMemFree(wifiStaInfo);
257     return ret;
258 }
259 
GetBasefeature(const struct HdfFeatureInfo * ifeature,struct IWiFiBaseFeature ** baseFeature)260 static int32_t GetBasefeature(const struct HdfFeatureInfo *ifeature, struct IWiFiBaseFeature **baseFeature)
261 {
262     if (ifeature->type == PROTOCOL_80211_IFTYPE_AP) {
263         if (g_apFeature == NULL) {
264             HDF_LOGE("%{public}s g_apFeature is NULL!", __func__);
265             return HDF_FAILURE;
266         }
267         *baseFeature = &(g_apFeature->baseFeature);
268     } else if (ifeature->type == PROTOCOL_80211_IFTYPE_STATION) {
269         if (g_staFeature == NULL) {
270             HDF_LOGE("%{public}s g_staFeature is NULL!", __func__);
271             return HDF_FAILURE;
272         }
273         *baseFeature = &(g_staFeature->baseFeature);
274     } else if (ifeature->type == PROTOCOL_80211_IFTYPE_P2P_DEVICE) {
275         if (g_p2pFeature == NULL) {
276             HDF_LOGE("%{public}s g_p2pFeature is NULL!", __func__);
277             return HDF_FAILURE;
278         }
279         *baseFeature = &(g_p2pFeature->baseFeature);
280     } else {
281         HDF_LOGE("%{public}s: wlan type is Invalid, featureType is %{public}d", __func__, ifeature->type);
282         return HDF_FAILURE;
283     }
284     return HDF_SUCCESS;
285 }
286 
WlanInterfaceGetChipId(struct IWlanInterface * self,const struct HdfFeatureInfo * ifeature,uint8_t * chipId)287 int32_t WlanInterfaceGetChipId(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, uint8_t *chipId)
288 {
289     int32_t ret = HDF_FAILURE;
290     struct IWiFiBaseFeature *baseFeature = NULL;
291 
292     (void)self;
293     if (ifeature == NULL || ifeature->ifName == NULL || chipId == NULL) {
294         HDF_LOGE("%{public}s ifeature or ifName is NULL!", __func__);
295         return HDF_ERR_INVALID_PARAM;
296     }
297     ret = GetBasefeature(ifeature, &baseFeature);
298     if (ret != HDF_SUCCESS) {
299         HDF_LOGE("%{public}s GetBasefeature failed!", __func__);
300         return HDF_FAILURE;
301     }
302     ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName);
303     if (ret != HDF_SUCCESS) {
304         HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
305         return HDF_FAILURE;
306     }
307 
308     return baseFeature->getChipId(baseFeature, chipId);
309 }
310 
WlanInterfaceGetDeviceMacAddress(struct IWlanInterface * self,const struct HdfFeatureInfo * ifeature,uint8_t * mac,uint32_t * macLen,uint8_t len)311 int32_t WlanInterfaceGetDeviceMacAddress(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
312     uint8_t *mac, uint32_t *macLen, uint8_t len)
313 {
314     int32_t ret = HDF_FAILURE;
315     struct IWiFiBaseFeature *baseFeature = NULL;
316 
317     (void)self;
318     if (ifeature == NULL || ifeature->ifName == NULL || mac == NULL || macLen == NULL) {
319         HDF_LOGE("%{public}s input parameter invalid!", __func__);
320         return HDF_ERR_INVALID_PARAM;
321     }
322     ret = GetBasefeature(ifeature, &baseFeature);
323     if (ret != HDF_SUCCESS) {
324         HDF_LOGE("%{public}s GetBasefeature failed!", __func__);
325         return HDF_FAILURE;
326     }
327     ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName);
328     if (ret != HDF_SUCCESS) {
329         HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
330         return HDF_FAILURE;
331     }
332     ret = baseFeature->getDeviceMacAddress(baseFeature, mac, len);
333     *macLen = ETH_ADDR_LEN;
334     return ret;
335 }
336 
WlanInterfaceGetFeatureByIfName(struct IWlanInterface * self,const char * ifName,struct HdfFeatureInfo * ifeature)337 int32_t WlanInterfaceGetFeatureByIfName(struct IWlanInterface *self, const char *ifName,
338     struct HdfFeatureInfo *ifeature)
339 {
340     int32_t ret;
341     struct IWiFiBaseFeature *baseFeature = NULL;
342 
343     (void)self;
344     if (ifName == NULL || ifeature == NULL) {
345         HDF_LOGE("%{public}s input parameter invalid!", __func__);
346         return HDF_ERR_INVALID_PARAM;
347     }
348     if (g_wifi == NULL || g_wifi->getFeatureByIfName == NULL) {
349         HDF_LOGE("%{public}s gwifi or g_wifi->getFeatureByIfName is NULL!", __func__);
350         return HDF_FAILURE;
351     }
352     ret = g_wifi->getFeatureByIfName(ifName, (struct IWiFiBaseFeature **)&baseFeature);
353     if (ret != HDF_SUCCESS) {
354         HDF_LOGE("%{public}s get FeatureByIfName failed!, error code: %{public}d", __func__, ret);
355         return ret;
356     }
357     if (baseFeature == NULL) {
358         HDF_LOGE("%{public}s baseFeature is NULL!", __func__);
359         return HDF_FAILURE;
360     }
361     ifeature->type = baseFeature->type;
362     ifeature->ifName = strdup(baseFeature->ifName);
363     return ret;
364 }
365 
WlanInterfaceGetFeatureType(struct IWlanInterface * self,const struct HdfFeatureInfo * ifeature,int32_t * featureType)366 int32_t WlanInterfaceGetFeatureType(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
367     int32_t *featureType)
368 {
369     (void)self;
370     int32_t ret;
371     int32_t type;
372     struct IWiFiBaseFeature *baseFeature = NULL;
373 
374     if (ifeature == NULL || featureType == NULL) {
375         HDF_LOGE("%{public}s input parameter invalid!", __func__);
376         return HDF_ERR_INVALID_PARAM;
377     }
378     ret = GetBasefeature(ifeature, &baseFeature);
379     if (ret != HDF_SUCCESS) {
380         HDF_LOGE("%{public}s GetBasefeature failed!", __func__);
381         return HDF_FAILURE;
382     }
383     baseFeature->type = ifeature->type;
384     type = baseFeature->getFeatureType(baseFeature);
385     *featureType = type;
386     return HDF_SUCCESS;
387 }
388 
WlanInterfaceGetFreqsWithBand(struct IWlanInterface * self,const struct HdfFeatureInfo * ifeature,const struct HdfWifiInfo * wifiInfo,int32_t * freq,uint32_t * freqLen)389 int32_t WlanInterfaceGetFreqsWithBand(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
390     const struct HdfWifiInfo *wifiInfo, int32_t *freq, uint32_t *freqLen)
391 {
392     int32_t ret;
393     struct IWiFiBaseFeature *baseFeature = NULL;
394 
395     (void)self;
396     if (ifeature == NULL || ifeature->ifName == NULL || freq == NULL || freqLen == NULL || wifiInfo == NULL) {
397         HDF_LOGE("%{public}s input parameter invalid!", __func__);
398         return HDF_ERR_INVALID_PARAM;
399     }
400     ret = GetBasefeature(ifeature, &baseFeature);
401     if (ret != HDF_SUCCESS) {
402         HDF_LOGE("%{public}s GetBasefeature failed!", __func__);
403         return HDF_FAILURE;
404     }
405     ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName);
406     if (ret != HDF_SUCCESS) {
407         HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
408         return HDF_FAILURE;
409     }
410 
411     return baseFeature->getValidFreqsWithBand(baseFeature, wifiInfo->band, freq, wifiInfo->size, freqLen);
412 }
413 
WlanInterfaceGetIfNamesByChipId(struct IWlanInterface * self,uint8_t chipId,char * ifName,uint32_t ifNameLen,uint32_t * num)414 int32_t WlanInterfaceGetIfNamesByChipId(struct IWlanInterface *self, uint8_t chipId, char *ifName,
415     uint32_t ifNameLen, uint32_t *num)
416 {
417     int32_t ret;
418 
419     (void)self;
420     if (ifName == NULL || num == NULL) {
421         HDF_LOGE("%{public}s input parameter invalid!", __func__);
422         return HDF_ERR_INVALID_PARAM;
423     }
424     char *name = NULL;
425 
426     if (g_staFeature != NULL) {
427         HDF_LOGD("%{public}s g_staFeature is not NULL!", __func__);
428         ret = g_staFeature->baseFeature.getIfNamesByChipId(chipId, &name, num);
429     } else if (g_apFeature != NULL) {
430         HDF_LOGD("%{public}s g_apFeature is not NULL!", __func__);
431         ret = g_apFeature->baseFeature.getIfNamesByChipId(chipId, &name, num);
432     } else if (g_p2pFeature != NULL) {
433         HDF_LOGD("%{public}s g_p2pFeature is not NULL!", __func__);
434         ret = g_p2pFeature->baseFeature.getIfNamesByChipId(chipId, &name, num);
435     } else {
436         HDF_LOGE("%{public}s: ap and sta feature is Invalid.", __func__);
437         ret = HDF_FAILURE;
438     }
439 
440     if (ret != HDF_SUCCESS) {
441         HDF_LOGE("%{public}s get name failed!, error code: %{public}d", __func__, ret);
442         return ret;
443     }
444 
445     if (name != NULL) {
446         if (strcpy_s(ifName, ifNameLen, name) != EOK) {
447             HDF_LOGE("%{public}s: copy ifName failed!", __func__);
448             return HDF_FAILURE;
449         }
450     }
451     return ret;
452 }
453 
WlanInterfaceGetNetworkIfaceName(struct IWlanInterface * self,const struct HdfFeatureInfo * ifeature,char * ifName,uint32_t ifNameLen)454 int32_t WlanInterfaceGetNetworkIfaceName(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
455     char *ifName, uint32_t ifNameLen)
456 {
457     int32_t ret;
458     const char *name = NULL;
459     struct IWiFiBaseFeature *baseFeature = NULL;
460 
461     (void)self;
462     if (ifeature == NULL || ifeature->ifName == NULL || ifName == NULL) {
463         HDF_LOGE("%{public}s input parameter invalid!", __func__);
464         return HDF_ERR_INVALID_PARAM;
465     }
466     ret = GetBasefeature(ifeature, &baseFeature);
467     if (ret != HDF_SUCCESS) {
468         HDF_LOGE("%{public}s GetBasefeature failed!", __func__);
469         return HDF_FAILURE;
470     }
471     ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName);
472     if (ret != HDF_SUCCESS) {
473         HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
474         return HDF_FAILURE;
475     }
476     name = baseFeature->getNetworkIfaceName(baseFeature);
477     if (name == NULL) {
478         HDF_LOGE("%{public}s get network iface name failed!", __func__);
479         return HDF_FAILURE;
480     }
481     if (strcpy_s(ifName, ifNameLen, name) != EOK) {
482         HDF_LOGE("%{public}s: copy ifName failed!", __func__);
483         return HDF_FAILURE;
484     }
485     return HDF_SUCCESS;
486 }
487 
WlanInterfaceGetSupportCombo(struct IWlanInterface * self,uint64_t * combo)488 int32_t WlanInterfaceGetSupportCombo(struct IWlanInterface *self, uint64_t *combo)
489 {
490     int32_t ret;
491 
492     (void)self;
493     if (combo == NULL) {
494         HDF_LOGE("%{public}s input parameter invalid!", __func__);
495         return HDF_ERR_INVALID_PARAM;
496     }
497     if (g_wifi == NULL || g_wifi->getSupportCombo == NULL) {
498         HDF_LOGE("%{public}s g_wifi or g_wifi->getSupportCombo is NULL!", __func__);
499         return HDF_FAILURE;
500     }
501     ret = g_wifi->getSupportCombo(combo, DEFAULT_COMBO_SIZE);
502     if (ret == HDF_ERR_NOT_SUPPORT) {
503         HDF_LOGW("%{public}s: not support to getting combo!, error code: %{public}d", __func__, ret);
504     }
505     return ret;
506 }
507 
WlanInterfaceGetSupportFeature(struct IWlanInterface * self,uint8_t * supType,uint32_t * supTypeLen)508 int32_t WlanInterfaceGetSupportFeature(struct IWlanInterface *self, uint8_t *supType, uint32_t *supTypeLen)
509 {
510     int32_t ret;
511 
512     (void)self;
513     if (supType == NULL || supTypeLen == NULL) {
514         HDF_LOGE("%{public}s input parameter invalid!", __func__);
515         return HDF_ERR_INVALID_PARAM;
516     }
517     if (g_wifi == NULL || g_wifi->getSupportFeature == NULL) {
518         HDF_LOGE("%{public}s g_wifi or g_wifi->getSupportFeature is NULL!", __func__);
519         return HDF_FAILURE;
520     }
521     ret = g_wifi->getSupportFeature(supType, *supTypeLen);
522     if (ret != HDF_SUCCESS) {
523         HDF_LOGE("%{public}s get support feature failed! error code: %{public}d", __func__, ret);
524     }
525     return ret;
526 }
527 
HdfWlanAddRemoteObj(struct IWlanCallback * self)528 static int32_t HdfWlanAddRemoteObj(struct IWlanCallback *self)
529 {
530     struct HdfWlanRemoteNode *pos = NULL;
531     struct DListHead *head = &HdfStubDriver()->remoteListHead;
532 
533     if (self == NULL) {
534         HDF_LOGE("%{public}s:self == NULL", __func__);
535         return HDF_ERR_INVALID_PARAM;
536     }
537     if (!DListIsEmpty(head)) {
538         DLIST_FOR_EACH_ENTRY(pos, head, struct HdfWlanRemoteNode, node) {
539             if (pos->service == self->AsObject(self)) {
540                 HDF_LOGE("%{public}s: pos->service == self", __func__);
541                 return HDF_FAILURE;
542             }
543         }
544     }
545 
546     struct HdfWlanRemoteNode *newRemoteNode =
547         (struct HdfWlanRemoteNode *)OsalMemCalloc(sizeof(struct HdfWlanRemoteNode));
548     if (newRemoteNode == NULL) {
549         HDF_LOGE("%{public}s:newRemoteNode is NULL", __func__);
550         return HDF_FAILURE;
551     }
552 
553     newRemoteNode->callbackObj = self;
554     newRemoteNode->service = self->AsObject(self);
555     DListInsertTail(&newRemoteNode->node, head);
556     return HDF_SUCCESS;
557 }
558 
FillData(uint8_t ** dst,uint32_t * dstLen,uint8_t * src,uint32_t srcLen)559 static int32_t FillData(uint8_t **dst, uint32_t *dstLen, uint8_t *src, uint32_t srcLen)
560 {
561     if (src == NULL || dst == NULL || dstLen == NULL) {
562         HDF_LOGE("%{public}s: Invalid parameter!", __func__);
563         return HDF_ERR_INVALID_PARAM;
564     }
565     *dst = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * srcLen);
566     if (*dst == NULL) {
567         HDF_LOGE("%{public}s: OsalMemCalloc fail!", __func__);
568         return HDF_FAILURE;
569     }
570     if (memcpy_s(*dst, srcLen, src, srcLen) != EOK) {
571         HDF_LOGE("%{public}s: memcpy_s fail!", __func__);
572         return HDF_FAILURE;
573     }
574     *dstLen = srcLen;
575     return HDF_SUCCESS;
576 }
577 
WlanFillScanResultInfo(WifiScanResult * wifiScanResult,struct HdfWifiScanResult * scanResult)578 static int32_t WlanFillScanResultInfo(WifiScanResult *wifiScanResult, struct HdfWifiScanResult *scanResult)
579 {
580     int32_t ret = HDF_SUCCESS;
581     if (wifiScanResult == NULL || scanResult == NULL) {
582         HDF_LOGE("%{public}s: wifiScanResult or scanResult is NULL!", __func__);
583         return HDF_ERR_INVALID_PARAM;
584     }
585     scanResult->flags = wifiScanResult->flags;
586     scanResult->caps = wifiScanResult->caps;
587     scanResult->freq = wifiScanResult->freq;
588     scanResult->beaconInt = wifiScanResult->beaconInt;
589     scanResult->qual = wifiScanResult->qual;
590     scanResult->level = wifiScanResult->level;
591     scanResult->age = wifiScanResult->age;
592     do {
593         if (wifiScanResult->bssid != NULL &&
594             FillData(&scanResult->bssid, &scanResult->bssidLen, wifiScanResult->bssid, ETH_ADDR_LEN) != HDF_SUCCESS) {
595             HDF_LOGE("%{public}s: fill bssid fail!", __func__);
596             ret = HDF_FAILURE;
597             break;
598         }
599         if ((wifiScanResult->ie != NULL) && (wifiScanResult->ieLen != 0) &&
600             FillData(&scanResult->ie, &scanResult->ieLen, wifiScanResult->ie, wifiScanResult->ieLen) != HDF_SUCCESS) {
601             HDF_LOGE("%{public}s: fill ie fail!", __func__);
602             ret = HDF_FAILURE;
603             break;
604         }
605         if ((wifiScanResult->beaconIe != NULL) && (wifiScanResult->beaconIeLen != 0) &&
606             FillData(&scanResult->beaconIe, &scanResult->beaconIeLen, wifiScanResult->beaconIe,
607                 wifiScanResult->beaconIeLen) != HDF_SUCCESS) {
608             HDF_LOGE("%{public}s: fill beaconIe fail!", __func__);
609             ret = HDF_FAILURE;
610         }
611     } while (0);
612     if (ret != HDF_SUCCESS) {
613         if (scanResult->bssid != NULL) {
614             OsalMemFree(scanResult->bssid);
615         }
616         if (scanResult->ie != NULL) {
617             OsalMemFree(scanResult->ie);
618         }
619         if (scanResult->beaconIe != NULL) {
620             OsalMemFree(scanResult->beaconIe);
621         }
622     }
623     return ret;
624 }
625 
WlanFillScanResultInfoExt(WifiScanResult * wifiScanResult,struct HdfWifiScanResultExt * scanResult)626 static int32_t WlanFillScanResultInfoExt(WifiScanResult *wifiScanResult, struct HdfWifiScanResultExt *scanResult)
627 {
628     int32_t ret = HDF_SUCCESS;
629     if (wifiScanResult == NULL || scanResult == NULL) {
630         HDF_LOGE("%{public}s: wifiScanResult or scanResult is NULL!", __func__);
631         return HDF_ERR_INVALID_PARAM;
632     }
633     scanResult->flags = wifiScanResult->flags;
634     scanResult->caps = wifiScanResult->caps;
635     scanResult->freq = wifiScanResult->freq;
636     scanResult->beaconInt = wifiScanResult->beaconInt;
637     scanResult->qual = wifiScanResult->qual;
638     scanResult->level = wifiScanResult->level;
639     scanResult->age = wifiScanResult->age;
640     scanResult->tsf = wifiScanResult->tsf;
641     do {
642         if (wifiScanResult->bssid != NULL &&
643             FillData(&scanResult->bssid, &scanResult->bssidLen, wifiScanResult->bssid, ETH_ADDR_LEN) != HDF_SUCCESS) {
644             HDF_LOGE("%{public}s: fill bssid fail!", __func__);
645             ret = HDF_FAILURE;
646             break;
647         }
648         if ((wifiScanResult->ie != NULL) && (wifiScanResult->ieLen != 0) &&
649             FillData(&scanResult->ie, &scanResult->ieLen, wifiScanResult->ie, wifiScanResult->ieLen) != HDF_SUCCESS) {
650             HDF_LOGE("%{public}s: fill ie fail!", __func__);
651             ret = HDF_FAILURE;
652             break;
653         }
654         if ((wifiScanResult->beaconIe != NULL) && (wifiScanResult->beaconIeLen != 0) &&
655             FillData(&scanResult->beaconIe, &scanResult->beaconIeLen, wifiScanResult->beaconIe,
656                 wifiScanResult->beaconIeLen) != HDF_SUCCESS) {
657             HDF_LOGE("%{public}s: fill beaconIe fail!", __func__);
658             ret = HDF_FAILURE;
659         }
660     } while (0);
661     if (ret != HDF_SUCCESS) {
662         if (scanResult->bssid != NULL) {
663             OsalMemFree(scanResult->bssid);
664         }
665         if (scanResult->ie != NULL) {
666             OsalMemFree(scanResult->ie);
667         }
668         if (scanResult->beaconIe != NULL) {
669             OsalMemFree(scanResult->beaconIe);
670         }
671     }
672     return ret;
673 }
674 
WlanFillScanResultsInfo(WifiScanResults * wifiScanResults,struct HdfWifiScanResults * scanResults)675 static int32_t WlanFillScanResultsInfo(WifiScanResults *wifiScanResults, struct HdfWifiScanResults *scanResults)
676 {
677     uint32_t i;
678     if (wifiScanResults == NULL || scanResults == NULL) {
679         HDF_LOGE("%{public}s: wifiScanResults or scanResults is NULL!", __func__);
680         return HDF_ERR_INVALID_PARAM;
681     }
682     for (i = 0; i < wifiScanResults->num; i++) {
683         if (WlanFillScanResultInfoExt(&wifiScanResults->scanResult[i], &scanResults->res[i]) != HDF_SUCCESS) {
684             return HDF_FAILURE;
685         }
686     }
687     scanResults->resLen = wifiScanResults->num;
688     return HDF_SUCCESS;
689 }
690 
ProcessEventScanResult(struct HdfWlanRemoteNode * node,uint32_t event,WifiScanResult * wifiScanResult,const char * ifName)691 static int32_t ProcessEventScanResult(struct HdfWlanRemoteNode *node, uint32_t event, WifiScanResult *wifiScanResult,
692     const char *ifName)
693 {
694     HDF_LOGI("hal enter %{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName);
695     struct HdfWifiScanResult *scanResult = NULL;
696     int32_t ret = HDF_FAILURE;
697 
698     if (node == NULL || node->callbackObj == NULL || node->callbackObj->ScanResult == NULL) {
699         HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL!", __func__);
700         return HDF_ERR_INVALID_PARAM;
701     }
702     scanResult = (struct HdfWifiScanResult *)OsalMemCalloc(sizeof(struct HdfWifiScanResult));
703     if ((scanResult == NULL) || (WlanFillScanResultInfo(wifiScanResult, scanResult) != HDF_SUCCESS)) {
704         HDF_LOGE("%{public}s: scanResult is NULL or WlanFillScanResultInfo fialed!", __func__);
705     } else {
706         ret = node->callbackObj->ScanResult(node->callbackObj, event, scanResult, ifName);
707     }
708     HdfWifiScanResultFree(scanResult, true);
709     HDF_LOGI("hal exit %{public}s", __FUNCTION__);
710     return ret;
711 }
712 
ProcessEventScanResults(struct HdfWlanRemoteNode * node,uint32_t event,WifiScanResults * wifiScanResults,const char * ifName)713 static int32_t ProcessEventScanResults(struct HdfWlanRemoteNode *node, uint32_t event,
714     WifiScanResults *wifiScanResults, const char *ifName)
715 {
716     HDF_LOGI("hal enter %{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName);
717     struct HdfWifiScanResults *scanResults = NULL;
718     uint32_t size;
719     int32_t ret = HDF_FAILURE;
720 
721     if (node == NULL || node->callbackObj == NULL || node->callbackObj->ScanResults == NULL) {
722         HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL!", __func__);
723         return HDF_ERR_INVALID_PARAM;
724     }
725     scanResults = (struct HdfWifiScanResults *)OsalMemCalloc(sizeof(struct HdfWifiScanResults));
726     if (scanResults == NULL) {
727         HDF_LOGE("%{public}s: scanResults is NULL!", __func__);
728         return HDF_ERR_MALLOC_FAIL;
729     }
730     if (wifiScanResults->num == 0) {
731         scanResults->res = NULL;
732         scanResults->resLen = 0;
733         ret = node->callbackObj->ScanResults(node->callbackObj, event, scanResults, ifName);
734         HdfWifiScanResultsFree(scanResults, true);
735         HDF_LOGD("%{public}s: scanResults num is 0!", __func__);
736         return ret;
737     }
738     scanResults->resLen = wifiScanResults->num;
739     size = sizeof(struct HdfWifiScanResultExt);
740     scanResults->res = (struct HdfWifiScanResultExt *)OsalMemCalloc(size * scanResults->resLen);
741     if ((scanResults->res == NULL) || (WlanFillScanResultsInfo(wifiScanResults, scanResults) != HDF_SUCCESS)) {
742         HDF_LOGE("%{public}s: scanResults->res is NULL or WlanFillScanResultsInfo fialed!", __func__);
743     } else {
744         ret = node->callbackObj->ScanResults(node->callbackObj, event, scanResults, ifName);
745     }
746     HdfWifiScanResultsFree(scanResults, true);
747     HDF_LOGI("hal exit %{public}s, wifiScanResults num:%{public}u", __FUNCTION__, wifiScanResults->num);
748     return ret;
749 }
750 
ProcessEventScanAborted(struct HdfWlanRemoteNode * node,uint32_t event,const char * ifName)751 static int32_t ProcessEventScanAborted(struct HdfWlanRemoteNode *node, uint32_t event, const char *ifName)
752 {
753     HDF_LOGI("hal enter %{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName);
754     int32_t ret = HDF_FAILURE;
755     struct HdfWifiScanResults scanResults = {0};
756 
757     if (node == NULL || node->callbackObj == NULL || node->callbackObj->ScanResults == NULL) {
758         HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL!", __func__);
759         return HDF_ERR_INVALID_PARAM;
760     }
761     ret = node->callbackObj->ScanResults(node->callbackObj, event, &scanResults, ifName);
762     HDF_LOGI("hal exit %{public}s, ScanResults ret:%{public}d", __FUNCTION__, ret);
763     return ret;
764 }
765 
ProcessEventActionReceived(struct HdfWlanRemoteNode * node,uint32_t event,WifiActionData * wifiActionData,const char * ifName)766 static int32_t ProcessEventActionReceived(struct HdfWlanRemoteNode *node, uint32_t event,
767     WifiActionData *wifiActionData, const char *ifName)
768 {
769     HDF_LOGI("hal enter %{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName);
770     int32_t ret = HDF_FAILURE;
771 
772     if (node == NULL || wifiActionData == NULL || ifName == NULL || node->callbackObj == NULL ||
773         node->callbackObj->WifiNetlinkMessage == NULL) {
774         HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL!", __func__);
775         return HDF_ERR_INVALID_PARAM;
776     }
777     ret = node->callbackObj->WifiNetlinkMessage(node->callbackObj, wifiActionData->data, wifiActionData->dataLen);
778     HDF_LOGI("hal exit %{public}s, WifiNetlinkMessage ret:%{public}d", __FUNCTION__, ret);
779     return ret;
780 }
781 
HdfWLanCallbackFun(uint32_t event,void * data,const char * ifName)782 static int32_t HdfWLanCallbackFun(uint32_t event, void *data, const char *ifName)
783 {
784     HDF_LOGI("%{public}s, event:%{public}u ifName:%{public}s", __FUNCTION__, event, ifName);
785     struct HdfWlanRemoteNode *pos = NULL;
786     struct DListHead *head = NULL;
787     int32_t *code = NULL;
788     int32_t ret = HDF_FAILURE;
789     (void)OsalMutexLock(&HdfStubDriver()->mutex);
790     head = &HdfStubDriver()->remoteListHead;
791 
792     if (data == NULL || ifName == NULL) {
793         HDF_LOGE("%{public}s: data or ifName is NULL!", __func__);
794         (void)OsalMutexUnlock(&HdfStubDriver()->mutex);
795         return HDF_ERR_INVALID_PARAM;
796     }
797     DLIST_FOR_EACH_ENTRY(pos, head, struct HdfWlanRemoteNode, node) {
798         if (pos == NULL) {
799             HDF_LOGE("%{public}s: pos is NULL", __func__);
800             break;
801         }
802         if (pos->service == NULL || pos->callbackObj == NULL) {
803             HDF_LOGW("%{public}s: pos->service or pos->callbackObj NULL", __func__);
804             continue;
805         }
806         switch (event) {
807             case WIFI_EVENT_RESET_DRIVER:
808                 code = (int32_t *)data;
809                 ret = pos->callbackObj->ResetDriverResult(pos->callbackObj, event, *code, ifName);
810                 break;
811             case WIFI_EVENT_SCAN_RESULT:
812                 ret = ProcessEventScanResult(pos, event, (WifiScanResult *)data, ifName);
813                 break;
814             case WIFI_EVENT_SCAN_RESULTS:
815                 ret = ProcessEventScanResults(pos, event, (WifiScanResults *)data, ifName);
816                 break;
817             case WIFI_EVENT_SCAN_ABORTED:
818                 ret = ProcessEventScanAborted(pos, event, ifName);
819                 break;
820             case WIFI_EVENT_ACTION_RECEIVED:
821                 ret = ProcessEventActionReceived(pos, event, (WifiActionData *)data, ifName);
822                 break;
823             default:
824                 HDF_LOGE("%{public}s: unknown eventId:%{public}d", __func__, event);
825                 break;
826         }
827         if (ret != HDF_SUCCESS) {
828             HDF_LOGI("%{public}s: dispatch code fialed, error code: %{public}d", __func__, ret);
829         }
830     }
831     (void)OsalMutexUnlock(&HdfStubDriver()->mutex);
832     return ret;
833 }
834 
HdfWlanNetlinkCallbackFun(const uint8_t * recvMsg,uint32_t recvMsgLen)835 static int32_t HdfWlanNetlinkCallbackFun(const uint8_t *recvMsg, uint32_t recvMsgLen)
836 {
837     struct HdfWlanRemoteNode *pos = NULL;
838     struct DListHead *head = NULL;
839     int32_t ret = HDF_FAILURE;
840     (void)OsalMutexLock(&HdfStubDriver()->mutex);
841     head = &HdfStubDriver()->remoteListHead;
842 
843     if (recvMsg == NULL) {
844         HDF_LOGE("%{public}s: recvMsg or ifName is NULL!", __func__);
845         (void)OsalMutexUnlock(&HdfStubDriver()->mutex);
846         return HDF_ERR_INVALID_PARAM;
847     }
848     DLIST_FOR_EACH_ENTRY(pos, head, struct HdfWlanRemoteNode, node) {
849         if (pos->service == NULL || pos->callbackObj == NULL) {
850             HDF_LOGW("%{public}s: pos->service or pos->callbackObj NULL", __func__);
851             continue;
852         }
853         ret = pos->callbackObj->WifiNetlinkMessage(pos->callbackObj, recvMsg, recvMsgLen);
854         if (ret != HDF_SUCCESS) {
855             HDF_LOGD("%{public}s: dispatch code fialed, error code: %{public}d", __func__, ret);
856         }
857     }
858     (void)OsalMutexUnlock(&HdfStubDriver()->mutex);
859     return ret;
860 }
861 
HdfWlanDelRemoteObj(struct IWlanCallback * self)862 static void HdfWlanDelRemoteObj(struct IWlanCallback *self)
863 {
864     struct HdfWlanRemoteNode *pos = NULL;
865     struct HdfWlanRemoteNode *tmp = NULL;
866     struct DListHead *head = &HdfStubDriver()->remoteListHead;
867 
868     DLIST_FOR_EACH_ENTRY_SAFE(pos, tmp, head, struct HdfWlanRemoteNode, node) {
869         if (pos->service->index == self->AsObject(self)->index) {
870             DListRemove(&(pos->node));
871             IWlanCallbackRelease(pos->callbackObj);
872             OsalMemFree(pos);
873             break;
874         }
875     }
876     IWlanCallbackRelease(self);
877 }
878 
WlanInterfaceRegisterEventCallback(struct IWlanInterface * self,struct IWlanCallback * cbFunc,const char * ifName)879 int32_t WlanInterfaceRegisterEventCallback(struct IWlanInterface *self, struct IWlanCallback *cbFunc,
880     const char *ifName)
881 {
882     int32_t ret;
883     HDF_LOGI("hal enter %{public}s, ifName:%{public}s", __FUNCTION__, ifName);
884     (void)self;
885     if (cbFunc == NULL || ifName == NULL) {
886         HDF_LOGE("%{public}s: input parameter invalid!", __func__);
887         return HDF_ERR_INVALID_PARAM;
888     }
889     if (g_wifi == NULL || g_wifi->registerEventCallback == NULL) {
890         HDF_LOGE("%{public}s g_wifi or g_wifi->registerEventCallback is NULL!", __func__);
891         return HDF_FAILURE;
892     }
893     (void)OsalMutexLock(&HdfStubDriver()->mutex);
894 
895     do {
896         ret = HdfWlanAddRemoteObj(cbFunc);
897         if (ret != HDF_SUCCESS) {
898             HDF_LOGE("%{public}s: HdfSensorAddRemoteObj false", __func__);
899             break;
900         }
901         ret = g_wifi->registerEventCallback(HdfWLanCallbackFun, ifName);
902         if (ret != HDF_SUCCESS) {
903             HDF_LOGE("%{public}s: Register failed!, error code: %{public}d", __func__, ret);
904             HdfWlanDelRemoteObj(cbFunc);
905             break;
906         }
907         ret = WlanInterfaceRegisterHid2dCallback(HdfWlanNetlinkCallbackFun, ifName);
908         if (ret != HDF_SUCCESS) {
909             HDF_LOGE("%{public}s: Register failed!, error code: %{public}d", __func__, ret);
910             g_wifi->unregisterEventCallback(HdfWLanCallbackFun, ifName);
911             HdfWlanDelRemoteObj(cbFunc);
912         }
913     } while (0);
914 
915     (void)OsalMutexUnlock(&HdfStubDriver()->mutex);
916     HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
917     return ret;
918 }
919 
WlanInterfaceUnregisterEventCallback(struct IWlanInterface * self,struct IWlanCallback * cbFunc,const char * ifName)920 int32_t WlanInterfaceUnregisterEventCallback(struct IWlanInterface *self, struct IWlanCallback *cbFunc,
921     const char *ifName)
922 {
923     HDF_LOGI("hal enter %{public}s, ifName:%{public}s", __FUNCTION__, ifName);
924     int32_t ret;
925 
926     (void)self;
927     if (cbFunc == NULL || ifName == NULL) {
928         HDF_LOGE("%{public}s: input parameter invalid!", __func__);
929         return HDF_ERR_INVALID_PARAM;
930     }
931     if (g_wifi == NULL || g_wifi->unregisterEventCallback == NULL) {
932         HDF_LOGE("%{public}s g_wifi or g_wifi->unregisterEventCallback is NULL!", __func__);
933         return HDF_FAILURE;
934     }
935     (void)OsalMutexLock(&HdfStubDriver()->mutex);
936     HdfWlanDelRemoteObj(cbFunc);
937     if (DListIsEmpty(&HdfStubDriver()->remoteListHead)) {
938         ret = g_wifi->unregisterEventCallback(HdfWLanCallbackFun, ifName);
939         if (ret != HDF_SUCCESS) {
940             HDF_LOGE("%{public}s: Unregister failed!, error code: %{public}d", __func__, ret);
941         }
942         ret = WlanInterfaceUnregisterHid2dCallback(HdfWlanNetlinkCallbackFun, ifName);
943         if (ret != HDF_SUCCESS) {
944             HDF_LOGE("%{public}s: Unregister Hid2dCallback failed!, error code: %{public}d", __func__, ret);
945         }
946     }
947     (void)OsalMutexUnlock(&HdfStubDriver()->mutex);
948     HDF_LOGI("hal exit %{public}s", __FUNCTION__);
949     return HDF_SUCCESS;
950 }
951 
WlanInterfaceResetDriver(struct IWlanInterface * self,uint8_t chipId,const char * ifName)952 int32_t WlanInterfaceResetDriver(struct IWlanInterface *self, uint8_t chipId, const char *ifName)
953 {
954     int32_t ret;
955 
956     (void)self;
957     if (ifName == NULL) {
958         HDF_LOGE("%{public}s: input parameter invalid!", __func__);
959         return HDF_ERR_INVALID_PARAM;
960     }
961     if (g_wifi == NULL || g_wifi->resetDriver == NULL) {
962         HDF_LOGE("%{public}s g_wifi or g_wifi->resetDriver is NULL!", __func__);
963         return HDF_FAILURE;
964     }
965     ret = g_wifi->resetDriver(chipId, ifName);
966     if (ret != HDF_SUCCESS) {
967         HDF_LOGE("%{public}s reset driver failed! error code: %{public}d", __func__, ret);
968         return ret;
969     }
970     OsalMSleep(RESET_TIME);
971     return ret;
972 }
973 
WlanInterfaceSetCountryCode(struct IWlanInterface * self,const struct HdfFeatureInfo * ifeature,const char * code,uint32_t len)974 int32_t WlanInterfaceSetCountryCode(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
975     const char *code, uint32_t len)
976 {
977     int32_t ret;
978 
979     (void)self;
980     if (ifeature == NULL || ifeature->ifName == NULL || code == NULL) {
981         HDF_LOGE("%{public}s input parameter invalid!", __func__);
982         return HDF_ERR_INVALID_PARAM;
983     }
984     if (g_apFeature == NULL || g_apFeature->setCountryCode == NULL) {
985         HDF_LOGE("%{public}s g_apFeature or g_apFeature->setCountryCode is NULL!", __func__);
986         return HDF_FAILURE;
987     }
988     ret = strcpy_s((g_apFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName);
989     if (ret != HDF_SUCCESS) {
990         HDF_LOGE("%{public}s: strcpy_s apFeature ifName is failed!", __func__);
991         return HDF_FAILURE;
992     }
993     ret = g_apFeature->setCountryCode(g_apFeature, code, strlen(code));
994     if (ret != HDF_SUCCESS) {
995         HDF_LOGE("%{public}s set country code failed!, error code: %{public}d", __func__, ret);
996     }
997     return ret;
998 }
999 
WlanInterfaceSetMacAddress(struct IWlanInterface * self,const struct HdfFeatureInfo * ifeature,const uint8_t * mac,uint32_t macLen)1000 int32_t WlanInterfaceSetMacAddress(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
1001     const uint8_t *mac, uint32_t macLen)
1002 {
1003     int32_t ret = HDF_FAILURE;
1004     struct IWiFiBaseFeature *baseFeature = NULL;
1005 
1006     (void)self;
1007     if (ifeature == NULL || mac == NULL || ifeature->ifName == NULL) {
1008         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1009         return HDF_ERR_INVALID_PARAM;
1010     }
1011     ret = GetBasefeature(ifeature, &baseFeature);
1012     if (ret != HDF_SUCCESS) {
1013         HDF_LOGE("%{public}s GetBasefeature failed!", __func__);
1014         return HDF_FAILURE;
1015     }
1016     ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName);
1017     if (ret != HDF_SUCCESS) {
1018         HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
1019         return HDF_FAILURE;
1020     }
1021     return baseFeature->setMacAddress(baseFeature, (uint8_t *)mac, ETH_ADDR_LEN);
1022 }
1023 
WlanInterfaceSetScanningMacAddress(struct IWlanInterface * self,const struct HdfFeatureInfo * ifeature,const uint8_t * scanMac,uint32_t scanMacLen)1024 int32_t WlanInterfaceSetScanningMacAddress(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
1025     const uint8_t *scanMac, uint32_t scanMacLen)
1026 {
1027     int32_t ret;
1028 
1029     (void)self;
1030     if (ifeature == NULL || ifeature->ifName == NULL || scanMac == NULL) {
1031         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1032         return HDF_ERR_INVALID_PARAM;
1033     }
1034     if (g_staFeature == NULL || g_staFeature->setScanningMacAddress == NULL) {
1035         HDF_LOGE("%{public}s g_staFeature or g_staFeature->setScanningMacAddress is NULL!", __func__);
1036         return HDF_FAILURE;
1037     }
1038     ret = strcpy_s((g_staFeature->baseFeature).ifName, IFNAMSIZ, ifeature->ifName);
1039     if (ret != HDF_SUCCESS) {
1040         HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
1041         return HDF_FAILURE;
1042     }
1043     ret = g_staFeature->setScanningMacAddress(g_staFeature, (uint8_t *)scanMac, (uint8_t)scanMacLen);
1044 
1045     return ret;
1046 }
1047 
WlanInterfaceSetTxPower(struct IWlanInterface * self,const struct HdfFeatureInfo * ifeature,int32_t power)1048 int32_t WlanInterfaceSetTxPower(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, int32_t power)
1049 {
1050     int32_t ret;
1051     struct IWiFiBaseFeature *baseFeature = NULL;
1052 
1053     (void)self;
1054     if (ifeature == NULL || ifeature->ifName == NULL) {
1055         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1056         return HDF_ERR_INVALID_PARAM;
1057     }
1058     ret = GetBasefeature(ifeature, &baseFeature);
1059     if (ret != HDF_SUCCESS) {
1060         HDF_LOGE("%{public}s GetBasefeature failed!", __func__);
1061         return HDF_FAILURE;
1062     }
1063     ret = strcpy_s(baseFeature->ifName, IFNAMSIZ, ifeature->ifName);
1064     if (ret != HDF_SUCCESS) {
1065         HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
1066         return HDF_FAILURE;
1067     }
1068 
1069     return baseFeature->setTxPower(baseFeature, power);
1070 }
1071 
WlanInterfaceGetNetDevInfo(struct IWlanInterface * self,struct HdfNetDeviceInfoResult * netDeviceInfoResult)1072 int32_t WlanInterfaceGetNetDevInfo(struct IWlanInterface *self, struct HdfNetDeviceInfoResult *netDeviceInfoResult)
1073 {
1074     int32_t ret = HDF_FAILURE;
1075 
1076     (void)self;
1077     if (g_wifi == NULL || g_wifi->getNetDevInfo == NULL ||netDeviceInfoResult == NULL) {
1078         HDF_LOGE("%{public}s: input parameter invalid!", __func__);
1079         return HDF_ERR_INVALID_PARAM;
1080     }
1081     struct NetDeviceInfoResult *netDeviceInfo =
1082         (struct NetDeviceInfoResult *)OsalMemCalloc(sizeof(struct NetDeviceInfoResult));
1083     if (netDeviceInfo == NULL) {
1084         HDF_LOGE("%{public}s:OsalMemCalloc failed!", __func__);
1085         return HDF_FAILURE;
1086     }
1087     ret = g_wifi->getNetDevInfo(netDeviceInfo);
1088     if (ret != HDF_SUCCESS) {
1089         HDF_LOGE("%{public}s: get netdev info failed!, error code: %{public}d", __func__, ret);
1090         OsalMemFree(netDeviceInfo);
1091         return HDF_FAILURE;
1092     }
1093 
1094     netDeviceInfoResult->deviceInfos =
1095         (struct HdfNetDeviceInfo *)OsalMemCalloc(sizeof(struct HdfNetDeviceInfo) * MAX_NETDEVICE_COUNT);
1096     if (netDeviceInfoResult->deviceInfos == NULL) {
1097         HDF_LOGE("%{public}s:netDeviceInfoResult->deviceInfos OsalMemCalloc failed", __func__);
1098         OsalMemFree(netDeviceInfo);
1099         return HDF_FAILURE;
1100     }
1101     netDeviceInfoResult->deviceInfosLen = MAX_NETDEVICE_COUNT;
1102     for (uint32_t i = 0; i < netDeviceInfoResult->deviceInfosLen; i++) {
1103         netDeviceInfoResult->deviceInfos[i].index = netDeviceInfo->deviceInfos[i].index;
1104         netDeviceInfoResult->deviceInfos[i].iftype = netDeviceInfo->deviceInfos[i].iftype;
1105         netDeviceInfoResult->deviceInfos[i].ifName = (char *)OsalMemCalloc(sizeof(char) * IFNAMSIZ);
1106         if (netDeviceInfoResult->deviceInfos != NULL) {
1107             if (memcpy_s(netDeviceInfoResult->deviceInfos[i].ifName, IFNAMSIZ, netDeviceInfo->deviceInfos[i].ifName,
1108                 IFNAMSIZ) != EOK) {
1109                 OsalMemFree(netDeviceInfoResult->deviceInfos[i].ifName);
1110                 break;
1111             }
1112             netDeviceInfoResult->deviceInfos[i].ifNameLen = IFNAMSIZ;
1113         }
1114         netDeviceInfoResult->deviceInfos[i].mac = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * ETH_ADDR_LEN);
1115         if (netDeviceInfoResult->deviceInfos[i].mac != NULL) {
1116             if (memcpy_s(netDeviceInfoResult->deviceInfos[i].mac, ETH_ADDR_LEN, netDeviceInfo->deviceInfos[i].mac,
1117                 ETH_ADDR_LEN) != EOK) {
1118                 OsalMemFree(netDeviceInfoResult->deviceInfos[i].mac);
1119                 break;
1120             }
1121             netDeviceInfoResult->deviceInfos[i].macLen = ETH_ADDR_LEN;
1122         }
1123     }
1124     OsalMemFree(netDeviceInfo);
1125     return ret;
1126 }
1127 
WLanFillSsid(WifiScan * wifiScan,const struct HdfWifiScan * scan)1128 static int32_t WLanFillSsid(WifiScan *wifiScan, const struct HdfWifiScan *scan)
1129 {
1130     uint32_t loop;
1131 
1132     for (loop = 0; loop < scan->ssidsLen; loop++) {
1133         if (scan->ssids[loop].ssidLen > MAX_SSID_LEN) {
1134             HDF_LOGW("%{public}s fail : ssidLen is invalid!", __func__);
1135             scan->ssids[loop].ssidLen = MAX_SSID_LEN - 1;
1136         }
1137         if (memcpy_s(wifiScan->ssids[loop].ssid, scan->ssids[loop].ssidLen, scan->ssids[loop].ssid,
1138             scan->ssids[loop].ssidLen) != EOK) {
1139             HDF_LOGE("%{public}s fail : memcpy_s ssids fail!", __func__);
1140             return HDF_FAILURE;
1141         }
1142         wifiScan->ssids[loop].ssidLen = (uint32_t)(scan->ssids[loop].ssidLen);
1143     }
1144     return HDF_SUCCESS;
1145 }
1146 
WLanFillScanData(WifiScan * wifiScan,const struct HdfWifiScan * scan)1147 static int32_t WLanFillScanData(WifiScan *wifiScan, const struct HdfWifiScan *scan)
1148 {
1149     if ((scan->ssids != NULL) && (scan->ssidsLen != 0)) {
1150         wifiScan->ssids = (WifiDriverScanSsid *)OsalMemCalloc(sizeof(WifiDriverScanSsid) * scan->ssidsLen);
1151         if (wifiScan->ssids != NULL) {
1152             if (WLanFillSsid(wifiScan, scan) != HDF_SUCCESS) {
1153                 HDF_LOGE("%{public}s fail : fill ssids fail!", __func__);
1154                 OsalMemFree(wifiScan->ssids);
1155                 return HDF_FAILURE;
1156             }
1157             wifiScan->numSsids = scan->ssidsLen;
1158         }
1159     }
1160 
1161     if ((scan->freqs != NULL) && (scan->freqsLen != 0)) {
1162         wifiScan->freqs = (int32_t *)OsalMemCalloc(sizeof(int32_t) * scan->freqsLen);
1163         if (wifiScan->freqs != NULL) {
1164             if (memcpy_s(wifiScan->freqs, sizeof(int32_t) * (scan->freqsLen), scan->freqs,
1165                 sizeof(int32_t) * (scan->freqsLen)) != EOK) {
1166                 HDF_LOGE("%{public}s fail : memcpy_s freqs fail!", __func__);
1167                 OsalMemFree(wifiScan->freqs);
1168                 return HDF_FAILURE;
1169             }
1170             wifiScan->numFreqs = scan->freqsLen;
1171         }
1172     }
1173 
1174     if ((scan->bssid != NULL) && (scan->bssidLen != 0)) {
1175         wifiScan->bssid = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * scan->bssidLen);
1176         if (wifiScan->bssid != NULL) {
1177             if (memcpy_s(wifiScan->bssid, sizeof(uint8_t) * (scan->bssidLen), scan->bssid,
1178                 sizeof(uint8_t) * (scan->bssidLen)) != EOK) {
1179                 HDF_LOGE("%{public}s fail : memcpy_s bssid fail!", __func__);
1180                 OsalMemFree(wifiScan->bssid);
1181                 return HDF_FAILURE;
1182             }
1183         }
1184     }
1185     if ((scan->extraIes != NULL) && (scan->extraIesLen != 0)) {
1186         wifiScan->extraIes = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * scan->extraIesLen);
1187         if (wifiScan->extraIes != NULL) {
1188             if (memcpy_s(wifiScan->extraIes, sizeof(uint8_t) * (scan->extraIesLen), scan->extraIes,
1189                 sizeof(uint8_t) * (scan->extraIesLen)) != EOK) {
1190                 HDF_LOGE("%{public}s fail : memcpy_s extraIes fail!", __func__);
1191                 OsalMemFree(wifiScan->extraIes);
1192                 return HDF_FAILURE;
1193             }
1194             wifiScan->extraIesLen = scan->extraIesLen;
1195         }
1196     }
1197 
1198     wifiScan->prefixSsidScanFlag = scan->prefixSsidScanFlag;
1199     wifiScan->fastConnectFlag = scan->fastConnectFlag;
1200     return HDF_SUCCESS;
1201 }
1202 
WifiScanFree(WifiScan * dataBlock)1203 static void WifiScanFree(WifiScan *dataBlock)
1204 {
1205     if (dataBlock == NULL) {
1206         return;
1207     }
1208 
1209     if (dataBlock->ssids != NULL) {
1210         OsalMemFree(dataBlock->ssids);
1211         dataBlock->ssids = NULL;
1212     }
1213     if (dataBlock->freqs != NULL) {
1214         OsalMemFree(dataBlock->freqs);
1215         dataBlock->freqs = NULL;
1216     }
1217     if (dataBlock->bssid != NULL) {
1218         OsalMemFree(dataBlock->bssid);
1219         dataBlock->bssid = NULL;
1220     }
1221     if (dataBlock->extraIes != NULL) {
1222         OsalMemFree(dataBlock->extraIes);
1223         dataBlock->extraIes = NULL;
1224     }
1225     OsalMemFree(dataBlock);
1226 }
1227 
WlanInterfaceStartScan(struct IWlanInterface * self,const struct HdfFeatureInfo * ifeature,const struct HdfWifiScan * scan)1228 int32_t WlanInterfaceStartScan(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature,
1229     const struct HdfWifiScan *scan)
1230 {
1231     HDF_LOGI("hal enter %{public}s", __FUNCTION__);
1232     int32_t ret = HDF_FAILURE;
1233 
1234     (void)self;
1235     if (ifeature == NULL || ifeature->ifName == NULL || scan == NULL) {
1236         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1237         return HDF_ERR_INVALID_PARAM;
1238     }
1239     WifiScan *wifiScan = (WifiScan *)OsalMemCalloc(sizeof(WifiScan));
1240     if (wifiScan == NULL) {
1241         HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
1242         return HDF_FAILURE;
1243     }
1244     if (WLanFillScanData(wifiScan, scan) != HDF_SUCCESS) {
1245         HDF_LOGE("%{public}s fail : fill scan data fail!", __func__);
1246         WifiScanFree(wifiScan);
1247         return HDF_FAILURE;
1248     }
1249     if (g_staFeature == NULL || g_staFeature->startScan == NULL) {
1250         HDF_LOGE("%{public}s g_staFeature or g_staFeature->startScan is NULL!", __func__);
1251         WifiScanFree(wifiScan);
1252         return HDF_FAILURE;
1253     }
1254     ret = g_staFeature->startScan(ifeature->ifName, wifiScan);
1255     if (ret != HDF_SUCCESS) {
1256         HDF_LOGE("%{public}s start scan failed!, error code: %{public}d", __func__, ret);
1257     }
1258     WifiScanFree(wifiScan);
1259     HDF_LOGI("hal exit %{public}s, ret:%{public}d", __FUNCTION__, ret);
1260     return ret;
1261 }
1262 
WlanInterfaceGetPowerMode(struct IWlanInterface * self,const struct HdfFeatureInfo * ifeature,uint8_t * mode)1263 int32_t WlanInterfaceGetPowerMode(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, uint8_t *mode)
1264 {
1265     int32_t ret;
1266 
1267     (void)self;
1268     if (ifeature == NULL || ifeature->ifName == NULL || mode == NULL) {
1269         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1270         return HDF_ERR_INVALID_PARAM;
1271     }
1272     if (g_wifi == NULL || g_wifi->getPowerMode == NULL) {
1273         HDF_LOGE("%{public}s g_wifi or g_wifi->getPowerMode is NULL!", __func__);
1274         return HDF_FAILURE;
1275     }
1276     ret = g_wifi->getPowerMode(ifeature->ifName, mode);
1277     if (ret != HDF_SUCCESS) {
1278         HDF_LOGE("%{public}s: get power mode failed!, error code: %{public}d", __func__, ret);
1279     }
1280     return ret;
1281 }
1282 
WlanInterfaceSetPowerMode(struct IWlanInterface * self,const struct HdfFeatureInfo * ifeature,uint8_t mode)1283 int32_t WlanInterfaceSetPowerMode(struct IWlanInterface *self, const struct HdfFeatureInfo *ifeature, uint8_t mode)
1284 {
1285     int32_t ret;
1286 
1287     (void)self;
1288     if (ifeature == NULL || ifeature->ifName == NULL) {
1289         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1290         return HDF_ERR_INVALID_PARAM;
1291     }
1292     if (g_wifi == NULL || g_wifi->setPowerMode == NULL) {
1293         HDF_LOGE("%{public}s g_wifi or g_wifi->setPowerMode is NULL!", __func__);
1294         return HDF_FAILURE;
1295     }
1296     ret = g_wifi->setPowerMode(ifeature->ifName, mode);
1297     if (ret != HDF_SUCCESS) {
1298         HDF_LOGE("%{public}s: get power mode failed!, error code: %{public}d", __func__, ret);
1299     }
1300     return ret;
1301 }
1302 
WlanInterfaceSetProjectionScreenParam(struct IWlanInterface * self,const char * ifName,const struct ProjectionScreenCmdParam * param)1303 int32_t WlanInterfaceSetProjectionScreenParam(struct IWlanInterface *self, const char *ifName,
1304     const struct ProjectionScreenCmdParam *param)
1305 {
1306     int32_t ret;
1307     ProjectionScreenParam *projectionScreenParam = NULL;
1308 
1309     (void)self;
1310     if (ifName == NULL || param == NULL) {
1311         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1312         return HDF_ERR_INVALID_PARAM;
1313     }
1314     if (g_wifi == NULL || g_wifi->setProjectionScreenParam == NULL) {
1315         HDF_LOGE("%{public}s g_wifi or g_wifi->setProjectionScreenParam is NULL!", __func__);
1316         return HDF_FAILURE;
1317     }
1318 
1319     projectionScreenParam = OsalMemCalloc(sizeof(ProjectionScreenParam) + param->bufLen);
1320     if (projectionScreenParam == NULL) {
1321         HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
1322         return HDF_FAILURE;
1323     }
1324     projectionScreenParam->cmdId = param->cmdId;
1325     projectionScreenParam->bufLen = param->bufLen;
1326     do {
1327         if (memcpy_s(projectionScreenParam->buf, projectionScreenParam->bufLen, param->buf, param->bufLen) != EOK) {
1328             HDF_LOGE("%{public}s: memcpy_s failed", __func__);
1329             ret = HDF_FAILURE;
1330             break;
1331         }
1332         ret = g_wifi->setProjectionScreenParam(ifName, projectionScreenParam);
1333         if (ret != HDF_SUCCESS) {
1334             HDF_LOGE("%{public}s: get channel meas result failed!, error code: %{public}d", __func__, ret);
1335         }
1336     } while (0);
1337 
1338     OsalMemFree(projectionScreenParam);
1339     return ret;
1340 }
1341 
WlanInterfaceGetStaInfo(struct IWlanInterface * self,const char * ifName,struct WifiStationInfo * info,const uint8_t * mac,uint32_t macLen)1342 int32_t WlanInterfaceGetStaInfo(struct IWlanInterface *self, const char *ifName, struct WifiStationInfo *info,
1343     const uint8_t *mac, uint32_t macLen)
1344 {
1345     int32_t ret;
1346 
1347     (void)self;
1348     if (ifName == NULL || info == NULL || mac == NULL) {
1349         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1350         return HDF_ERR_INVALID_PARAM;
1351     }
1352     if (g_wifi == NULL || g_wifi->getStationInfo == NULL) {
1353         HDF_LOGE("%{public}s g_wifi or g_wifi->getStationInfo is NULL!", __func__);
1354         return HDF_FAILURE;
1355     }
1356     ret = g_wifi->getStationInfo(ifName, (StationInfo *)info, mac, macLen);
1357     if (ret != HDF_SUCCESS) {
1358         HDF_LOGE("%{public}s: get station information failed!, error code: %{public}d", __func__, ret);
1359     }
1360     return ret;
1361 }
1362 
FillPnoSettings(WifiPnoSettings * wifiPnoSettings,const struct PnoSettings * pnoSettings)1363 static int32_t FillPnoSettings(WifiPnoSettings *wifiPnoSettings, const struct PnoSettings *pnoSettings)
1364 {
1365     wifiPnoSettings->min2gRssi = pnoSettings->min2gRssi;
1366     wifiPnoSettings->min5gRssi = pnoSettings->min5gRssi;
1367     wifiPnoSettings->scanIntervalMs = pnoSettings->scanIntervalMs;
1368     wifiPnoSettings->scanIterations = pnoSettings->scanIterations;
1369 
1370     if ((pnoSettings->pnoNetworks == NULL) || (pnoSettings->pnoNetworksLen == 0)) {
1371         HDF_LOGE("%{public}s: scan networks is NULL.", __func__);
1372         return HDF_FAILURE;
1373     }
1374 
1375     wifiPnoSettings->pnoNetworksLen = pnoSettings->pnoNetworksLen;
1376     wifiPnoSettings->pnoNetworks =
1377         (WifiPnoNetwork *)OsalMemCalloc(sizeof(WifiPnoNetwork) * (pnoSettings->pnoNetworksLen));
1378     if (wifiPnoSettings->pnoNetworks == NULL) {
1379         HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
1380         return HDF_FAILURE;
1381     }
1382     for (uint32_t i = 0; i < pnoSettings->pnoNetworksLen; i++) {
1383         wifiPnoSettings->pnoNetworks[i].isHidden = pnoSettings->pnoNetworks[i].isHidden;
1384         wifiPnoSettings->pnoNetworks[i].ssid.ssidLen = (uint32_t)(pnoSettings->pnoNetworks[i].ssid.ssidLen);
1385         if (memcpy_s(wifiPnoSettings->pnoNetworks[i].ssid.ssid, MAX_SSID_LEN, pnoSettings->pnoNetworks[i].ssid.ssid,
1386                 pnoSettings->pnoNetworks[i].ssid.ssidLen) != EOK) {
1387             HDF_LOGE("%{public}s fail : memcpy_s ssids fail!", __func__);
1388             return HDF_FAILURE;
1389         }
1390         if (pnoSettings->pnoNetworks[i].freqsLen != 0) {
1391             wifiPnoSettings->pnoNetworks[i].freqs =
1392                 (int32_t *)OsalMemCalloc(sizeof(int32_t) * (pnoSettings->pnoNetworks[i].freqsLen));
1393             if (wifiPnoSettings->pnoNetworks[i].freqs == NULL) {
1394                 HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
1395                 return HDF_FAILURE;
1396             }
1397             wifiPnoSettings->pnoNetworks[i].freqsLen = pnoSettings->pnoNetworks[i].freqsLen;
1398             if (memcpy_s(wifiPnoSettings->pnoNetworks[i].freqs,
1399                     sizeof(int32_t) * (pnoSettings->pnoNetworks[i].freqsLen), pnoSettings->pnoNetworks[i].freqs,
1400                     sizeof(int32_t) * (pnoSettings->pnoNetworks[i].freqsLen)) != EOK) {
1401                 HDF_LOGE("%{public}s fail : memcpy_s freqs fail!", __func__);
1402                 return HDF_FAILURE;
1403             }
1404         }
1405     }
1406     return HDF_SUCCESS;
1407 }
1408 
WifiPnoSettingsFree(WifiPnoSettings * wifiPnoSettings)1409 static void WifiPnoSettingsFree(WifiPnoSettings *wifiPnoSettings)
1410 {
1411     if (wifiPnoSettings == NULL) {
1412         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1413         return;
1414     }
1415     for (uint32_t i = 0; i < wifiPnoSettings->pnoNetworksLen; i++) {
1416         if (wifiPnoSettings->pnoNetworks[i].freqs != NULL) {
1417             OsalMemFree(wifiPnoSettings->pnoNetworks[i].freqs);
1418             wifiPnoSettings->pnoNetworks[i].freqs = NULL;
1419         }
1420     }
1421     OsalMemFree(wifiPnoSettings->pnoNetworks);
1422     wifiPnoSettings->pnoNetworks = NULL;
1423     OsalMemFree(wifiPnoSettings);
1424 }
1425 
WlanInterfaceStartPnoScan(struct IWlanInterface * self,const char * ifName,const struct PnoSettings * pnoSettings)1426 int32_t WlanInterfaceStartPnoScan(struct IWlanInterface *self, const char *ifName,
1427     const struct PnoSettings *pnoSettings)
1428 {
1429     HDF_LOGI("hal enter %{public}s ifName:%{public}s", __FUNCTION__, ifName);
1430     int32_t ret;
1431     (void)self;
1432 
1433     if (ifName == NULL || pnoSettings == NULL) {
1434         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1435         return HDF_ERR_INVALID_PARAM;
1436     }
1437     if (g_staFeature == NULL || g_staFeature->startPnoScan == NULL) {
1438         HDF_LOGE("%{public}s g_staFeature or g_staFeature->startPnoScan is NULL!", __func__);
1439         return HDF_FAILURE;
1440     }
1441     WifiPnoSettings *wifiPnoSettings = (WifiPnoSettings *)OsalMemCalloc(sizeof(WifiPnoSettings));
1442     if (wifiPnoSettings == NULL) {
1443         HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
1444         return HDF_FAILURE;
1445     }
1446     if (FillPnoSettings(wifiPnoSettings, pnoSettings) != HDF_SUCCESS) {
1447         HDF_LOGE("%{public}s fail : memcpy_s ssids fail!", __func__);
1448         WifiPnoSettingsFree(wifiPnoSettings);
1449         return HDF_FAILURE;
1450     }
1451 
1452     ret = strcpy_s((g_staFeature->baseFeature).ifName, IFNAMSIZ, ifName);
1453     if (ret != HDF_SUCCESS) {
1454         HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
1455         WifiPnoSettingsFree(wifiPnoSettings);
1456         return HDF_FAILURE;
1457     }
1458     ret = g_staFeature->startPnoScan(ifName, wifiPnoSettings);
1459     if (ret != HDF_SUCCESS) {
1460         HDF_LOGE("%{public}s: startPnoScan failed!, error code: %{public}d", __func__, ret);
1461     }
1462     WifiPnoSettingsFree(wifiPnoSettings);
1463     HDF_LOGI("hal exit %{public}s", __FUNCTION__);
1464     return ret;
1465 }
1466 
WlanInterfaceStopPnoScan(struct IWlanInterface * self,const char * ifName)1467 int32_t WlanInterfaceStopPnoScan(struct IWlanInterface *self, const char *ifName)
1468 {
1469     HDF_LOGI("hal enter %{public}s ifName:%{public}s", __FUNCTION__, ifName);
1470     int32_t ret;
1471     (void)self;
1472 
1473     if (ifName == NULL) {
1474         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1475         return HDF_ERR_INVALID_PARAM;
1476     }
1477     if (g_staFeature == NULL || g_staFeature->stopPnoScan == NULL) {
1478         HDF_LOGE("%{public}s g_staFeature or g_staFeature->stopPnoScan is NULL!", __func__);
1479         return HDF_FAILURE;
1480     }
1481     ret = strcpy_s((g_staFeature->baseFeature).ifName, IFNAMSIZ, ifName);
1482     if (ret != HDF_SUCCESS) {
1483         HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
1484         return HDF_FAILURE;
1485     }
1486     ret = g_staFeature->stopPnoScan(ifName);
1487     if (ret != HDF_SUCCESS) {
1488         HDF_LOGE("%{public}s: stopPnoScan failed!, error code: %{public}d", __func__, ret);
1489     }
1490     HDF_LOGI("hal exit %{public}s", __FUNCTION__);
1491     return ret;
1492 }
1493 
WlanInterfaceGetSignalPollInfo(struct IWlanInterface * self,const char * ifName,struct SignalPollResult * signalResult)1494 int32_t WlanInterfaceGetSignalPollInfo(struct IWlanInterface *self, const char *ifName,
1495     struct SignalPollResult *signalResult)
1496 {
1497     int32_t ret;
1498     (void)self;
1499 
1500     if (ifName == NULL || signalResult == NULL) {
1501         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1502         return HDF_ERR_INVALID_PARAM;
1503     }
1504     if (g_staFeature == NULL || g_staFeature->getSignalPollInfo == NULL) {
1505         HDF_LOGE("%{public}s g_staFeature or g_staFeature->getSignalPollInfo is NULL!", __func__);
1506         return HDF_FAILURE;
1507     }
1508     ret = strcpy_s((g_staFeature->baseFeature).ifName, IFNAMSIZ, ifName);
1509     if (ret != HDF_SUCCESS) {
1510         HDF_LOGE("%{public}s: strcpy_s is failed!, error code: %{public}d", __func__, ret);
1511         return HDF_FAILURE;
1512     }
1513     ret = g_staFeature->getSignalPollInfo(ifName, (struct SignalResult *)signalResult);
1514     if (ret != HDF_SUCCESS) {
1515         HDF_LOGE("%{public}s: get signal information failed!, error code: %{public}d", __func__, ret);
1516     }
1517     return ret;
1518 }
1519 
WlanInterfaceGetApBandwidth(struct IWlanInterface * self,const char * ifName,uint8_t * bandwidth)1520 int32_t WlanInterfaceGetApBandwidth(struct IWlanInterface *self, const char *ifName,
1521     uint8_t *bandwidth)
1522 {
1523     int32_t ret;
1524     (void)self;
1525 
1526     if (ifName == NULL || bandwidth == NULL) {
1527         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1528         return HDF_ERR_INVALID_PARAM;
1529     }
1530     if (g_apFeature == NULL || g_apFeature->getApBandwidth == NULL) {
1531         HDF_LOGE("%{public}s g_apFeature or g_staFeature->getApBandwidth is NULL!", __func__);
1532         return HDF_FAILURE;
1533     }
1534     ret = g_apFeature->getApBandwidth(ifName, bandwidth);
1535     if (ret != HDF_SUCCESS) {
1536         HDF_LOGE("%{public}s: get signal information failed!, error code: %d", __func__, ret);
1537     }
1538     return ret;
1539 }
1540 
WlanInterfaceResetToFactoryMacAddress(struct IWlanInterface * self,const char * ifName)1541 int32_t WlanInterfaceResetToFactoryMacAddress(struct IWlanInterface *self, const char *ifName)
1542 {
1543     int32_t ret;
1544 
1545     (void)self;
1546     if (ifName == NULL) {
1547         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1548         return HDF_ERR_INVALID_PARAM;
1549     }
1550 
1551     if (g_staFeature != NULL) {
1552         HDF_LOGD("%{public}s g_staFeature is not NULL!", __func__);
1553         ret = g_staFeature->baseFeature.resetToFactoryMacAddress(ifName);
1554     } else if (g_apFeature != NULL) {
1555         HDF_LOGD("%{public}s g_apFeature is not NULL!", __func__);
1556         ret = g_apFeature->baseFeature.resetToFactoryMacAddress(ifName);
1557     } else {
1558         HDF_LOGE("%{public}s: ap and sta feature is Invalid.", __func__);
1559         ret = HDF_FAILURE;
1560     }
1561 
1562     if (ret != HDF_SUCCESS) {
1563         HDF_LOGE("%{public}s get name failed!, error code: %{public}d", __func__, ret);
1564     }
1565     return ret;
1566 }
1567 
WlanInterfaceSendActionFrame(struct IWlanInterface * self,const char * ifName,uint32_t freq,const uint8_t * frameData,uint32_t frameDataLen)1568 int32_t WlanInterfaceSendActionFrame(struct IWlanInterface *self, const char *ifName, uint32_t freq,
1569     const uint8_t *frameData, uint32_t frameDataLen)
1570 {
1571     int32_t ret;
1572     (void)self;
1573     if (ifName == NULL || freq == 0 || frameData == NULL || frameDataLen == 0) {
1574         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1575         return HDF_ERR_INVALID_PARAM;
1576     }
1577     if (g_wifi == NULL || g_wifi->sendActionFrame == NULL) {
1578         HDF_LOGE("%{public}s g_wifi or g_wifi->sendActionFrame is NULL!", __func__);
1579         return HDF_FAILURE;
1580     }
1581     ret = g_wifi->sendActionFrame(ifName, freq, frameData, frameDataLen);
1582     if (ret != HDF_SUCCESS) {
1583         HDF_LOGE("%{public}s failed!, error code: %{public}d", __func__, ret);
1584     }
1585     return ret;
1586 }
1587 
WlanInterfaceRegisterActionFrameReceiver(struct IWlanInterface * self,const char * ifName,const uint8_t * match,uint32_t matchLen)1588 int32_t WlanInterfaceRegisterActionFrameReceiver(struct IWlanInterface *self, const char *ifName,
1589     const uint8_t *match, uint32_t matchLen)
1590 {
1591     int32_t ret;
1592     (void)self;
1593     if (ifName == NULL || match == NULL || matchLen == 0) {
1594         HDF_LOGE("%{public}s input parameter invalid!", __func__);
1595         return HDF_ERR_INVALID_PARAM;
1596     }
1597     if (g_wifi == NULL || g_wifi->registerActionFrameReceiver == NULL) {
1598         HDF_LOGE("%{public}s g_wifi or g_wifi->registerActionFrameReceiver is NULL!", __func__);
1599         return HDF_FAILURE;
1600     }
1601     ret = g_wifi->registerActionFrameReceiver(ifName, match, matchLen);
1602     if (ret != HDF_SUCCESS) {
1603         HDF_LOGE("%{public}s failed!, error code: %{public}d", __func__, ret);
1604     }
1605     return ret;
1606 }
1607 
WlanInterfaceWifiConstruct(void)1608 int32_t WlanInterfaceWifiConstruct(void)
1609 {
1610     int32_t ret;
1611 
1612     ret = WifiConstruct(&g_wifi);
1613     if (ret != HDF_SUCCESS) {
1614         HDF_LOGE("%{public}s construct WiFi failed! error code: %{public}d", __func__, ret);
1615     }
1616     return ret;
1617 }
1618 
WlanInterfaceWifiDestruct(void)1619 int32_t WlanInterfaceWifiDestruct(void)
1620 {
1621     int32_t ret;
1622 
1623     ret = WifiDestruct(&g_wifi);
1624     if (ret != HDF_SUCCESS) {
1625         HDF_LOGE("%{public}s destruct WiFi failed! error code: %{public}d", __func__, ret);
1626     }
1627     return ret;
1628 }
1629