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