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