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