• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Driver interaction with hdf wifi
3  * Copyright (c) 2020 Huawei Device Co., Ltd.
4  *
5  * This software may be distributed under the terms of the BSD license.
6  * See README for more details.
7  */
8 
9 #include "wpa_hal.h"
10 #include "includes.h"
11 #include "utils/common.h"
12 #include "driver.h"
13 #include "ap/hostapd.h"
14 #include "l2_packet/l2_packet.h"
15 #include "eloop.h"
16 #include "securec.h"
17 #include <dirent.h>
18 
19 #ifdef __cplusplus
20 #if __cplusplus
21 extern "C" {
22 #endif
23 #endif
24 
25 WifiDriverData *g_wifiDriverData = NULL;
26 enum WifiIfType g_wifiDriverType = WIFI_IFTYPE_UNSPECIFIED;
27 #define WAIT_LOAD_NETDEVICE 2500
28 #ifdef CONFIG_OHOS_P2P
29 uint8_t g_msgInit = true;
30 #endif
31 
GetDrvData()32 WifiDriverData *GetDrvData()
33 {
34     return g_wifiDriverData;
35 }
36 
37 #ifdef CONFIG_OHOS_P2P
38 #define WPA_MAX_WIFI_DEV_NUM 3
39 
40 WifiDev* g_wifiDev[WPA_MAX_WIFI_DEV_NUM] = {NULL};
41 
GetWifiDevByName(const char * ifName)42 WifiDev* GetWifiDevByName(const char *ifName)
43 {
44     int32_t i;
45     if (ifName == NULL) {
46         return NULL;
47     }
48     for (i = 0; i < WPA_MAX_WIFI_DEV_NUM; i++) {
49         if ((g_wifiDev[i] != NULL) && (strncmp(g_wifiDev[i]->ifName, ifName, strlen(ifName)) == 0)) {
50             g_wifiDev[i]->networkId = i;
51             return g_wifiDev[i];
52         }
53     }
54     return NULL;
55 }
56 
SetWifiDev(WifiDev * wifiDev)57 int32_t SetWifiDev(WifiDev *wifiDev)
58 {
59     int32_t i;
60     if (wifiDev == NULL) {
61         return -EFAIL;
62     }
63     for (i = 0; i < WPA_MAX_WIFI_DEV_NUM; i++) {
64         if ((g_wifiDev[i] != NULL) && (strncmp(g_wifiDev[i]->ifName, wifiDev->ifName, strlen(wifiDev->ifName)) == 0)) {
65             g_wifiDev[i] = wifiDev;
66             return SUCC;
67         } else if (g_wifiDev[i] == NULL) {
68             g_wifiDev[i] = wifiDev;
69             g_wifiDev[i]->networkId = i;
70             return SUCC;
71         }
72     }
73     return -EFAIL;
74 }
75 
FreeWifiDev(WifiDev * wifiDev)76 void FreeWifiDev(WifiDev *wifiDev)
77 {
78     int32_t i;
79     if (wifiDev == NULL) {
80         return;
81     }
82     for (i = 0; i < WPA_MAX_WIFI_DEV_NUM; i++) {
83         if (g_wifiDev[i] == wifiDev) {
84             g_wifiDev[i] = NULL;
85             break;
86         }
87     }
88     os_free(wifiDev);
89     wifiDev = NULL;
90 }
91 
CountWifiDevInUse()92 int32_t CountWifiDevInUse()
93 {
94     int32_t i;
95     int32_t count = 0;
96     for (i = 0; i < WPA_MAX_WIFI_DEV_NUM; i++) {
97         if (g_wifiDev[i] != NULL) {
98             count++;
99         }
100     }
101     return count;
102 }
103 #endif // CONFIG_OHOS_P2P
104 
OnWpaWiFiEvents(uint32_t event,void * data,const char * ifName)105 static int OnWpaWiFiEvents(uint32_t event, void *data, const char *ifName)
106 {
107     WifiDriverData *drv = NULL;
108 #ifndef CONFIG_OHOS_P2P
109     drv = GetDrvData();
110 #else
111     WifiDev *wifiDev = NULL;
112     wifiDev = GetWifiDevByName(ifName);
113     if (wifiDev == NULL) {
114         wpa_printf(MSG_ERROR, "OnWpaWiFiEvents wifiDev is null\n");
115         return -EFAIL;
116     }
117     drv = wifiDev->priv;
118 #endif
119     (void)ifName;
120     wpa_printf(MSG_INFO, "OnWpaWiFiEvents event=%d", event);
121     if (drv == NULL || data == NULL) {
122         return -EFAIL;
123     }
124     switch (event) {
125         case WIFI_EVENT_NEW_STA:
126             WifiWpaNewStaProcess(drv, (WifiNewStaInfo *)data);
127             break;
128         case WIFI_EVENT_DEL_STA:
129             WifiWpaDelStaProcess(drv, (uint8_t *)data);
130             break;
131         case WIFI_EVENT_RX_MGMT:
132             WifiWpaRxMgmtProcess(drv, (WifiRxMgmt *)data);
133             break;
134         case WIFI_EVENT_TX_STATUS:
135             WifiWpaTxStatusProcess(drv, (WifiTxStatus *)data);
136             break;
137         case WIFI_EVENT_SCAN_DONE:
138             WifiWpaScanDoneProcess(drv, (uint32_t *)data);
139             break;
140         case WIFI_EVENT_SCAN_RESULT:
141             WifiWpaScanResultProcess(drv, (WifiScanResult *)data);
142             break;
143         case WIFI_EVENT_CONNECT_RESULT:
144             WifiWpaConnectResultProcess(drv, (WifiConnectResult *)data);
145             break;
146         case WIFI_EVENT_DISCONNECT:
147             WifiWpaDisconnectProcess(drv, (WifiDisconnect *)data);
148             break;
149         case WIFI_EVENT_EAPOL_RECV:
150             WifiWpaDriverEapolRecvProcess(drv, data);
151             break;
152         case WIFI_EVENT_REMAIN_ON_CHANNEL:
153             WifiWpaRemainOnChannelProcess(drv, (WifiOnChannel *)data);
154             break;
155         case WIFI_EVENT_CANCEL_REMAIN_ON_CHANNEL:
156             WifiWpaCancelRemainOnChannelProcess(drv, (WifiOnChannel *)data);
157             break;
158         default:
159             break;
160     }
161 
162     return SUCC;
163 }
164 
WifiClientInit(const char * ifName)165 static int32_t WifiClientInit(const char *ifName)
166 {
167     int32_t ret;
168 
169     wpa_printf(MSG_INFO, "WifiClientInit enter.");
170     ret = WifiDriverClientInit();
171     if (ret != SUCC) {
172         wpa_printf(MSG_ERROR, "WifiWpa init msg service failed");
173         return ret;
174     }
175     ret = WifiRegisterEventCallback(OnWpaWiFiEvents, WIFI_KERNEL_TO_WPA_CLIENT, ifName);
176     if (ret != SUCC) {
177         wpa_printf(MSG_ERROR, "WifiWpa register event listener faild");
178     }
179     return ret;
180 }
181 
WifiClientDeinit(const char * ifName)182 void WifiClientDeinit(const char *ifName)
183 {
184     WifiUnregisterEventCallback(OnWpaWiFiEvents, WIFI_KERNEL_TO_WPA_CLIENT, ifName);
185     WifiDriverClientDeinit();
186 }
187 
WifiWpaGetBssid(void * priv,uint8_t * bssid)188 static int32_t WifiWpaGetBssid(void *priv, uint8_t *bssid)
189 {
190     WifiDriverData *drv = priv;
191     errno_t rc;
192     if ((priv == NULL) || (bssid == NULL)) {
193         return -EFAIL;
194     }
195     if (drv->associated == WIFI_DISCONNECT) {
196         wpa_printf(MSG_ERROR, "%s associated status error", __func__);
197         return -EFAIL;
198     }
199 
200     rc = memcpy_s(bssid, ETH_ADDR_LEN, drv->bssid, ETH_ADDR_LEN);
201     if (rc != EOK) {
202         return -EFAIL;
203     }
204     return SUCC;
205 }
206 
WifiWpaGetSsid(void * priv,uint8_t * ssid)207 static int32_t WifiWpaGetSsid(void *priv, uint8_t *ssid)
208 {
209     WifiDriverData *drv = priv;
210     errno_t rc;
211     if ((priv == NULL) || (ssid == NULL)) {
212         return -EFAIL;
213     }
214     if (drv->associated == WIFI_DISCONNECT) {
215         wpa_printf(MSG_ERROR, "%s associated status error", __func__);
216         return -EFAIL;
217     }
218     rc = memcpy_s(ssid, MAX_SSID_LEN, drv->ssid, drv->ssidLen);
219     if (rc != EOK) {
220         return -EFAIL;
221     }
222     return drv->ssidLen;
223 }
224 
WifiAlgToCipherSuite(enum wpa_alg alg,size_t keyLen)225 static uint32_t WifiAlgToCipherSuite(enum wpa_alg alg, size_t keyLen)
226 {
227     switch (alg) {
228         case WPA_ALG_WEP:
229             if (keyLen == WPA_WEP40_KEY_LEN) {
230                 return RSN_CIPHER_SUITE_WEP40;
231             }
232             return RSN_CIPHER_SUITE_WEP104;
233         case WPA_ALG_TKIP:
234             return RSN_CIPHER_SUITE_TKIP;
235         case WPA_ALG_CCMP:
236             return RSN_CIPHER_SUITE_CCMP;
237         case WPA_ALG_GCMP:
238             return RSN_CIPHER_SUITE_GCMP;
239         case WPA_ALG_CCMP_256:
240             return RSN_CIPHER_SUITE_CCMP_256;
241         case WPA_ALG_GCMP_256:
242             return RSN_CIPHER_SUITE_GCMP_256;
243         case WPA_ALG_BIP_CMAC_128:
244             return RSN_CIPHER_SUITE_AES_128_CMAC;
245         case WPA_ALG_BIP_GMAC_128:
246             return RSN_CIPHER_SUITE_BIP_GMAC_128;
247         case WPA_ALG_BIP_GMAC_256:
248             return RSN_CIPHER_SUITE_BIP_GMAC_256;
249         case WPA_ALG_BIP_CMAC_256:
250             return RSN_CIPHER_SUITE_BIP_CMAC_256;
251         case WPA_ALG_SMS4:
252             return RSN_CIPHER_SUITE_SMS4;
253         case WPA_ALG_KRK:
254             return RSN_CIPHER_SUITE_KRK;
255         case WPA_ALG_NONE:
256             return 0;
257         default:
258             return 0;
259     }
260 }
261 
IsBroadcastAddr(const uint8_t * addr)262 static inline int IsBroadcastAddr(const uint8_t *addr)
263 {
264     // 0 1 2 3 4 5 are mac index
265     return (addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) == 0xff;
266 }
267 
WifiWpaInitAlg(WifiKeyExt * keyExt,enum wpa_alg alg,size_t keyLen)268 static void WifiWpaInitAlg(WifiKeyExt *keyExt, enum wpa_alg alg, size_t keyLen)
269 {
270   keyExt->cipher = WifiAlgToCipherSuite(alg, keyLen);
271   if ((alg == WPA_ALG_BIP_CMAC_128) || (alg == WPA_ALG_BIP_GMAC_128) ||
272       (alg == WPA_ALG_BIP_GMAC_256) || (alg == WPA_ALG_BIP_CMAC_256)) {
273     keyExt->defMgmt = true;
274   } else {
275     keyExt->def = true;
276   }
277 }
278 
WifiWpaInitAddr(WifiKeyExt * keyExt,const uint8_t * addr,const enum wpa_alg alg,const int32_t keyIdx,const int32_t setTx)279 static int32_t WifiWpaInitAddr(WifiKeyExt *keyExt, const uint8_t *addr, const enum wpa_alg alg, const int32_t keyIdx,
280     const int32_t setTx)
281 {
282     keyExt->type = WIFI_KEYTYPE_BUTT;
283     keyExt->defaultTypes = WIFI_KEY_DEFAULT_TYPE_INVALID;
284     if (addr != NULL) {
285         if (!IsBroadcastAddr(addr)) {
286             keyExt->addr = (uint8_t *)os_zalloc(ETH_ADDR_LEN);
287             if ((keyExt->addr == NULL) || (memcpy_s(keyExt->addr, ETH_ADDR_LEN, addr, ETH_ADDR_LEN) != EOK)) {
288                 return -EFAIL;
289             }
290             if ((alg != WPA_ALG_WEP) && (keyIdx != 0) && (setTx == 0)) {
291                 keyExt->type = WIFI_KEYTYPE_GROUP;
292             }
293             keyExt->defaultTypes = WIFI_KEY_DEFAULT_TYPE_UNICAST;
294         } else {
295             keyExt->addr = NULL;
296             keyExt->defaultTypes = WIFI_KEY_DEFAULT_TYPE_MULTICAST;
297         }
298     }
299     if (keyExt->type == WIFI_KEYTYPE_BUTT) {
300         keyExt->type = (keyExt->addr != NULL) ? WIFI_KEYTYPE_PAIRWISE : WIFI_KEYTYPE_GROUP;
301     }
302     return SUCC;
303 }
304 
WifiWpaInitSeq(WifiKeyExt * keyExt,const uint8_t * seq,const size_t seqLen)305 static int32_t WifiWpaInitSeq(WifiKeyExt *keyExt, const uint8_t *seq, const size_t seqLen)
306 {
307     keyExt->seqLen = seqLen;
308     if ((seq != NULL) && (seqLen != 0)) {
309         keyExt->seq = (uint8_t *)os_zalloc(seqLen);
310         if ((keyExt->seq == NULL) || (memcpy_s(keyExt->seq, seqLen, seq, seqLen) != EOK)) {
311             return -EFAIL;
312         }
313     }
314     return SUCC;
315 }
316 
WifiWpaInitKey(WifiKeyExt * keyExt,const uint8_t * key,const size_t keyLen,const int32_t keyIdx,const enum wpa_alg alg)317 static int32_t WifiWpaInitKey(WifiKeyExt *keyExt, const uint8_t *key, const size_t keyLen, const int32_t keyIdx,
318     const enum wpa_alg alg)
319 {
320     keyExt->keyLen = keyLen;
321     keyExt->keyIdx = keyIdx;
322     if ((alg != WPA_ALG_NONE) && (key != NULL) && (keyLen != 0)) {
323         keyExt->key = (uint8_t *)os_zalloc(keyLen);
324         if ((keyExt->key == NULL) || (memcpy_s(keyExt->key, keyLen, key, keyLen) != EOK)) {
325             return -EFAIL;
326         }
327     }
328     return SUCC;
329 }
330 
WifiKeyExtFree(WifiKeyExt ** key)331 static void WifiKeyExtFree(WifiKeyExt **key)
332 {
333     if (key == NULL || *key == NULL) {
334         return;
335     }
336 
337     if ((*key)->addr != NULL) {
338         os_free((*key)->addr);
339         (*key)->addr = NULL;
340     }
341     if ((*key)->seq != NULL) {
342         os_free((*key)->seq);
343         (*key)->seq = NULL;
344     }
345     if ((*key)->key != NULL) {
346         os_free((*key)->key);
347         (*key)->key = NULL;
348     }
349 
350     os_free(*key);
351     *key = NULL;
352 }
353 
IsApInterface(int32_t mode)354 static inline int32_t IsApInterface(int32_t mode)
355 {
356     return ((mode) == WIFI_IFTYPE_AP || (mode) == WIFI_IFTYPE_P2P_GO);
357 }
358 
WifiWpaSetKey(void * priv,struct wpa_driver_set_key_params * params)359 static int32_t WifiWpaSetKey(void *priv,
360                              struct wpa_driver_set_key_params *params) {
361   int32_t ret;
362   WifiKeyExt *keyExt = NULL;
363   WifiDriverData *drv = priv;
364 
365   if ((priv == NULL) || (params->ifname == NULL) || (priv == NULL)) {
366     return -EFAIL;
367   }
368   if (drv->mode == WIFI_IFTYPE_P2P_DEVICE) {
369     return SUCC;
370   }
371 
372   keyExt = os_zalloc(sizeof(WifiKeyExt));
373   if (keyExt == NULL) {
374     return -EFAIL;
375   }
376 
377   WifiWpaInitAlg(keyExt, params->alg, params->key_len);
378   if (WifiWpaInitAddr(keyExt, params->addr, params->alg, params->key_idx,
379                       params->set_tx) != SUCC ||
380       WifiWpaInitSeq(keyExt, params->seq, params->seq_len) != SUCC ||
381       WifiWpaInitKey(keyExt, params->key, params->key_len, params->key_idx,
382                      params->alg) != SUCC) {
383     WifiKeyExtFree(&keyExt);
384     wpa_printf(MSG_ERROR, "WifiWpaInitKey failed");
385     return -EFAIL;
386   }
387 
388   if (params->alg == WPA_ALG_NONE) {
389     ret = WifiCmdDelKey(params->ifname, keyExt);
390   } else {
391     ret = WifiCmdNewKey(params->ifname, keyExt);
392     if ((ret != SUCC) || (params->set_tx == 0) ||
393         (params->alg == WPA_ALG_NONE)) {
394       WifiKeyExtFree(&keyExt);
395       return ret;
396     }
397 
398     if ((IsApInterface(drv->mode)) && (keyExt->addr != NULL) &&
399         (!IsBroadcastAddr(keyExt->addr))) {
400       WifiKeyExtFree(&keyExt);
401       return ret;
402     }
403     ret = WifiCmdSetKey(params->ifname, keyExt);
404   }
405 
406   WifiKeyExtFree(&keyExt);
407   return ret;
408 }
409 
WifiWpaReceiveEapol(void * ctx,const uint8_t * srcAddr,const uint8_t * buf,size_t len)410 static void WifiWpaReceiveEapol(void *ctx, const uint8_t *srcAddr, const uint8_t *buf, size_t len)
411 {
412     WifiDriverData *drv = ctx;
413 
414     if ((ctx == NULL) || (srcAddr == NULL) || (buf == NULL) || (len < sizeof(struct l2_ethhdr))) {
415         return;
416     }
417 
418     drv_event_eapol_rx(drv->ctx, srcAddr, buf + sizeof(struct l2_ethhdr), len - sizeof(struct l2_ethhdr));
419     wpa_printf(MSG_INFO, "WifiWpaReceiveEapol done");
420 }
421 
WifiWpaPreInit(const WifiDriverData * drv)422 static void WifiWpaPreInit(const WifiDriverData *drv)
423 {
424     WifiSetMode setMode;
425     WifiSetNewDev info;
426 
427     if (drv == NULL) {
428         return;
429     }
430 
431     (void)memset_s(&setMode, sizeof(WifiSetMode), 0, sizeof(WifiSetMode));
432     (void)memset_s(&info, sizeof(WifiSetNewDev), 0, sizeof(WifiSetNewDev));
433 
434     if  (strncmp(drv->iface, "p2p-p2p0-", 9) == 0) {
435         info.ifType = WIFI_IFTYPE_P2P_CLIENT;
436         setMode.iftype = WIFI_IFTYPE_P2P_CLIENT;
437     } else if (strncmp(drv->iface, "p2p0", 4) == 0) {
438         info.ifType = WIFI_IFTYPE_P2P_DEVICE;
439         setMode.iftype = WIFI_IFTYPE_P2P_DEVICE;
440     } else {
441         setMode.iftype = WIFI_IFTYPE_STATION;
442         info.status = false;
443         info.ifType = WIFI_IFTYPE_STATION;
444         info.mode = WIFI_PHY_MODE_11N;
445         if (WifiCmdSetNetdev(drv->iface, &info) != SUCC) {
446             wpa_printf(MSG_ERROR, "%s set netdev failed", __func__);
447         }
448         if (WifiCmdSetMode((char *)drv->iface, &setMode) != SUCC) {
449             wpa_printf(MSG_ERROR, "%s set mode failed", __func__);
450         }
451     }
452 }
453 
454 #ifdef CONFIG_OPEN_HARMONY_PATCH
CheckWifiIface(const char * ifName)455 static void CheckWifiIface(const char *ifName)
456 {
457     DIR *dir;
458     struct dirent *dent;
459     while (true) {
460         dir = opendir("/sys/class/net");
461         if (dir == 0) {
462             return;
463         }
464         while ((dent = readdir(dir))) {
465             if (dent->d_name[0] == '.') {
466                 continue;
467             }
468             if (strcmp(dent->d_name, ifName) == 0) {
469                 goto out;
470             }
471             usleep(WAIT_LOAD_NETDEVICE);
472         }
473     }
474 out:
475     closedir(dir);
476 }
477 #endif
478 
WifiWpaDeinit(void * priv)479 static void WifiWpaDeinit(void *priv)
480 {
481     WifiDriverData *drv = NULL;
482     WifiSetNewDev info;
483 
484     if (priv == NULL) {
485         return;
486     }
487 
488     drv = (WifiDriverData *)priv;
489     info.status = false;
490     info.ifType = WIFI_IFTYPE_STATION;
491     info.mode = WIFI_PHY_MODE_11N;
492 #ifdef CONFIG_OHOS_P2P
493     if  (strncmp(drv->iface, "p2p-p2p0-", 9) == 0) {
494         info.ifType = WIFI_IFTYPE_P2P_CLIENT;
495     } else if (strncmp(drv->iface, "p2p0", 4) == 0) {
496         info.ifType = WIFI_IFTYPE_P2P_DEVICE;
497     }
498     WifiDev *wifiDev = NULL;
499     wifiDev = GetWifiDevByName(drv->iface);
500     if (wifiDev == NULL) {
501         wpa_printf(MSG_ERROR, "%s: GetWifiDevByName failed.\r\n.", __FUNCTION__);
502     }
503     FreeWifiDev(wifiDev);
504 #endif // CONFIG_OHOS_P2P
505     eloop_cancel_timeout(WifiWpaScanTimeout, drv, drv->ctx);
506     WifiCmdSetNetdev(drv->iface, &info);
507 
508     if (drv->eapolSock != NULL) {
509         l2_packet_deinit(drv->eapolSock);
510     }
511 
512 #ifdef CONFIG_OHOS_P2P
513     WifiUnregisterEventCallback(OnWpaWiFiEvents, WIFI_KERNEL_TO_WPA_CLIENT, drv->iface);
514     if (CountWifiDevInUse() == 0) {
515         g_msgInit = true;
516         os_free(g_wifiDriverData);
517         g_wifiDriverData = NULL;
518         (void)WifiClientDeinit(drv->iface);
519     }
520 #else
521     os_free(g_wifiDriverData);
522     g_wifiDriverData = NULL;
523     (void)WifiClientDeinit(drv->iface);
524 #endif //CONFIG_OHOS_P2P
525 
526     wpa_printf(MSG_INFO, "WifiWpaDeinit done");
527 }
528 
WifiWpaInit(void * ctx,const char * ifName)529 static void *WifiWpaInit(void *ctx, const char *ifName)
530 {
531     int32_t ret;
532     WifiSetNewDev info;
533 #ifdef CONFIG_OHOS_P2P
534     WifiDev *wifiDev = NULL;
535     errno_t rc;
536 #endif
537 
538     if ((ctx == NULL) || (ifName == NULL)) {
539         return NULL;
540     }
541 
542     wpa_printf(MSG_INFO, "%s enter, interface name:%s.", __FUNCTION__, ifName);
543     (void)memset_s(&info, sizeof(WifiSetNewDev), 0, sizeof(WifiSetNewDev));
544     WifiDriverData *drv = os_zalloc(sizeof(WifiDriverData));
545     if (drv == NULL) {
546         goto failed;
547     }
548 
549     drv->ctx = ctx;
550     if (memcpy_s(drv->iface, sizeof(drv->iface), ifName, sizeof(drv->iface)) != EOK) {
551         goto failed;
552     }
553 #ifdef CONFIG_OHOS_P2P
554     if (g_msgInit && (strncmp(drv->iface, "p2p0", 4) == 0)) {
555         if (WifiClientInit(drv->iface) != SUCC) {
556             goto failed;
557         }
558         g_msgInit = false;
559     }
560 #endif // CONFIG_OHOS_P2P
561     if (strncmp(drv->iface, "wlan0", 5) == 0) {
562         if (WifiClientInit(drv->iface) != SUCC) {
563             goto failed;
564         }
565     }
566 #ifdef CONFIG_OPEN_HARMONY_PATCH
567     CheckWifiIface(ifName);
568 #endif
569     WifiWpaPreInit(drv);
570 
571     info.status = true;
572     info.ifType = WIFI_IFTYPE_STATION;
573     info.mode = WIFI_PHY_MODE_11N;
574 #ifdef CONFIG_OHOS_P2P
575     if  (strncmp(drv->iface, "p2p-p2p0-", 9) == 0) {
576         info.ifType = WIFI_IFTYPE_P2P_CLIENT;
577     } else if (strncmp(drv->iface, "p2p0", 4) == 0) {
578         info.ifType = WIFI_IFTYPE_P2P_DEVICE;
579     }
580 #endif // CONFIG_OHOS_P2P
581     ret = WifiCmdSetNetdev(drv->iface, &info);
582     if (ret != SUCC) {
583         wpa_printf(MSG_ERROR, "WifiWpaInit set netdev faild");
584         goto failed;
585     }
586     drv->eapolSock = l2_packet_init(drv->iface, NULL, ETH_P_EAPOL, WifiWpaReceiveEapol, drv, 1);
587     if (drv->eapolSock == NULL) {
588         wpa_printf(MSG_ERROR, "WifiWpaInit l2_packet_init faild");
589         goto failed;
590     }
591 
592     if (l2_packet_get_own_addr(drv->eapolSock, drv->ownAddr)) {
593         wpa_printf(MSG_ERROR, "l2_packet_get_own_addr faild");
594         goto failed;
595     }
596 
597     g_wifiDriverType = WIFI_IFTYPE_STATION;
598 #ifdef CONFIG_OHOS_P2P
599     wifiDev = (WifiDev *)os_zalloc(sizeof(WifiDev));
600     if (wifiDev == NULL) {
601         wpa_printf(MSG_ERROR, "%s wifiDev malloc failed.", __FUNCTION__);
602         goto failed;
603     }
604     wifiDev->priv = drv;
605     wifiDev->ifNameLen = sizeof(ifName);
606     rc = memcpy_s(wifiDev->ifName, sizeof(wifiDev->ifName), drv->iface, sizeof(drv->iface));
607     if (rc != EOK) {
608         wpa_printf(MSG_ERROR, "%s could not copy wifi device name.", __FUNCTION__);
609         goto failed;
610     }
611     wpa_printf(MSG_ERROR, "%s init done, ifName:%s.", __FUNCTION__, wifiDev->ifName);
612     SetWifiDev(wifiDev);
613 #endif // CONFIG_OHOS_P2P
614     g_wifiDriverData = drv;
615     return drv;
616 
617 failed:
618 #ifdef CONFIG_OHOS_P2P
619     FreeWifiDev(wifiDev);
620 #endif // CONFIG_OHOS_P2P
621     WifiWpaDeinit(drv);
622     return NULL;
623 }
624 
WifiWpaDeauthenticate(void * priv,const uint8_t * addr,uint16_t reasonCode)625 static int32_t WifiWpaDeauthenticate(void *priv, const uint8_t *addr, uint16_t reasonCode)
626 {
627     int32_t ret;
628     WifiDriverData *drv = priv;
629 
630     (void)addr;
631     if (priv == NULL) {
632         return -EFAIL;
633     }
634 
635     wpa_printf(MSG_INFO, "WifiWpaDeauthenticate reasonCode = %d", reasonCode);
636     ret = WifiCmdDisconnet(drv->iface, reasonCode);
637     if (ret == SUCC) {
638         drv->associated = WIFI_DISCONNECT;
639     }
640     return ret;
641 }
642 
WifiWpaDriverAp(WifiDriverData * drv,struct wpa_driver_associate_params * params)643 static int32_t WifiWpaDriverAp(WifiDriverData *drv, struct wpa_driver_associate_params *params)
644 {
645     int32_t ret;
646     WifiSetMode setMode;
647     errno_t rc;
648 
649     if ((drv == NULL) || (params == NULL)) {
650         wpa_printf(MSG_ERROR, "%s input NULL ptr.", __FUNCTION__);
651         return -EFAIL;
652     }
653     rc = memset_s(&setMode, sizeof(WifiSetMode), 0, sizeof(WifiSetMode));
654     if (rc != EOK) {
655         wpa_printf(MSG_ERROR, "%s: memset failed.", __FUNCTION__);
656         return -EFAIL;
657     }
658     if (params->p2p) {
659         wpa_printf(MSG_INFO, "%s: Setup AP operations for P2P group.(GO).", __FUNCTION__);
660         setMode.iftype = WIFI_IFTYPE_P2P_GO;
661     } else {
662         setMode.iftype = WIFI_IFTYPE_AP;
663     }
664     rc = memcpy_s(setMode.bssid, ETH_ADDR_LEN, drv->ownAddr, ETH_ADDR_LEN);
665     if (rc != EOK) {
666         wpa_printf(MSG_ERROR, "%s memcpy failed.", __FUNCTION__);
667         return -EFAIL;
668     }
669     ret = WifiCmdSetMode(drv->iface, &setMode);
670     if (ret != SUCC) {
671         wpa_printf(MSG_ERROR, "%s: set mode failed.", __FUNCTION__);
672         return -EFAIL;
673     }
674     return SUCC;
675 }
676 
WifiWpaAssocParamsSet(WifiDriverData * drv,struct wpa_driver_associate_params * params,WifiAssociateParams * assocParams)677 static int32_t WifiWpaAssocParamsSet(WifiDriverData *drv, struct wpa_driver_associate_params *params,
678     WifiAssociateParams *assocParams)
679 {
680     if (params->bssid != NULL) {
681         assocParams->bssid = (uint8_t *)os_zalloc(ETH_ADDR_LEN);
682         if (assocParams->bssid == NULL) {
683             return -EFAIL;
684         }
685         if (memcpy_s(assocParams->bssid, ETH_ADDR_LEN, params->bssid, ETH_ADDR_LEN) != EOK) {
686             return -EFAIL;
687         }
688     }
689 
690     if (params->freq.freq != 0) {
691         assocParams->freq = params->freq.freq;
692     }
693     if (params->ssid_len > MAX_SSID_LEN) {
694         params->ssid_len = MAX_SSID_LEN;
695     }
696     if ((params->ssid != NULL) && (params->ssid_len != 0)) {
697         assocParams->ssid = (uint8_t *)os_zalloc(params->ssid_len);
698         if (assocParams->ssid == NULL) {
699             return -EFAIL;
700         }
701         assocParams->ssidLen = params->ssid_len;
702         if (memcpy_s(assocParams->ssid, assocParams->ssidLen, params->ssid, params->ssid_len) != EOK) {
703             return -EFAIL;
704         }
705         if (memset_s(drv->ssid, MAX_SSID_LEN, 0, MAX_SSID_LEN) != EOK) {
706             return -EFAIL;
707         }
708         if (memcpy_s(drv->ssid, MAX_SSID_LEN, params->ssid, params->ssid_len) != EOK) {
709             return -EFAIL;
710         }
711         drv->ssidLen = params->ssid_len;
712     }
713 
714     if ((params->wpa_ie != NULL) && (params->wpa_ie_len != 0)) {
715         assocParams->ie = (uint8_t *)os_zalloc(params->wpa_ie_len);
716         if (assocParams->ie == NULL) {
717             return -EFAIL;
718         }
719         assocParams->ieLen = params->wpa_ie_len;
720         if (memcpy_s(assocParams->ie, assocParams->ieLen, params->wpa_ie, params->wpa_ie_len) != EOK) {
721             return -EFAIL;
722         }
723     }
724 
725     return SUCC;
726 }
727 
WifiCipherToCipherSuite(uint32_t cipher)728 static uint32_t WifiCipherToCipherSuite(uint32_t cipher)
729 {
730     switch (cipher) {
731         case WPA_CIPHER_CCMP_256:
732             return RSN_CIPHER_SUITE_CCMP_256;
733         case WPA_CIPHER_GCMP_256:
734             return RSN_CIPHER_SUITE_GCMP_256;
735         case WPA_CIPHER_CCMP:
736             return RSN_CIPHER_SUITE_CCMP;
737         case WPA_CIPHER_GCMP:
738             return RSN_CIPHER_SUITE_GCMP;
739         case WPA_CIPHER_TKIP:
740             return RSN_CIPHER_SUITE_TKIP;
741         case WPA_CIPHER_WEP104:
742             return RSN_CIPHER_SUITE_WEP104;
743         case WPA_CIPHER_WEP40:
744             return RSN_CIPHER_SUITE_WEP40;
745         case WPA_CIPHER_GTK_NOT_USED:
746             return RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED;
747         default:
748             return 0;
749     }
750 }
751 
WifiWpaAssocParamCryptoSet(const struct wpa_driver_associate_params * params,WifiAssociateParams * assocParams)752 static int32_t WifiWpaAssocParamCryptoSet(const struct wpa_driver_associate_params *params,
753     WifiAssociateParams *assocParams)
754 {
755     uint32_t ver = 0;
756     uint32_t akm_suites_num = 0;
757     uint32_t ciphers_pairwise_num = 0;
758     int32_t mgmt = RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X;
759 
760     assocParams->crypto = (WifiCryptoSetting *)os_zalloc(sizeof(WifiCryptoSetting));
761     if (assocParams->crypto == NULL) {
762         return -EFAIL;
763     }
764 
765     if (params->wpa_proto != 0) {
766         if (params->wpa_proto & WPA_PROTO_WPA) {
767             ver |= WPA_VERSION_1;
768         }
769         if (params->wpa_proto & WPA_PROTO_RSN) {
770             ver |= WPA_VERSION_2;
771         }
772         assocParams->crypto->wpaVersions = ver;
773     }
774 
775     if (params->pairwise_suite != WPA_CIPHER_NONE) {
776         assocParams->crypto->ciphersPairwise[ciphers_pairwise_num++] = WifiCipherToCipherSuite(params->pairwise_suite);
777         assocParams->crypto->nCiphersPairwise = ciphers_pairwise_num;
778     }
779 
780     if (params->group_suite != WPA_CIPHER_NONE) {
781         assocParams->crypto->cipherGroup = WifiCipherToCipherSuite(params->group_suite);
782     }
783 
784     if (params->key_mgmt_suite == WPA_KEY_MGMT_PSK || params->key_mgmt_suite == WPA_KEY_MGMT_SAE ||
785         params->key_mgmt_suite == WPA_KEY_MGMT_PSK_SHA256) {
786         switch (params->key_mgmt_suite) {
787             case WPA_KEY_MGMT_PSK_SHA256:
788                 mgmt = RSN_AUTH_KEY_MGMT_PSK_SHA256;
789                 break;
790             case WPA_KEY_MGMT_SAE:
791                 mgmt = RSN_AUTH_KEY_MGMT_SAE;
792                 break;
793             case WPA_KEY_MGMT_PSK: __attribute__((fallthrough));
794             default:
795                 mgmt = RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X;
796                 break;
797         }
798         assocParams->crypto->akmSuites[akm_suites_num++] = mgmt;
799         assocParams->crypto->nAkmSuites = akm_suites_num;
800     }
801 
802     return SUCC;
803 }
804 
WifiWpaSetConnKeys(const struct wpa_driver_associate_params * wpa_params,WifiAssociateParams * params)805 static void WifiWpaSetConnKeys(const struct wpa_driver_associate_params *wpa_params, WifiAssociateParams *params)
806 {
807     int32_t loop;
808     uint8_t privacy;
809     errno_t rc;
810 
811     if ((wpa_params == NULL) || (params == NULL)) {
812         return;
813     }
814 
815     privacy = 0;
816     for (loop = 0; loop < WEP_KEY_NUM; loop++) {
817         if (wpa_params->wep_key[loop] == NULL) {
818             continue;
819         }
820         privacy = 1;
821         break;
822     }
823 
824     if ((wpa_params->wps == WPS_MODE_PRIVACY) ||
825         ((wpa_params->pairwise_suite != 0) && (wpa_params->pairwise_suite != WPA_CIPHER_NONE))) {
826         privacy = 1;
827     }
828     if (privacy == 0) {
829         return;
830     }
831     params->privacy = privacy;
832     for (loop = 0; loop < WEP_KEY_NUM; loop++) {
833         if (wpa_params->wep_key[loop] == NULL) {
834             continue;
835         }
836         params->keyLen = wpa_params->wep_key_len[loop];
837         params->key = (uint8_t *)os_zalloc(params->keyLen);
838         if (params->key == NULL) {
839             return;
840         }
841 
842         rc = memcpy_s(params->key, params->keyLen, wpa_params->wep_key[loop], params->keyLen);
843         if (rc != EOK) {
844             os_free(params->key);
845             params->key = NULL;
846             return;
847         }
848         params->keyIdx = wpa_params->wep_tx_keyidx;
849         break;
850     }
851 
852     return;
853 }
854 
WifiWpaConnectFree(WifiAssociateParams ** params)855 static void WifiWpaConnectFree(WifiAssociateParams **params)
856 {
857     if (params == NULL || *params == NULL) {
858         return;
859     }
860 
861     if ((*params)->ie != NULL) {
862         os_free((*params)->ie);
863         (*params)->ie = NULL;
864     }
865     if ((*params)->crypto != NULL) {
866         os_free((*params)->crypto);
867         (*params)->crypto = NULL;
868     }
869     if ((*params)->ssid != NULL) {
870         os_free((*params)->ssid);
871         (*params)->ssid = NULL;
872     }
873     if ((*params)->bssid != NULL) {
874         os_free((*params)->bssid);
875         (*params)->bssid = NULL;
876     }
877     if ((*params)->key != NULL) {
878         os_free((*params)->key);
879         (*params)->key = NULL;
880     }
881 
882     os_free(*params);
883     *params = NULL;
884 }
885 
WifiGetStaAuthType(const struct wpa_driver_associate_params * params)886 static WifiAuthType WifiGetStaAuthType(const struct wpa_driver_associate_params *params)
887 {
888     WifiAuthType type = WIFI_AUTHTYPE_BUTT;
889     uint32_t algs = 0;
890 
891     if ((uint32_t)(params->auth_alg) & WPA_AUTH_ALG_OPEN) {
892         type = WIFI_AUTHTYPE_OPEN_SYSTEM;
893         algs++;
894     }
895     if ((uint32_t)(params->auth_alg) & WPA_AUTH_ALG_SHARED) {
896         type = WIFI_AUTHTYPE_SHARED_KEY;
897         algs++;
898     }
899     if ((uint32_t)(params->auth_alg) & WPA_AUTH_ALG_LEAP) {
900         type = WIFI_AUTHTYPE_EAP;
901         algs++;
902     }
903 
904     if (algs > 1) {
905         return WIFI_AUTHTYPE_AUTOMATIC;
906     } else if (algs == 1) {
907         return type;
908     }
909 
910     if ((uint32_t)params->auth_alg & WPA_AUTH_ALG_FT) {
911         type = WIFI_AUTHTYPE_FT;
912     }
913     return type;
914 }
915 
WifiWpaTryConnect(WifiDriverData * drv,struct wpa_driver_associate_params * params)916 static int32_t WifiWpaTryConnect(WifiDriverData *drv, struct wpa_driver_associate_params *params)
917 {
918     WifiAssociateParams *assocParams = NULL;
919     int32_t ret = -EFAIL;
920 
921     if ((drv == NULL) || (params == NULL)) {
922         return -EFAIL;
923     }
924 
925     assocParams = (WifiAssociateParams *)os_zalloc(sizeof(WifiAssociateParams));
926     if (assocParams == NULL) {
927         return ret;
928     }
929     if (WifiWpaAssocParamsSet(drv, params, assocParams) != SUCC) {
930         wpa_printf(MSG_ERROR, "WifiWpaTryConnect set assoc params faild");
931         goto skip_auth_type;
932     }
933     if (WifiWpaAssocParamCryptoSet(params, assocParams) != SUCC) {
934         wpa_printf(MSG_ERROR, "WifiWpaTryConnect set assoc crypto faild");
935         goto skip_auth_type;
936     }
937     assocParams->mfp = params->mgmt_frame_protection;
938     assocParams->authType = WifiGetStaAuthType(params);
939 
940     WifiWpaSetConnKeys(params, assocParams);
941     ret = WifiCmdAssoc(drv->iface, assocParams);
942     if (ret != SUCC) {
943         wpa_printf(MSG_ERROR, "WifiWpaTryConnect assoc faild");
944     }
945 
946 skip_auth_type:
947     WifiWpaConnectFree(&assocParams);
948     return ret;
949 }
950 
WifiWpaDisconnet(WifiDriverData * drv,uint16_t reasonCode)951 static int32_t WifiWpaDisconnet(WifiDriverData *drv, uint16_t reasonCode)
952 {
953     int32_t ret;
954 
955     if (drv == NULL) {
956         return -EFAIL;
957     }
958     ret = WifiCmdDisconnet(drv->iface, reasonCode);
959     if (ret == SUCC) {
960         drv->associated = WIFI_DISCONNECT;
961     }
962     wpa_printf(MSG_INFO, "WifiWpaDisconnet done ret=%d", ret);
963     return ret;
964 }
WifiWpaAssociate(void * priv,struct wpa_driver_associate_params * params)965 static int WifiWpaAssociate(void *priv, struct wpa_driver_associate_params *params)
966 {
967     int ret;
968     WifiDriverData *drv = priv;
969 
970     if ((drv == NULL) || (params == NULL)) {
971         return -EFAIL;
972     }
973 #ifdef CONFIG_OHOS_P2P
974     if (params->mode == IEEE80211_MODE_AP) {
975         return WifiWpaDriverAp(drv, params);
976     }
977 #endif
978     ret = WifiWpaTryConnect(drv, params);
979     if (ret != SUCC) {
980         if (WifiWpaDisconnet(drv, WLAN_REASON_PREV_AUTH_NOT_VALID)) {
981             return -EFAIL;
982         }
983         ret = WifiWpaTryConnect(drv, params);
984     }
985     wpa_printf(MSG_INFO, "WifiWpaAssociate done ret=%d", ret);
986     return ret;
987 }
988 
WifiWpaGetMacAddr(void * priv)989 static const uint8_t *WifiWpaGetMacAddr(void *priv)
990 {
991     WifiDriverData *drv = priv;
992 
993     if (priv == NULL) {
994         return NULL;
995     }
996     return drv->ownAddr;
997 }
998 
WifiWpaWpaSendEapol(void * priv,const uint8_t * dest,uint16_t proto,const uint8_t * data,size_t dataLen)999 int32_t WifiWpaWpaSendEapol(void *priv, const uint8_t *dest, uint16_t proto, const uint8_t *data, size_t dataLen)
1000 {
1001     WifiDriverData *drv = priv;
1002     int32_t ret;
1003     uint32_t frameLen;
1004     uint8_t *frame = NULL;
1005     uint8_t *payload = NULL;
1006     struct l2_ethhdr *l2_ethhdr = NULL;
1007     errno_t rc;
1008 
1009     if ((priv == NULL) || (data == NULL) || (dest == NULL)) {
1010         return -EFAIL;
1011     }
1012 
1013     frameLen = dataLen + sizeof(struct l2_ethhdr);
1014     frame = os_zalloc(frameLen);
1015     if (frame == NULL) {
1016         return -EFAIL;
1017     }
1018 
1019     l2_ethhdr = (struct l2_ethhdr *)frame;
1020     rc = memcpy_s(l2_ethhdr->h_dest, ETH_ADDR_LEN, dest, ETH_ADDR_LEN);
1021     if (rc != EOK) {
1022         os_free(frame);
1023         frame = NULL;
1024         return -EFAIL;
1025     }
1026     rc = memcpy_s(l2_ethhdr->h_source, ETH_ADDR_LEN, drv->ownAddr, ETH_ADDR_LEN);
1027     if (rc != EOK) {
1028         os_free(frame);
1029         frame = NULL;
1030         return -EFAIL;
1031     }
1032     l2_ethhdr->h_proto = host_to_be16(proto);
1033 
1034     payload = (uint8_t *)(l2_ethhdr + 1);
1035     rc = memcpy_s(payload, dataLen, data, dataLen);
1036     if (rc != EOK) {
1037         os_free(frame);
1038         frame = NULL;
1039         return -EFAIL;
1040     }
1041     ret = l2_packet_send(drv->eapolSock, dest, host_to_be16(proto), frame, frameLen);
1042     os_free(frame);
1043     frame = NULL;
1044     wpa_printf(MSG_INFO, "WifiWpaWpaSendEapol done ret=%d", ret);
1045     return ret;
1046 }
1047 
WifiWpaHwFeatureDataFree(struct hostapd_hw_modes ** modes,uint16_t num)1048 static void WifiWpaHwFeatureDataFree(struct hostapd_hw_modes **modes, uint16_t num)
1049 {
1050     uint16_t loop;
1051 
1052     if (modes == NULL || *modes == NULL) {
1053         return;
1054     }
1055     for (loop = 0; loop < num; ++loop) {
1056         if ((*modes)[loop].channels != NULL) {
1057             os_free((*modes)[loop].channels);
1058             (*modes)[loop].channels = NULL;
1059         }
1060         if ((*modes)[loop].rates != NULL) {
1061             os_free((*modes)[loop].rates);
1062             (*modes)[loop].rates = NULL;
1063         }
1064     }
1065     os_free(*modes);
1066     *modes = NULL;
1067 }
1068 
WifiWpaGetHwFeatureData(void * priv,uint16_t * numModes,uint16_t * flags,uint8_t * dfs)1069 static struct hostapd_hw_modes *WifiWpaGetHwFeatureData(void *priv, uint16_t *numModes, uint16_t *flags, uint8_t *dfs)
1070 {
1071     WifiModes modesData[] = {{IEEE80211G_RATES_NUM, HOSTAPD_MODE_IEEE80211G},
1072         {IEEE80211B_RATES_NUM, HOSTAPD_MODE_IEEE80211B}, {IEEE80211A_RATES_NUM, HOSTAPD_MODE_IEEE80211A}};
1073     size_t loop;
1074     uint32_t index;
1075     uint32_t iee80211band;
1076     WifiHwFeatureData hwFeatureData;
1077     WifiDriverData *drv = (WifiDriverData *)priv;
1078     (void)dfs;
1079     if ((priv == NULL) || (numModes == NULL) || (flags == NULL)) {
1080         return NULL;
1081     }
1082     (void)memset_s(&hwFeatureData, sizeof(WifiHwFeatureData), 0, sizeof(WifiHwFeatureData));
1083     *numModes = DEFAULT_NUM_MODES;
1084     *flags = 0;
1085 
1086     if (WifiCmdGetHwFeature(drv->iface, &hwFeatureData) != SUCC) {
1087         return NULL;
1088     }
1089     if (hwFeatureData.bands[IEEE80211_BAND_5GHZ].channelNum != 0) {
1090         *numModes = sizeof(modesData) / sizeof(WifiModes);
1091     }
1092     struct hostapd_hw_modes *modes = os_calloc(*numModes, sizeof(struct hostapd_hw_modes));
1093     if (modes == NULL) {
1094         return NULL;
1095     }
1096 
1097     for (loop = 0; loop < *numModes; ++loop) {
1098         modes[loop].channels = NULL;
1099         modes[loop].rates = NULL;
1100     }
1101 
1102     modes[0].ht_capab = hwFeatureData.htCapab;
1103     iee80211band = IEEE80211_BAND_2GHZ;
1104     for (index = 0; index < *numModes; index++) {
1105         if (index >= DEFAULT_NUM_MODES) {
1106             iee80211band = IEEE80211_BAND_5GHZ;
1107         }
1108         modes[index].mode = modesData[index].mode;
1109         modes[index].num_channels = hwFeatureData.bands[iee80211band].channelNum;
1110         modes[index].num_rates = modesData[index].numRates;
1111         modes[index].channels = os_calloc(hwFeatureData.bands[iee80211band].channelNum, sizeof(struct hostapd_channel_data));
1112         modes[index].rates = os_calloc(modes[index].num_rates, sizeof(uint32_t));
1113         if ((modes[index].channels == NULL) || (modes[index].rates == NULL)) {
1114             WifiWpaHwFeatureDataFree(&modes, *numModes);
1115             return NULL;
1116         }
1117 
1118         for (loop = 0; loop < (size_t)hwFeatureData.bands[iee80211band].channelNum; loop++) {
1119             modes[index].channels[loop].chan = hwFeatureData.bands[iee80211band].iee80211Channel[loop].channel;
1120             modes[index].channels[loop].freq = hwFeatureData.bands[iee80211band].iee80211Channel[loop].freq;
1121             modes[index].channels[loop].flag = hwFeatureData.bands[iee80211band].iee80211Channel[loop].flags;
1122             modes[index].channels[loop].allowed_bw = HOSTAPD_CHAN_WIDTH_20 | HOSTAPD_CHAN_WIDTH_10;
1123         }
1124 
1125         for (loop = 0; loop < (size_t)modes[index].num_rates; loop++) {
1126             if (index < DEFAULT_NUM_MODES) {
1127                 modes[index].rates[loop] = hwFeatureData.bitrate[loop];
1128             } else {
1129                 modes[index].rates[loop] = hwFeatureData.bitrate[loop + IEEE80211B_RATES_NUM];
1130             }
1131         }
1132     }
1133 
1134     wpa_printf(MSG_INFO, "WifiWpaGetHwFeatureData done");
1135     return modes;
1136 }
1137 
WifiWpaSendMlme(void * priv,const uint8_t * data,size_t dataLen,int32_t noack,uint32_t freq,const uint16_t * csaOffs,size_t csaOffsLen,int no_encrypt,unsigned int wait)1138 static int32_t WifiWpaSendMlme(void *priv, const uint8_t *data, size_t dataLen, int32_t noack, uint32_t freq,
1139     const uint16_t *csaOffs, size_t csaOffsLen, int no_encrypt, unsigned int wait)
1140 {
1141     int32_t ret;
1142     WifiDriverData *drv = priv;
1143     WifiMlmeData *mlme = NULL;
1144     errno_t rc;
1145 
1146     (void)freq;
1147     (void)csaOffs;
1148     (void)csaOffsLen;
1149     (void)noack;
1150     (void)no_encrypt;
1151     (void)wait;
1152     if ((priv == NULL) || (data == NULL)) {
1153         return -EFAIL;
1154     }
1155     mlme = os_zalloc(sizeof(WifiMlmeData));
1156     if (mlme == NULL) {
1157         return -EFAIL;
1158     }
1159     mlme->data = NULL;
1160     mlme->dataLen = dataLen;
1161     mlme->cookie = &(drv->actionCookie);
1162     if ((data != NULL) && (dataLen != 0)) {
1163         mlme->data = (uint8_t *)os_zalloc(dataLen);
1164         if (mlme->data == NULL) {
1165             os_free(mlme);
1166             mlme = NULL;
1167             return -EFAIL;
1168         }
1169         rc = memcpy_s(mlme->data, dataLen, data, dataLen);
1170         if (rc != EOK) {
1171             os_free(mlme->data);
1172             mlme->data = NULL;
1173             os_free(mlme);
1174             return -EFAIL;
1175         }
1176     }
1177     ret = WifiCmdSendMlme(drv->iface, mlme);
1178     os_free(mlme->data);
1179     mlme->data = NULL;
1180     os_free(mlme);
1181     if (ret != SUCC) {
1182         ret = -EFAIL;
1183     }
1184     wpa_printf(MSG_INFO, "WifiWpaSendMlme done ret=%d", ret);
1185     return ret;
1186 }
1187 
WifiWpaGetScanResults2(void * priv)1188 static struct wpa_scan_results *WifiWpaGetScanResults2(void *priv)
1189 {
1190     struct wpa_scan_results *results = NULL;
1191     WifiDriverData *drv = priv;
1192     uint32_t loop;
1193     errno_t rc;
1194 
1195     if (priv == NULL) {
1196         return NULL;
1197     }
1198 
1199     results = (struct wpa_scan_results *)os_zalloc(sizeof(struct wpa_scan_results));
1200     if (results == NULL) {
1201         return NULL;
1202     }
1203 
1204     results->num = drv->scanNum;
1205     if (results->num == 0) {
1206         return results;
1207     }
1208     results->res = (struct wpa_scan_res **)os_zalloc(results->num * sizeof(struct wpa_scan_res *));
1209     if (results->res == NULL) {
1210         os_free(results);
1211         results = NULL;
1212         return NULL;
1213     }
1214     rc = memcpy_s(results->res, results->num * sizeof(struct wpa_scan_res *), drv->scanRes,
1215         results->num * sizeof(struct wpa_scan_res *));
1216     if (rc != EOK) {
1217         os_free(results->res);
1218         os_free(results);
1219         results = NULL;
1220         return NULL;
1221     }
1222     drv->scanNum = 0;
1223     for (loop = 0; loop < SCAN_AP_LIMIT; loop++) {
1224         drv->scanRes[loop] = NULL;
1225     }
1226     wpa_printf(MSG_INFO, "WifiWpaGetScanResults2 done");
1227     return results;
1228 }
1229 
WifiWpaInit2(void * ctx,const char * ifname,void * globalPriv)1230 static void *WifiWpaInit2(void *ctx, const char *ifname, void *globalPriv)
1231 {
1232     (void)globalPriv;
1233     return WifiWpaInit(ctx, ifname);
1234 }
1235 
WifiWpaScanProcessSsid(struct wpa_driver_scan_params * params,WifiScan * scan)1236 static int32_t WifiWpaScanProcessSsid(struct wpa_driver_scan_params *params, WifiScan *scan)
1237 {
1238     errno_t rc;
1239     size_t loop;
1240     if (params->num_ssids == 0) {
1241         return SUCC;
1242     }
1243 
1244     scan->numSsids = params->num_ssids;
1245     scan->ssids = (WifiDriverScanSsid *)os_zalloc(sizeof(WifiDriverScanSsid) * params->num_ssids);
1246     if (scan->ssids == NULL) {
1247         return -EFAIL;
1248     }
1249 
1250     for (loop = 0; (loop < params->num_ssids) && (loop < WPAS_MAX_SCAN_SSIDS); loop++) {
1251         wpa_printf(MSG_INFO, "WIFI: Scan : %s SSID : %zu\n", anonymize_ssid(params->ssids[loop].ssid),
1252 			params->ssids[loop].ssid_len);
1253 
1254         if (params->ssids[loop].ssid_len > MAX_SSID_LEN) {
1255             params->ssids[loop].ssid_len = MAX_SSID_LEN;
1256         }
1257         if (params->ssids[loop].ssid_len) {
1258             rc = memcpy_s(scan->ssids[loop].ssid, MAX_SSID_LEN, params->ssids[loop].ssid, params->ssids[loop].ssid_len);
1259             if (rc != EOK) {
1260                 return -EFAIL;
1261             }
1262         }
1263         scan->ssids[loop].ssidLen = params->ssids[loop].ssid_len;
1264     }
1265 
1266     return SUCC;
1267 }
1268 
WifiWpaScanProcessBssid(const struct wpa_driver_scan_params * params,WifiScan * scan)1269 static int32_t WifiWpaScanProcessBssid(const struct wpa_driver_scan_params *params, WifiScan *scan)
1270 {
1271     errno_t rc;
1272     if (params->bssid != NULL) {
1273         scan->bssid = (uint8_t *)os_zalloc(ETH_ADDR_LEN);
1274         if (scan->bssid == NULL) {
1275             return -EFAIL;
1276         }
1277         rc = memcpy_s(scan->bssid, ETH_ADDR_LEN, params->bssid, ETH_ADDR_LEN);
1278         if (rc != EOK) {
1279             return -EFAIL;
1280         }
1281     }
1282     return SUCC;
1283 }
1284 
WifiWpaScanProcessExtraIes(const struct wpa_driver_scan_params * params,WifiScan * scan)1285 static int32_t WifiWpaScanProcessExtraIes(const struct wpa_driver_scan_params *params, WifiScan *scan)
1286 {
1287     errno_t rc;
1288     if ((params->extra_ies != NULL) && (params->extra_ies_len != 0)) {
1289         scan->extraIes = (uint8_t *)os_zalloc(params->extra_ies_len);
1290         if (scan->extraIes == NULL) {
1291             return -EFAIL;
1292         }
1293 
1294         rc = memcpy_s(scan->extraIes, params->extra_ies_len, params->extra_ies, params->extra_ies_len);
1295         if (rc != EOK) {
1296             return -EFAIL;
1297         }
1298         scan->extraIesLen = params->extra_ies_len;
1299     }
1300     return SUCC;
1301 }
1302 
WifiWpaScanProcessFreq(const struct wpa_driver_scan_params * params,WifiScan * scan)1303 static int32_t WifiWpaScanProcessFreq(const struct wpa_driver_scan_params *params, WifiScan *scan)
1304 {
1305     uint32_t numFreqs;
1306     int32_t *freqs = NULL;
1307     errno_t rc;
1308 
1309     if (params->freqs != NULL) {
1310         numFreqs = 0;
1311         for (freqs = params->freqs; *freqs != 0; freqs++) {
1312             numFreqs++;
1313             if (numFreqs > 14) { // 14 is 2.4G channel num
1314                 return -EFAIL;
1315             }
1316         }
1317 
1318         scan->numFreqs = numFreqs;
1319         scan->freqs = (int32_t *)os_zalloc(numFreqs * (sizeof(int32_t)));
1320         if (scan->freqs == NULL) {
1321             return -EFAIL;
1322         }
1323         rc = memcpy_s(scan->freqs, numFreqs * (sizeof(int32_t)), params->freqs, numFreqs * (sizeof(int32_t)));
1324         if (rc != EOK) {
1325             return -EFAIL;
1326         }
1327     }
1328     return SUCC;
1329 }
1330 
WifiWpaScanFree(WifiScan ** scan)1331 static void WifiWpaScanFree(WifiScan **scan)
1332 {
1333     if (scan == NULL || *scan == NULL) {
1334         return;
1335     }
1336 
1337     if ((*scan)->ssids != NULL) {
1338         os_free((*scan)->ssids);
1339         (*scan)->ssids = NULL;
1340     }
1341     if ((*scan)->bssid != NULL) {
1342         os_free((*scan)->bssid);
1343         (*scan)->bssid = NULL;
1344     }
1345 
1346     if ((*scan)->extraIes != NULL) {
1347         os_free((*scan)->extraIes);
1348         (*scan)->extraIes = NULL;
1349     }
1350 
1351     if ((*scan)->freqs != NULL) {
1352         os_free((*scan)->freqs);
1353         (*scan)->freqs = NULL;
1354     }
1355 
1356     os_free(*scan);
1357     *scan = NULL;
1358 }
1359 
WifiWpaScanTimeout(void * eloop,void * ctx)1360 void WifiWpaScanTimeout(void *eloop, void *ctx)
1361 {
1362     (void)eloop;
1363     if (ctx == NULL) {
1364         return;
1365     }
1366     wpa_supplicant_event(ctx, EVENT_SCAN_RESULTS, NULL);
1367 }
1368 
WifiWpaScan2(void * priv,struct wpa_driver_scan_params * params)1369 static int32_t WifiWpaScan2(void *priv, struct wpa_driver_scan_params *params)
1370 {
1371     WifiScan *scan = NULL;
1372     WifiDriverData *drv = NULL;
1373     int32_t timeout;
1374     int32_t ret;
1375 
1376     if ((priv == NULL) || (params == NULL) || (params->num_ssids > WPAS_MAX_SCAN_SSIDS)) {
1377         return -EFAIL;
1378     }
1379     drv = (WifiDriverData *)priv;
1380     scan = (WifiScan *)os_zalloc(sizeof(WifiScan));
1381     if (scan == NULL) {
1382         return -EFAIL;
1383     }
1384     if ((WifiWpaScanProcessSsid(params, scan) != SUCC) || (WifiWpaScanProcessBssid(params, scan) != SUCC) ||
1385         (WifiWpaScanProcessExtraIes(params, scan) != SUCC) || (WifiWpaScanProcessFreq(params, scan) != SUCC)) {
1386         WifiWpaScanFree(&scan);
1387         return -EFAIL;
1388     }
1389 
1390     scan->fastConnectFlag = WPA_FLAG_OFF;
1391     scan->prefixSsidScanFlag = WPA_FLAG_OFF;
1392     ret = WifiCmdScan(drv->iface, scan);
1393     WifiWpaScanFree(&scan);
1394 
1395     timeout = SCAN_TIME_OUT;
1396     eloop_cancel_timeout(WifiWpaScanTimeout, drv, drv->ctx);
1397     eloop_register_timeout(timeout, 0, WifiWpaScanTimeout, drv, drv->ctx);
1398 
1399     return ret;
1400 }
1401 
WifiSetApFreq(WifiApSetting * apsettings,const struct wpa_driver_ap_params * params)1402 static void WifiSetApFreq(WifiApSetting *apsettings, const struct wpa_driver_ap_params *params)
1403 {
1404     if (params->freq != NULL) {
1405         apsettings->freqParams.mode = params->freq->mode;
1406         apsettings->freqParams.freq = params->freq->freq;
1407         apsettings->freqParams.channel = params->freq->channel;
1408         apsettings->freqParams.htEnabled = params->freq->ht_enabled;
1409         apsettings->freqParams.secChannelOffset = params->freq->sec_channel_offset;
1410         apsettings->freqParams.centerFreq1 = params->freq->center_freq1;
1411         apsettings->freqParams.bandwidth = params->freq->bandwidth;
1412         if (params->freq->bandwidth == WPA_BANDWIDTH_20) {
1413             apsettings->freqParams.bandwidth = WIFI_CHAN_WIDTH_20;
1414         } else {
1415             apsettings->freqParams.bandwidth = WIFI_CHAN_WIDTH_40;
1416         }
1417     }
1418 }
1419 
WifiSetApBand(WifiApSetting * apsettings,struct hostapd_data * hapd)1420 static void WifiSetApBand(WifiApSetting *apsettings, struct hostapd_data *hapd)
1421 {
1422     if ((apsettings!= NULL) && (hapd!= NULL)) {
1423         switch (hapd->conf->wps_rf_bands) {
1424             case WPS_RF_24GHZ:
1425                 apsettings->freqParams.band = IEEE80211_BAND_2GHZ;
1426                 break;
1427             case WPS_RF_50GHZ:
1428                 apsettings->freqParams.band = IEEE80211_BAND_5GHZ;
1429                 break;
1430             default:
1431                 apsettings->freqParams.band = IEEE80211_BAND_2GHZ;
1432                 break;
1433         }
1434     }
1435 }
1436 
WifiSetApBeaconData(WifiApSetting * apsettings,const struct wpa_driver_ap_params * params)1437 static int WifiSetApBeaconData(WifiApSetting *apsettings, const struct wpa_driver_ap_params *params)
1438 {
1439     if ((params->head != NULL) && (params->head_len != 0)) {
1440         apsettings->beaconData.headLen = params->head_len;
1441         apsettings->beaconData.head = (uint8_t *)os_zalloc(apsettings->beaconData.headLen);
1442         if (apsettings->beaconData.head == NULL) {
1443             return -EFAIL;
1444         }
1445         if (memcpy_s(apsettings->beaconData.head, apsettings->beaconData.headLen, params->head, params->head_len) !=
1446             EOK) {
1447             return -EFAIL;
1448         }
1449     }
1450 
1451     if ((params->tail != NULL) && (params->tail_len != 0)) {
1452         apsettings->beaconData.tailLen = params->tail_len;
1453         apsettings->beaconData.tail = (uint8_t *)os_zalloc(apsettings->beaconData.tailLen);
1454         if (apsettings->beaconData.tail == NULL) {
1455             return -EFAIL;
1456         }
1457         if (memcpy_s(apsettings->beaconData.tail, apsettings->beaconData.tailLen, params->tail, params->tail_len) !=
1458             EOK) {
1459             return -EFAIL;
1460         }
1461     }
1462     return SUCC;
1463 }
1464 
WifiApSettingsFree(WifiApSetting ** apsettings)1465 static void WifiApSettingsFree(WifiApSetting **apsettings)
1466 {
1467     if (apsettings == NULL || *apsettings == NULL) {
1468         return;
1469     }
1470 
1471     if ((*apsettings)->meshSsid != NULL) {
1472         os_free((*apsettings)->meshSsid);
1473         (*apsettings)->meshSsid = NULL;
1474     }
1475 
1476     if ((*apsettings)->ssid != NULL) {
1477         os_free((*apsettings)->ssid);
1478         (*apsettings)->ssid = NULL;
1479     }
1480 
1481     if ((*apsettings)->beaconData.head != NULL) {
1482         os_free((*apsettings)->beaconData.head);
1483         (*apsettings)->beaconData.head = NULL;
1484     }
1485 
1486     if ((*apsettings)->beaconData.tail != NULL) {
1487         os_free((*apsettings)->beaconData.tail);
1488         (*apsettings)->beaconData.tail = NULL;
1489     }
1490 
1491     os_free(*apsettings);
1492     *apsettings = NULL;
1493 }
1494 
WifiGetApAuthType(const struct wpa_driver_ap_params * params)1495 static WifiAuthType WifiGetApAuthType(const struct wpa_driver_ap_params *params)
1496 {
1497     WifiAuthType type;
1498 
1499     if ((params->auth_algs & (WPA_AUTH_ALG_OPEN | WPA_AUTH_ALG_SHARED)) == (WPA_AUTH_ALG_OPEN | WPA_AUTH_ALG_SHARED)) {
1500         type = WIFI_AUTHTYPE_AUTOMATIC;
1501     } else if ((params->auth_algs & WPA_AUTH_ALG_SHARED) == WPA_AUTH_ALG_SHARED) {
1502         type = WIFI_AUTHTYPE_SHARED_KEY;
1503     } else {
1504         type = WIFI_AUTHTYPE_OPEN_SYSTEM;
1505     }
1506     return type;
1507 }
1508 
WifiWpaSetAp(void * priv,struct wpa_driver_ap_params * params)1509 static int32_t WifiWpaSetAp(void *priv, struct wpa_driver_ap_params *params)
1510 {
1511     int32_t ret;
1512     WifiApSetting *apsettings = NULL;
1513     WifiDriverData *drv = (WifiDriverData *)priv;
1514     if ((priv == NULL) || (params == NULL) || (params->freq == NULL)) {
1515         return -EFAIL;
1516     }
1517     if ((params->freq->bandwidth != WPA_BANDWIDTH_20) && (params->freq->bandwidth != WPA_BANDWIDTH_40)) {
1518         return -EFAIL;
1519     }
1520 
1521     apsettings = os_zalloc(sizeof(WifiApSetting));
1522     if (apsettings == NULL) {
1523         return -EFAIL;
1524     }
1525     apsettings->beaconInterval = params->beacon_int;
1526     apsettings->dtimPeriod = params->dtim_period;
1527     apsettings->hiddenSsid = params->hide_ssid;
1528     apsettings->authType = WifiGetApAuthType(params);
1529 
1530     if ((params->ssid != NULL) && (params->ssid_len != 0)) {
1531         apsettings->ssidLen = params->ssid_len;
1532         apsettings->ssid = (uint8_t *)os_zalloc(apsettings->ssidLen);
1533         if ((apsettings->ssid == NULL) ||
1534             (memcpy_s(apsettings->ssid, apsettings->ssidLen, params->ssid, params->ssid_len) != EOK)) {
1535             goto failed;
1536         }
1537     }
1538     WifiSetApFreq(apsettings, params);
1539     WifiSetApBand(apsettings, drv->hapd);
1540     if (WifiSetApBeaconData(apsettings, params) != SUCC) {
1541         goto failed;
1542     }
1543     if (drv->beaconSet == true) {
1544         ret = WifiCmdChangeBeacon(drv->iface, apsettings);
1545     } else {
1546         ret = WifiCmdSetAp(drv->iface, apsettings);
1547     }
1548     if (ret == SUCC) {
1549         drv->beaconSet = true;
1550     }
1551     WifiApSettingsFree(&apsettings);
1552     wpa_printf(MSG_INFO, "WifiWpaGetScanResults2 done ret=%d", ret);
1553     return ret;
1554 
1555 failed:
1556     WifiApSettingsFree(&apsettings);
1557     return -EFAIL;
1558 }
1559 
WifiHapdPreInit(const WifiDriverData * drv)1560 static void WifiHapdPreInit(const WifiDriverData *drv)
1561 {
1562     WifiSetNewDev info;
1563 
1564     if (drv == NULL) {
1565         return;
1566     }
1567     info.status = false;
1568     info.ifType = WIFI_IFTYPE_STATION;
1569     info.mode = WIFI_PHY_MODE_11N;
1570     int ret = WifiCmdSetNetdev(drv->iface, &info);
1571 
1572     if (ret != SUCC) {
1573         wpa_printf(MSG_ERROR, "%s set netdev failed ret = %d.", __func__, ret);
1574     }
1575 }
1576 
WifiDrvInit(void * ctx,const struct wpa_init_params * params)1577 static WifiDriverData *WifiDrvInit(void *ctx, const struct wpa_init_params *params)
1578 {
1579     WifiDriverData *drv = NULL;
1580     errno_t rc;
1581     WifiSetNewDev info;
1582     WifiSetMode setMode;
1583     int32_t ret;
1584 #ifdef CONFIG_OHOS_P2P
1585     WifiDev *wifiDev = NULL;
1586 #endif
1587     if ((ctx == NULL) || (params == NULL)) {
1588         return NULL;
1589     }
1590     drv = os_zalloc(sizeof(WifiDriverData));
1591     if (drv == NULL) {
1592         goto failed;
1593     }
1594 
1595     drv->ctx = ctx;
1596     rc = memcpy_s(drv->iface, sizeof(drv->iface), params->ifname, sizeof(drv->iface));
1597     if (rc != EOK) {
1598         os_free(drv);
1599         drv = NULL;
1600         goto failed;
1601     }
1602 #ifdef CONFIG_OHOS_P2P
1603     wifiDev = (WifiDev *)os_zalloc(sizeof(WifiDev));
1604     if (wifiDev == NULL)
1605     {
1606         wpa_printf(MSG_ERROR, "%s wifiDev malloc failed.", __FUNCTION__);
1607         goto failed;
1608     }
1609     wifiDev->priv = drv;
1610     wifiDev->ifNameLen = sizeof(params->ifname);
1611     rc = memcpy_s(wifiDev->ifName, sizeof(wifiDev->ifName), drv->iface, sizeof(drv->iface));
1612     if (rc != EOK) {
1613         wpa_printf(MSG_ERROR, "%s wifiDev could not copy interface name.", __FUNCTION__);
1614         goto failed;
1615     }
1616     wpa_printf(MSG_INFO, "%s init, interface name:%s.", __FUNCTION__, wifiDev->ifName);
1617     SetWifiDev(wifiDev);
1618 #endif // CONFIG_OHOS_P2P
1619     WifiHapdPreInit(drv);
1620 
1621     setMode.iftype = WIFI_IFTYPE_AP;
1622     ret = WifiCmdSetMode(drv->iface, &setMode);
1623     if (ret != SUCC) {
1624         wpa_printf(MSG_ERROR, "WifiWpaHapdInit set mode failed, iface = %s, ret = %d.", drv->iface, ret);
1625         goto failed;
1626     }
1627     info.status = true;
1628     info.ifType = WIFI_IFTYPE_AP;
1629     info.mode = WIFI_PHY_MODE_11N;
1630     ret = WifiCmdSetNetdev(drv->iface, &info);
1631     if (ret != SUCC) {
1632         wpa_printf(MSG_ERROR, "WifiDrvInit set netdev failed");
1633         goto failed;
1634     }
1635     wpa_printf(MSG_INFO, "WifiDrvInit done");
1636     return drv;
1637 
1638 failed:
1639     if (drv != NULL) {
1640         info.status = false;
1641         info.ifType = WIFI_IFTYPE_STATION;
1642         info.mode = WIFI_PHY_MODE_11N;
1643         WifiCmdSetNetdev(drv->iface, &info);
1644         os_free(drv);
1645         drv = NULL;
1646     }
1647 #ifdef CONFIG_OHOS_P2P
1648     FreeWifiDev(wifiDev);
1649 #endif // CONFIG_OHOS_P2P
1650     return NULL;
1651 }
1652 
WifiWpaInitl2(struct wpa_init_params * params,WifiDriverData * drv)1653 static int32_t WifiWpaInitl2(struct wpa_init_params *params, WifiDriverData *drv)
1654 {
1655     int32_t ret;
1656     uint8_t addrTmp[ETH_ADDR_LEN] = {0};
1657 
1658     drv->eapolSock = l2_packet_init(drv->iface, NULL, ETH_P_EAPOL, WifiWpaReceiveEapol, drv, 1);
1659     if (drv->eapolSock == NULL) {
1660         wpa_printf(MSG_ERROR, "WifiDrvInit l2 packet init failed");
1661         return -EFAIL;
1662     }
1663     if (l2_packet_get_own_addr(drv->eapolSock, addrTmp)) {
1664         return -EFAIL;
1665     }
1666     ret = memcpy_s(params->own_addr, ETH_ADDR_LEN, addrTmp, ETH_ADDR_LEN);
1667     if (ret != EOK) {
1668         return -EFAIL;
1669     }
1670     ret = memcpy_s(drv->ownAddr, ETH_ADDR_LEN, addrTmp, ETH_ADDR_LEN);
1671     if (ret != EOK) {
1672         return -EFAIL;
1673     }
1674     return SUCC;
1675 }
1676 
WifiWpaHapdInit(struct hostapd_data * hapd,struct wpa_init_params * params)1677 static void *WifiWpaHapdInit(struct hostapd_data *hapd, struct wpa_init_params *params)
1678 {
1679     WifiDriverData *drv = NULL;
1680 
1681     int32_t ret;
1682 
1683     if ((hapd == NULL) || (params == NULL) || (hapd->conf == NULL)) {
1684         return NULL;
1685     }
1686 
1687     if (WifiClientInit(params->ifname) != SUCC) {
1688         wpa_printf(MSG_ERROR, "Wifi client init failed");
1689         return NULL;
1690     }
1691     drv = WifiDrvInit(hapd, params);
1692     if (drv == NULL) {
1693         wpa_printf(MSG_ERROR, "WifiWpaHapdInit drv init failed");
1694         goto failed;
1695     }
1696     drv->hapd = hapd;
1697 
1698     ret = WifiWpaInitl2(params, drv);
1699     if (ret != SUCC) {
1700         wpa_printf(MSG_ERROR, "WifiWpaInitI2 failed");
1701         goto failed;
1702     }
1703 
1704     g_wifiDriverData = drv;
1705     g_wifiDriverType = WIFI_IFTYPE_AP;
1706     wpa_printf(MSG_INFO, "WifiWpaHapdInit done");
1707     return (void *)drv;
1708 
1709 failed:
1710     if (drv != NULL && drv->eapolSock != NULL) {
1711         l2_packet_deinit(drv->eapolSock);
1712     }
1713     WifiWpaDeinit(drv);
1714     return NULL;
1715 }
1716 
WifiWpaHapdDeinit(void * priv)1717 static void WifiWpaHapdDeinit(void *priv)
1718 {
1719     int32_t ret;
1720     WifiDriverData *drv = NULL;
1721     WifiSetMode setMode;
1722     WifiSetNewDev info;
1723 
1724     if (priv == NULL) {
1725         return;
1726     }
1727 
1728     (void)memset_s(&setMode, sizeof(WifiSetMode), 0, sizeof(WifiSetMode));
1729     drv = (WifiDriverData *)priv;
1730     setMode.iftype = WIFI_IFTYPE_STATION;
1731     info.status = false;
1732     info.ifType = WIFI_IFTYPE_AP;
1733     info.mode = WIFI_PHY_MODE_11N;
1734 
1735     WifiCmdSetNetdev(drv->iface, &info);
1736     ret = WifiCmdSetMode((char *)drv->iface, &setMode);
1737     if (ret != SUCC) {
1738         return;
1739     }
1740 
1741     if (drv->eapolSock != NULL) {
1742         l2_packet_deinit(drv->eapolSock);
1743     }
1744     os_free(g_wifiDriverData);
1745     g_wifiDriverData = NULL;
1746     WifiClientDeinit(drv->iface);
1747 
1748     wpa_printf(MSG_INFO, "WifiWpaHapdDeinit done");
1749 }
1750 
WifiWpaHapdSendEapol(void * priv,const uint8_t * addr,const uint8_t * data,size_t dataLen,int encrypt,const uint8_t * ownAddr,uint32_t flags)1751 static int32_t WifiWpaHapdSendEapol(void *priv, const uint8_t *addr, const uint8_t *data, size_t dataLen, int encrypt,
1752     const uint8_t *ownAddr, uint32_t flags)
1753 {
1754     WifiDriverData *drv = priv;
1755     int32_t ret;
1756     uint32_t frameLen;
1757     uint8_t *frameBuf = NULL;
1758     uint8_t *payload = NULL;
1759     struct l2_ethhdr *ethhdr = NULL;
1760 
1761     (void)encrypt;
1762     (void)flags;
1763     if ((priv == NULL) || (addr == NULL) || (data == NULL) || (ownAddr == NULL)) {
1764         return -EFAIL;
1765     }
1766 
1767     frameLen = dataLen + sizeof(struct l2_ethhdr);
1768     frameBuf = os_zalloc(frameLen);
1769     if (frameBuf == NULL) {
1770         return -EFAIL;
1771     }
1772 
1773     ethhdr = (struct l2_ethhdr *)frameBuf;
1774     if (memcpy_s(ethhdr->h_dest, ETH_ADDR_LEN, addr, ETH_ADDR_LEN) != EOK) {
1775         os_free(frameBuf);
1776         frameBuf = NULL;
1777         return -EFAIL;
1778     }
1779     if (memcpy_s(ethhdr->h_source, ETH_ADDR_LEN, ownAddr, ETH_ADDR_LEN) != EOK) {
1780         os_free(frameBuf);
1781         frameBuf = NULL;
1782         return -EFAIL;
1783     }
1784     ethhdr->h_proto = host_to_be16(ETH_P_PAE);
1785     payload = (uint8_t *)(ethhdr + 1);
1786     if (memcpy_s(payload, dataLen, data, dataLen) != EOK) {
1787         os_free(frameBuf);
1788         frameBuf = NULL;
1789         return -EFAIL;
1790     }
1791     ret = l2_packet_send(drv->eapolSock, addr, ETH_P_EAPOL, frameBuf, frameLen);
1792     os_free(frameBuf);
1793     frameBuf = NULL;
1794     wpa_printf(MSG_INFO, "WifiWpaHapdSendEapol done, ret=%d", ret);
1795     return ret;
1796 }
1797 
WifiWpaStaRemove(void * priv,const uint8_t * addr)1798 static int32_t WifiWpaStaRemove(void *priv, const uint8_t *addr)
1799 {
1800     WifiDriverData *drv = NULL;
1801     int32_t ret;
1802 
1803     if ((priv == NULL) || (addr == NULL)) {
1804         return -EFAIL;
1805     }
1806     drv = (WifiDriverData *)priv;
1807     ret = WifiCmdStaRemove(drv->iface, addr, ETH_ADDR_LEN);
1808     if (ret != SUCC) {
1809         return -EFAIL;
1810     }
1811     wpa_printf(MSG_INFO, "WifiWpaStaRemove done, ret=%d", ret);
1812     return ret;
1813 }
1814 
WifiDuplicateStr(const uint8_t * src,size_t len)1815 static uint8_t *WifiDuplicateStr(const uint8_t *src, size_t len)
1816 {
1817     uint8_t *res = NULL;
1818 
1819     if (src == NULL) {
1820         return NULL;
1821     }
1822     res = os_malloc(len + 1);
1823     if (res == NULL) {
1824         return NULL;
1825     }
1826     if (memcpy_s(res, len, src, len) != EOK) {
1827         os_free(res);
1828         return NULL;
1829     }
1830     res[len] = '\0';
1831 
1832     return res;
1833 }
1834 
WifiActionDataBufFree(WifiActionData * actionData)1835 static void WifiActionDataBufFree(WifiActionData *actionData)
1836 {
1837     if (actionData == NULL) {
1838         return;
1839     }
1840     if (actionData->data != NULL) {
1841         os_free(actionData->data);
1842         actionData->data = NULL;
1843     }
1844 }
1845 
WifiWpaSendAction(void * priv,uint32_t freq,uint32_t wait,const uint8_t * dst,const uint8_t * src,const uint8_t * bssid,const uint8_t * data,size_t dataLen,int32_t noCck)1846 static int32_t WifiWpaSendAction(void *priv, uint32_t freq, uint32_t wait, const uint8_t *dst, const uint8_t *src,
1847     const uint8_t *bssid, const uint8_t *data, size_t dataLen, int32_t noCck)
1848 {
1849     WifiActionData actionData = {
1850         .dst = {0},
1851         .src = {0},
1852         .bssid = {0},
1853         .data = NULL,
1854         .dataLen = 0,
1855         .freq = 0,
1856         .wait = 0,
1857         .noCck = 0,
1858     };
1859     WifiDriverData *drv = NULL;
1860     int32_t ret;
1861 
1862     if ((priv == NULL) || (data == NULL) || (dst == NULL) || (src == NULL) || (bssid == NULL)) {
1863         return -EFAIL;
1864     }
1865     drv = (WifiDriverData *)priv;
1866 
1867     if (memcpy_s(actionData.dst, ETH_ADDR_LEN, dst, ETH_ADDR_LEN) != EOK) {
1868         return -EFAIL;
1869     }
1870     if (memcpy_s(actionData.src, ETH_ADDR_LEN, src, ETH_ADDR_LEN) != EOK) {
1871         return -EFAIL;
1872     }
1873     if (memcpy_s(actionData.bssid, ETH_ADDR_LEN, bssid, ETH_ADDR_LEN) != EOK) {
1874         return -EFAIL;
1875     }
1876 
1877     actionData.dataLen = dataLen;
1878     actionData.freq = freq;
1879     actionData.wait = wait;
1880     actionData.noCck = noCck;
1881     actionData.data = WifiDuplicateStr(data, dataLen);
1882     if (actionData.data == NULL) {
1883         return -EFAIL;
1884     }
1885     ret = WifiCmdSendAction(drv->iface, &actionData);
1886     WifiActionDataBufFree(&actionData);
1887     wpa_printf(MSG_INFO, "WifiWpaSendAction done, ret=%d", ret);
1888     return ret;
1889 }
1890 
DeinitWifiService()1891 __attribute__ ((visibility ("default"))) void DeinitWifiService()
1892 {
1893     if (g_wifiDriverType == WIFI_IFTYPE_STATION) {
1894         WifiWpaDeinit(g_wifiDriverData);
1895     } else if (g_wifiDriverType == WIFI_IFTYPE_AP) {
1896         WifiWpaHapdDeinit(g_wifiDriverData);
1897     } else {
1898         printf("no need to cleanup \n");
1899     }
1900 }
1901 
1902 #ifdef CONFIG_OHOS_P2P
WifiProbeReqReport(void * priv,int32_t report)1903 static int32_t WifiProbeReqReport(void *priv, int32_t report)
1904 {
1905     WifiDriverData *drv = NULL;
1906     wpa_printf(MSG_INFO, "%s enter.", __FUNCTION__);
1907     if (priv == NULL) {
1908         wpa_printf(MSG_ERROR, "%s input invalid.", __FUNCTION__);
1909         return -EFAIL;
1910     }
1911     drv = (WifiDriverData *)priv;
1912     return WifiCmdProbeReqReport(drv->iface, &report);
1913 }
1914 
WifiRemainOnChannel(void * priv,uint32_t freq,uint32_t duration)1915 static int32_t WifiRemainOnChannel(void *priv, uint32_t freq, uint32_t duration)
1916 {
1917     int32_t ret;
1918     WifiDriverData *drv = priv;
1919     WifiOnChannel *onChannel = NULL;
1920     if (priv == NULL) {
1921         wpa_printf(MSG_ERROR, "%s input invalid.", __FUNCTION__);
1922         return -EFAIL;
1923     }
1924     onChannel = (WifiOnChannel *)os_zalloc(sizeof(WifiOnChannel));
1925     if (onChannel == NULL)
1926     {
1927         wpa_printf(MSG_ERROR, "%s failed to alloc channel.", __FUNCTION__);
1928         return -EFAIL;
1929     }
1930     onChannel->freq = freq;
1931     onChannel->duration = duration;
1932 
1933     ret = WifiCmdRemainOnChannel(drv->iface, onChannel);
1934 
1935     os_free(onChannel);
1936     onChannel = NULL;
1937 
1938     return ret;
1939 }
1940 
WifiCancelRemainOnChannel(void * priv)1941 static int32_t WifiCancelRemainOnChannel(void *priv)
1942 {
1943     WifiDriverData *drv = priv;
1944     if (drv == NULL) {
1945         wpa_printf(MSG_ERROR, "%s input invalid.", __FUNCTION__);
1946         return -EFAIL;
1947     }
1948 
1949     return WifiCmdCancelRemainOnChannel(drv->iface);
1950 }
1951 
WifiAddIf(void * priv,enum wpa_driver_if_type type,const char * ifName,const uint8_t * addr,void * bss_ctx,void ** drv_priv,char * force_ifname,uint8_t * if_addr,const char * bridge,int32_t use_existing,int32_t setup_ap)1952 static int32_t WifiAddIf(void *priv, enum wpa_driver_if_type type, const char *ifName, const uint8_t *addr, void *bss_ctx,
1953                          void **drv_priv, char *force_ifname, uint8_t *if_addr, const char *bridge, int32_t use_existing, int32_t setup_ap)
1954 {
1955     WifiDriverData *drv = priv;
1956     WifiIfAdd *ifAdd = NULL;
1957     int32_t ret;
1958     WifiDev *wifiDev = NULL;
1959     if (priv == NULL) {
1960         wpa_printf(MSG_ERROR, "%s input invalid.", __FUNCTION__);
1961         return -EFAIL;
1962     }
1963     ifAdd = (WifiIfAdd *)os_zalloc(sizeof(WifiIfAdd));
1964     if (ifAdd == NULL) {
1965         wpa_printf(MSG_ERROR, "%s failed to alloc ifAdd.", __FUNCTION__);
1966         return -EFAIL;
1967     }
1968     switch (type) {
1969     case WPA_IF_STATION:
1970         ifAdd->type = WIFI_IFTYPE_STATION;
1971         break;
1972     case WPA_IF_P2P_GROUP:
1973     case WPA_IF_P2P_CLIENT:
1974         ifAdd->type = WIFI_IFTYPE_P2P_CLIENT;
1975         break;
1976     case WPA_IF_AP_VLAN:
1977         ifAdd->type = WIFI_IFTYPE_AP_VLAN;
1978         break;
1979     case WPA_IF_AP_BSS:
1980         ifAdd->type = WIFI_IFTYPE_AP;
1981         break;
1982     case WPA_IF_P2P_GO:
1983         ifAdd->type = WIFI_IFTYPE_P2P_GO;
1984         break;
1985     case WPA_IF_P2P_DEVICE:
1986         ifAdd->type = WIFI_IFTYPE_P2P_DEVICE;
1987         break;
1988     case WPA_IF_MESH:
1989         ifAdd->type = WIFI_IFTYPE_MESH_POINT;
1990         break;
1991     default:
1992         wpa_printf(MSG_ERROR, "%s unsuportted interface type %d.", __FUNCTION__, type);
1993     }
1994 
1995     ret = WifiRegisterEventCallback(OnWpaWiFiEvents, WIFI_KERNEL_TO_WPA_CLIENT, ifName);
1996     if (ret != SUCC) {
1997         wpa_printf(MSG_ERROR, "WifiWpa register event listener faild");
1998     }
1999     ret = memcpy_s(ifAdd->ifName, IFNAMSIZ, ifName, IFNAMSIZ);
2000     if (ret != SUCC) {
2001         wpa_printf(MSG_ERROR, "%s memcpy_s ifName faild", __FUNCTION__);
2002         return -EFAIL;
2003     }
2004 
2005     ret = WifiCmdAddIf(drv->iface, ifAdd);
2006     if (ret == SUCC) {
2007         wifiDev = (WifiDev *)os_zalloc(sizeof(WifiDev));
2008         if (wifiDev == NULL) {
2009             wpa_printf(MSG_ERROR, "%s failed to malloc wifiDev.", __FUNCTION__);
2010             return -EFAIL;
2011         }
2012         wifiDev->priv = drv;
2013         wifiDev->ifNameLen = sizeof(ifName);
2014         errno_t rc = memcpy_s(wifiDev->ifName, sizeof(wifiDev->ifName), ifName, sizeof(drv->iface));
2015         if (rc != EOK) {
2016             wpa_printf(MSG_ERROR, "Could not copy wifi device name.");
2017             FreeWifiDev(wifiDev);
2018             return ret;
2019         }
2020         wpa_printf(MSG_INFO, "%s ifName:%s, type:%d", __FUNCTION__, wifiDev->ifName, ifAdd->type);
2021         SetWifiDev(wifiDev);
2022     }
2023     os_free(ifAdd);
2024     ifAdd = NULL;
2025     return ret;
2026 }
2027 
WifiRemoveIf(void * priv,enum wpa_driver_if_type type,const char * ifName)2028 static int32_t WifiRemoveIf(void *priv, enum wpa_driver_if_type type, const char *ifName)
2029 {
2030     WifiDriverData *drv = priv;
2031     WifiIfRemove ifRemove = {0};
2032     int32_t ret;
2033     errno_t rc;
2034     WifiDev *wifiDev = NULL;
2035     if (priv == NULL || ifName == NULL) {
2036         wpa_printf(MSG_ERROR, "%s input invalid.", __FUNCTION__);
2037         return -EFAIL;
2038     }
2039     if (os_strlen(ifName) > IFNAMSIZ) {
2040         wpa_printf(MSG_ERROR, "%s ifName invalid:%s.", __FUNCTION__, ifName);
2041         return -EFAIL;
2042     }
2043     rc = memcpy_s(ifRemove.ifName, IFNAMSIZ, ifName, IFNAMSIZ);
2044     if (rc != EOK) {
2045         wpa_printf(MSG_ERROR, "%s can not copy interface name.", __FUNCTION__);
2046         return -EFAIL;
2047     }
2048 
2049     ret = WifiCmdRemoveIf(drv->iface, &ifRemove);
2050     wifiDev = GetWifiDevByName(ifName);
2051     if (wifiDev == NULL) {
2052         wpa_printf(MSG_INFO, "%s: GetWifiDevByName is null, already free.", __FUNCTION__);
2053         return SUCC;
2054     }
2055     FreeWifiDev(wifiDev);
2056     return SUCC;
2057 }
2058 
WifiSetApWpsP2pIe(void * priv,const struct wpabuf * beacon,const struct wpabuf * probresp,const struct wpabuf * assocresp)2059 int32_t WifiSetApWpsP2pIe(void *priv, const struct wpabuf *beacon, const struct wpabuf *probresp, const struct wpabuf *assocresp)
2060 {
2061     int32_t loops;
2062     int32_t ret = SUCC;
2063     WifiAppIe *appIe = NULL;
2064     struct wpabuf *wpabufTmp = NULL;
2065     WifiDriverData *drv = (WifiDriverData *)priv;
2066     WifiCmd cmdAddr[4] = {{0x1, beacon}, {0x2, probresp}, {0x4, assocresp}, {-1, NULL}};
2067     errno_t rc;
2068     appIe = (WifiAppIe *)os_zalloc(sizeof(WifiAppIe));
2069     if (appIe == NULL) {
2070         wpa_printf(MSG_ERROR, "%s:failed to malloc WifiAppIe.", __FUNCTION__);
2071         return -EFAIL;
2072     }
2073     for (loops = 0; cmdAddr[loops].cmd != -1; loops++) {
2074         wpabufTmp = (struct wpabuf *)cmdAddr[loops].src;
2075         if (wpabufTmp != NULL) {
2076             appIe->appIeType = cmdAddr[loops].cmd;
2077             appIe->ieLen = wpabuf_len(wpabufTmp);
2078             if ((wpabufTmp->buf != NULL) && (appIe->ieLen != 0)) {
2079                 appIe->ie = os_zalloc(appIe->ieLen);
2080                 if (appIe->ie == NULL) {
2081                     wpa_printf(MSG_ERROR, "%s appIe->ie malloc failed.", __FUNCTION__);
2082                     os_free(appIe);
2083                     return -EFAIL;
2084                 }
2085                 rc = memcpy_s(appIe->ie, appIe->ieLen, wpabuf_head(wpabufTmp), wpabuf_len(wpabufTmp));
2086                 if (rc != EOK) {
2087                     wpa_printf(MSG_ERROR, "%s: ", __FUNCTION__);
2088                     os_free(appIe->ie);
2089                     os_free(appIe);
2090                     return -EFAIL;
2091                 }
2092             }
2093             wpa_printf(MSG_INFO, "%s type %d, ie_len %d.", __FUNCTION__, appIe->appIeType, appIe->ieLen);
2094 
2095             ret = WifiCmdSetApWpsP2pIe(drv->iface, appIe);
2096             os_free(appIe->ie);
2097             appIe->ie = NULL;
2098             if (ret < 0) {
2099                 break;
2100             }
2101         }
2102     }
2103     os_free(appIe);
2104     appIe = NULL;
2105     return ret;
2106 }
2107 
WifiWpaGetDrvFlags(void * priv,uint64_t * drvFlags)2108 int32_t WifiWpaGetDrvFlags(void *priv, uint64_t *drvFlags)
2109 {
2110     WifiDriverData *drv = NULL;
2111     WifiGetDrvFlags *params = NULL;
2112     int32_t ret;
2113     if (priv == NULL || drvFlags == NULL)
2114     {
2115         return -EFAIL;
2116     }
2117     drv = (WifiDriverData *)priv;
2118     params = (WifiGetDrvFlags *)os_zalloc(sizeof(WifiGetDrvFlags));
2119     if (params == NULL)
2120     {
2121         return -EFAIL;
2122     }
2123     params->drvFlags = 0;
2124     ret = WifiCmdGetDrvFlags(drv->iface, params);
2125     if (ret != SUCC)
2126     {
2127         wpa_printf(MSG_ERROR, "%s WifiCmdGetDrvFlags failed, ret is %d.", __FUNCTION__, ret);
2128         os_free(params);
2129         return -EFAIL;
2130     }
2131     *drvFlags = params->drvFlags;
2132     wpa_printf(MSG_INFO, "%s Get drvFlags done.", __FUNCTION__);
2133     os_free(params);
2134     return ret;
2135 }
2136 #endif // CONFIG_OHOS_P2P
2137 
2138 const struct wpa_driver_ops g_wifiDriverOps = {
2139     .name = "hdf wifi",
2140     .desc = "wpa hdf adaptor layer",
2141     .get_bssid = WifiWpaGetBssid,
2142     .get_ssid = WifiWpaGetSsid,
2143     .set_key = WifiWpaSetKey,
2144     .scan2 = WifiWpaScan2,
2145     .get_scan_results2 = WifiWpaGetScanResults2,
2146     .deauthenticate = WifiWpaDeauthenticate,
2147     .associate = WifiWpaAssociate,
2148     .send_eapol = WifiWpaWpaSendEapol,
2149     .init2 = WifiWpaInit2,
2150     .deinit = WifiWpaDeinit,
2151     .set_ap = WifiWpaSetAp,
2152     .send_mlme = WifiWpaSendMlme,
2153     .get_hw_feature_data = WifiWpaGetHwFeatureData,
2154     .sta_remove = WifiWpaStaRemove,
2155     .hapd_init = WifiWpaHapdInit,
2156     .hapd_deinit = WifiWpaHapdDeinit,
2157     .hapd_send_eapol = WifiWpaHapdSendEapol,
2158     .send_action = WifiWpaSendAction,
2159     .get_mac_addr = WifiWpaGetMacAddr,
2160 #ifdef CONFIG_OHOS_P2P
2161     .remain_on_channel = WifiRemainOnChannel,
2162     .cancel_remain_on_channel = WifiCancelRemainOnChannel,
2163     .probe_req_report = WifiProbeReqReport,
2164     .if_add = WifiAddIf,
2165     .if_remove = WifiRemoveIf,
2166     .set_ap_wps_ie = WifiSetApWpsP2pIe,
2167 #endif // CONFIG_OHOS_P2P
2168 };
2169 
2170 #ifdef __cplusplus
2171 #if __cplusplus
2172 }
2173 #endif
2174 #endif
2175