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