• 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     eloop_cancel_timeout(WifiWpaScanTimeout, drv, drv->ctx);
476     WifiCmdSetNetdev(drv->iface, &info);
477 
478     if (drv->eapolSock != NULL) {
479         l2_packet_deinit(drv->eapolSock);
480     }
481 
482 #ifdef CONFIG_OHOS_P2P
483     WifiUnregisterEventCallback(OnWpaWiFiEvents, WIFI_KERNEL_TO_WPA_CLIENT, drv->iface);
484     if (CountWifiDevInUse() == 0) {
485         g_msgInit = TRUE;
486         os_free(g_wifiDriverData);
487         g_wifiDriverData = NULL;
488         (void)WifiClientDeinit(drv->iface);
489     }
490 #else
491     os_free(g_wifiDriverData);
492     g_wifiDriverData = NULL;
493     (void)WifiClientDeinit(drv->iface);
494 #endif //CONFIG_OHOS_P2P
495 
496     wpa_printf(MSG_INFO, "WifiWpaDeinit done");
497 }
498 
WifiWpaInit(void * ctx,const char * ifName)499 static void *WifiWpaInit(void *ctx, const char *ifName)
500 {
501     int32_t ret;
502     WifiSetNewDev info;
503 #ifdef CONFIG_OHOS_P2P
504     WifiDev *wifiDev = NULL;
505     errno_t rc;
506 #endif
507 
508     if ((ctx == NULL) || (ifName == NULL)) {
509         return NULL;
510     }
511 
512     wpa_printf(MSG_INFO, "%s enter, interface name:%s.", __FUNCTION__, ifName);
513     (void)memset_s(&info, sizeof(WifiSetNewDev), 0, sizeof(WifiSetNewDev));
514     WifiDriverData *drv = os_zalloc(sizeof(WifiDriverData));
515     if (drv == NULL) {
516         goto failed;
517     }
518 
519     drv->ctx = ctx;
520     if (memcpy_s(drv->iface, sizeof(drv->iface), ifName, sizeof(drv->iface)) != EOK) {
521         goto failed;
522     }
523 #ifdef CONFIG_OHOS_P2P
524     if (g_msgInit && (strncmp(drv->iface, "p2p0", 4) == 0)) {
525         if (WifiClientInit(drv->iface) != SUCC) {
526             goto failed;
527         }
528         g_msgInit = FALSE;
529     }
530 #endif // CONFIG_OHOS_P2P
531     if (strncmp(drv->iface, "wlan0", 5) == 0) {
532         if (WifiClientInit(drv->iface) != SUCC) {
533             goto failed;
534         }
535     }
536     WifiWpaPreInit(drv);
537 
538     info.status = TRUE;
539     info.ifType = WIFI_IFTYPE_STATION;
540     info.mode = WIFI_PHY_MODE_11N;
541 #ifdef CONFIG_OHOS_P2P
542     if  (strncmp(drv->iface, "p2p-p2p0-0", 10) == 0) {
543         info.ifType = WIFI_IFTYPE_P2P_CLIENT;
544     } else if (strncmp(drv->iface, "p2p0", 4) == 0) {
545         info.ifType = WIFI_IFTYPE_P2P_DEVICE;
546     }
547 #endif // CONFIG_OHOS_P2P
548     ret = WifiCmdSetNetdev(drv->iface, &info);
549     if (ret != SUCC) {
550         wpa_printf(MSG_ERROR, "WifiWpaInit set netdev faild");
551         goto failed;
552     }
553     drv->eapolSock = l2_packet_init(drv->iface, NULL, ETH_P_EAPOL, WifiWpaReceiveEapol, drv, 1);
554     if (drv->eapolSock == NULL) {
555         wpa_printf(MSG_ERROR, "WifiWpaInit l2_packet_init faild");
556         goto failed;
557     }
558 
559     if (l2_packet_get_own_addr(drv->eapolSock, drv->ownAddr)) {
560         wpa_printf(MSG_ERROR, "l2_packet_get_own_addr faild");
561         goto failed;
562     }
563 
564     g_wifiDriverType = WIFI_IFTYPE_STATION;
565 #ifdef CONFIG_OHOS_P2P
566     wifiDev = (WifiDev *)os_zalloc(sizeof(WifiDev));
567     if (wifiDev == NULL) {
568         wpa_printf(MSG_ERROR, "%s wifiDev malloc failed.", __FUNCTION__);
569         goto failed;
570     }
571     wifiDev->priv = drv;
572     wifiDev->ifNameLen = sizeof(ifName);
573     rc = memcpy_s(wifiDev->ifName, sizeof(wifiDev->ifName), drv->iface, sizeof(drv->iface));
574     if (rc != EOK) {
575         wpa_printf(MSG_ERROR, "%s could not copy wifi device name.", __FUNCTION__);
576         goto failed;
577     }
578     wpa_printf(MSG_ERROR, "%s init done, ifname:%s.", __FUNCTION__, wifiDev->ifName);
579     SetWifiDev(wifiDev);
580 #endif // CONFIG_OHOS_P2P
581     g_wifiDriverData = drv;
582     return drv;
583 
584 failed:
585 #ifdef CONFIG_OHOS_P2P
586     FreeWifiDev(wifiDev);
587 #endif // CONFIG_OHOS_P2P
588     WifiWpaDeinit(drv);
589     return NULL;
590 }
591 
WifiWpaDeauthenticate(void * priv,const uint8_t * addr,uint16_t reasonCode)592 static int32_t WifiWpaDeauthenticate(void *priv, const uint8_t *addr, uint16_t reasonCode)
593 {
594     int32_t ret;
595     WifiDriverData *drv = priv;
596 
597     (void)addr;
598     if (priv == NULL) {
599         return -EFAIL;
600     }
601 
602     wpa_printf(MSG_INFO, "WifiWpaDeauthenticate reasonCode = %d", reasonCode);
603     ret = WifiCmdDisconnet(drv->iface, reasonCode);
604     if (ret == SUCC) {
605         drv->associated = WIFI_DISCONNECT;
606     }
607     return ret;
608 }
609 
WifiWpaDriverAp(WifiDriverData * drv,struct wpa_driver_associate_params * params)610 static int32_t WifiWpaDriverAp(WifiDriverData *drv, struct wpa_driver_associate_params *params)
611 {
612     int32_t ret;
613     WifiSetMode setMode;
614     errno_t rc;
615 
616     if ((drv == NULL) || (params == NULL)) {
617         wpa_printf(MSG_ERROR, "%s input NULL ptr.", __FUNCTION__);
618         return -EFAIL;
619     }
620     rc = memset_s(&setMode, sizeof(WifiSetMode), 0, sizeof(WifiSetMode));
621     if (rc != EOK) {
622         wpa_printf(MSG_ERROR, "%s: memset failed.", __FUNCTION__);
623         return -EFAIL;
624     }
625     if (params->p2p) {
626         wpa_printf(MSG_INFO, "%s: Setup AP operations for P2P group.(GO).", __FUNCTION__);
627         setMode.iftype = WIFI_IFTYPE_P2P_GO;
628     } else {
629         setMode.iftype = WIFI_IFTYPE_AP;
630     }
631     rc = memcpy_s(setMode.bssid, ETH_ADDR_LEN, drv->ownAddr, ETH_ADDR_LEN);
632     if (rc != EOK) {
633         wpa_printf(MSG_ERROR, "%s memcpy failed.", __FUNCTION__);
634         return -EFAIL;
635     }
636     ret = WifiCmdSetMode(drv->iface, &setMode);
637     if (ret != SUCC) {
638         wpa_printf(MSG_ERROR, "%s: set mode failed.", __FUNCTION__);
639         return -EFAIL;
640     }
641     return SUCC;
642 }
643 
WifiWpaAssocParamsSet(WifiDriverData * drv,struct wpa_driver_associate_params * params,WifiAssociateParams * assocParams)644 static int32_t WifiWpaAssocParamsSet(WifiDriverData *drv, struct wpa_driver_associate_params *params,
645     WifiAssociateParams *assocParams)
646 {
647     if (params->bssid != NULL) {
648         assocParams->bssid = (uint8_t *)os_zalloc(ETH_ADDR_LEN);
649         if (assocParams->bssid == NULL) {
650             return -EFAIL;
651         }
652         if (memcpy_s(assocParams->bssid, ETH_ADDR_LEN, params->bssid, ETH_ADDR_LEN) != EOK) {
653             return -EFAIL;
654         }
655     }
656 
657     if (params->freq.freq != 0) {
658         assocParams->freq = params->freq.freq;
659     }
660     if (params->ssid_len > MAX_SSID_LEN) {
661         params->ssid_len = MAX_SSID_LEN;
662     }
663     if ((params->ssid != NULL) && (params->ssid_len != 0)) {
664         assocParams->ssid = (uint8_t *)os_zalloc(params->ssid_len);
665         if (assocParams->ssid == NULL) {
666             return -EFAIL;
667         }
668         assocParams->ssidLen = params->ssid_len;
669         if (memcpy_s(assocParams->ssid, assocParams->ssidLen, params->ssid, params->ssid_len) != EOK) {
670             return -EFAIL;
671         }
672         if (memset_s(drv->ssid, MAX_SSID_LEN, 0, MAX_SSID_LEN) != EOK) {
673             return -EFAIL;
674         }
675         if (memcpy_s(drv->ssid, MAX_SSID_LEN, params->ssid, params->ssid_len) != EOK) {
676             return -EFAIL;
677         }
678         drv->ssidLen = params->ssid_len;
679     }
680 
681     if ((params->wpa_ie != NULL) && (params->wpa_ie_len != 0)) {
682         assocParams->ie = (uint8_t *)os_zalloc(params->wpa_ie_len);
683         if (assocParams->ie == NULL) {
684             return -EFAIL;
685         }
686         assocParams->ieLen = params->wpa_ie_len;
687         if (memcpy_s(assocParams->ie, assocParams->ieLen, params->wpa_ie, params->wpa_ie_len) != EOK) {
688             return -EFAIL;
689         }
690     }
691 
692     return SUCC;
693 }
694 
WifiCipherToCipherSuite(uint32_t cipher)695 static uint32_t WifiCipherToCipherSuite(uint32_t cipher)
696 {
697     switch (cipher) {
698         case WPA_CIPHER_CCMP_256:
699             return RSN_CIPHER_SUITE_CCMP_256;
700         case WPA_CIPHER_GCMP_256:
701             return RSN_CIPHER_SUITE_GCMP_256;
702         case WPA_CIPHER_CCMP:
703             return RSN_CIPHER_SUITE_CCMP;
704         case WPA_CIPHER_GCMP:
705             return RSN_CIPHER_SUITE_GCMP;
706         case WPA_CIPHER_TKIP:
707             return RSN_CIPHER_SUITE_TKIP;
708         case WPA_CIPHER_WEP104:
709             return RSN_CIPHER_SUITE_WEP104;
710         case WPA_CIPHER_WEP40:
711             return RSN_CIPHER_SUITE_WEP40;
712         case WPA_CIPHER_GTK_NOT_USED:
713             return RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED;
714         default:
715             return 0;
716     }
717 }
718 
WifiWpaAssocParamCryptoSet(const struct wpa_driver_associate_params * params,WifiAssociateParams * assocParams)719 static int32_t WifiWpaAssocParamCryptoSet(const struct wpa_driver_associate_params *params,
720     WifiAssociateParams *assocParams)
721 {
722     uint32_t ver = 0;
723     uint32_t akm_suites_num = 0;
724     uint32_t ciphers_pairwise_num = 0;
725     int32_t mgmt = RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X;
726 
727     assocParams->crypto = (WifiCryptoSetting *)os_zalloc(sizeof(WifiCryptoSetting));
728     if (assocParams->crypto == NULL) {
729         return -EFAIL;
730     }
731 
732     if (params->wpa_proto != 0) {
733         if (params->wpa_proto & WPA_PROTO_WPA) {
734             ver |= WPA_VERSION_1;
735         }
736         if (params->wpa_proto & WPA_PROTO_RSN) {
737             ver |= WPA_VERSION_2;
738         }
739         assocParams->crypto->wpaVersions = ver;
740     }
741 
742     if (params->pairwise_suite != WPA_CIPHER_NONE) {
743         assocParams->crypto->ciphersPairwise[ciphers_pairwise_num++] = WifiCipherToCipherSuite(params->pairwise_suite);
744         assocParams->crypto->nCiphersPairwise = ciphers_pairwise_num;
745     }
746 
747     if (params->group_suite != WPA_CIPHER_NONE) {
748         assocParams->crypto->cipherGroup = WifiCipherToCipherSuite(params->group_suite);
749     }
750 
751     if (params->key_mgmt_suite == WPA_KEY_MGMT_PSK || params->key_mgmt_suite == WPA_KEY_MGMT_SAE ||
752         params->key_mgmt_suite == WPA_KEY_MGMT_PSK_SHA256) {
753         switch (params->key_mgmt_suite) {
754             case WPA_KEY_MGMT_PSK_SHA256:
755                 mgmt = RSN_AUTH_KEY_MGMT_PSK_SHA256;
756                 break;
757             case WPA_KEY_MGMT_SAE:
758                 mgmt = RSN_AUTH_KEY_MGMT_SAE;
759                 break;
760             case WPA_KEY_MGMT_PSK: /* fall through */
761             default:
762                 mgmt = RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X;
763                 break;
764         }
765         assocParams->crypto->akmSuites[akm_suites_num++] = mgmt;
766         assocParams->crypto->nAkmSuites = akm_suites_num;
767     }
768 
769     return SUCC;
770 }
771 
WifiWpaSetConnKeys(const struct wpa_driver_associate_params * wpa_params,WifiAssociateParams * params)772 static void WifiWpaSetConnKeys(const struct wpa_driver_associate_params *wpa_params, WifiAssociateParams *params)
773 {
774     int32_t loop;
775     uint8_t privacy;
776     errno_t rc;
777 
778     if ((wpa_params == NULL) || (params == NULL)) {
779         return;
780     }
781 
782     privacy = 0;
783     for (loop = 0; loop < WEP_KEY_NUM; loop++) {
784         if (wpa_params->wep_key[loop] == NULL) {
785             continue;
786         }
787         privacy = 1;
788         break;
789     }
790 
791     if ((wpa_params->wps == WPS_MODE_PRIVACY) ||
792         ((wpa_params->pairwise_suite != 0) && (wpa_params->pairwise_suite != WPA_CIPHER_NONE))) {
793         privacy = 1;
794     }
795     if (privacy == 0) {
796         return;
797     }
798     params->privacy = privacy;
799     for (loop = 0; loop < WEP_KEY_NUM; loop++) {
800         if (wpa_params->wep_key[loop] == NULL) {
801             continue;
802         }
803         params->keyLen = wpa_params->wep_key_len[loop];
804         params->key = (uint8_t *)os_zalloc(params->keyLen);
805         if (params->key == NULL) {
806             return;
807         }
808 
809         rc = memcpy_s(params->key, params->keyLen, wpa_params->wep_key[loop], params->keyLen);
810         if (rc != EOK) {
811             os_free(params->key);
812             params->key = NULL;
813             return;
814         }
815         params->keyIdx = wpa_params->wep_tx_keyidx;
816         break;
817     }
818 
819     return;
820 }
821 
WifiWpaConnectFree(WifiAssociateParams ** params)822 static void WifiWpaConnectFree(WifiAssociateParams **params)
823 {
824     if (params == NULL || *params == NULL) {
825         return;
826     }
827 
828     if ((*params)->ie != NULL) {
829         os_free((*params)->ie);
830         (*params)->ie = NULL;
831     }
832     if ((*params)->crypto != NULL) {
833         os_free((*params)->crypto);
834         (*params)->crypto = NULL;
835     }
836     if ((*params)->ssid != NULL) {
837         os_free((*params)->ssid);
838         (*params)->ssid = NULL;
839     }
840     if ((*params)->bssid != NULL) {
841         os_free((*params)->bssid);
842         (*params)->bssid = NULL;
843     }
844     if ((*params)->key != NULL) {
845         os_free((*params)->key);
846         (*params)->key = NULL;
847     }
848 
849     os_free(*params);
850     *params = NULL;
851 }
852 
WifiGetStaAuthType(const struct wpa_driver_associate_params * params)853 static WifiAuthType WifiGetStaAuthType(const struct wpa_driver_associate_params *params)
854 {
855     WifiAuthType type = WIFI_AUTHTYPE_BUTT;
856     uint32_t algs = 0;
857 
858     if ((uint32_t)(params->auth_alg) & WPA_AUTH_ALG_OPEN) {
859         type = WIFI_AUTHTYPE_OPEN_SYSTEM;
860         algs++;
861     }
862     if ((uint32_t)(params->auth_alg) & WPA_AUTH_ALG_SHARED) {
863         type = WIFI_AUTHTYPE_SHARED_KEY;
864         algs++;
865     }
866     if ((uint32_t)(params->auth_alg) & WPA_AUTH_ALG_LEAP) {
867         type = WIFI_AUTHTYPE_EAP;
868         algs++;
869     }
870 
871     if (algs > 1) {
872         return WIFI_AUTHTYPE_AUTOMATIC;
873     } else if (algs == 1) {
874         return type;
875     }
876 
877     if ((uint32_t)params->auth_alg & WPA_AUTH_ALG_FT) {
878         type = WIFI_AUTHTYPE_FT;
879     }
880     return type;
881 }
882 
WifiWpaTryConnect(WifiDriverData * drv,struct wpa_driver_associate_params * params)883 static int32_t WifiWpaTryConnect(WifiDriverData *drv, struct wpa_driver_associate_params *params)
884 {
885     WifiAssociateParams *assocParams = NULL;
886     int32_t ret = -EFAIL;
887 
888     if ((drv == NULL) || (params == NULL)) {
889         return -EFAIL;
890     }
891 
892     assocParams = (WifiAssociateParams *)os_zalloc(sizeof(WifiAssociateParams));
893     if (assocParams == NULL) {
894         return ret;
895     }
896     if (WifiWpaAssocParamsSet(drv, params, assocParams) != SUCC) {
897         wpa_printf(MSG_ERROR, "WifiWpaTryConnect set assoc params faild");
898         goto skip_auth_type;
899     }
900     if (WifiWpaAssocParamCryptoSet(params, assocParams) != SUCC) {
901         wpa_printf(MSG_ERROR, "WifiWpaTryConnect set assoc crypto faild");
902         goto skip_auth_type;
903     }
904     assocParams->mfp = params->mgmt_frame_protection;
905     assocParams->authType = WifiGetStaAuthType(params);
906 
907     WifiWpaSetConnKeys(params, assocParams);
908     ret = WifiCmdAssoc(drv->iface, assocParams);
909     if (ret != SUCC) {
910         wpa_printf(MSG_ERROR, "WifiWpaTryConnect assoc faild");
911     }
912 
913 skip_auth_type:
914     WifiWpaConnectFree(&assocParams);
915     return ret;
916 }
917 
WifiWpaDisconnet(WifiDriverData * drv,uint16_t reasonCode)918 static int32_t WifiWpaDisconnet(WifiDriverData *drv, uint16_t reasonCode)
919 {
920     int32_t ret;
921 
922     if (drv == NULL) {
923         return -EFAIL;
924     }
925     ret = WifiCmdDisconnet(drv->iface, reasonCode);
926     if (ret == SUCC) {
927         drv->associated = WIFI_DISCONNECT;
928     }
929     wpa_printf(MSG_INFO, "WifiWpaDisconnet done ret=%d", ret);
930     return ret;
931 }
WifiWpaAssociate(void * priv,struct wpa_driver_associate_params * params)932 static int WifiWpaAssociate(void *priv, struct wpa_driver_associate_params *params)
933 {
934     int ret;
935     WifiDriverData *drv = priv;
936 
937     if ((drv == NULL) || (params == NULL)) {
938         return -EFAIL;
939     }
940 #ifdef CONFIG_OHOS_P2P
941     if (params->mode == IEEE80211_MODE_AP) {
942         return WifiWpaDriverAp(drv, params);
943     }
944 #endif
945     ret = WifiWpaTryConnect(drv, params);
946     if (ret != SUCC) {
947         if (WifiWpaDisconnet(drv, WLAN_REASON_PREV_AUTH_NOT_VALID)) {
948             return -EFAIL;
949         }
950         ret = WifiWpaTryConnect(drv, params);
951     }
952     wpa_printf(MSG_INFO, "WifiWpaAssociate done ret=%d", ret);
953     return ret;
954 }
955 
WifiWpaGetMacAddr(void * priv)956 static const uint8_t *WifiWpaGetMacAddr(void *priv)
957 {
958     WifiDriverData *drv = priv;
959 
960     if (priv == NULL) {
961         return NULL;
962     }
963     return drv->ownAddr;
964 }
965 
WifiWpaWpaSendEapol(void * priv,const uint8_t * dest,uint16_t proto,const uint8_t * data,size_t dataLen)966 int32_t WifiWpaWpaSendEapol(void *priv, const uint8_t *dest, uint16_t proto, const uint8_t *data, size_t dataLen)
967 {
968     WifiDriverData *drv = priv;
969     int32_t ret;
970     uint32_t frameLen;
971     uint8_t *frame = NULL;
972     uint8_t *payload = NULL;
973     struct l2_ethhdr *l2_ethhdr = NULL;
974     errno_t rc;
975 
976     if ((priv == NULL) || (data == NULL) || (dest == NULL)) {
977         return -EFAIL;
978     }
979 
980     frameLen = dataLen + sizeof(struct l2_ethhdr);
981     frame = os_zalloc(frameLen);
982     if (frame == NULL) {
983         return -EFAIL;
984     }
985 
986     l2_ethhdr = (struct l2_ethhdr *)frame;
987     rc = memcpy_s(l2_ethhdr->h_dest, ETH_ADDR_LEN, dest, ETH_ADDR_LEN);
988     if (rc != EOK) {
989         os_free(frame);
990         frame = NULL;
991         return -EFAIL;
992     }
993     rc = memcpy_s(l2_ethhdr->h_source, ETH_ADDR_LEN, drv->ownAddr, ETH_ADDR_LEN);
994     if (rc != EOK) {
995         os_free(frame);
996         frame = NULL;
997         return -EFAIL;
998     }
999     l2_ethhdr->h_proto = host_to_be16(proto);
1000 
1001     payload = (uint8_t *)(l2_ethhdr + 1);
1002     rc = memcpy_s(payload, dataLen, data, dataLen);
1003     if (rc != EOK) {
1004         os_free(frame);
1005         frame = NULL;
1006         return -EFAIL;
1007     }
1008     ret = l2_packet_send(drv->eapolSock, dest, host_to_be16(proto), frame, frameLen);
1009     os_free(frame);
1010     frame = NULL;
1011     wpa_printf(MSG_INFO, "WifiWpaWpaSendEapol done ret=%d", ret);
1012     return ret;
1013 }
1014 
WifiWpaHwFeatureDataFree(struct hostapd_hw_modes ** modes,uint16_t num)1015 static void WifiWpaHwFeatureDataFree(struct hostapd_hw_modes **modes, uint16_t num)
1016 {
1017     uint16_t loop;
1018 
1019     if (modes == NULL || *modes == NULL) {
1020         return;
1021     }
1022     for (loop = 0; loop < num; ++loop) {
1023         if ((*modes)[loop].channels != NULL) {
1024             os_free((*modes)[loop].channels);
1025             (*modes)[loop].channels = NULL;
1026         }
1027         if ((*modes)[loop].rates != NULL) {
1028             os_free((*modes)[loop].rates);
1029             (*modes)[loop].rates = NULL;
1030         }
1031     }
1032     os_free(*modes);
1033     *modes = NULL;
1034 }
1035 
WifiWpaGetHwFeatureData(void * priv,uint16_t * numModes,uint16_t * flags,uint8_t * dfs)1036 static struct hostapd_hw_modes *WifiWpaGetHwFeatureData(void *priv, uint16_t *numModes, uint16_t *flags, uint8_t *dfs)
1037 {
1038     WifiModes modesData[] = {{IEEE80211G_RATES_NUM, HOSTAPD_MODE_IEEE80211G},
1039         {IEEE80211B_RATES_NUM, HOSTAPD_MODE_IEEE80211B}, {IEEE80211A_RATES_NUM, HOSTAPD_MODE_IEEE80211A}};
1040     size_t loop;
1041     uint32_t index;
1042     uint32_t iee80211band;
1043     WifiHwFeatureData hwFeatureData;
1044     WifiDriverData *drv = (WifiDriverData *)priv;
1045     (void)dfs;
1046     if ((priv == NULL) || (numModes == NULL) || (flags == NULL)) {
1047         return NULL;
1048     }
1049     (void)memset_s(&hwFeatureData, sizeof(WifiHwFeatureData), 0, sizeof(WifiHwFeatureData));
1050     *numModes = DEFAULT_NUM_MODES;
1051     *flags = 0;
1052 
1053     if (WifiCmdGetHwFeature(drv->iface, &hwFeatureData) != SUCC) {
1054         return NULL;
1055     }
1056     if (hwFeatureData.bands[IEEE80211_BAND_5GHZ].channelNum != 0) {
1057         *numModes = sizeof(modesData) / sizeof(WifiModes);
1058     }
1059     struct hostapd_hw_modes *modes = os_calloc(*numModes, sizeof(struct hostapd_hw_modes));
1060     if (modes == NULL) {
1061         return NULL;
1062     }
1063 
1064     for (loop = 0; loop < *numModes; ++loop) {
1065         modes[loop].channels = NULL;
1066         modes[loop].rates = NULL;
1067     }
1068 
1069     modes[0].ht_capab = hwFeatureData.htCapab;
1070     iee80211band = IEEE80211_BAND_2GHZ;
1071     for (index = 0; index < *numModes; index++) {
1072         if (index >= DEFAULT_NUM_MODES) {
1073             iee80211band = IEEE80211_BAND_5GHZ;
1074         }
1075         modes[index].mode = modesData[index].mode;
1076         modes[index].num_channels = hwFeatureData.bands[iee80211band].channelNum;
1077         modes[index].num_rates = modesData[index].numRates;
1078         modes[index].channels = os_calloc(hwFeatureData.bands[iee80211band].channelNum, sizeof(struct hostapd_channel_data));
1079         modes[index].rates = os_calloc(modes[index].num_rates, sizeof(uint32_t));
1080         if ((modes[index].channels == NULL) || (modes[index].rates == NULL)) {
1081             WifiWpaHwFeatureDataFree(&modes, *numModes);
1082             return NULL;
1083         }
1084 
1085         for (loop = 0; loop < (size_t)hwFeatureData.bands[iee80211band].channelNum; loop++) {
1086             modes[index].channels[loop].chan = hwFeatureData.bands[iee80211band].iee80211Channel[loop].channel;
1087             modes[index].channels[loop].freq = hwFeatureData.bands[iee80211band].iee80211Channel[loop].freq;
1088             modes[index].channels[loop].flag = hwFeatureData.bands[iee80211band].iee80211Channel[loop].flags;
1089         }
1090 
1091         for (loop = 0; loop < (size_t)modes[index].num_rates; loop++) {
1092             if (index < DEFAULT_NUM_MODES) {
1093                 modes[index].rates[loop] = hwFeatureData.bitrate[loop];
1094             } else {
1095                 modes[index].rates[loop] = hwFeatureData.bitrate[loop + IEEE80211B_RATES_NUM];
1096             }
1097         }
1098     }
1099 
1100     wpa_printf(MSG_INFO, "WifiWpaGetHwFeatureData done");
1101     return modes;
1102 }
1103 
WifiWpaSendMlme(void * priv,const uint8_t * data,size_t dataLen,int32_t noack,uint32_t freq,const uint16_t * csaOffs,size_t csaOffsLen)1104 static int32_t WifiWpaSendMlme(void *priv, const uint8_t *data, size_t dataLen, int32_t noack, uint32_t freq,
1105     const uint16_t *csaOffs, size_t csaOffsLen)
1106 {
1107     int32_t ret;
1108     WifiDriverData *drv = priv;
1109     WifiMlmeData *mlme = NULL;
1110     errno_t rc;
1111 
1112     (void)freq;
1113     (void)csaOffs;
1114     (void)csaOffsLen;
1115     (void)noack;
1116     if ((priv == NULL) || (data == NULL)) {
1117         return -EFAIL;
1118     }
1119     mlme = os_zalloc(sizeof(WifiMlmeData));
1120     if (mlme == NULL) {
1121         return -EFAIL;
1122     }
1123     mlme->data = NULL;
1124     mlme->dataLen = dataLen;
1125     mlme->cookie = &(drv->actionCookie);
1126     if ((data != NULL) && (dataLen != 0)) {
1127         mlme->data = (uint8_t *)os_zalloc(dataLen);
1128         if (mlme->data == NULL) {
1129             os_free(mlme);
1130             mlme = NULL;
1131             return -EFAIL;
1132         }
1133         rc = memcpy_s(mlme->data, dataLen, data, dataLen);
1134         if (rc != EOK) {
1135             os_free(mlme->data);
1136             mlme->data = NULL;
1137             os_free(mlme);
1138             return -EFAIL;
1139         }
1140     }
1141     ret = WifiCmdSendMlme(drv->iface, mlme);
1142     os_free(mlme->data);
1143     mlme->data = NULL;
1144     os_free(mlme);
1145     if (ret != SUCC) {
1146         ret = -EFAIL;
1147     }
1148     wpa_printf(MSG_INFO, "WifiWpaSendMlme done ret=%d", ret);
1149     return ret;
1150 }
1151 
WifiWpaGetScanResults2(void * priv)1152 static struct wpa_scan_results *WifiWpaGetScanResults2(void *priv)
1153 {
1154     struct wpa_scan_results *results = NULL;
1155     WifiDriverData *drv = priv;
1156     uint32_t loop;
1157     errno_t rc;
1158 
1159     if (priv == NULL) {
1160         return NULL;
1161     }
1162 
1163     results = (struct wpa_scan_results *)os_zalloc(sizeof(struct wpa_scan_results));
1164     if (results == NULL) {
1165         return NULL;
1166     }
1167 
1168     results->num = drv->scanNum;
1169     if (results->num == 0) {
1170         return results;
1171     }
1172     results->res = (struct wpa_scan_res **)os_zalloc(results->num * sizeof(struct wpa_scan_res *));
1173     if (results->res == NULL) {
1174         os_free(results);
1175         results = NULL;
1176         return NULL;
1177     }
1178     rc = memcpy_s(results->res, results->num * sizeof(struct wpa_scan_res *), drv->scanRes,
1179         results->num * sizeof(struct wpa_scan_res *));
1180     if (rc != EOK) {
1181         os_free(results->res);
1182         os_free(results);
1183         results = NULL;
1184         return NULL;
1185     }
1186     drv->scanNum = 0;
1187     for (loop = 0; loop < SCAN_AP_LIMIT; loop++) {
1188         drv->scanRes[loop] = NULL;
1189     }
1190     wpa_printf(MSG_INFO, "WifiWpaGetScanResults2 done");
1191     return results;
1192 }
1193 
WifiWpaInit2(void * ctx,const char * ifname,void * globalPriv)1194 static void *WifiWpaInit2(void *ctx, const char *ifname, void *globalPriv)
1195 {
1196     (void)globalPriv;
1197     return WifiWpaInit(ctx, ifname);
1198 }
1199 
WifiWpaScanProcessSsid(struct wpa_driver_scan_params * params,WifiScan * scan)1200 static int32_t WifiWpaScanProcessSsid(struct wpa_driver_scan_params *params, WifiScan *scan)
1201 {
1202     errno_t rc;
1203     size_t loop;
1204     if (params->num_ssids == 0) {
1205         return SUCC;
1206     }
1207 
1208     scan->numSsids = params->num_ssids;
1209     scan->ssids = (WifiDriverScanSsid *)os_zalloc(sizeof(WifiDriverScanSsid) * params->num_ssids);
1210     if (scan->ssids == NULL) {
1211         return -EFAIL;
1212     }
1213 
1214     for (loop = 0; (loop < params->num_ssids) && (loop < WPAS_MAX_SCAN_SSIDS); loop++) {
1215         wpa_printf(MSG_INFO, "WIFI: Scan : %s SSID : %zu\n", params->ssids[loop].ssid, params->ssids[loop].ssid_len);
1216 
1217         if (params->ssids[loop].ssid_len > MAX_SSID_LEN) {
1218             params->ssids[loop].ssid_len = MAX_SSID_LEN;
1219         }
1220         if (params->ssids[loop].ssid_len) {
1221             rc = memcpy_s(scan->ssids[loop].ssid, MAX_SSID_LEN, params->ssids[loop].ssid, params->ssids[loop].ssid_len);
1222             if (rc != EOK) {
1223                 return -EFAIL;
1224             }
1225         }
1226         scan->ssids[loop].ssidLen = params->ssids[loop].ssid_len;
1227     }
1228 
1229     return SUCC;
1230 }
1231 
WifiWpaScanProcessBssid(const struct wpa_driver_scan_params * params,WifiScan * scan)1232 static int32_t WifiWpaScanProcessBssid(const struct wpa_driver_scan_params *params, WifiScan *scan)
1233 {
1234     errno_t rc;
1235     if (params->bssid != NULL) {
1236         scan->bssid = (uint8_t *)os_zalloc(ETH_ADDR_LEN);
1237         if (scan->bssid == NULL) {
1238             return -EFAIL;
1239         }
1240         rc = memcpy_s(scan->bssid, ETH_ADDR_LEN, params->bssid, ETH_ADDR_LEN);
1241         if (rc != EOK) {
1242             return -EFAIL;
1243         }
1244     }
1245     return SUCC;
1246 }
1247 
WifiWpaScanProcessExtraIes(const struct wpa_driver_scan_params * params,WifiScan * scan)1248 static int32_t WifiWpaScanProcessExtraIes(const struct wpa_driver_scan_params *params, WifiScan *scan)
1249 {
1250     errno_t rc;
1251     if ((params->extra_ies != NULL) && (params->extra_ies_len != 0)) {
1252         scan->extraIes = (uint8_t *)os_zalloc(params->extra_ies_len);
1253         if (scan->extraIes == NULL) {
1254             return -EFAIL;
1255         }
1256 
1257         rc = memcpy_s(scan->extraIes, params->extra_ies_len, params->extra_ies, params->extra_ies_len);
1258         if (rc != EOK) {
1259             return -EFAIL;
1260         }
1261         scan->extraIesLen = params->extra_ies_len;
1262     }
1263     return SUCC;
1264 }
1265 
WifiWpaScanProcessFreq(const struct wpa_driver_scan_params * params,WifiScan * scan)1266 static int32_t WifiWpaScanProcessFreq(const struct wpa_driver_scan_params *params, WifiScan *scan)
1267 {
1268     uint32_t numFreqs;
1269     int32_t *freqs = NULL;
1270     errno_t rc;
1271 
1272     if (params->freqs != NULL) {
1273         numFreqs = 0;
1274         for (freqs = params->freqs; *freqs != 0; freqs++) {
1275             numFreqs++;
1276             if (numFreqs > 14) { // 14 is 2.4G channel num
1277                 return -EFAIL;
1278             }
1279         }
1280 
1281         scan->numFreqs = numFreqs;
1282         scan->freqs = (int32_t *)os_zalloc(numFreqs * (sizeof(int32_t)));
1283         if (scan->freqs == NULL) {
1284             return -EFAIL;
1285         }
1286         rc = memcpy_s(scan->freqs, numFreqs * (sizeof(int32_t)), params->freqs, numFreqs * (sizeof(int32_t)));
1287         if (rc != EOK) {
1288             return -EFAIL;
1289         }
1290     }
1291     return SUCC;
1292 }
1293 
WifiWpaScanFree(WifiScan ** scan)1294 static void WifiWpaScanFree(WifiScan **scan)
1295 {
1296     if (scan == NULL || *scan == NULL) {
1297         return;
1298     }
1299 
1300     if ((*scan)->ssids != NULL) {
1301         os_free((*scan)->ssids);
1302         (*scan)->ssids = NULL;
1303     }
1304     if ((*scan)->bssid != NULL) {
1305         os_free((*scan)->bssid);
1306         (*scan)->bssid = NULL;
1307     }
1308 
1309     if ((*scan)->extraIes != NULL) {
1310         os_free((*scan)->extraIes);
1311         (*scan)->extraIes = NULL;
1312     }
1313 
1314     if ((*scan)->freqs != NULL) {
1315         os_free((*scan)->freqs);
1316         (*scan)->freqs = NULL;
1317     }
1318 
1319     os_free(*scan);
1320     *scan = NULL;
1321 }
1322 
WifiWpaScanTimeout(void * eloop,void * ctx)1323 void WifiWpaScanTimeout(void *eloop, void *ctx)
1324 {
1325     (void)eloop;
1326     if (ctx == NULL) {
1327         return;
1328     }
1329     wpa_supplicant_event(ctx, EVENT_SCAN_RESULTS, NULL);
1330 }
1331 
WifiWpaScan2(void * priv,struct wpa_driver_scan_params * params)1332 static int32_t WifiWpaScan2(void *priv, struct wpa_driver_scan_params *params)
1333 {
1334     WifiScan *scan = NULL;
1335     WifiDriverData *drv = NULL;
1336     int32_t timeout;
1337     int32_t ret;
1338 
1339     if ((priv == NULL) || (params == NULL) || (params->num_ssids > WPAS_MAX_SCAN_SSIDS)) {
1340         return -EFAIL;
1341     }
1342     drv = (WifiDriverData *)priv;
1343     scan = (WifiScan *)os_zalloc(sizeof(WifiScan));
1344     if (scan == NULL) {
1345         return -EFAIL;
1346     }
1347     if ((WifiWpaScanProcessSsid(params, scan) != SUCC) || (WifiWpaScanProcessBssid(params, scan) != SUCC) ||
1348         (WifiWpaScanProcessExtraIes(params, scan) != SUCC) || (WifiWpaScanProcessFreq(params, scan) != SUCC)) {
1349         WifiWpaScanFree(&scan);
1350         return -EFAIL;
1351     }
1352 
1353     scan->fastConnectFlag = WPA_FLAG_OFF;
1354     scan->prefixSsidScanFlag = WPA_FLAG_OFF;
1355     ret = WifiCmdScan(drv->iface, scan);
1356     WifiWpaScanFree(&scan);
1357 
1358     timeout = SCAN_TIME_OUT;
1359     eloop_cancel_timeout(WifiWpaScanTimeout, drv, drv->ctx);
1360     eloop_register_timeout(timeout, 0, WifiWpaScanTimeout, drv, drv->ctx);
1361 
1362     return ret;
1363 }
1364 
WifiSetApFreq(WifiApSetting * apsettings,const struct wpa_driver_ap_params * params)1365 static void WifiSetApFreq(WifiApSetting *apsettings, const struct wpa_driver_ap_params *params)
1366 {
1367     if (params->freq != NULL) {
1368         apsettings->freqParams.mode = params->freq->mode;
1369         apsettings->freqParams.freq = params->freq->freq;
1370         apsettings->freqParams.channel = params->freq->channel;
1371         apsettings->freqParams.htEnabled = params->freq->ht_enabled;
1372         apsettings->freqParams.secChannelOffset = params->freq->sec_channel_offset;
1373         apsettings->freqParams.centerFreq1 = params->freq->center_freq1;
1374         apsettings->freqParams.bandwidth = params->freq->bandwidth;
1375         if (params->freq->bandwidth == WPA_BANDWIDTH_20) {
1376             apsettings->freqParams.bandwidth = WIFI_CHAN_WIDTH_20;
1377         } else {
1378             apsettings->freqParams.bandwidth = WIFI_CHAN_WIDTH_40;
1379         }
1380     }
1381 }
1382 
WifiSetApBand(WifiApSetting * apsettings,struct hostapd_data * hapd)1383 static void WifiSetApBand(WifiApSetting *apsettings, struct hostapd_data *hapd)
1384 {
1385     if ((apsettings!= NULL) && (hapd!= NULL)) {
1386         switch (hapd->conf->wps_rf_bands) {
1387             case WPS_RF_24GHZ:
1388                 apsettings->freqParams.band = IEEE80211_BAND_2GHZ;
1389                 break;
1390             case WPS_RF_50GHZ:
1391                 apsettings->freqParams.band = IEEE80211_BAND_5GHZ;
1392                 break;
1393             default:
1394                 apsettings->freqParams.band = IEEE80211_BAND_2GHZ;
1395                 break;
1396         }
1397     }
1398 }
1399 
WifiSetApBeaconData(WifiApSetting * apsettings,const struct wpa_driver_ap_params * params)1400 static int WifiSetApBeaconData(WifiApSetting *apsettings, const struct wpa_driver_ap_params *params)
1401 {
1402     if ((params->head != NULL) && (params->head_len != 0)) {
1403         apsettings->beaconData.headLen = params->head_len;
1404         apsettings->beaconData.head = (uint8_t *)os_zalloc(apsettings->beaconData.headLen);
1405         if (apsettings->beaconData.head == NULL) {
1406             return -EFAIL;
1407         }
1408         if (memcpy_s(apsettings->beaconData.head, apsettings->beaconData.headLen, params->head, params->head_len) !=
1409             EOK) {
1410             return -EFAIL;
1411         }
1412     }
1413 
1414     if ((params->tail != NULL) && (params->tail_len != 0)) {
1415         apsettings->beaconData.tailLen = params->tail_len;
1416         apsettings->beaconData.tail = (uint8_t *)os_zalloc(apsettings->beaconData.tailLen);
1417         if (apsettings->beaconData.tail == NULL) {
1418             return -EFAIL;
1419         }
1420         if (memcpy_s(apsettings->beaconData.tail, apsettings->beaconData.tailLen, params->tail, params->tail_len) !=
1421             EOK) {
1422             return -EFAIL;
1423         }
1424     }
1425     return SUCC;
1426 }
1427 
WifiApSettingsFree(WifiApSetting ** apsettings)1428 static void WifiApSettingsFree(WifiApSetting **apsettings)
1429 {
1430     if (apsettings == NULL || *apsettings == NULL) {
1431         return;
1432     }
1433 
1434     if ((*apsettings)->meshSsid != NULL) {
1435         os_free((*apsettings)->meshSsid);
1436         (*apsettings)->meshSsid = NULL;
1437     }
1438 
1439     if ((*apsettings)->ssid != NULL) {
1440         os_free((*apsettings)->ssid);
1441         (*apsettings)->ssid = NULL;
1442     }
1443 
1444     if ((*apsettings)->beaconData.head != NULL) {
1445         os_free((*apsettings)->beaconData.head);
1446         (*apsettings)->beaconData.head = NULL;
1447     }
1448 
1449     if ((*apsettings)->beaconData.tail != NULL) {
1450         os_free((*apsettings)->beaconData.tail);
1451         (*apsettings)->beaconData.tail = NULL;
1452     }
1453 
1454     os_free(*apsettings);
1455     *apsettings = NULL;
1456 }
1457 
WifiGetApAuthType(const struct wpa_driver_ap_params * params)1458 static WifiAuthType WifiGetApAuthType(const struct wpa_driver_ap_params *params)
1459 {
1460     WifiAuthType type;
1461 
1462     if ((params->auth_algs & (WPA_AUTH_ALG_OPEN | WPA_AUTH_ALG_SHARED)) == (WPA_AUTH_ALG_OPEN | WPA_AUTH_ALG_SHARED)) {
1463         type = WIFI_AUTHTYPE_AUTOMATIC;
1464     } else if ((params->auth_algs & WPA_AUTH_ALG_SHARED) == WPA_AUTH_ALG_SHARED) {
1465         type = WIFI_AUTHTYPE_SHARED_KEY;
1466     } else {
1467         type = WIFI_AUTHTYPE_OPEN_SYSTEM;
1468     }
1469     return type;
1470 }
1471 
WifiWpaSetAp(void * priv,struct wpa_driver_ap_params * params)1472 static int32_t WifiWpaSetAp(void *priv, struct wpa_driver_ap_params *params)
1473 {
1474     int32_t ret;
1475     WifiApSetting *apsettings = NULL;
1476     WifiDriverData *drv = (WifiDriverData *)priv;
1477     if ((priv == NULL) || (params == NULL) || (params->freq == NULL)) {
1478         return -EFAIL;
1479     }
1480     if ((params->freq->bandwidth != WPA_BANDWIDTH_20) && (params->freq->bandwidth != WPA_BANDWIDTH_40)) {
1481         return -EFAIL;
1482     }
1483 
1484     apsettings = os_zalloc(sizeof(WifiApSetting));
1485     if (apsettings == NULL) {
1486         return -EFAIL;
1487     }
1488     apsettings->beaconInterval = params->beacon_int;
1489     apsettings->dtimPeriod = params->dtim_period;
1490     apsettings->hiddenSsid = params->hide_ssid;
1491     apsettings->authType = WifiGetApAuthType(params);
1492 
1493     if ((params->ssid != NULL) && (params->ssid_len != 0)) {
1494         apsettings->ssidLen = params->ssid_len;
1495         apsettings->ssid = (uint8_t *)os_zalloc(apsettings->ssidLen);
1496         if ((apsettings->ssid == NULL) ||
1497             (memcpy_s(apsettings->ssid, apsettings->ssidLen, params->ssid, params->ssid_len) != EOK)) {
1498             goto failed;
1499         }
1500     }
1501     WifiSetApFreq(apsettings, params);
1502     WifiSetApBand(apsettings, drv->hapd);
1503     if (WifiSetApBeaconData(apsettings, params) != SUCC) {
1504         goto failed;
1505     }
1506     if (drv->beaconSet == TRUE) {
1507         ret = WifiCmdChangeBeacon(drv->iface, apsettings);
1508     } else {
1509         ret = WifiCmdSetAp(drv->iface, apsettings);
1510     }
1511     if (ret == SUCC) {
1512         drv->beaconSet = TRUE;
1513     }
1514     WifiApSettingsFree(&apsettings);
1515     wpa_printf(MSG_INFO, "WifiWpaGetScanResults2 done ret=%d", ret);
1516     return ret;
1517 
1518 failed:
1519     WifiApSettingsFree(&apsettings);
1520     return -EFAIL;
1521 }
1522 
WifiHapdPreInit(const WifiDriverData * drv)1523 static void WifiHapdPreInit(const WifiDriverData *drv)
1524 {
1525     WifiSetNewDev info;
1526 
1527     if (drv == NULL) {
1528         return;
1529     }
1530     info.status = FALSE;
1531     info.ifType = WIFI_IFTYPE_STATION;
1532     info.mode = WIFI_PHY_MODE_11N;
1533     int ret = WifiCmdSetNetdev(drv->iface, &info);
1534 
1535     if (ret != SUCC) {
1536         wpa_printf(MSG_ERROR, "%s set netdev failed ret = %d.", __func__, ret);
1537     }
1538 }
1539 
WifiDrvInit(void * ctx,const struct wpa_init_params * params)1540 static WifiDriverData *WifiDrvInit(void *ctx, const struct wpa_init_params *params)
1541 {
1542     WifiDriverData *drv = NULL;
1543     errno_t rc;
1544     WifiSetNewDev info;
1545     WifiSetMode setMode;
1546     int32_t ret;
1547 #ifdef CONFIG_OHOS_P2P
1548     WifiDev *wifiDev = NULL;
1549 #endif
1550     if ((ctx == NULL) || (params == NULL)) {
1551         return NULL;
1552     }
1553     drv = os_zalloc(sizeof(WifiDriverData));
1554     if (drv == NULL) {
1555         goto failed;
1556     }
1557 
1558     drv->ctx = ctx;
1559     rc = memcpy_s(drv->iface, sizeof(drv->iface), params->ifname, sizeof(drv->iface));
1560     if (rc != EOK) {
1561         os_free(drv);
1562         drv = NULL;
1563         goto failed;
1564     }
1565 #ifdef CONFIG_OHOS_P2P
1566     wifiDev = (WifiDev *)os_zalloc(sizeof(WifiDev));
1567     if (wifiDev == NULL)
1568     {
1569         wpa_printf(MSG_ERROR, "%s wifiDev malloc failed.", __FUNCTION__);
1570         goto failed;
1571     }
1572     wifiDev->priv = drv;
1573     wifiDev->ifNameLen = sizeof(params->ifname);
1574     rc = memcpy_s(wifiDev->ifName, sizeof(wifiDev->ifName), drv->iface, sizeof(drv->iface));
1575     if (rc != EOK) {
1576         wpa_printf(MSG_ERROR, "%s wifiDev could not copy interface name.", __FUNCTION__);
1577         goto failed;
1578     }
1579     wpa_printf(MSG_INFO, "%s init, interface name:%s.", __FUNCTION__, wifiDev->ifName);
1580     SetWifiDev(wifiDev);
1581 #endif // CONFIG_OHOS_P2P
1582     WifiHapdPreInit(drv);
1583 
1584     setMode.iftype = WIFI_IFTYPE_AP;
1585     ret = WifiCmdSetMode(drv->iface, &setMode);
1586     if (ret != SUCC) {
1587         wpa_printf(MSG_ERROR, "WifiWpaHapdInit set mode failed, iface = %s, ret = %d.", drv->iface, ret);
1588         goto failed;
1589     }
1590     info.status = TRUE;
1591     info.ifType = WIFI_IFTYPE_AP;
1592     info.mode = WIFI_PHY_MODE_11N;
1593     ret = WifiCmdSetNetdev(drv->iface, &info);
1594     if (ret != SUCC) {
1595         wpa_printf(MSG_ERROR, "WifiDrvInit set netdev failed");
1596         goto failed;
1597     }
1598     wpa_printf(MSG_INFO, "WifiDrvInit done");
1599     return drv;
1600 
1601 failed:
1602     if (drv != NULL) {
1603         info.status = FALSE;
1604         info.ifType = WIFI_IFTYPE_STATION;
1605         info.mode = WIFI_PHY_MODE_11N;
1606         WifiCmdSetNetdev(drv->iface, &info);
1607         os_free(drv);
1608         drv = NULL;
1609     }
1610 #ifdef CONFIG_OHOS_P2P
1611     FreeWifiDev(wifiDev);
1612 #endif // CONFIG_OHOS_P2P
1613     return NULL;
1614 }
1615 
WifiWpaInitl2(struct wpa_init_params * params,WifiDriverData * drv)1616 static int32_t WifiWpaInitl2(struct wpa_init_params *params, WifiDriverData *drv)
1617 {
1618     int32_t ret;
1619     uint8_t addrTmp[ETH_ADDR_LEN] = {0};
1620 
1621     drv->eapolSock = l2_packet_init(drv->iface, NULL, ETH_P_EAPOL, WifiWpaReceiveEapol, drv, 1);
1622     if (drv->eapolSock == NULL) {
1623         wpa_printf(MSG_ERROR, "WifiDrvInit l2 packet init failed");
1624         return -EFAIL;
1625     }
1626     if (l2_packet_get_own_addr(drv->eapolSock, addrTmp)) {
1627         return -EFAIL;
1628     }
1629     ret = memcpy_s(params->own_addr, ETH_ADDR_LEN, addrTmp, ETH_ADDR_LEN);
1630     if (ret != EOK) {
1631         return -EFAIL;
1632     }
1633     ret = memcpy_s(drv->ownAddr, ETH_ADDR_LEN, addrTmp, ETH_ADDR_LEN);
1634     if (ret != EOK) {
1635         return -EFAIL;
1636     }
1637     return SUCC;
1638 }
1639 
WifiWpaHapdInit(struct hostapd_data * hapd,struct wpa_init_params * params)1640 static void *WifiWpaHapdInit(struct hostapd_data *hapd, struct wpa_init_params *params)
1641 {
1642     WifiDriverData *drv = NULL;
1643 
1644     int32_t ret;
1645 
1646     if ((hapd == NULL) || (params == NULL) || (hapd->conf == NULL)) {
1647         return NULL;
1648     }
1649 
1650     if (WifiClientInit(params->ifname) != SUCC) {
1651         wpa_printf(MSG_ERROR, "Wifi client init failed");
1652         return NULL;
1653     }
1654     drv = WifiDrvInit(hapd, params);
1655     if (drv == NULL) {
1656         wpa_printf(MSG_ERROR, "WifiWpaHapdInit drv init failed");
1657         goto failed;
1658     }
1659     drv->hapd = hapd;
1660 
1661     ret = WifiWpaInitl2(params, drv);
1662     if (ret != SUCC) {
1663         wpa_printf(MSG_ERROR, "WifiWpaInitI2 failed");
1664         goto failed;
1665     }
1666 
1667     g_wifiDriverData = drv;
1668     g_wifiDriverType = WIFI_IFTYPE_AP;
1669     wpa_printf(MSG_INFO, "WifiWpaHapdInit done");
1670     return (void *)drv;
1671 
1672 failed:
1673     if (drv != NULL && drv->eapolSock != NULL) {
1674         l2_packet_deinit(drv->eapolSock);
1675     }
1676     WifiWpaDeinit(drv);
1677     return NULL;
1678 }
1679 
WifiWpaHapdDeinit(void * priv)1680 static void WifiWpaHapdDeinit(void *priv)
1681 {
1682     int32_t ret;
1683     WifiDriverData *drv = NULL;
1684     WifiSetMode setMode;
1685     WifiSetNewDev info;
1686 
1687     if (priv == NULL) {
1688         return;
1689     }
1690 
1691     (void)memset_s(&setMode, sizeof(WifiSetMode), 0, sizeof(WifiSetMode));
1692     drv = (WifiDriverData *)priv;
1693     setMode.iftype = WIFI_IFTYPE_STATION;
1694     info.status = FALSE;
1695     info.ifType = WIFI_IFTYPE_AP;
1696     info.mode = WIFI_PHY_MODE_11N;
1697 
1698     WifiCmdSetNetdev(drv->iface, &info);
1699     ret = WifiCmdSetMode((char *)drv->iface, &setMode);
1700     if (ret != SUCC) {
1701         return;
1702     }
1703 
1704     if (drv->eapolSock != NULL) {
1705         l2_packet_deinit(drv->eapolSock);
1706     }
1707     os_free(g_wifiDriverData);
1708     g_wifiDriverData = NULL;
1709     WifiClientDeinit(drv->iface);
1710 
1711     wpa_printf(MSG_INFO, "WifiWpaHapdDeinit done");
1712 }
1713 
WifiWpaHapdSendEapol(void * priv,const uint8_t * addr,const uint8_t * data,size_t dataLen,int encrypt,const uint8_t * ownAddr,uint32_t flags)1714 static int32_t WifiWpaHapdSendEapol(void *priv, const uint8_t *addr, const uint8_t *data, size_t dataLen, int encrypt,
1715     const uint8_t *ownAddr, uint32_t flags)
1716 {
1717     WifiDriverData *drv = priv;
1718     int32_t ret;
1719     uint32_t frameLen;
1720     uint8_t *frameBuf = NULL;
1721     uint8_t *payload = NULL;
1722     struct l2_ethhdr *ethhdr = NULL;
1723 
1724     (void)encrypt;
1725     (void)flags;
1726     if ((priv == NULL) || (addr == NULL) || (data == NULL) || (ownAddr == NULL)) {
1727         return -EFAIL;
1728     }
1729 
1730     frameLen = dataLen + sizeof(struct l2_ethhdr);
1731     frameBuf = os_zalloc(frameLen);
1732     if (frameBuf == NULL) {
1733         return -EFAIL;
1734     }
1735 
1736     ethhdr = (struct l2_ethhdr *)frameBuf;
1737     if (memcpy_s(ethhdr->h_dest, ETH_ADDR_LEN, addr, ETH_ADDR_LEN) != EOK) {
1738         os_free(frameBuf);
1739         frameBuf = NULL;
1740         return -EFAIL;
1741     }
1742     if (memcpy_s(ethhdr->h_source, ETH_ADDR_LEN, ownAddr, ETH_ADDR_LEN) != EOK) {
1743         os_free(frameBuf);
1744         frameBuf = NULL;
1745         return -EFAIL;
1746     }
1747     ethhdr->h_proto = host_to_be16(ETH_P_PAE);
1748     payload = (uint8_t *)(ethhdr + 1);
1749     if (memcpy_s(payload, dataLen, data, dataLen) != EOK) {
1750         os_free(frameBuf);
1751         frameBuf = NULL;
1752         return -EFAIL;
1753     }
1754     ret = l2_packet_send(drv->eapolSock, addr, ETH_P_EAPOL, frameBuf, frameLen);
1755     os_free(frameBuf);
1756     frameBuf = NULL;
1757     wpa_printf(MSG_INFO, "WifiWpaHapdSendEapol done, ret=%d", ret);
1758     return ret;
1759 }
1760 
WifiWpaStaRemove(void * priv,const uint8_t * addr)1761 static int32_t WifiWpaStaRemove(void *priv, const uint8_t *addr)
1762 {
1763     WifiDriverData *drv = NULL;
1764     int32_t ret;
1765 
1766     if ((priv == NULL) || (addr == NULL)) {
1767         return -EFAIL;
1768     }
1769     drv = (WifiDriverData *)priv;
1770     ret = WifiCmdStaRemove(drv->iface, addr, ETH_ADDR_LEN);
1771     if (ret != SUCC) {
1772         return -EFAIL;
1773     }
1774     wpa_printf(MSG_INFO, "WifiWpaStaRemove done, ret=%d", ret);
1775     return ret;
1776 }
1777 
WifiDuplicateStr(const uint8_t * src,size_t len)1778 static uint8_t *WifiDuplicateStr(const uint8_t *src, size_t len)
1779 {
1780     uint8_t *res = NULL;
1781 
1782     if (src == NULL) {
1783         return NULL;
1784     }
1785     res = os_malloc(len + 1);
1786     if (res == NULL) {
1787         return NULL;
1788     }
1789     if (memcpy_s(res, len, src, len) != EOK) {
1790         os_free(res);
1791         return NULL;
1792     }
1793     res[len] = '\0';
1794 
1795     return res;
1796 }
1797 
WifiActionDataBufFree(WifiActionData * actionData)1798 static void WifiActionDataBufFree(WifiActionData *actionData)
1799 {
1800     if (actionData == NULL) {
1801         return;
1802     }
1803     if (actionData->data != NULL) {
1804         os_free(actionData->data);
1805         actionData->data = NULL;
1806     }
1807 }
1808 
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)1809 static int32_t WifiWpaSendAction(void *priv, uint32_t freq, uint32_t wait, const uint8_t *dst, const uint8_t *src,
1810     const uint8_t *bssid, const uint8_t *data, size_t dataLen, int32_t noCck)
1811 {
1812     WifiActionData actionData = {
1813         .dst = {0},
1814         .src = {0},
1815         .bssid = {0},
1816         .data = NULL,
1817         .dataLen = 0,
1818     };
1819     WifiDriverData *drv = NULL;
1820     int32_t ret;
1821 
1822     (void)freq;
1823     (void)wait;
1824     (void)noCck;
1825     if ((priv == NULL) || (data == NULL) || (dst == NULL) || (src == NULL) || (bssid == NULL)) {
1826         return -EFAIL;
1827     }
1828     drv = (WifiDriverData *)priv;
1829 
1830     if (memcpy_s(actionData.dst, ETH_ADDR_LEN, dst, ETH_ADDR_LEN) != EOK) {
1831         return -EFAIL;
1832     }
1833     if (memcpy_s(actionData.src, ETH_ADDR_LEN, src, ETH_ADDR_LEN) != EOK) {
1834         return -EFAIL;
1835     }
1836     if (memcpy_s(actionData.bssid, ETH_ADDR_LEN, bssid, ETH_ADDR_LEN) != EOK) {
1837         return -EFAIL;
1838     }
1839 
1840     actionData.dataLen = dataLen;
1841     actionData.data = WifiDuplicateStr(data, dataLen);
1842     if (actionData.data == NULL) {
1843         return -EFAIL;
1844     }
1845     ret = WifiCmdSendAction(drv->iface, &actionData);
1846     WifiActionDataBufFree(&actionData);
1847     wpa_printf(MSG_INFO, "WifiWpaSendAction done, ret=%d", ret);
1848     return ret;
1849 }
1850 
DeinitWifiService()1851 __attribute__ ((visibility ("default"))) void DeinitWifiService()
1852 {
1853     if (g_wifiDriverType == WIFI_IFTYPE_STATION) {
1854         WifiWpaDeinit(g_wifiDriverData);
1855     } else if (g_wifiDriverType == WIFI_IFTYPE_AP) {
1856         WifiWpaHapdDeinit(g_wifiDriverData);
1857     } else {
1858         printf("no need to cleanup \n");
1859     }
1860 }
1861 
1862 #ifdef CONFIG_OHOS_P2P
WifiProbeReqReport(void * priv,int32_t report)1863 static int32_t WifiProbeReqReport(void *priv, int32_t report)
1864 {
1865     WifiDriverData *drv = NULL;
1866     wpa_printf(MSG_INFO, "%s enter.", __FUNCTION__);
1867     if (priv == NULL) {
1868         wpa_printf(MSG_ERROR, "%s input invalid.", __FUNCTION__);
1869         return -EFAIL;
1870     }
1871     drv = (WifiDriverData *)priv;
1872     return WifiCmdProbeReqReport(drv->iface, &report);
1873 }
1874 
WifiRemainOnChannel(void * priv,uint32_t freq,uint32_t duration)1875 static int32_t WifiRemainOnChannel(void *priv, uint32_t freq, uint32_t duration)
1876 {
1877     int32_t ret;
1878     WifiDriverData *drv = priv;
1879     WifiOnChannel *onChannel = NULL;
1880     if (priv == NULL) {
1881         wpa_printf(MSG_ERROR, "%s input invalid.", __FUNCTION__);
1882         return -EFAIL;
1883     }
1884     onChannel = (WifiOnChannel *)os_zalloc(sizeof(WifiOnChannel));
1885     if (onChannel == NULL)
1886     {
1887         wpa_printf(MSG_ERROR, "%s failed to alloc channel.", __FUNCTION__);
1888         return -EFAIL;
1889     }
1890     onChannel->freq = freq;
1891     onChannel->duration = duration;
1892 
1893     ret = WifiCmdRemainOnChannel(drv->iface, onChannel);
1894 
1895     os_free(onChannel);
1896     onChannel = NULL;
1897 
1898     return ret;
1899 }
1900 
WifiCancelRemainOnChannel(void * priv)1901 static int32_t WifiCancelRemainOnChannel(void *priv)
1902 {
1903     WifiDriverData *drv = priv;
1904     if (drv == NULL) {
1905         wpa_printf(MSG_ERROR, "%s input invalid.", __FUNCTION__);
1906         return -EFAIL;
1907     }
1908 
1909     return WifiCmdCancelRemainOnChannel(drv->iface);
1910 }
1911 
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)1912 static int32_t WifiAddIf(void *priv, enum wpa_driver_if_type type, const char *ifName, const uint8_t *addr, void *bss_ctx,
1913                          void **drv_priv, char *force_ifname, uint8_t *if_addr, const char *bridge, int32_t use_existing, int32_t setup_ap)
1914 {
1915     WifiDriverData *drv = priv;
1916     WifiIfAdd *ifAdd = NULL;
1917     int32_t ret;
1918     WifiDev *wifiDev = NULL;
1919     if (priv == NULL) {
1920         wpa_printf(MSG_ERROR, "%s input invalid.", __FUNCTION__);
1921         return -EFAIL;
1922     }
1923     ifAdd = (WifiIfAdd *)os_zalloc(sizeof(WifiIfAdd));
1924     switch (type) {
1925     case WPA_IF_STATION:
1926         ifAdd->type = WIFI_IFTYPE_STATION;
1927         break;
1928     case WPA_IF_P2P_GROUP:
1929     case WPA_IF_P2P_CLIENT:
1930         ifAdd->type = WIFI_IFTYPE_P2P_CLIENT;
1931         break;
1932     case WPA_IF_AP_VLAN:
1933         ifAdd->type = WIFI_IFTYPE_AP_VLAN;
1934         break;
1935     case WPA_IF_AP_BSS:
1936         ifAdd->type = WIFI_IFTYPE_AP;
1937         break;
1938     case WPA_IF_P2P_GO:
1939         ifAdd->type = WIFI_IFTYPE_P2P_GO;
1940         break;
1941     case WPA_IF_P2P_DEVICE:
1942         ifAdd->type = WIFI_IFTYPE_P2P_DEVICE;
1943         break;
1944     case WPA_IF_MESH:
1945         ifAdd->type = WIFI_IFTYPE_MESH_POINT;
1946         break;
1947     default:
1948         wpa_printf(MSG_ERROR, "%s unsuportted interface type %d.", __FUNCTION__, type);
1949     }
1950 
1951     ret = WifiRegisterEventCallback(OnWpaWiFiEvents, WIFI_KERNEL_TO_WPA_CLIENT, ifName);
1952     if (ret != SUCC) {
1953         wpa_printf(MSG_ERROR, "WifiWpa register event listener faild");
1954     }
1955 
1956     ret = WifiCmdAddIf(drv->iface, ifAdd);
1957     if (ret == SUCC) {
1958         wifiDev = (WifiDev *)os_zalloc(sizeof(WifiDev));
1959         if (wifiDev == NULL) {
1960             wpa_printf(MSG_ERROR, "%s failed to malloc wifiDev.", __FUNCTION__);
1961             return -EFAIL;
1962         }
1963         wifiDev->priv = drv;
1964         wifiDev->ifNameLen = sizeof(ifName);
1965         errno_t rc = memcpy_s(wifiDev->ifName, sizeof(wifiDev->ifName), ifName, sizeof(drv->iface));
1966         if (rc != EOK) {
1967             wpa_printf(MSG_ERROR, "Could not copy wifi device name.");
1968             FreeWifiDev(wifiDev);
1969             return ret;
1970         }
1971         wpa_printf(MSG_INFO, "%s ifName:%s, type:%d", __FUNCTION__, wifiDev->ifName, ifAdd->type);
1972         SetWifiDev(wifiDev);
1973     }
1974     os_free(ifAdd);
1975     ifAdd = NULL;
1976     return ret;
1977 }
1978 
WifiRemoveIf(void * priv,enum wpa_driver_if_type type,const char * ifName)1979 static int32_t WifiRemoveIf(void *priv, enum wpa_driver_if_type type, const char *ifName)
1980 {
1981     WifiDriverData *drv = priv;
1982     WifiIfRemove ifRemove = {0};
1983     int32_t ret;
1984     errno_t rc;
1985     WifiDev *wifiDev = NULL;
1986     if (priv == NULL || ifName == NULL) {
1987         wpa_printf(MSG_ERROR, "%s input invalid.", __FUNCTION__);
1988         return -EFAIL;
1989     }
1990     if (os_strlen(ifName) > IFNAMSIZ) {
1991         wpa_printf(MSG_ERROR, "%s ifName invalid:%s.", __FUNCTION__, ifName);
1992         return -EFAIL;
1993     }
1994     rc = memcpy_s(ifRemove.ifname, IFNAMSIZ, ifName, IFNAMSIZ);
1995     if (rc != EOK) {
1996         wpa_printf(MSG_ERROR, "%s can not copy interface name.", __FUNCTION__);
1997         return -EFAIL;
1998     }
1999 
2000     ret = WifiCmdRemoveIf(drv->iface, &ifRemove);
2001     wifiDev = GetWifiDevByName(ifName);
2002     if (wifiDev == NULL) {
2003         wpa_printf(MSG_INFO, "%s: GetWifiDevByName is null, already free.", __FUNCTION__);
2004         return SUCC;
2005     }
2006     FreeWifiDev(wifiDev);
2007     return SUCC;
2008 }
2009 
WifiSetApWpsP2pIe(void * priv,const struct wpabuf * beacon,const struct wpabuf * probresp,const struct wpabuf * assocresp)2010 int32_t WifiSetApWpsP2pIe(void *priv, const struct wpabuf *beacon, const struct wpabuf *probresp, const struct wpabuf *assocresp)
2011 {
2012     int32_t loops;
2013     int32_t ret = SUCC;
2014     WifiAppIe *appIe = NULL;
2015     struct wpabuf *wpabufTmp = NULL;
2016     WifiDriverData *drv = (WifiDriverData *)priv;
2017     WifiCmd cmdAddr[4] = {{0x1, beacon}, {0x2, probresp}, {0x4, assocresp}, {-1, NULL}};
2018     errno_t rc;
2019     appIe = (WifiAppIe *)os_zalloc(sizeof(WifiAppIe));
2020     if (appIe == NULL) {
2021         wpa_printf(MSG_ERROR, "%s:failed to malloc WifiAppIe.", __FUNCTION__);
2022         return -EFAIL;
2023     }
2024     for (loops = 0; cmdAddr[loops].cmd != -1; loops++) {
2025         wpabufTmp = (struct wpabuf *)cmdAddr[loops].src;
2026         if (wpabufTmp != NULL) {
2027             appIe->appIeType = cmdAddr[loops].cmd;
2028             appIe->ieLen = wpabuf_len(wpabufTmp);
2029             if ((wpabufTmp->buf != NULL) && (appIe->ieLen != 0)) {
2030                 appIe->ie = os_zalloc(appIe->ieLen);
2031                 if (appIe->ie == NULL) {
2032                     wpa_printf(MSG_ERROR, "%s appIe->ie malloc failed.", __FUNCTION__);
2033                     os_free(appIe);
2034                     return -EFAIL;
2035                 }
2036                 rc = memcpy_s(appIe->ie, appIe->ieLen, wpabuf_head(wpabufTmp), wpabuf_len(wpabufTmp));
2037                 if (rc != EOK) {
2038                     wpa_printf(MSG_ERROR, "%s: ", __FUNCTION__);
2039                     os_free(appIe->ie);
2040                     os_free(appIe);
2041                     return -EFAIL;
2042                 }
2043             }
2044             wpa_printf(MSG_INFO, "%s type %d, ie_len %d.", __FUNCTION__, appIe->appIeType, appIe->ieLen);
2045 
2046             ret = WifiCmdSetApWpsP2pIe(drv->iface, appIe);
2047             os_free(appIe->ie);
2048             appIe->ie = NULL;
2049             if (ret < 0) {
2050                 break;
2051             }
2052         }
2053     }
2054     os_free(appIe);
2055     appIe = NULL;
2056     return ret;
2057 }
2058 
WifiWpaGetDrvFlags(void * priv,uint64_t * drvFlags)2059 int32_t WifiWpaGetDrvFlags(void *priv, uint64_t *drvFlags)
2060 {
2061     WifiDriverData *drv = NULL;
2062     WifiGetDrvFlags *params = NULL;
2063     int32_t ret;
2064     if (priv == NULL || drvFlags == NULL)
2065     {
2066         return -EFAIL;
2067     }
2068     drv = (WifiDriverData *)priv;
2069     params = (WifiGetDrvFlags *)os_zalloc(sizeof(WifiGetDrvFlags));
2070     if (params == NULL)
2071     {
2072         return -EFAIL;
2073     }
2074     params->drvFlags = 0;
2075     ret = WifiCmdGetDrvFlags(drv->iface, params);
2076     if (ret != SUCC)
2077     {
2078         wpa_printf(MSG_ERROR, "%s WifiCmdGetDrvFlags failed, ret is %d.", __FUNCTION__, ret);
2079         os_free(params);
2080         return -EFAIL;
2081     }
2082     *drvFlags = params->drvFlags;
2083     wpa_printf(MSG_INFO, "%s Get drvFlags done.", __FUNCTION__);
2084     os_free(params);
2085     return ret;
2086 }
2087 #endif // CONFIG_OHOS_P2P
2088 
2089 const struct wpa_driver_ops g_wifiDriverOps = {
2090     .name = "hdf wifi",
2091     .desc = "wpa hdf adaptor layer",
2092     .get_bssid = WifiWpaGetBssid,
2093     .get_ssid = WifiWpaGetSsid,
2094     .set_key = WifiWpaSetKey,
2095     .scan2 = WifiWpaScan2,
2096     .get_scan_results2 = WifiWpaGetScanResults2,
2097     .deauthenticate = WifiWpaDeauthenticate,
2098     .associate = WifiWpaAssociate,
2099     .send_eapol = WifiWpaWpaSendEapol,
2100     .init2 = WifiWpaInit2,
2101     .deinit = WifiWpaDeinit,
2102     .set_ap = WifiWpaSetAp,
2103     .send_mlme = WifiWpaSendMlme,
2104     .get_hw_feature_data = WifiWpaGetHwFeatureData,
2105     .sta_remove = WifiWpaStaRemove,
2106     .hapd_init = WifiWpaHapdInit,
2107     .hapd_deinit = WifiWpaHapdDeinit,
2108     .hapd_send_eapol = WifiWpaHapdSendEapol,
2109     .send_action = WifiWpaSendAction,
2110     .get_mac_addr = WifiWpaGetMacAddr,
2111 #ifdef CONFIG_OHOS_P2P
2112     .remain_on_channel = WifiRemainOnChannel,
2113     .cancel_remain_on_channel = WifiCancelRemainOnChannel,
2114     .probe_req_report = WifiProbeReqReport,
2115     .if_add = WifiAddIf,
2116     .if_remove = WifiRemoveIf,
2117     .set_ap_wps_ie = WifiSetApWpsP2pIe,
2118 #endif // CONFIG_OHOS_P2P
2119 };
2120 
2121 #ifdef __cplusplus
2122 #if __cplusplus
2123 }
2124 #endif
2125 #endif
2126