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