• 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: /* fall through */
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", params->ssids[loop].ssid, params->ssids[loop].ssid_len);
1252 
1253         if (params->ssids[loop].ssid_len > MAX_SSID_LEN) {
1254             params->ssids[loop].ssid_len = MAX_SSID_LEN;
1255         }
1256         if (params->ssids[loop].ssid_len) {
1257             rc = memcpy_s(scan->ssids[loop].ssid, MAX_SSID_LEN, params->ssids[loop].ssid, params->ssids[loop].ssid_len);
1258             if (rc != EOK) {
1259                 return -EFAIL;
1260             }
1261         }
1262         scan->ssids[loop].ssidLen = params->ssids[loop].ssid_len;
1263     }
1264 
1265     return SUCC;
1266 }
1267 
WifiWpaScanProcessBssid(const struct wpa_driver_scan_params * params,WifiScan * scan)1268 static int32_t WifiWpaScanProcessBssid(const struct wpa_driver_scan_params *params, WifiScan *scan)
1269 {
1270     errno_t rc;
1271     if (params->bssid != NULL) {
1272         scan->bssid = (uint8_t *)os_zalloc(ETH_ADDR_LEN);
1273         if (scan->bssid == NULL) {
1274             return -EFAIL;
1275         }
1276         rc = memcpy_s(scan->bssid, ETH_ADDR_LEN, params->bssid, ETH_ADDR_LEN);
1277         if (rc != EOK) {
1278             return -EFAIL;
1279         }
1280     }
1281     return SUCC;
1282 }
1283 
WifiWpaScanProcessExtraIes(const struct wpa_driver_scan_params * params,WifiScan * scan)1284 static int32_t WifiWpaScanProcessExtraIes(const struct wpa_driver_scan_params *params, WifiScan *scan)
1285 {
1286     errno_t rc;
1287     if ((params->extra_ies != NULL) && (params->extra_ies_len != 0)) {
1288         scan->extraIes = (uint8_t *)os_zalloc(params->extra_ies_len);
1289         if (scan->extraIes == NULL) {
1290             return -EFAIL;
1291         }
1292 
1293         rc = memcpy_s(scan->extraIes, params->extra_ies_len, params->extra_ies, params->extra_ies_len);
1294         if (rc != EOK) {
1295             return -EFAIL;
1296         }
1297         scan->extraIesLen = params->extra_ies_len;
1298     }
1299     return SUCC;
1300 }
1301 
WifiWpaScanProcessFreq(const struct wpa_driver_scan_params * params,WifiScan * scan)1302 static int32_t WifiWpaScanProcessFreq(const struct wpa_driver_scan_params *params, WifiScan *scan)
1303 {
1304     uint32_t numFreqs;
1305     int32_t *freqs = NULL;
1306     errno_t rc;
1307 
1308     if (params->freqs != NULL) {
1309         numFreqs = 0;
1310         for (freqs = params->freqs; *freqs != 0; freqs++) {
1311             numFreqs++;
1312             if (numFreqs > 14) { // 14 is 2.4G channel num
1313                 return -EFAIL;
1314             }
1315         }
1316 
1317         scan->numFreqs = numFreqs;
1318         scan->freqs = (int32_t *)os_zalloc(numFreqs * (sizeof(int32_t)));
1319         if (scan->freqs == NULL) {
1320             return -EFAIL;
1321         }
1322         rc = memcpy_s(scan->freqs, numFreqs * (sizeof(int32_t)), params->freqs, numFreqs * (sizeof(int32_t)));
1323         if (rc != EOK) {
1324             return -EFAIL;
1325         }
1326     }
1327     return SUCC;
1328 }
1329 
WifiWpaScanFree(WifiScan ** scan)1330 static void WifiWpaScanFree(WifiScan **scan)
1331 {
1332     if (scan == NULL || *scan == NULL) {
1333         return;
1334     }
1335 
1336     if ((*scan)->ssids != NULL) {
1337         os_free((*scan)->ssids);
1338         (*scan)->ssids = NULL;
1339     }
1340     if ((*scan)->bssid != NULL) {
1341         os_free((*scan)->bssid);
1342         (*scan)->bssid = NULL;
1343     }
1344 
1345     if ((*scan)->extraIes != NULL) {
1346         os_free((*scan)->extraIes);
1347         (*scan)->extraIes = NULL;
1348     }
1349 
1350     if ((*scan)->freqs != NULL) {
1351         os_free((*scan)->freqs);
1352         (*scan)->freqs = NULL;
1353     }
1354 
1355     os_free(*scan);
1356     *scan = NULL;
1357 }
1358 
WifiWpaScanTimeout(void * eloop,void * ctx)1359 void WifiWpaScanTimeout(void *eloop, void *ctx)
1360 {
1361     (void)eloop;
1362     if (ctx == NULL) {
1363         return;
1364     }
1365     wpa_supplicant_event(ctx, EVENT_SCAN_RESULTS, NULL);
1366 }
1367 
WifiWpaScan2(void * priv,struct wpa_driver_scan_params * params)1368 static int32_t WifiWpaScan2(void *priv, struct wpa_driver_scan_params *params)
1369 {
1370     WifiScan *scan = NULL;
1371     WifiDriverData *drv = NULL;
1372     int32_t timeout;
1373     int32_t ret;
1374 
1375     if ((priv == NULL) || (params == NULL) || (params->num_ssids > WPAS_MAX_SCAN_SSIDS)) {
1376         return -EFAIL;
1377     }
1378     drv = (WifiDriverData *)priv;
1379     scan = (WifiScan *)os_zalloc(sizeof(WifiScan));
1380     if (scan == NULL) {
1381         return -EFAIL;
1382     }
1383     if ((WifiWpaScanProcessSsid(params, scan) != SUCC) || (WifiWpaScanProcessBssid(params, scan) != SUCC) ||
1384         (WifiWpaScanProcessExtraIes(params, scan) != SUCC) || (WifiWpaScanProcessFreq(params, scan) != SUCC)) {
1385         WifiWpaScanFree(&scan);
1386         return -EFAIL;
1387     }
1388 
1389     scan->fastConnectFlag = WPA_FLAG_OFF;
1390     scan->prefixSsidScanFlag = WPA_FLAG_OFF;
1391     ret = WifiCmdScan(drv->iface, scan);
1392     WifiWpaScanFree(&scan);
1393 
1394     timeout = SCAN_TIME_OUT;
1395     eloop_cancel_timeout(WifiWpaScanTimeout, drv, drv->ctx);
1396     eloop_register_timeout(timeout, 0, WifiWpaScanTimeout, drv, drv->ctx);
1397 
1398     return ret;
1399 }
1400 
WifiSetApFreq(WifiApSetting * apsettings,const struct wpa_driver_ap_params * params)1401 static void WifiSetApFreq(WifiApSetting *apsettings, const struct wpa_driver_ap_params *params)
1402 {
1403     if (params->freq != NULL) {
1404         apsettings->freqParams.mode = params->freq->mode;
1405         apsettings->freqParams.freq = params->freq->freq;
1406         apsettings->freqParams.channel = params->freq->channel;
1407         apsettings->freqParams.htEnabled = params->freq->ht_enabled;
1408         apsettings->freqParams.secChannelOffset = params->freq->sec_channel_offset;
1409         apsettings->freqParams.centerFreq1 = params->freq->center_freq1;
1410         apsettings->freqParams.bandwidth = params->freq->bandwidth;
1411         if (params->freq->bandwidth == WPA_BANDWIDTH_20) {
1412             apsettings->freqParams.bandwidth = WIFI_CHAN_WIDTH_20;
1413         } else {
1414             apsettings->freqParams.bandwidth = WIFI_CHAN_WIDTH_40;
1415         }
1416     }
1417 }
1418 
WifiSetApBand(WifiApSetting * apsettings,struct hostapd_data * hapd)1419 static void WifiSetApBand(WifiApSetting *apsettings, struct hostapd_data *hapd)
1420 {
1421     if ((apsettings!= NULL) && (hapd!= NULL)) {
1422         switch (hapd->conf->wps_rf_bands) {
1423             case WPS_RF_24GHZ:
1424                 apsettings->freqParams.band = IEEE80211_BAND_2GHZ;
1425                 break;
1426             case WPS_RF_50GHZ:
1427                 apsettings->freqParams.band = IEEE80211_BAND_5GHZ;
1428                 break;
1429             default:
1430                 apsettings->freqParams.band = IEEE80211_BAND_2GHZ;
1431                 break;
1432         }
1433     }
1434 }
1435 
WifiSetApBeaconData(WifiApSetting * apsettings,const struct wpa_driver_ap_params * params)1436 static int WifiSetApBeaconData(WifiApSetting *apsettings, const struct wpa_driver_ap_params *params)
1437 {
1438     if ((params->head != NULL) && (params->head_len != 0)) {
1439         apsettings->beaconData.headLen = params->head_len;
1440         apsettings->beaconData.head = (uint8_t *)os_zalloc(apsettings->beaconData.headLen);
1441         if (apsettings->beaconData.head == NULL) {
1442             return -EFAIL;
1443         }
1444         if (memcpy_s(apsettings->beaconData.head, apsettings->beaconData.headLen, params->head, params->head_len) !=
1445             EOK) {
1446             return -EFAIL;
1447         }
1448     }
1449 
1450     if ((params->tail != NULL) && (params->tail_len != 0)) {
1451         apsettings->beaconData.tailLen = params->tail_len;
1452         apsettings->beaconData.tail = (uint8_t *)os_zalloc(apsettings->beaconData.tailLen);
1453         if (apsettings->beaconData.tail == NULL) {
1454             return -EFAIL;
1455         }
1456         if (memcpy_s(apsettings->beaconData.tail, apsettings->beaconData.tailLen, params->tail, params->tail_len) !=
1457             EOK) {
1458             return -EFAIL;
1459         }
1460     }
1461     return SUCC;
1462 }
1463 
WifiApSettingsFree(WifiApSetting ** apsettings)1464 static void WifiApSettingsFree(WifiApSetting **apsettings)
1465 {
1466     if (apsettings == NULL || *apsettings == NULL) {
1467         return;
1468     }
1469 
1470     if ((*apsettings)->meshSsid != NULL) {
1471         os_free((*apsettings)->meshSsid);
1472         (*apsettings)->meshSsid = NULL;
1473     }
1474 
1475     if ((*apsettings)->ssid != NULL) {
1476         os_free((*apsettings)->ssid);
1477         (*apsettings)->ssid = NULL;
1478     }
1479 
1480     if ((*apsettings)->beaconData.head != NULL) {
1481         os_free((*apsettings)->beaconData.head);
1482         (*apsettings)->beaconData.head = NULL;
1483     }
1484 
1485     if ((*apsettings)->beaconData.tail != NULL) {
1486         os_free((*apsettings)->beaconData.tail);
1487         (*apsettings)->beaconData.tail = NULL;
1488     }
1489 
1490     os_free(*apsettings);
1491     *apsettings = NULL;
1492 }
1493 
WifiGetApAuthType(const struct wpa_driver_ap_params * params)1494 static WifiAuthType WifiGetApAuthType(const struct wpa_driver_ap_params *params)
1495 {
1496     WifiAuthType type;
1497 
1498     if ((params->auth_algs & (WPA_AUTH_ALG_OPEN | WPA_AUTH_ALG_SHARED)) == (WPA_AUTH_ALG_OPEN | WPA_AUTH_ALG_SHARED)) {
1499         type = WIFI_AUTHTYPE_AUTOMATIC;
1500     } else if ((params->auth_algs & WPA_AUTH_ALG_SHARED) == WPA_AUTH_ALG_SHARED) {
1501         type = WIFI_AUTHTYPE_SHARED_KEY;
1502     } else {
1503         type = WIFI_AUTHTYPE_OPEN_SYSTEM;
1504     }
1505     return type;
1506 }
1507 
WifiWpaSetAp(void * priv,struct wpa_driver_ap_params * params)1508 static int32_t WifiWpaSetAp(void *priv, struct wpa_driver_ap_params *params)
1509 {
1510     int32_t ret;
1511     WifiApSetting *apsettings = NULL;
1512     WifiDriverData *drv = (WifiDriverData *)priv;
1513     if ((priv == NULL) || (params == NULL) || (params->freq == NULL)) {
1514         return -EFAIL;
1515     }
1516     if ((params->freq->bandwidth != WPA_BANDWIDTH_20) && (params->freq->bandwidth != WPA_BANDWIDTH_40)) {
1517         return -EFAIL;
1518     }
1519 
1520     apsettings = os_zalloc(sizeof(WifiApSetting));
1521     if (apsettings == NULL) {
1522         return -EFAIL;
1523     }
1524     apsettings->beaconInterval = params->beacon_int;
1525     apsettings->dtimPeriod = params->dtim_period;
1526     apsettings->hiddenSsid = params->hide_ssid;
1527     apsettings->authType = WifiGetApAuthType(params);
1528 
1529     if ((params->ssid != NULL) && (params->ssid_len != 0)) {
1530         apsettings->ssidLen = params->ssid_len;
1531         apsettings->ssid = (uint8_t *)os_zalloc(apsettings->ssidLen);
1532         if ((apsettings->ssid == NULL) ||
1533             (memcpy_s(apsettings->ssid, apsettings->ssidLen, params->ssid, params->ssid_len) != EOK)) {
1534             goto failed;
1535         }
1536     }
1537     WifiSetApFreq(apsettings, params);
1538     WifiSetApBand(apsettings, drv->hapd);
1539     if (WifiSetApBeaconData(apsettings, params) != SUCC) {
1540         goto failed;
1541     }
1542     if (drv->beaconSet == true) {
1543         ret = WifiCmdChangeBeacon(drv->iface, apsettings);
1544     } else {
1545         ret = WifiCmdSetAp(drv->iface, apsettings);
1546     }
1547     if (ret == SUCC) {
1548         drv->beaconSet = true;
1549     }
1550     WifiApSettingsFree(&apsettings);
1551     wpa_printf(MSG_INFO, "WifiWpaGetScanResults2 done ret=%d", ret);
1552     return ret;
1553 
1554 failed:
1555     WifiApSettingsFree(&apsettings);
1556     return -EFAIL;
1557 }
1558 
WifiHapdPreInit(const WifiDriverData * drv)1559 static void WifiHapdPreInit(const WifiDriverData *drv)
1560 {
1561     WifiSetNewDev info;
1562 
1563     if (drv == NULL) {
1564         return;
1565     }
1566     info.status = false;
1567     info.ifType = WIFI_IFTYPE_STATION;
1568     info.mode = WIFI_PHY_MODE_11N;
1569     int ret = WifiCmdSetNetdev(drv->iface, &info);
1570 
1571     if (ret != SUCC) {
1572         wpa_printf(MSG_ERROR, "%s set netdev failed ret = %d.", __func__, ret);
1573     }
1574 }
1575 
WifiDrvInit(void * ctx,const struct wpa_init_params * params)1576 static WifiDriverData *WifiDrvInit(void *ctx, const struct wpa_init_params *params)
1577 {
1578     WifiDriverData *drv = NULL;
1579     errno_t rc;
1580     WifiSetNewDev info;
1581     WifiSetMode setMode;
1582     int32_t ret;
1583 #ifdef CONFIG_OHOS_P2P
1584     WifiDev *wifiDev = NULL;
1585 #endif
1586     if ((ctx == NULL) || (params == NULL)) {
1587         return NULL;
1588     }
1589     drv = os_zalloc(sizeof(WifiDriverData));
1590     if (drv == NULL) {
1591         goto failed;
1592     }
1593 
1594     drv->ctx = ctx;
1595     rc = memcpy_s(drv->iface, sizeof(drv->iface), params->ifname, sizeof(drv->iface));
1596     if (rc != EOK) {
1597         os_free(drv);
1598         drv = NULL;
1599         goto failed;
1600     }
1601 #ifdef CONFIG_OHOS_P2P
1602     wifiDev = (WifiDev *)os_zalloc(sizeof(WifiDev));
1603     if (wifiDev == NULL)
1604     {
1605         wpa_printf(MSG_ERROR, "%s wifiDev malloc failed.", __FUNCTION__);
1606         goto failed;
1607     }
1608     wifiDev->priv = drv;
1609     wifiDev->ifNameLen = sizeof(params->ifname);
1610     rc = memcpy_s(wifiDev->ifName, sizeof(wifiDev->ifName), drv->iface, sizeof(drv->iface));
1611     if (rc != EOK) {
1612         wpa_printf(MSG_ERROR, "%s wifiDev could not copy interface name.", __FUNCTION__);
1613         goto failed;
1614     }
1615     wpa_printf(MSG_INFO, "%s init, interface name:%s.", __FUNCTION__, wifiDev->ifName);
1616     SetWifiDev(wifiDev);
1617 #endif // CONFIG_OHOS_P2P
1618     WifiHapdPreInit(drv);
1619 
1620     setMode.iftype = WIFI_IFTYPE_AP;
1621     ret = WifiCmdSetMode(drv->iface, &setMode);
1622     if (ret != SUCC) {
1623         wpa_printf(MSG_ERROR, "WifiWpaHapdInit set mode failed, iface = %s, ret = %d.", drv->iface, ret);
1624         goto failed;
1625     }
1626     info.status = true;
1627     info.ifType = WIFI_IFTYPE_AP;
1628     info.mode = WIFI_PHY_MODE_11N;
1629     ret = WifiCmdSetNetdev(drv->iface, &info);
1630     if (ret != SUCC) {
1631         wpa_printf(MSG_ERROR, "WifiDrvInit set netdev failed");
1632         goto failed;
1633     }
1634     wpa_printf(MSG_INFO, "WifiDrvInit done");
1635     return drv;
1636 
1637 failed:
1638     if (drv != NULL) {
1639         info.status = false;
1640         info.ifType = WIFI_IFTYPE_STATION;
1641         info.mode = WIFI_PHY_MODE_11N;
1642         WifiCmdSetNetdev(drv->iface, &info);
1643         os_free(drv);
1644         drv = NULL;
1645     }
1646 #ifdef CONFIG_OHOS_P2P
1647     FreeWifiDev(wifiDev);
1648 #endif // CONFIG_OHOS_P2P
1649     return NULL;
1650 }
1651 
WifiWpaInitl2(struct wpa_init_params * params,WifiDriverData * drv)1652 static int32_t WifiWpaInitl2(struct wpa_init_params *params, WifiDriverData *drv)
1653 {
1654     int32_t ret;
1655     uint8_t addrTmp[ETH_ADDR_LEN] = {0};
1656 
1657     drv->eapolSock = l2_packet_init(drv->iface, NULL, ETH_P_EAPOL, WifiWpaReceiveEapol, drv, 1);
1658     if (drv->eapolSock == NULL) {
1659         wpa_printf(MSG_ERROR, "WifiDrvInit l2 packet init failed");
1660         return -EFAIL;
1661     }
1662     if (l2_packet_get_own_addr(drv->eapolSock, addrTmp)) {
1663         return -EFAIL;
1664     }
1665     ret = memcpy_s(params->own_addr, ETH_ADDR_LEN, addrTmp, ETH_ADDR_LEN);
1666     if (ret != EOK) {
1667         return -EFAIL;
1668     }
1669     ret = memcpy_s(drv->ownAddr, ETH_ADDR_LEN, addrTmp, ETH_ADDR_LEN);
1670     if (ret != EOK) {
1671         return -EFAIL;
1672     }
1673     return SUCC;
1674 }
1675 
WifiWpaHapdInit(struct hostapd_data * hapd,struct wpa_init_params * params)1676 static void *WifiWpaHapdInit(struct hostapd_data *hapd, struct wpa_init_params *params)
1677 {
1678     WifiDriverData *drv = NULL;
1679 
1680     int32_t ret;
1681 
1682     if ((hapd == NULL) || (params == NULL) || (hapd->conf == NULL)) {
1683         return NULL;
1684     }
1685 
1686     if (WifiClientInit(params->ifname) != SUCC) {
1687         wpa_printf(MSG_ERROR, "Wifi client init failed");
1688         return NULL;
1689     }
1690     drv = WifiDrvInit(hapd, params);
1691     if (drv == NULL) {
1692         wpa_printf(MSG_ERROR, "WifiWpaHapdInit drv init failed");
1693         goto failed;
1694     }
1695     drv->hapd = hapd;
1696 
1697     ret = WifiWpaInitl2(params, drv);
1698     if (ret != SUCC) {
1699         wpa_printf(MSG_ERROR, "WifiWpaInitI2 failed");
1700         goto failed;
1701     }
1702 
1703     g_wifiDriverData = drv;
1704     g_wifiDriverType = WIFI_IFTYPE_AP;
1705     wpa_printf(MSG_INFO, "WifiWpaHapdInit done");
1706     return (void *)drv;
1707 
1708 failed:
1709     if (drv != NULL && drv->eapolSock != NULL) {
1710         l2_packet_deinit(drv->eapolSock);
1711     }
1712     WifiWpaDeinit(drv);
1713     return NULL;
1714 }
1715 
WifiWpaHapdDeinit(void * priv)1716 static void WifiWpaHapdDeinit(void *priv)
1717 {
1718     int32_t ret;
1719     WifiDriverData *drv = NULL;
1720     WifiSetMode setMode;
1721     WifiSetNewDev info;
1722 
1723     if (priv == NULL) {
1724         return;
1725     }
1726 
1727     (void)memset_s(&setMode, sizeof(WifiSetMode), 0, sizeof(WifiSetMode));
1728     drv = (WifiDriverData *)priv;
1729     setMode.iftype = WIFI_IFTYPE_STATION;
1730     info.status = false;
1731     info.ifType = WIFI_IFTYPE_AP;
1732     info.mode = WIFI_PHY_MODE_11N;
1733 
1734     WifiCmdSetNetdev(drv->iface, &info);
1735     ret = WifiCmdSetMode((char *)drv->iface, &setMode);
1736     if (ret != SUCC) {
1737         return;
1738     }
1739 
1740     if (drv->eapolSock != NULL) {
1741         l2_packet_deinit(drv->eapolSock);
1742     }
1743     os_free(g_wifiDriverData);
1744     g_wifiDriverData = NULL;
1745     WifiClientDeinit(drv->iface);
1746 
1747     wpa_printf(MSG_INFO, "WifiWpaHapdDeinit done");
1748 }
1749 
WifiWpaHapdSendEapol(void * priv,const uint8_t * addr,const uint8_t * data,size_t dataLen,int encrypt,const uint8_t * ownAddr,uint32_t flags)1750 static int32_t WifiWpaHapdSendEapol(void *priv, const uint8_t *addr, const uint8_t *data, size_t dataLen, int encrypt,
1751     const uint8_t *ownAddr, uint32_t flags)
1752 {
1753     WifiDriverData *drv = priv;
1754     int32_t ret;
1755     uint32_t frameLen;
1756     uint8_t *frameBuf = NULL;
1757     uint8_t *payload = NULL;
1758     struct l2_ethhdr *ethhdr = NULL;
1759 
1760     (void)encrypt;
1761     (void)flags;
1762     if ((priv == NULL) || (addr == NULL) || (data == NULL) || (ownAddr == NULL)) {
1763         return -EFAIL;
1764     }
1765 
1766     frameLen = dataLen + sizeof(struct l2_ethhdr);
1767     frameBuf = os_zalloc(frameLen);
1768     if (frameBuf == NULL) {
1769         return -EFAIL;
1770     }
1771 
1772     ethhdr = (struct l2_ethhdr *)frameBuf;
1773     if (memcpy_s(ethhdr->h_dest, ETH_ADDR_LEN, addr, ETH_ADDR_LEN) != EOK) {
1774         os_free(frameBuf);
1775         frameBuf = NULL;
1776         return -EFAIL;
1777     }
1778     if (memcpy_s(ethhdr->h_source, ETH_ADDR_LEN, ownAddr, ETH_ADDR_LEN) != EOK) {
1779         os_free(frameBuf);
1780         frameBuf = NULL;
1781         return -EFAIL;
1782     }
1783     ethhdr->h_proto = host_to_be16(ETH_P_PAE);
1784     payload = (uint8_t *)(ethhdr + 1);
1785     if (memcpy_s(payload, dataLen, data, dataLen) != EOK) {
1786         os_free(frameBuf);
1787         frameBuf = NULL;
1788         return -EFAIL;
1789     }
1790     ret = l2_packet_send(drv->eapolSock, addr, ETH_P_EAPOL, frameBuf, frameLen);
1791     os_free(frameBuf);
1792     frameBuf = NULL;
1793     wpa_printf(MSG_INFO, "WifiWpaHapdSendEapol done, ret=%d", ret);
1794     return ret;
1795 }
1796 
WifiWpaStaRemove(void * priv,const uint8_t * addr)1797 static int32_t WifiWpaStaRemove(void *priv, const uint8_t *addr)
1798 {
1799     WifiDriverData *drv = NULL;
1800     int32_t ret;
1801 
1802     if ((priv == NULL) || (addr == NULL)) {
1803         return -EFAIL;
1804     }
1805     drv = (WifiDriverData *)priv;
1806     ret = WifiCmdStaRemove(drv->iface, addr, ETH_ADDR_LEN);
1807     if (ret != SUCC) {
1808         return -EFAIL;
1809     }
1810     wpa_printf(MSG_INFO, "WifiWpaStaRemove done, ret=%d", ret);
1811     return ret;
1812 }
1813 
WifiDuplicateStr(const uint8_t * src,size_t len)1814 static uint8_t *WifiDuplicateStr(const uint8_t *src, size_t len)
1815 {
1816     uint8_t *res = NULL;
1817 
1818     if (src == NULL) {
1819         return NULL;
1820     }
1821     res = os_malloc(len + 1);
1822     if (res == NULL) {
1823         return NULL;
1824     }
1825     if (memcpy_s(res, len, src, len) != EOK) {
1826         os_free(res);
1827         return NULL;
1828     }
1829     res[len] = '\0';
1830 
1831     return res;
1832 }
1833 
WifiActionDataBufFree(WifiActionData * actionData)1834 static void WifiActionDataBufFree(WifiActionData *actionData)
1835 {
1836     if (actionData == NULL) {
1837         return;
1838     }
1839     if (actionData->data != NULL) {
1840         os_free(actionData->data);
1841         actionData->data = NULL;
1842     }
1843 }
1844 
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)1845 static int32_t WifiWpaSendAction(void *priv, uint32_t freq, uint32_t wait, const uint8_t *dst, const uint8_t *src,
1846     const uint8_t *bssid, const uint8_t *data, size_t dataLen, int32_t noCck)
1847 {
1848     WifiActionData actionData = {
1849         .dst = {0},
1850         .src = {0},
1851         .bssid = {0},
1852         .data = NULL,
1853         .dataLen = 0,
1854         .freq = 0,
1855         .wait = 0,
1856         .noCck = 0,
1857     };
1858     WifiDriverData *drv = NULL;
1859     int32_t ret;
1860 
1861     if ((priv == NULL) || (data == NULL) || (dst == NULL) || (src == NULL) || (bssid == NULL)) {
1862         return -EFAIL;
1863     }
1864     drv = (WifiDriverData *)priv;
1865 
1866     if (memcpy_s(actionData.dst, ETH_ADDR_LEN, dst, ETH_ADDR_LEN) != EOK) {
1867         return -EFAIL;
1868     }
1869     if (memcpy_s(actionData.src, ETH_ADDR_LEN, src, ETH_ADDR_LEN) != EOK) {
1870         return -EFAIL;
1871     }
1872     if (memcpy_s(actionData.bssid, ETH_ADDR_LEN, bssid, ETH_ADDR_LEN) != EOK) {
1873         return -EFAIL;
1874     }
1875 
1876     actionData.dataLen = dataLen;
1877     actionData.freq = freq;
1878     actionData.wait = wait;
1879     actionData.noCck = noCck;
1880     actionData.data = WifiDuplicateStr(data, dataLen);
1881     if (actionData.data == NULL) {
1882         return -EFAIL;
1883     }
1884     ret = WifiCmdSendAction(drv->iface, &actionData);
1885     WifiActionDataBufFree(&actionData);
1886     wpa_printf(MSG_INFO, "WifiWpaSendAction done, ret=%d", ret);
1887     return ret;
1888 }
1889 
DeinitWifiService()1890 __attribute__ ((visibility ("default"))) void DeinitWifiService()
1891 {
1892     if (g_wifiDriverType == WIFI_IFTYPE_STATION) {
1893         WifiWpaDeinit(g_wifiDriverData);
1894     } else if (g_wifiDriverType == WIFI_IFTYPE_AP) {
1895         WifiWpaHapdDeinit(g_wifiDriverData);
1896     } else {
1897         printf("no need to cleanup \n");
1898     }
1899 }
1900 
1901 #ifdef CONFIG_OHOS_P2P
WifiProbeReqReport(void * priv,int32_t report)1902 static int32_t WifiProbeReqReport(void *priv, int32_t report)
1903 {
1904     WifiDriverData *drv = NULL;
1905     wpa_printf(MSG_INFO, "%s enter.", __FUNCTION__);
1906     if (priv == NULL) {
1907         wpa_printf(MSG_ERROR, "%s input invalid.", __FUNCTION__);
1908         return -EFAIL;
1909     }
1910     drv = (WifiDriverData *)priv;
1911     return WifiCmdProbeReqReport(drv->iface, &report);
1912 }
1913 
WifiRemainOnChannel(void * priv,uint32_t freq,uint32_t duration)1914 static int32_t WifiRemainOnChannel(void *priv, uint32_t freq, uint32_t duration)
1915 {
1916     int32_t ret;
1917     WifiDriverData *drv = priv;
1918     WifiOnChannel *onChannel = NULL;
1919     if (priv == NULL) {
1920         wpa_printf(MSG_ERROR, "%s input invalid.", __FUNCTION__);
1921         return -EFAIL;
1922     }
1923     onChannel = (WifiOnChannel *)os_zalloc(sizeof(WifiOnChannel));
1924     if (onChannel == NULL)
1925     {
1926         wpa_printf(MSG_ERROR, "%s failed to alloc channel.", __FUNCTION__);
1927         return -EFAIL;
1928     }
1929     onChannel->freq = freq;
1930     onChannel->duration = duration;
1931 
1932     ret = WifiCmdRemainOnChannel(drv->iface, onChannel);
1933 
1934     os_free(onChannel);
1935     onChannel = NULL;
1936 
1937     return ret;
1938 }
1939 
WifiCancelRemainOnChannel(void * priv)1940 static int32_t WifiCancelRemainOnChannel(void *priv)
1941 {
1942     WifiDriverData *drv = priv;
1943     if (drv == NULL) {
1944         wpa_printf(MSG_ERROR, "%s input invalid.", __FUNCTION__);
1945         return -EFAIL;
1946     }
1947 
1948     return WifiCmdCancelRemainOnChannel(drv->iface);
1949 }
1950 
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)1951 static int32_t WifiAddIf(void *priv, enum wpa_driver_if_type type, const char *ifName, const uint8_t *addr, void *bss_ctx,
1952                          void **drv_priv, char *force_ifname, uint8_t *if_addr, const char *bridge, int32_t use_existing, int32_t setup_ap)
1953 {
1954     WifiDriverData *drv = priv;
1955     WifiIfAdd *ifAdd = NULL;
1956     int32_t ret;
1957     WifiDev *wifiDev = NULL;
1958     if (priv == NULL) {
1959         wpa_printf(MSG_ERROR, "%s input invalid.", __FUNCTION__);
1960         return -EFAIL;
1961     }
1962     ifAdd = (WifiIfAdd *)os_zalloc(sizeof(WifiIfAdd));
1963     if (ifAdd == NULL) {
1964         wpa_printf(MSG_ERROR, "%s failed to alloc ifAdd.", __FUNCTION__);
1965         return -EFAIL;
1966     }
1967     switch (type) {
1968     case WPA_IF_STATION:
1969         ifAdd->type = WIFI_IFTYPE_STATION;
1970         break;
1971     case WPA_IF_P2P_GROUP:
1972     case WPA_IF_P2P_CLIENT:
1973         ifAdd->type = WIFI_IFTYPE_P2P_CLIENT;
1974         break;
1975     case WPA_IF_AP_VLAN:
1976         ifAdd->type = WIFI_IFTYPE_AP_VLAN;
1977         break;
1978     case WPA_IF_AP_BSS:
1979         ifAdd->type = WIFI_IFTYPE_AP;
1980         break;
1981     case WPA_IF_P2P_GO:
1982         ifAdd->type = WIFI_IFTYPE_P2P_GO;
1983         break;
1984     case WPA_IF_P2P_DEVICE:
1985         ifAdd->type = WIFI_IFTYPE_P2P_DEVICE;
1986         break;
1987     case WPA_IF_MESH:
1988         ifAdd->type = WIFI_IFTYPE_MESH_POINT;
1989         break;
1990     default:
1991         wpa_printf(MSG_ERROR, "%s unsuportted interface type %d.", __FUNCTION__, type);
1992     }
1993 
1994     ret = WifiRegisterEventCallback(OnWpaWiFiEvents, WIFI_KERNEL_TO_WPA_CLIENT, ifName);
1995     if (ret != SUCC) {
1996         wpa_printf(MSG_ERROR, "WifiWpa register event listener faild");
1997     }
1998     ret = memcpy_s(ifAdd->ifName, IFNAMSIZ, ifName, IFNAMSIZ);
1999     if (ret != SUCC) {
2000         wpa_printf(MSG_ERROR, "%s memcpy_s ifName faild", __FUNCTION__);
2001         return -EFAIL;
2002     }
2003 
2004     ret = WifiCmdAddIf(drv->iface, ifAdd);
2005     if (ret == SUCC) {
2006         wifiDev = (WifiDev *)os_zalloc(sizeof(WifiDev));
2007         if (wifiDev == NULL) {
2008             wpa_printf(MSG_ERROR, "%s failed to malloc wifiDev.", __FUNCTION__);
2009             return -EFAIL;
2010         }
2011         wifiDev->priv = drv;
2012         wifiDev->ifNameLen = sizeof(ifName);
2013         errno_t rc = memcpy_s(wifiDev->ifName, sizeof(wifiDev->ifName), ifName, sizeof(drv->iface));
2014         if (rc != EOK) {
2015             wpa_printf(MSG_ERROR, "Could not copy wifi device name.");
2016             FreeWifiDev(wifiDev);
2017             return ret;
2018         }
2019         wpa_printf(MSG_INFO, "%s ifName:%s, type:%d", __FUNCTION__, wifiDev->ifName, ifAdd->type);
2020         SetWifiDev(wifiDev);
2021     }
2022     os_free(ifAdd);
2023     ifAdd = NULL;
2024     return ret;
2025 }
2026 
WifiRemoveIf(void * priv,enum wpa_driver_if_type type,const char * ifName)2027 static int32_t WifiRemoveIf(void *priv, enum wpa_driver_if_type type, const char *ifName)
2028 {
2029     WifiDriverData *drv = priv;
2030     WifiIfRemove ifRemove = {0};
2031     int32_t ret;
2032     errno_t rc;
2033     WifiDev *wifiDev = NULL;
2034     if (priv == NULL || ifName == NULL) {
2035         wpa_printf(MSG_ERROR, "%s input invalid.", __FUNCTION__);
2036         return -EFAIL;
2037     }
2038     if (os_strlen(ifName) > IFNAMSIZ) {
2039         wpa_printf(MSG_ERROR, "%s ifName invalid:%s.", __FUNCTION__, ifName);
2040         return -EFAIL;
2041     }
2042     rc = memcpy_s(ifRemove.ifName, IFNAMSIZ, ifName, IFNAMSIZ);
2043     if (rc != EOK) {
2044         wpa_printf(MSG_ERROR, "%s can not copy interface name.", __FUNCTION__);
2045         return -EFAIL;
2046     }
2047 
2048     ret = WifiCmdRemoveIf(drv->iface, &ifRemove);
2049     wifiDev = GetWifiDevByName(ifName);
2050     if (wifiDev == NULL) {
2051         wpa_printf(MSG_INFO, "%s: GetWifiDevByName is null, already free.", __FUNCTION__);
2052         return SUCC;
2053     }
2054     FreeWifiDev(wifiDev);
2055     return SUCC;
2056 }
2057 
WifiSetApWpsP2pIe(void * priv,const struct wpabuf * beacon,const struct wpabuf * probresp,const struct wpabuf * assocresp)2058 int32_t WifiSetApWpsP2pIe(void *priv, const struct wpabuf *beacon, const struct wpabuf *probresp, const struct wpabuf *assocresp)
2059 {
2060     int32_t loops;
2061     int32_t ret = SUCC;
2062     WifiAppIe *appIe = NULL;
2063     struct wpabuf *wpabufTmp = NULL;
2064     WifiDriverData *drv = (WifiDriverData *)priv;
2065     WifiCmd cmdAddr[4] = {{0x1, beacon}, {0x2, probresp}, {0x4, assocresp}, {-1, NULL}};
2066     errno_t rc;
2067     appIe = (WifiAppIe *)os_zalloc(sizeof(WifiAppIe));
2068     if (appIe == NULL) {
2069         wpa_printf(MSG_ERROR, "%s:failed to malloc WifiAppIe.", __FUNCTION__);
2070         return -EFAIL;
2071     }
2072     for (loops = 0; cmdAddr[loops].cmd != -1; loops++) {
2073         wpabufTmp = (struct wpabuf *)cmdAddr[loops].src;
2074         if (wpabufTmp != NULL) {
2075             appIe->appIeType = cmdAddr[loops].cmd;
2076             appIe->ieLen = wpabuf_len(wpabufTmp);
2077             if ((wpabufTmp->buf != NULL) && (appIe->ieLen != 0)) {
2078                 appIe->ie = os_zalloc(appIe->ieLen);
2079                 if (appIe->ie == NULL) {
2080                     wpa_printf(MSG_ERROR, "%s appIe->ie malloc failed.", __FUNCTION__);
2081                     os_free(appIe);
2082                     return -EFAIL;
2083                 }
2084                 rc = memcpy_s(appIe->ie, appIe->ieLen, wpabuf_head(wpabufTmp), wpabuf_len(wpabufTmp));
2085                 if (rc != EOK) {
2086                     wpa_printf(MSG_ERROR, "%s: ", __FUNCTION__);
2087                     os_free(appIe->ie);
2088                     os_free(appIe);
2089                     return -EFAIL;
2090                 }
2091             }
2092             wpa_printf(MSG_INFO, "%s type %d, ie_len %d.", __FUNCTION__, appIe->appIeType, appIe->ieLen);
2093 
2094             ret = WifiCmdSetApWpsP2pIe(drv->iface, appIe);
2095             os_free(appIe->ie);
2096             appIe->ie = NULL;
2097             if (ret < 0) {
2098                 break;
2099             }
2100         }
2101     }
2102     os_free(appIe);
2103     appIe = NULL;
2104     return ret;
2105 }
2106 
WifiWpaGetDrvFlags(void * priv,uint64_t * drvFlags)2107 int32_t WifiWpaGetDrvFlags(void *priv, uint64_t *drvFlags)
2108 {
2109     WifiDriverData *drv = NULL;
2110     WifiGetDrvFlags *params = NULL;
2111     int32_t ret;
2112     if (priv == NULL || drvFlags == NULL)
2113     {
2114         return -EFAIL;
2115     }
2116     drv = (WifiDriverData *)priv;
2117     params = (WifiGetDrvFlags *)os_zalloc(sizeof(WifiGetDrvFlags));
2118     if (params == NULL)
2119     {
2120         return -EFAIL;
2121     }
2122     params->drvFlags = 0;
2123     ret = WifiCmdGetDrvFlags(drv->iface, params);
2124     if (ret != SUCC)
2125     {
2126         wpa_printf(MSG_ERROR, "%s WifiCmdGetDrvFlags failed, ret is %d.", __FUNCTION__, ret);
2127         os_free(params);
2128         return -EFAIL;
2129     }
2130     *drvFlags = params->drvFlags;
2131     wpa_printf(MSG_INFO, "%s Get drvFlags done.", __FUNCTION__);
2132     os_free(params);
2133     return ret;
2134 }
2135 #endif // CONFIG_OHOS_P2P
2136 
2137 const struct wpa_driver_ops g_wifiDriverOps = {
2138     .name = "hdf wifi",
2139     .desc = "wpa hdf adaptor layer",
2140     .get_bssid = WifiWpaGetBssid,
2141     .get_ssid = WifiWpaGetSsid,
2142     .set_key = WifiWpaSetKey,
2143     .scan2 = WifiWpaScan2,
2144     .get_scan_results2 = WifiWpaGetScanResults2,
2145     .deauthenticate = WifiWpaDeauthenticate,
2146     .associate = WifiWpaAssociate,
2147     .send_eapol = WifiWpaWpaSendEapol,
2148     .init2 = WifiWpaInit2,
2149     .deinit = WifiWpaDeinit,
2150     .set_ap = WifiWpaSetAp,
2151     .send_mlme = WifiWpaSendMlme,
2152     .get_hw_feature_data = WifiWpaGetHwFeatureData,
2153     .sta_remove = WifiWpaStaRemove,
2154     .hapd_init = WifiWpaHapdInit,
2155     .hapd_deinit = WifiWpaHapdDeinit,
2156     .hapd_send_eapol = WifiWpaHapdSendEapol,
2157     .send_action = WifiWpaSendAction,
2158     .get_mac_addr = WifiWpaGetMacAddr,
2159 #ifdef CONFIG_OHOS_P2P
2160     .remain_on_channel = WifiRemainOnChannel,
2161     .cancel_remain_on_channel = WifiCancelRemainOnChannel,
2162     .probe_req_report = WifiProbeReqReport,
2163     .if_add = WifiAddIf,
2164     .if_remove = WifiRemoveIf,
2165     .set_ap_wps_ie = WifiSetApWpsP2pIe,
2166 #endif // CONFIG_OHOS_P2P
2167 };
2168 
2169 #ifdef __cplusplus
2170 #if __cplusplus
2171 }
2172 #endif
2173 #endif
2174