2 * WPA Supplicant - testing driver interface
3 * Copyright (c) 2004-2008, Jouni Malinen <j@w1.fi>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
9 * Alternatively, this software may be distributed under the terms of BSD
12 * See README and COPYING for more details.
15 /* Make sure we get winsock2.h for Windows build to get sockaddr_storage */
16 #include "build_config.h"
17 #ifdef CONFIG_NATIVE_WINDOWS
19 #endif /* CONFIG_NATIVE_WINDOWS */
23 #ifndef CONFIG_NATIVE_WINDOWS
27 #define DRIVER_TEST_UNIX
28 #endif /* CONFIG_NATIVE_WINDOWS */
32 #include "l2_packet/l2_packet.h"
35 #include "ieee802_11_defs.h"
37 #include "../../hostapd/hostapd.h"
38 #include "../../hostapd/wpa.h"
39 #include "../../hostapd/hw_features.h"
42 struct test_client_socket
{
43 struct test_client_socket
*next
;
45 struct sockaddr_un un
;
47 struct test_driver_bss
*bss
;
50 struct test_driver_bss
{
51 struct test_driver_bss
*next
;
52 char ifname
[IFNAMSIZ
+ 1];
57 size_t wps_beacon_ie_len
;
58 u8
*wps_probe_resp_ie
;
59 size_t wps_probe_resp_ie_len
;
65 struct wpa_driver_test_global
{
69 struct wpa_driver_test_data
{
70 struct wpa_driver_test_global
*global
;
72 u8 own_addr
[ETH_ALEN
];
74 #ifdef DRIVER_TEST_UNIX
75 struct sockaddr_un hostapd_addr
;
76 #endif /* DRIVER_TEST_UNIX */
78 struct sockaddr_in hostapd_addr_udp
;
79 int hostapd_addr_udp_set
;
80 char *own_socket_path
;
85 #define MAX_SCAN_RESULTS 30
86 struct wpa_scan_res
*scanres
[MAX_SCAN_RESULTS
];
90 size_t assoc_wpa_ie_len
;
94 size_t probe_req_ie_len
;
98 struct hostapd_data
*hapd
;
99 struct test_client_socket
*cli
;
100 struct test_driver_bss
*bss
;
108 static void test_driver_free_bss(struct test_driver_bss
*bss
)
111 free(bss
->wps_beacon_ie
);
112 free(bss
->wps_probe_resp_ie
);
117 static void test_driver_free_priv(struct wpa_driver_test_data
*drv
)
119 struct test_driver_bss
*bss
, *prev
;
128 test_driver_free_bss(prev
);
130 free(drv
->own_socket_path
);
131 free(drv
->socket_dir
);
136 static struct test_client_socket
*
137 test_driver_get_cli(struct wpa_driver_test_data
*drv
, struct sockaddr_un
*from
,
140 struct test_client_socket
*cli
= drv
->cli
;
143 if (cli
->unlen
== fromlen
&&
144 strncmp(cli
->un
.sun_path
, from
->sun_path
,
145 fromlen
- sizeof(cli
->un
.sun_family
)) == 0)
154 static int test_driver_send_eapol(void *priv
, const u8
*addr
, const u8
*data
,
155 size_t data_len
, int encrypt
,
158 struct wpa_driver_test_data
*drv
= priv
;
159 struct test_client_socket
*cli
;
162 struct l2_ethhdr eth
;
164 if (drv
->test_socket
< 0)
169 if (memcmp(cli
->addr
, addr
, ETH_ALEN
) == 0)
175 wpa_printf(MSG_DEBUG
, "%s: no destination client entry",
180 memcpy(eth
.h_dest
, addr
, ETH_ALEN
);
181 memcpy(eth
.h_source
, own_addr
, ETH_ALEN
);
182 eth
.h_proto
= host_to_be16(ETH_P_EAPOL
);
184 io
[0].iov_base
= "EAPOL ";
186 io
[1].iov_base
= ð
;
187 io
[1].iov_len
= sizeof(eth
);
188 io
[2].iov_base
= (u8
*) data
;
189 io
[2].iov_len
= data_len
;
191 memset(&msg
, 0, sizeof(msg
));
194 msg
.msg_name
= &cli
->un
;
195 msg
.msg_namelen
= cli
->unlen
;
196 return sendmsg(drv
->test_socket
, &msg
, 0);
200 static int test_driver_send_ether(void *priv
, const u8
*dst
, const u8
*src
,
201 u16 proto
, const u8
*data
, size_t data_len
)
203 struct wpa_driver_test_data
*drv
= priv
;
206 struct l2_ethhdr eth
;
208 struct sockaddr_un addr
;
211 int ret
= 0, broadcast
= 0, count
= 0;
213 if (drv
->test_socket
< 0 || drv
->socket_dir
== NULL
) {
214 wpa_printf(MSG_DEBUG
, "%s: invalid parameters (sock=%d "
216 __func__
, drv
->test_socket
, drv
->socket_dir
);
220 broadcast
= memcmp(dst
, "\xff\xff\xff\xff\xff\xff", ETH_ALEN
) == 0;
221 snprintf(desttxt
, sizeof(desttxt
), MACSTR
, MAC2STR(dst
));
223 memcpy(eth
.h_dest
, dst
, ETH_ALEN
);
224 memcpy(eth
.h_source
, src
, ETH_ALEN
);
225 eth
.h_proto
= host_to_be16(proto
);
227 io
[0].iov_base
= "ETHER ";
229 io
[1].iov_base
= ð
;
230 io
[1].iov_len
= sizeof(eth
);
231 io
[2].iov_base
= (u8
*) data
;
232 io
[2].iov_len
= data_len
;
234 memset(&msg
, 0, sizeof(msg
));
238 dir
= opendir(drv
->socket_dir
);
240 perror("test_driver: opendir");
243 while ((dent
= readdir(dir
))) {
244 #ifdef _DIRENT_HAVE_D_TYPE
245 /* Skip the file if it is not a socket. Also accept
246 * DT_UNKNOWN (0) in case the C library or underlying file
247 * system does not support d_type. */
248 if (dent
->d_type
!= DT_SOCK
&& dent
->d_type
!= DT_UNKNOWN
)
250 #endif /* _DIRENT_HAVE_D_TYPE */
251 if (strcmp(dent
->d_name
, ".") == 0 ||
252 strcmp(dent
->d_name
, "..") == 0)
255 memset(&addr
, 0, sizeof(addr
));
256 addr
.sun_family
= AF_UNIX
;
257 snprintf(addr
.sun_path
, sizeof(addr
.sun_path
), "%s/%s",
258 drv
->socket_dir
, dent
->d_name
);
260 if (strcmp(addr
.sun_path
, drv
->own_socket_path
) == 0)
262 if (!broadcast
&& strstr(dent
->d_name
, desttxt
) == NULL
)
265 wpa_printf(MSG_DEBUG
, "%s: Send ether frame to %s",
266 __func__
, dent
->d_name
);
268 msg
.msg_name
= &addr
;
269 msg
.msg_namelen
= sizeof(addr
);
270 ret
= sendmsg(drv
->test_socket
, &msg
, 0);
272 perror("driver_test: sendmsg");
277 if (!broadcast
&& count
== 0) {
278 wpa_printf(MSG_DEBUG
, "%s: Destination " MACSTR
" not found",
279 __func__
, MAC2STR(dst
));
287 static int wpa_driver_test_send_mlme(void *priv
, const u8
*buf
, size_t len
)
289 struct wpa_driver_test_data
*drv
= priv
;
293 int ret
= 0, broadcast
= 0;
295 struct sockaddr_un addr
;
298 struct ieee80211_hdr
*hdr
;
301 if (drv
->test_socket
< 0 || len
< 10 || drv
->socket_dir
== NULL
) {
302 wpa_printf(MSG_DEBUG
, "%s: invalid parameters (sock=%d len=%lu"
304 __func__
, drv
->test_socket
, (unsigned long) len
,
311 broadcast
= memcmp(dest
, "\xff\xff\xff\xff\xff\xff", ETH_ALEN
) == 0;
312 snprintf(desttxt
, sizeof(desttxt
), MACSTR
, MAC2STR(dest
));
314 io
[0].iov_base
= "MLME ";
316 io
[1].iov_base
= (void *) buf
;
319 memset(&msg
, 0, sizeof(msg
));
323 dir
= opendir(drv
->socket_dir
);
325 perror("test_driver: opendir");
328 while ((dent
= readdir(dir
))) {
329 #ifdef _DIRENT_HAVE_D_TYPE
330 /* Skip the file if it is not a socket. Also accept
331 * DT_UNKNOWN (0) in case the C library or underlying file
332 * system does not support d_type. */
333 if (dent
->d_type
!= DT_SOCK
&& dent
->d_type
!= DT_UNKNOWN
)
335 #endif /* _DIRENT_HAVE_D_TYPE */
336 if (strcmp(dent
->d_name
, ".") == 0 ||
337 strcmp(dent
->d_name
, "..") == 0)
340 memset(&addr
, 0, sizeof(addr
));
341 addr
.sun_family
= AF_UNIX
;
342 snprintf(addr
.sun_path
, sizeof(addr
.sun_path
), "%s/%s",
343 drv
->socket_dir
, dent
->d_name
);
345 if (strcmp(addr
.sun_path
, drv
->own_socket_path
) == 0)
347 if (!broadcast
&& strstr(dent
->d_name
, desttxt
) == NULL
)
350 wpa_printf(MSG_DEBUG
, "%s: Send management frame to %s",
351 __func__
, dent
->d_name
);
353 msg
.msg_name
= &addr
;
354 msg
.msg_namelen
= sizeof(addr
);
355 ret
= sendmsg(drv
->test_socket
, &msg
, 0);
357 perror("driver_test: sendmsg");
361 hdr
= (struct ieee80211_hdr
*) buf
;
362 fc
= le_to_host16(hdr
->frame_control
);
363 hostapd_mgmt_tx_cb(drv
->hapd
, (u8
*) buf
, len
, WLAN_FC_GET_STYPE(fc
),
370 static void test_driver_scan(struct wpa_driver_test_data
*drv
,
371 struct sockaddr_un
*from
, socklen_t fromlen
,
374 char buf
[512], *pos
, *end
;
376 struct test_driver_bss
*bss
;
381 /* data: optional [ ' ' | STA-addr | ' ' | IEs(hex) ] */
383 wpa_printf(MSG_DEBUG
, "test_driver: SCAN");
387 hwaddr_aton(data
+ 1, sa
)) {
388 wpa_printf(MSG_DEBUG
, "test_driver: Unexpected SCAN "
396 ielen
= os_strlen(data
) / 2;
397 if (ielen
> sizeof(ie
))
399 if (hexstr2bin(data
, ie
, ielen
) < 0)
402 wpa_printf(MSG_DEBUG
, "test_driver: Scan from " MACSTR
,
404 wpa_hexdump(MSG_MSGDUMP
, "test_driver: scan IEs", ie
, ielen
);
406 hostapd_probe_req_rx(drv
->hapd
, sa
, ie
, ielen
);
409 for (bss
= drv
->bss
; bss
; bss
= bss
->next
) {
411 end
= buf
+ sizeof(buf
);
413 /* reply: SCANRESP BSSID SSID IEs */
414 ret
= snprintf(pos
, end
- pos
, "SCANRESP " MACSTR
" ",
415 MAC2STR(bss
->bssid
));
416 if (ret
< 0 || ret
>= end
- pos
)
419 pos
+= wpa_snprintf_hex(pos
, end
- pos
,
420 bss
->ssid
, bss
->ssid_len
);
421 ret
= snprintf(pos
, end
- pos
, " ");
422 if (ret
< 0 || ret
>= end
- pos
)
425 pos
+= wpa_snprintf_hex(pos
, end
- pos
, bss
->ie
, bss
->ielen
);
426 pos
+= wpa_snprintf_hex(pos
, end
- pos
, bss
->wps_probe_resp_ie
,
427 bss
->wps_probe_resp_ie_len
);
430 ret
= snprintf(pos
, end
- pos
, " PRIVACY");
431 if (ret
< 0 || ret
>= end
- pos
)
436 sendto(drv
->test_socket
, buf
, pos
- buf
, 0,
437 (struct sockaddr
*) from
, fromlen
);
442 static struct hostapd_data
*
443 test_driver_get_hapd(struct wpa_driver_test_data
*drv
,
444 struct test_driver_bss
*bss
)
446 struct hostapd_iface
*iface
= drv
->hapd
->iface
;
447 struct hostapd_data
*hapd
= NULL
;
451 wpa_printf(MSG_DEBUG
, "%s: bss == NULL", __func__
);
455 for (i
= 0; i
< iface
->num_bss
; i
++) {
456 hapd
= iface
->bss
[i
];
457 if (memcmp(hapd
->own_addr
, bss
->bssid
, ETH_ALEN
) == 0)
460 if (i
== iface
->num_bss
) {
461 wpa_printf(MSG_DEBUG
, "%s: no matching interface entry found "
462 "for BSSID " MACSTR
, __func__
, MAC2STR(bss
->bssid
));
470 static int test_driver_new_sta(struct wpa_driver_test_data
*drv
,
471 struct test_driver_bss
*bss
, const u8
*addr
,
472 const u8
*ie
, size_t ielen
)
474 struct hostapd_data
*hapd
;
476 hapd
= test_driver_get_hapd(drv
, bss
);
480 return hostapd_notif_assoc(hapd
, addr
, ie
, ielen
);
484 static void test_driver_assoc(struct wpa_driver_test_data
*drv
,
485 struct sockaddr_un
*from
, socklen_t fromlen
,
488 struct test_client_socket
*cli
;
489 u8 ie
[256], ssid
[32];
490 size_t ielen
, ssid_len
= 0;
491 char *pos
, *pos2
, cmd
[50];
492 struct test_driver_bss
*bss
;
494 /* data: STA-addr SSID(hex) IEs(hex) */
496 cli
= os_zalloc(sizeof(*cli
));
500 if (hwaddr_aton(data
, cli
->addr
)) {
501 printf("test_socket: Invalid MAC address '%s' in ASSOC\n",
509 pos2
= strchr(pos
, ' ');
512 ssid_len
= (pos2
- pos
) / 2;
513 if (hexstr2bin(pos
, ssid
, ssid_len
) < 0) {
514 wpa_printf(MSG_DEBUG
, "%s: Invalid SSID", __func__
);
518 wpa_hexdump_ascii(MSG_DEBUG
, "test_driver_assoc: SSID",
522 ielen
= strlen(pos
) / 2;
523 if (ielen
> sizeof(ie
))
525 if (hexstr2bin(pos
, ie
, ielen
) < 0)
529 for (bss
= drv
->bss
; bss
; bss
= bss
->next
) {
530 if (bss
->ssid_len
== ssid_len
&&
531 memcmp(bss
->ssid
, ssid
, ssid_len
) == 0)
535 wpa_printf(MSG_DEBUG
, "%s: No matching SSID found from "
536 "configured BSSes", __func__
);
542 memcpy(&cli
->un
, from
, sizeof(cli
->un
));
543 cli
->unlen
= fromlen
;
544 cli
->next
= drv
->cli
;
546 wpa_hexdump_ascii(MSG_DEBUG
, "test_socket: ASSOC sun_path",
547 (const u8
*) cli
->un
.sun_path
,
548 cli
->unlen
- sizeof(cli
->un
.sun_family
));
550 snprintf(cmd
, sizeof(cmd
), "ASSOCRESP " MACSTR
" 0",
551 MAC2STR(bss
->bssid
));
552 sendto(drv
->test_socket
, cmd
, strlen(cmd
), 0,
553 (struct sockaddr
*) from
, fromlen
);
555 if (test_driver_new_sta(drv
, bss
, cli
->addr
, ie
, ielen
) < 0) {
556 wpa_printf(MSG_DEBUG
, "test_driver: failed to add new STA");
561 static void test_driver_disassoc(struct wpa_driver_test_data
*drv
,
562 struct sockaddr_un
*from
, socklen_t fromlen
)
564 struct test_client_socket
*cli
;
566 cli
= test_driver_get_cli(drv
, from
, fromlen
);
570 hostapd_notif_disassoc(drv
->hapd
, cli
->addr
);
574 static void test_driver_eapol(struct wpa_driver_test_data
*drv
,
575 struct sockaddr_un
*from
, socklen_t fromlen
,
576 u8
*data
, size_t datalen
)
578 struct test_client_socket
*cli
;
580 /* Skip Ethernet header */
581 wpa_printf(MSG_DEBUG
, "test_driver: dst=" MACSTR
" src="
582 MACSTR
" proto=%04x",
583 MAC2STR(data
), MAC2STR(data
+ ETH_ALEN
),
584 WPA_GET_BE16(data
+ 2 * ETH_ALEN
));
588 cli
= test_driver_get_cli(drv
, from
, fromlen
);
590 struct hostapd_data
*hapd
;
591 hapd
= test_driver_get_hapd(drv
, cli
->bss
);
594 hostapd_eapol_receive(hapd
, cli
->addr
, data
, datalen
);
596 wpa_printf(MSG_DEBUG
, "test_socket: EAPOL from unknown "
602 static void test_driver_ether(struct wpa_driver_test_data
*drv
,
603 struct sockaddr_un
*from
, socklen_t fromlen
,
604 u8
*data
, size_t datalen
)
606 struct l2_ethhdr
*eth
;
608 if (datalen
< sizeof(*eth
))
611 eth
= (struct l2_ethhdr
*) data
;
612 wpa_printf(MSG_DEBUG
, "test_driver: RX ETHER dst=" MACSTR
" src="
613 MACSTR
" proto=%04x",
614 MAC2STR(eth
->h_dest
), MAC2STR(eth
->h_source
),
615 be_to_host16(eth
->h_proto
));
617 #ifdef CONFIG_IEEE80211R
618 if (be_to_host16(eth
->h_proto
) == ETH_P_RRB
) {
619 wpa_ft_rrb_rx(drv
->hapd
->wpa_auth
, eth
->h_source
,
620 data
+ sizeof(*eth
), datalen
- sizeof(*eth
));
622 #endif /* CONFIG_IEEE80211R */
626 static void test_driver_mlme(struct wpa_driver_test_data
*drv
,
627 struct sockaddr_un
*from
, socklen_t fromlen
,
628 u8
*data
, size_t datalen
)
630 struct ieee80211_hdr
*hdr
;
633 hdr
= (struct ieee80211_hdr
*) data
;
635 if (test_driver_get_cli(drv
, from
, fromlen
) == NULL
&& datalen
>= 16) {
636 struct test_client_socket
*cli
;
637 cli
= os_zalloc(sizeof(*cli
));
640 wpa_printf(MSG_DEBUG
, "Adding client entry for " MACSTR
,
641 MAC2STR(hdr
->addr2
));
642 memcpy(cli
->addr
, hdr
->addr2
, ETH_ALEN
);
643 memcpy(&cli
->un
, from
, sizeof(cli
->un
));
644 cli
->unlen
= fromlen
;
645 cli
->next
= drv
->cli
;
649 wpa_hexdump(MSG_MSGDUMP
, "test_driver_mlme: received frame",
651 fc
= le_to_host16(hdr
->frame_control
);
652 if (WLAN_FC_GET_TYPE(fc
) != WLAN_FC_TYPE_MGMT
) {
653 wpa_printf(MSG_ERROR
, "%s: received non-mgmt frame",
657 hostapd_mgmt_rx(drv
->hapd
, data
, datalen
, WLAN_FC_GET_STYPE(fc
), NULL
);
661 static void test_driver_receive_unix(int sock
, void *eloop_ctx
, void *sock_ctx
)
663 struct wpa_driver_test_data
*drv
= eloop_ctx
;
666 struct sockaddr_un from
;
667 socklen_t fromlen
= sizeof(from
);
669 res
= recvfrom(sock
, buf
, sizeof(buf
) - 1, 0,
670 (struct sockaddr
*) &from
, &fromlen
);
672 perror("recvfrom(test_socket)");
677 wpa_printf(MSG_DEBUG
, "test_driver: received %u bytes", res
);
679 if (strncmp(buf
, "SCAN", 4) == 0) {
680 test_driver_scan(drv
, &from
, fromlen
, buf
+ 4);
681 } else if (strncmp(buf
, "ASSOC ", 6) == 0) {
682 test_driver_assoc(drv
, &from
, fromlen
, buf
+ 6);
683 } else if (strcmp(buf
, "DISASSOC") == 0) {
684 test_driver_disassoc(drv
, &from
, fromlen
);
685 } else if (strncmp(buf
, "EAPOL ", 6) == 0) {
686 test_driver_eapol(drv
, &from
, fromlen
, (u8
*) buf
+ 6,
688 } else if (strncmp(buf
, "ETHER ", 6) == 0) {
689 test_driver_ether(drv
, &from
, fromlen
, (u8
*) buf
+ 6,
691 } else if (strncmp(buf
, "MLME ", 5) == 0) {
692 test_driver_mlme(drv
, &from
, fromlen
, (u8
*) buf
+ 5, res
- 5);
694 wpa_hexdump_ascii(MSG_DEBUG
, "Unknown test_socket command",
700 static struct test_driver_bss
*
701 test_driver_get_bss(struct wpa_driver_test_data
*drv
, const char *ifname
)
703 struct test_driver_bss
*bss
;
705 for (bss
= drv
->bss
; bss
; bss
= bss
->next
) {
706 if (strcmp(bss
->ifname
, ifname
) == 0)
713 static int test_driver_set_generic_elem(const char *ifname
, void *priv
,
714 const u8
*elem
, size_t elem_len
)
716 struct wpa_driver_test_data
*drv
= priv
;
717 struct test_driver_bss
*bss
;
719 bss
= test_driver_get_bss(drv
, ifname
);
731 bss
->ie
= malloc(elem_len
);
732 if (bss
->ie
== NULL
) {
737 memcpy(bss
->ie
, elem
, elem_len
);
738 bss
->ielen
= elem_len
;
743 static int test_driver_set_wps_beacon_ie(const char *ifname
, void *priv
,
744 const u8
*ie
, size_t len
)
746 struct wpa_driver_test_data
*drv
= priv
;
747 struct test_driver_bss
*bss
;
749 wpa_hexdump(MSG_DEBUG
, "test_driver: Beacon WPS IE", ie
, len
);
750 bss
= test_driver_get_bss(drv
, ifname
);
754 free(bss
->wps_beacon_ie
);
757 bss
->wps_beacon_ie
= NULL
;
758 bss
->wps_beacon_ie_len
= 0;
762 bss
->wps_beacon_ie
= malloc(len
);
763 if (bss
->wps_beacon_ie
== NULL
) {
764 bss
->wps_beacon_ie_len
= 0;
768 memcpy(bss
->wps_beacon_ie
, ie
, len
);
769 bss
->wps_beacon_ie_len
= len
;
774 static int test_driver_set_wps_probe_resp_ie(const char *ifname
, void *priv
,
775 const u8
*ie
, size_t len
)
777 struct wpa_driver_test_data
*drv
= priv
;
778 struct test_driver_bss
*bss
;
780 wpa_hexdump(MSG_DEBUG
, "test_driver: ProbeResp WPS IE", ie
, len
);
781 bss
= test_driver_get_bss(drv
, ifname
);
785 free(bss
->wps_probe_resp_ie
);
788 bss
->wps_probe_resp_ie
= NULL
;
789 bss
->wps_probe_resp_ie_len
= 0;
793 bss
->wps_probe_resp_ie
= malloc(len
);
794 if (bss
->wps_probe_resp_ie
== NULL
) {
795 bss
->wps_probe_resp_ie_len
= 0;
799 memcpy(bss
->wps_probe_resp_ie
, ie
, len
);
800 bss
->wps_probe_resp_ie_len
= len
;
805 static int test_driver_sta_deauth(void *priv
, const u8
*own_addr
,
806 const u8
*addr
, int reason
)
808 struct wpa_driver_test_data
*drv
= priv
;
809 struct test_client_socket
*cli
;
811 if (drv
->test_socket
< 0)
816 if (memcmp(cli
->addr
, addr
, ETH_ALEN
) == 0)
824 return sendto(drv
->test_socket
, "DEAUTH", 6, 0,
825 (struct sockaddr
*) &cli
->un
, cli
->unlen
);
829 static int test_driver_sta_disassoc(void *priv
, const u8
*own_addr
,
830 const u8
*addr
, int reason
)
832 struct wpa_driver_test_data
*drv
= priv
;
833 struct test_client_socket
*cli
;
835 if (drv
->test_socket
< 0)
840 if (memcmp(cli
->addr
, addr
, ETH_ALEN
) == 0)
848 return sendto(drv
->test_socket
, "DISASSOC", 8, 0,
849 (struct sockaddr
*) &cli
->un
, cli
->unlen
);
853 static int test_driver_bss_add(void *priv
, const char *ifname
, const u8
*bssid
)
855 struct wpa_driver_test_data
*drv
= priv
;
856 struct test_driver_bss
*bss
;
858 wpa_printf(MSG_DEBUG
, "%s(ifname=%s bssid=" MACSTR
")",
859 __func__
, ifname
, MAC2STR(bssid
));
861 bss
= os_zalloc(sizeof(*bss
));
865 os_strlcpy(bss
->ifname
, ifname
, IFNAMSIZ
);
866 memcpy(bss
->bssid
, bssid
, ETH_ALEN
);
868 bss
->next
= drv
->bss
;
875 static int test_driver_bss_remove(void *priv
, const char *ifname
)
877 struct wpa_driver_test_data
*drv
= priv
;
878 struct test_driver_bss
*bss
, *prev
;
879 struct test_client_socket
*cli
, *prev_c
;
881 wpa_printf(MSG_DEBUG
, "%s(ifname=%s)", __func__
, ifname
);
883 for (prev
= NULL
, bss
= drv
->bss
; bss
; prev
= bss
, bss
= bss
->next
) {
884 if (strcmp(bss
->ifname
, ifname
) != 0)
888 prev
->next
= bss
->next
;
890 drv
->bss
= bss
->next
;
892 for (prev_c
= NULL
, cli
= drv
->cli
; cli
;
893 prev_c
= cli
, cli
= cli
->next
) {
897 prev_c
->next
= cli
->next
;
899 drv
->cli
= cli
->next
;
904 test_driver_free_bss(bss
);
912 static int test_driver_if_add(const char *iface
, void *priv
,
913 enum hostapd_driver_if_type type
, char *ifname
,
916 wpa_printf(MSG_DEBUG
, "%s(iface=%s type=%d ifname=%s)",
917 __func__
, iface
, type
, ifname
);
922 static int test_driver_if_update(void *priv
, enum hostapd_driver_if_type type
,
923 char *ifname
, const u8
*addr
)
925 wpa_printf(MSG_DEBUG
, "%s(type=%d ifname=%s)", __func__
, type
, ifname
);
930 static int test_driver_if_remove(void *priv
, enum hostapd_driver_if_type type
,
931 const char *ifname
, const u8
*addr
)
933 wpa_printf(MSG_DEBUG
, "%s(type=%d ifname=%s)", __func__
, type
, ifname
);
938 static int test_driver_valid_bss_mask(void *priv
, const u8
*addr
,
945 static int test_driver_set_ssid(const char *ifname
, void *priv
, const u8
*buf
,
948 struct wpa_driver_test_data
*drv
= priv
;
949 struct test_driver_bss
*bss
;
951 wpa_printf(MSG_DEBUG
, "%s(ifname=%s)", __func__
, ifname
);
952 wpa_hexdump_ascii(MSG_DEBUG
, "test_driver_set_ssid: SSID", buf
, len
);
954 for (bss
= drv
->bss
; bss
; bss
= bss
->next
) {
955 if (strcmp(bss
->ifname
, ifname
) != 0)
958 if (len
< 0 || (size_t) len
> sizeof(bss
->ssid
))
961 memcpy(bss
->ssid
, buf
, len
);
971 static int test_driver_set_privacy(const char *ifname
, void *priv
, int enabled
)
973 struct wpa_driver_test_data
*drv
= priv
;
974 struct test_driver_bss
*bss
;
976 wpa_printf(MSG_DEBUG
, "%s(ifname=%s enabled=%d)",
977 __func__
, ifname
, enabled
);
979 for (bss
= drv
->bss
; bss
; bss
= bss
->next
) {
980 if (strcmp(bss
->ifname
, ifname
) != 0)
983 bss
->privacy
= enabled
;
992 static int test_driver_set_key(const char *iface
, void *priv
, wpa_alg alg
,
993 const u8
*addr
, int key_idx
, int set_tx
,
994 const u8
*seq
, size_t seq_len
,
995 const u8
*key
, size_t key_len
)
997 wpa_printf(MSG_DEBUG
, "%s(iface=%s alg=%d idx=%d set_tx=%d)",
998 __func__
, iface
, alg
, key_idx
, set_tx
);
1000 wpa_printf(MSG_DEBUG
, " addr=" MACSTR
, MAC2STR(addr
));
1002 wpa_hexdump_key(MSG_DEBUG
, " key", key
, key_len
);
1007 static int test_driver_set_sta_vlan(void *priv
, const u8
*addr
,
1008 const char *ifname
, int vlan_id
)
1010 wpa_printf(MSG_DEBUG
, "%s(addr=" MACSTR
" ifname=%s vlan_id=%d)",
1011 __func__
, MAC2STR(addr
), ifname
, vlan_id
);
1016 static int test_driver_sta_add(const char *ifname
, void *priv
,
1017 struct hostapd_sta_add_params
*params
)
1019 struct wpa_driver_test_data
*drv
= priv
;
1020 struct test_client_socket
*cli
;
1021 struct test_driver_bss
*bss
;
1023 wpa_printf(MSG_DEBUG
, "%s(ifname=%s addr=" MACSTR
" aid=%d "
1024 "capability=0x%x flags=0x%x listen_interval=%d)",
1025 __func__
, ifname
, MAC2STR(params
->addr
), params
->aid
,
1026 params
->capability
, params
->flags
,
1027 params
->listen_interval
);
1028 wpa_hexdump(MSG_DEBUG
, "test_driver_sta_add - supp_rates",
1029 params
->supp_rates
, params
->supp_rates_len
);
1033 if (os_memcmp(cli
->addr
, params
->addr
, ETH_ALEN
) == 0)
1038 wpa_printf(MSG_DEBUG
, "%s: no matching client entry",
1043 for (bss
= drv
->bss
; bss
; bss
= bss
->next
) {
1044 if (strcmp(ifname
, bss
->ifname
) == 0)
1048 wpa_printf(MSG_DEBUG
, "%s: No matching interface found from "
1049 "configured BSSes", __func__
);
1059 static void * test_driver_init(struct hostapd_data
*hapd
,
1060 struct wpa_init_params
*params
)
1062 struct wpa_driver_test_data
*drv
;
1063 struct sockaddr_un addr_un
;
1064 struct sockaddr_in addr_in
;
1065 struct sockaddr
*addr
;
1068 drv
= os_zalloc(sizeof(struct wpa_driver_test_data
));
1070 printf("Could not allocate memory for test driver data\n");
1073 drv
->bss
= os_zalloc(sizeof(*drv
->bss
));
1074 if (drv
->bss
== NULL
) {
1075 printf("Could not allocate memory for test driver BSS data\n");
1082 /* Generate a MAC address to help testing with multiple APs */
1083 params
->own_addr
[0] = 0x02; /* locally administered */
1084 sha1_prf((const u8
*) params
->ifname
, strlen(params
->ifname
),
1085 "hostapd test bssid generation",
1086 params
->ssid
, params
->ssid_len
,
1087 params
->own_addr
+ 1, ETH_ALEN
- 1);
1089 os_strlcpy(drv
->bss
->ifname
, params
->ifname
, IFNAMSIZ
);
1090 memcpy(drv
->bss
->bssid
, params
->own_addr
, ETH_ALEN
);
1092 if (params
->test_socket
) {
1093 if (os_strlen(params
->test_socket
) >=
1094 sizeof(addr_un
.sun_path
)) {
1095 printf("Too long test_socket path\n");
1096 test_driver_free_priv(drv
);
1099 if (strncmp(params
->test_socket
, "DIR:", 4) == 0) {
1100 size_t len
= strlen(params
->test_socket
) + 30;
1101 drv
->socket_dir
= strdup(params
->test_socket
+ 4);
1102 drv
->own_socket_path
= malloc(len
);
1103 if (drv
->own_socket_path
) {
1104 snprintf(drv
->own_socket_path
, len
,
1106 params
->test_socket
+ 4,
1107 MAC2STR(params
->own_addr
));
1109 } else if (strncmp(params
->test_socket
, "UDP:", 4) == 0) {
1110 drv
->udp_port
= atoi(params
->test_socket
+ 4);
1112 drv
->own_socket_path
= strdup(params
->test_socket
);
1114 if (drv
->own_socket_path
== NULL
&& drv
->udp_port
== 0) {
1115 test_driver_free_priv(drv
);
1119 drv
->test_socket
= socket(drv
->udp_port
? PF_INET
: PF_UNIX
,
1121 if (drv
->test_socket
< 0) {
1123 test_driver_free_priv(drv
);
1127 if (drv
->udp_port
) {
1128 os_memset(&addr_in
, 0, sizeof(addr_in
));
1129 addr_in
.sin_family
= AF_INET
;
1130 addr_in
.sin_port
= htons(drv
->udp_port
);
1131 addr
= (struct sockaddr
*) &addr_in
;
1132 alen
= sizeof(addr_in
);
1134 os_memset(&addr_un
, 0, sizeof(addr_un
));
1135 addr_un
.sun_family
= AF_UNIX
;
1136 os_strlcpy(addr_un
.sun_path
, drv
->own_socket_path
,
1137 sizeof(addr_un
.sun_path
));
1138 addr
= (struct sockaddr
*) &addr_un
;
1139 alen
= sizeof(addr_un
);
1141 if (bind(drv
->test_socket
, addr
, alen
) < 0) {
1142 perror("bind(PF_UNIX)");
1143 close(drv
->test_socket
);
1144 if (drv
->own_socket_path
)
1145 unlink(drv
->own_socket_path
);
1146 test_driver_free_priv(drv
);
1149 eloop_register_read_sock(drv
->test_socket
,
1150 test_driver_receive_unix
, drv
, NULL
);
1152 drv
->test_socket
= -1;
1158 static void test_driver_deinit(void *priv
)
1160 struct wpa_driver_test_data
*drv
= priv
;
1161 struct test_client_socket
*cli
, *prev
;
1170 if (drv
->test_socket
>= 0) {
1171 eloop_unregister_read_sock(drv
->test_socket
);
1172 close(drv
->test_socket
);
1173 if (drv
->own_socket_path
)
1174 unlink(drv
->own_socket_path
);
1177 /* There should be only one BSS remaining at this point. */
1178 if (drv
->bss
== NULL
)
1179 wpa_printf(MSG_ERROR
, "%s: drv->bss == NULL", __func__
);
1180 else if (drv
->bss
->next
)
1181 wpa_printf(MSG_ERROR
, "%s: drv->bss->next != NULL", __func__
);
1183 test_driver_free_priv(drv
);
1188 static void wpa_driver_test_poll(void *eloop_ctx
, void *timeout_ctx
)
1190 struct wpa_driver_test_data
*drv
= eloop_ctx
;
1192 #ifdef DRIVER_TEST_UNIX
1193 if (drv
->associated
&& drv
->hostapd_addr_set
) {
1195 if (stat(drv
->hostapd_addr
.sun_path
, &st
) < 0) {
1196 wpa_printf(MSG_DEBUG
, "%s: lost connection to AP: %s",
1197 __func__
, strerror(errno
));
1198 drv
->associated
= 0;
1199 wpa_supplicant_event(drv
->ctx
, EVENT_DISASSOC
, NULL
);
1202 #endif /* DRIVER_TEST_UNIX */
1204 eloop_register_timeout(1, 0, wpa_driver_test_poll
, drv
, NULL
);
1208 static int wpa_driver_test_set_wpa(void *priv
, int enabled
)
1210 wpa_printf(MSG_DEBUG
, "%s: enabled=%d", __func__
, enabled
);
1215 static void wpa_driver_test_scan_timeout(void *eloop_ctx
, void *timeout_ctx
)
1217 wpa_printf(MSG_DEBUG
, "Scan timeout - try to get results");
1218 wpa_supplicant_event(timeout_ctx
, EVENT_SCAN_RESULTS
, NULL
);
1222 #ifdef DRIVER_TEST_UNIX
1223 static void wpa_driver_scan_dir(struct wpa_driver_test_data
*drv
,
1226 struct dirent
*dent
;
1228 struct sockaddr_un addr
;
1229 char cmd
[512], *pos
, *end
;
1232 dir
= opendir(path
);
1236 end
= cmd
+ sizeof(cmd
);
1238 ret
= os_snprintf(pos
, end
- pos
, "SCAN " MACSTR
,
1239 MAC2STR(drv
->own_addr
));
1240 if (ret
>= 0 && ret
< end
- pos
)
1242 if (drv
->probe_req_ie
) {
1243 ret
= os_snprintf(pos
, end
- pos
, " ");
1244 if (ret
>= 0 && ret
< end
- pos
)
1246 pos
+= wpa_snprintf_hex(pos
, end
- pos
, drv
->probe_req_ie
,
1247 drv
->probe_req_ie_len
);
1251 while ((dent
= readdir(dir
))) {
1252 if (os_strncmp(dent
->d_name
, "AP-", 3) != 0 &&
1253 os_strncmp(dent
->d_name
, "STA-", 4) != 0)
1255 if (drv
->own_socket_path
) {
1257 olen
= os_strlen(drv
->own_socket_path
);
1258 dlen
= os_strlen(dent
->d_name
);
1260 os_strcmp(dent
->d_name
,
1261 drv
->own_socket_path
+ olen
- dlen
) == 0)
1264 wpa_printf(MSG_DEBUG
, "%s: SCAN %s", __func__
, dent
->d_name
);
1266 os_memset(&addr
, 0, sizeof(addr
));
1267 addr
.sun_family
= AF_UNIX
;
1268 os_snprintf(addr
.sun_path
, sizeof(addr
.sun_path
), "%s/%s",
1269 path
, dent
->d_name
);
1271 if (sendto(drv
->test_socket
, cmd
, os_strlen(cmd
), 0,
1272 (struct sockaddr
*) &addr
, sizeof(addr
)) < 0) {
1273 perror("sendto(test_socket)");
1278 #endif /* DRIVER_TEST_UNIX */
1281 static int wpa_driver_test_scan(void *priv
,
1282 struct wpa_driver_scan_params
*params
)
1284 struct wpa_driver_test_data
*drv
= priv
;
1287 wpa_printf(MSG_DEBUG
, "%s: priv=%p", __func__
, priv
);
1288 for (i
= 0; i
< params
->num_ssids
; i
++)
1289 wpa_hexdump(MSG_DEBUG
, "Scan SSID",
1290 params
->ssids
[i
].ssid
, params
->ssids
[i
].ssid_len
);
1291 wpa_hexdump(MSG_DEBUG
, "Scan extra IE(s)",
1292 params
->extra_ies
, params
->extra_ies_len
);
1294 drv
->num_scanres
= 0;
1296 #ifdef DRIVER_TEST_UNIX
1297 if (drv
->test_socket
>= 0 && drv
->test_dir
)
1298 wpa_driver_scan_dir(drv
, drv
->test_dir
);
1300 if (drv
->test_socket
>= 0 && drv
->hostapd_addr_set
&&
1301 sendto(drv
->test_socket
, "SCAN", 4, 0,
1302 (struct sockaddr
*) &drv
->hostapd_addr
,
1303 sizeof(drv
->hostapd_addr
)) < 0) {
1304 perror("sendto(test_socket)");
1306 #endif /* DRIVER_TEST_UNIX */
1308 if (drv
->test_socket
>= 0 && drv
->hostapd_addr_udp_set
&&
1309 sendto(drv
->test_socket
, "SCAN", 4, 0,
1310 (struct sockaddr
*) &drv
->hostapd_addr_udp
,
1311 sizeof(drv
->hostapd_addr_udp
)) < 0) {
1312 perror("sendto(test_socket)");
1315 eloop_cancel_timeout(wpa_driver_test_scan_timeout
, drv
, drv
->ctx
);
1316 eloop_register_timeout(1, 0, wpa_driver_test_scan_timeout
, drv
,
1322 static struct wpa_scan_results
* wpa_driver_test_get_scan_results2(void *priv
)
1324 struct wpa_driver_test_data
*drv
= priv
;
1325 struct wpa_scan_results
*res
;
1328 res
= os_zalloc(sizeof(*res
));
1332 res
->res
= os_zalloc(drv
->num_scanres
* sizeof(struct wpa_scan_res
*));
1333 if (res
->res
== NULL
) {
1338 for (i
= 0; i
< drv
->num_scanres
; i
++) {
1339 struct wpa_scan_res
*r
;
1340 if (drv
->scanres
[i
] == NULL
)
1342 r
= os_malloc(sizeof(*r
) + drv
->scanres
[i
]->ie_len
);
1345 os_memcpy(r
, drv
->scanres
[i
],
1346 sizeof(*r
) + drv
->scanres
[i
]->ie_len
);
1347 res
->res
[res
->num
++] = r
;
1354 static int wpa_driver_test_set_key(void *priv
, wpa_alg alg
, const u8
*addr
,
1355 int key_idx
, int set_tx
,
1356 const u8
*seq
, size_t seq_len
,
1357 const u8
*key
, size_t key_len
)
1359 wpa_printf(MSG_DEBUG
, "%s: priv=%p alg=%d key_idx=%d set_tx=%d",
1360 __func__
, priv
, alg
, key_idx
, set_tx
);
1362 wpa_printf(MSG_DEBUG
, " addr=" MACSTR
, MAC2STR(addr
));
1365 wpa_hexdump(MSG_DEBUG
, " seq", seq
, seq_len
);
1368 wpa_hexdump(MSG_DEBUG
, " key", key
, key_len
);
1374 static int wpa_driver_test_associate(
1375 void *priv
, struct wpa_driver_associate_params
*params
)
1377 struct wpa_driver_test_data
*drv
= priv
;
1378 wpa_printf(MSG_DEBUG
, "%s: priv=%p freq=%d pairwise_suite=%d "
1379 "group_suite=%d key_mgmt_suite=%d auth_alg=%d mode=%d",
1380 __func__
, priv
, params
->freq
, params
->pairwise_suite
,
1381 params
->group_suite
, params
->key_mgmt_suite
,
1382 params
->auth_alg
, params
->mode
);
1383 if (params
->bssid
) {
1384 wpa_printf(MSG_DEBUG
, " bssid=" MACSTR
,
1385 MAC2STR(params
->bssid
));
1388 wpa_hexdump_ascii(MSG_DEBUG
, " ssid",
1389 params
->ssid
, params
->ssid_len
);
1391 if (params
->wpa_ie
) {
1392 wpa_hexdump(MSG_DEBUG
, " wpa_ie",
1393 params
->wpa_ie
, params
->wpa_ie_len
);
1394 drv
->assoc_wpa_ie_len
= params
->wpa_ie_len
;
1395 if (drv
->assoc_wpa_ie_len
> sizeof(drv
->assoc_wpa_ie
))
1396 drv
->assoc_wpa_ie_len
= sizeof(drv
->assoc_wpa_ie
);
1397 os_memcpy(drv
->assoc_wpa_ie
, params
->wpa_ie
,
1398 drv
->assoc_wpa_ie_len
);
1400 drv
->assoc_wpa_ie_len
= 0;
1402 drv
->ibss
= params
->mode
== IEEE80211_MODE_IBSS
;
1403 drv
->privacy
= params
->key_mgmt_suite
&
1404 (WPA_KEY_MGMT_IEEE8021X
|
1406 WPA_KEY_MGMT_WPA_NONE
|
1407 WPA_KEY_MGMT_FT_IEEE8021X
|
1408 WPA_KEY_MGMT_FT_PSK
|
1409 WPA_KEY_MGMT_IEEE8021X_SHA256
|
1410 WPA_KEY_MGMT_PSK_SHA256
);
1411 if (params
->wep_key_len
[params
->wep_tx_keyidx
])
1414 #ifdef DRIVER_TEST_UNIX
1415 if (drv
->test_dir
&& params
->bssid
&&
1416 params
->mode
!= IEEE80211_MODE_IBSS
) {
1417 os_memset(&drv
->hostapd_addr
, 0, sizeof(drv
->hostapd_addr
));
1418 drv
->hostapd_addr
.sun_family
= AF_UNIX
;
1419 os_snprintf(drv
->hostapd_addr
.sun_path
,
1420 sizeof(drv
->hostapd_addr
.sun_path
),
1422 drv
->test_dir
, MAC2STR(params
->bssid
));
1423 drv
->hostapd_addr_set
= 1;
1425 #endif /* DRIVER_TEST_UNIX */
1427 if (drv
->test_socket
>= 0 &&
1428 (drv
->hostapd_addr_set
|| drv
->hostapd_addr_udp_set
)) {
1429 char cmd
[200], *pos
, *end
;
1431 end
= cmd
+ sizeof(cmd
);
1433 ret
= os_snprintf(pos
, end
- pos
, "ASSOC " MACSTR
" ",
1434 MAC2STR(drv
->own_addr
));
1435 if (ret
>= 0 && ret
< end
- pos
)
1437 pos
+= wpa_snprintf_hex(pos
, end
- pos
, params
->ssid
,
1439 ret
= os_snprintf(pos
, end
- pos
, " ");
1440 if (ret
>= 0 && ret
< end
- pos
)
1442 pos
+= wpa_snprintf_hex(pos
, end
- pos
, params
->wpa_ie
,
1443 params
->wpa_ie_len
);
1445 #ifdef DRIVER_TEST_UNIX
1446 if (drv
->hostapd_addr_set
&&
1447 sendto(drv
->test_socket
, cmd
, os_strlen(cmd
), 0,
1448 (struct sockaddr
*) &drv
->hostapd_addr
,
1449 sizeof(drv
->hostapd_addr
)) < 0) {
1450 perror("sendto(test_socket)");
1453 #endif /* DRIVER_TEST_UNIX */
1454 if (drv
->hostapd_addr_udp_set
&&
1455 sendto(drv
->test_socket
, cmd
, os_strlen(cmd
), 0,
1456 (struct sockaddr
*) &drv
->hostapd_addr_udp
,
1457 sizeof(drv
->hostapd_addr_udp
)) < 0) {
1458 perror("sendto(test_socket)");
1462 os_memcpy(drv
->ssid
, params
->ssid
, params
->ssid_len
);
1463 drv
->ssid_len
= params
->ssid_len
;
1465 drv
->associated
= 1;
1466 if (params
->mode
== IEEE80211_MODE_IBSS
) {
1467 os_memcpy(drv
->ssid
, params
->ssid
, params
->ssid_len
);
1468 drv
->ssid_len
= params
->ssid_len
;
1470 os_memcpy(drv
->bssid
, params
->bssid
, ETH_ALEN
);
1472 os_get_random(drv
->bssid
, ETH_ALEN
);
1473 drv
->bssid
[0] &= ~0x01;
1474 drv
->bssid
[0] |= 0x02;
1477 wpa_supplicant_event(drv
->ctx
, EVENT_ASSOC
, NULL
);
1484 static int wpa_driver_test_get_bssid(void *priv
, u8
*bssid
)
1486 struct wpa_driver_test_data
*drv
= priv
;
1487 os_memcpy(bssid
, drv
->bssid
, ETH_ALEN
);
1492 static int wpa_driver_test_get_ssid(void *priv
, u8
*ssid
)
1494 struct wpa_driver_test_data
*drv
= priv
;
1495 os_memcpy(ssid
, drv
->ssid
, 32);
1496 return drv
->ssid_len
;
1500 static int wpa_driver_test_send_disassoc(struct wpa_driver_test_data
*drv
)
1502 #ifdef DRIVER_TEST_UNIX
1503 if (drv
->test_socket
>= 0 &&
1504 sendto(drv
->test_socket
, "DISASSOC", 8, 0,
1505 (struct sockaddr
*) &drv
->hostapd_addr
,
1506 sizeof(drv
->hostapd_addr
)) < 0) {
1507 perror("sendto(test_socket)");
1510 #endif /* DRIVER_TEST_UNIX */
1511 if (drv
->test_socket
>= 0 && drv
->hostapd_addr_udp_set
&&
1512 sendto(drv
->test_socket
, "DISASSOC", 8, 0,
1513 (struct sockaddr
*) &drv
->hostapd_addr_udp
,
1514 sizeof(drv
->hostapd_addr_udp
)) < 0) {
1515 perror("sendto(test_socket)");
1522 static int wpa_driver_test_deauthenticate(void *priv
, const u8
*addr
,
1525 struct wpa_driver_test_data
*drv
= priv
;
1526 wpa_printf(MSG_DEBUG
, "%s addr=" MACSTR
" reason_code=%d",
1527 __func__
, MAC2STR(addr
), reason_code
);
1528 os_memset(drv
->bssid
, 0, ETH_ALEN
);
1529 drv
->associated
= 0;
1530 wpa_supplicant_event(drv
->ctx
, EVENT_DISASSOC
, NULL
);
1531 return wpa_driver_test_send_disassoc(drv
);
1535 static int wpa_driver_test_disassociate(void *priv
, const u8
*addr
,
1538 struct wpa_driver_test_data
*drv
= priv
;
1539 wpa_printf(MSG_DEBUG
, "%s addr=" MACSTR
" reason_code=%d",
1540 __func__
, MAC2STR(addr
), reason_code
);
1541 os_memset(drv
->bssid
, 0, ETH_ALEN
);
1542 drv
->associated
= 0;
1543 wpa_supplicant_event(drv
->ctx
, EVENT_DISASSOC
, NULL
);
1544 return wpa_driver_test_send_disassoc(drv
);
1548 static void wpa_driver_test_scanresp(struct wpa_driver_test_data
*drv
,
1549 struct sockaddr
*from
,
1553 struct wpa_scan_res
*res
;
1554 const char *pos
, *pos2
;
1556 u8
*ie_pos
, *ie_start
, *ie_end
;
1557 #define MAX_IE_LEN 1000
1559 wpa_printf(MSG_DEBUG
, "test_driver: SCANRESP %s", data
);
1560 if (drv
->num_scanres
>= MAX_SCAN_RESULTS
) {
1561 wpa_printf(MSG_DEBUG
, "test_driver: No room for the new scan "
1566 /* SCANRESP BSSID SSID IEs */
1568 res
= os_zalloc(sizeof(*res
) + MAX_IE_LEN
);
1571 ie_start
= ie_pos
= (u8
*) (res
+ 1);
1572 ie_end
= ie_pos
+ MAX_IE_LEN
;
1574 if (hwaddr_aton(data
, res
->bssid
)) {
1575 wpa_printf(MSG_DEBUG
, "test_driver: invalid BSSID in scanres");
1583 pos2
= os_strchr(pos
, ' ');
1585 wpa_printf(MSG_DEBUG
, "test_driver: invalid SSID termination "
1590 len
= (pos2
- pos
) / 2;
1594 * Generate SSID IE from the SSID field since this IE is not included
1595 * in the main IE field.
1597 *ie_pos
++ = WLAN_EID_SSID
;
1599 if (hexstr2bin(pos
, ie_pos
, len
) < 0) {
1600 wpa_printf(MSG_DEBUG
, "test_driver: invalid SSID in scanres");
1607 pos2
= os_strchr(pos
, ' ');
1609 len
= os_strlen(pos
) / 2;
1611 len
= (pos2
- pos
) / 2;
1612 if ((int) len
> ie_end
- ie_pos
)
1613 len
= ie_end
- ie_pos
;
1614 if (hexstr2bin(pos
, ie_pos
, len
) < 0) {
1615 wpa_printf(MSG_DEBUG
, "test_driver: invalid IEs in scanres");
1620 res
->ie_len
= ie_pos
- ie_start
;
1626 if (os_strstr(pos
, "PRIVACY"))
1627 res
->caps
|= IEEE80211_CAP_PRIVACY
;
1628 if (os_strstr(pos
, "IBSS"))
1629 res
->caps
|= IEEE80211_CAP_IBSS
;
1632 os_free(drv
->scanres
[drv
->num_scanres
]);
1633 drv
->scanres
[drv
->num_scanres
++] = res
;
1637 static void wpa_driver_test_assocresp(struct wpa_driver_test_data
*drv
,
1638 struct sockaddr
*from
,
1642 /* ASSOCRESP BSSID <res> */
1643 if (hwaddr_aton(data
, drv
->bssid
)) {
1644 wpa_printf(MSG_DEBUG
, "test_driver: invalid BSSID in "
1647 if (drv
->use_associnfo
) {
1648 union wpa_event_data event
;
1649 os_memset(&event
, 0, sizeof(event
));
1650 event
.assoc_info
.req_ies
= drv
->assoc_wpa_ie
;
1651 event
.assoc_info
.req_ies_len
= drv
->assoc_wpa_ie_len
;
1652 wpa_supplicant_event(drv
->ctx
, EVENT_ASSOCINFO
, &event
);
1654 drv
->associated
= 1;
1655 wpa_supplicant_event(drv
->ctx
, EVENT_ASSOC
, NULL
);
1659 static void wpa_driver_test_disassoc(struct wpa_driver_test_data
*drv
,
1660 struct sockaddr
*from
,
1663 drv
->associated
= 0;
1664 wpa_supplicant_event(drv
->ctx
, EVENT_DISASSOC
, NULL
);
1668 static void wpa_driver_test_eapol(struct wpa_driver_test_data
*drv
,
1669 struct sockaddr
*from
,
1671 const u8
*data
, size_t data_len
)
1673 const u8
*src
= drv
->bssid
;
1675 if (data_len
> 14) {
1676 /* Skip Ethernet header */
1677 src
= data
+ ETH_ALEN
;
1681 wpa_supplicant_rx_eapol(drv
->ctx
, src
, data
, data_len
);
1685 static void wpa_driver_test_mlme(struct wpa_driver_test_data
*drv
,
1686 struct sockaddr
*from
,
1688 const u8
*data
, size_t data_len
)
1690 #ifdef CONFIG_CLIENT_MLME
1691 struct ieee80211_rx_status rx_status
;
1692 os_memset(&rx_status
, 0, sizeof(rx_status
));
1693 wpa_supplicant_sta_rx(drv
->ctx
, data
, data_len
, &rx_status
);
1694 #endif /* CONFIG_CLIENT_MLME */
1698 static void wpa_driver_test_scan_cmd(struct wpa_driver_test_data
*drv
,
1699 struct sockaddr
*from
,
1701 const u8
*data
, size_t data_len
)
1703 char buf
[512], *pos
, *end
;
1706 /* data: optional [ STA-addr | ' ' | IEs(hex) ] */
1712 end
= buf
+ sizeof(buf
);
1714 /* reply: SCANRESP BSSID SSID IEs */
1715 ret
= snprintf(pos
, end
- pos
, "SCANRESP " MACSTR
" ",
1716 MAC2STR(drv
->bssid
));
1717 if (ret
< 0 || ret
>= end
- pos
)
1720 pos
+= wpa_snprintf_hex(pos
, end
- pos
,
1721 drv
->ssid
, drv
->ssid_len
);
1722 ret
= snprintf(pos
, end
- pos
, " ");
1723 if (ret
< 0 || ret
>= end
- pos
)
1726 pos
+= wpa_snprintf_hex(pos
, end
- pos
, drv
->assoc_wpa_ie
,
1727 drv
->assoc_wpa_ie_len
);
1730 ret
= snprintf(pos
, end
- pos
, " PRIVACY");
1731 if (ret
< 0 || ret
>= end
- pos
)
1736 ret
= snprintf(pos
, end
- pos
, " IBSS");
1737 if (ret
< 0 || ret
>= end
- pos
)
1741 sendto(drv
->test_socket
, buf
, pos
- buf
, 0,
1742 (struct sockaddr
*) from
, fromlen
);
1746 static void wpa_driver_test_receive_unix(int sock
, void *eloop_ctx
,
1749 struct wpa_driver_test_data
*drv
= eloop_ctx
;
1752 struct sockaddr_storage from
;
1753 socklen_t fromlen
= sizeof(from
);
1754 const size_t buflen
= 2000;
1756 buf
= os_malloc(buflen
);
1759 res
= recvfrom(sock
, buf
, buflen
- 1, 0,
1760 (struct sockaddr
*) &from
, &fromlen
);
1762 perror("recvfrom(test_socket)");
1768 wpa_printf(MSG_DEBUG
, "test_driver: received %u bytes", res
);
1770 if (os_strncmp(buf
, "SCANRESP ", 9) == 0) {
1771 wpa_driver_test_scanresp(drv
, (struct sockaddr
*) &from
,
1773 } else if (os_strncmp(buf
, "ASSOCRESP ", 10) == 0) {
1774 wpa_driver_test_assocresp(drv
, (struct sockaddr
*) &from
,
1776 } else if (os_strcmp(buf
, "DISASSOC") == 0) {
1777 wpa_driver_test_disassoc(drv
, (struct sockaddr
*) &from
,
1779 } else if (os_strcmp(buf
, "DEAUTH") == 0) {
1780 wpa_driver_test_disassoc(drv
, (struct sockaddr
*) &from
,
1782 } else if (os_strncmp(buf
, "EAPOL ", 6) == 0) {
1783 wpa_driver_test_eapol(drv
, (struct sockaddr
*) &from
, fromlen
,
1784 (const u8
*) buf
+ 6, res
- 6);
1785 } else if (os_strncmp(buf
, "MLME ", 5) == 0) {
1786 wpa_driver_test_mlme(drv
, (struct sockaddr
*) &from
, fromlen
,
1787 (const u8
*) buf
+ 5, res
- 5);
1788 } else if (os_strncmp(buf
, "SCAN ", 5) == 0) {
1789 wpa_driver_test_scan_cmd(drv
, (struct sockaddr
*) &from
,
1791 (const u8
*) buf
+ 5, res
- 5);
1793 wpa_hexdump_ascii(MSG_DEBUG
, "Unknown test_socket command",
1800 static void * wpa_driver_test_init2(void *ctx
, const char *ifname
,
1803 struct wpa_driver_test_data
*drv
;
1805 drv
= os_zalloc(sizeof(*drv
));
1808 drv
->global
= global_priv
;
1810 drv
->test_socket
= -1;
1812 /* Set dummy BSSID and SSID for testing. */
1813 drv
->bssid
[0] = 0x02;
1814 drv
->bssid
[1] = 0x00;
1815 drv
->bssid
[2] = 0x00;
1816 drv
->bssid
[3] = 0x00;
1817 drv
->bssid
[4] = 0x00;
1818 drv
->bssid
[5] = 0x01;
1819 os_memcpy(drv
->ssid
, "test", 5);
1822 /* Generate a MAC address to help testing with multiple STAs */
1823 drv
->own_addr
[0] = 0x02; /* locally administered */
1824 sha1_prf((const u8
*) ifname
, os_strlen(ifname
),
1825 "wpa_supplicant test mac addr generation",
1826 NULL
, 0, drv
->own_addr
+ 1, ETH_ALEN
- 1);
1827 eloop_register_timeout(1, 0, wpa_driver_test_poll
, drv
, NULL
);
1833 static void wpa_driver_test_close_test_socket(struct wpa_driver_test_data
*drv
)
1835 if (drv
->test_socket
>= 0) {
1836 eloop_unregister_read_sock(drv
->test_socket
);
1837 close(drv
->test_socket
);
1838 drv
->test_socket
= -1;
1841 if (drv
->own_socket_path
) {
1842 unlink(drv
->own_socket_path
);
1843 os_free(drv
->own_socket_path
);
1844 drv
->own_socket_path
= NULL
;
1849 static void wpa_driver_test_deinit(void *priv
)
1851 struct wpa_driver_test_data
*drv
= priv
;
1853 wpa_driver_test_close_test_socket(drv
);
1854 eloop_cancel_timeout(wpa_driver_test_scan_timeout
, drv
, drv
->ctx
);
1855 eloop_cancel_timeout(wpa_driver_test_poll
, drv
, NULL
);
1856 os_free(drv
->test_dir
);
1857 for (i
= 0; i
< MAX_SCAN_RESULTS
; i
++)
1858 os_free(drv
->scanres
[i
]);
1859 os_free(drv
->probe_req_ie
);
1864 static int wpa_driver_test_attach(struct wpa_driver_test_data
*drv
,
1867 #ifdef DRIVER_TEST_UNIX
1868 static unsigned int counter
= 0;
1869 struct sockaddr_un addr
;
1872 os_free(drv
->own_socket_path
);
1874 len
= os_strlen(dir
) + 30;
1875 drv
->own_socket_path
= os_malloc(len
);
1876 if (drv
->own_socket_path
== NULL
)
1878 os_snprintf(drv
->own_socket_path
, len
, "%s/STA-" MACSTR
,
1879 dir
, MAC2STR(drv
->own_addr
));
1881 drv
->own_socket_path
= os_malloc(100);
1882 if (drv
->own_socket_path
== NULL
)
1884 os_snprintf(drv
->own_socket_path
, 100,
1885 "/tmp/wpa_supplicant_test-%d-%d",
1886 getpid(), counter
++);
1889 drv
->test_socket
= socket(PF_UNIX
, SOCK_DGRAM
, 0);
1890 if (drv
->test_socket
< 0) {
1891 perror("socket(PF_UNIX)");
1892 os_free(drv
->own_socket_path
);
1893 drv
->own_socket_path
= NULL
;
1897 os_memset(&addr
, 0, sizeof(addr
));
1898 addr
.sun_family
= AF_UNIX
;
1899 os_strlcpy(addr
.sun_path
, drv
->own_socket_path
, sizeof(addr
.sun_path
));
1900 if (bind(drv
->test_socket
, (struct sockaddr
*) &addr
,
1901 sizeof(addr
)) < 0) {
1902 perror("bind(PF_UNIX)");
1903 close(drv
->test_socket
);
1904 unlink(drv
->own_socket_path
);
1905 os_free(drv
->own_socket_path
);
1906 drv
->own_socket_path
= NULL
;
1910 eloop_register_read_sock(drv
->test_socket
,
1911 wpa_driver_test_receive_unix
, drv
, NULL
);
1914 #else /* DRIVER_TEST_UNIX */
1916 #endif /* DRIVER_TEST_UNIX */
1920 static int wpa_driver_test_attach_udp(struct wpa_driver_test_data
*drv
,
1925 pos
= os_strchr(dst
, ':');
1929 wpa_printf(MSG_DEBUG
, "%s: addr=%s port=%s", __func__
, dst
, pos
);
1931 drv
->test_socket
= socket(PF_INET
, SOCK_DGRAM
, 0);
1932 if (drv
->test_socket
< 0) {
1933 perror("socket(PF_INET)");
1937 os_memset(&drv
->hostapd_addr_udp
, 0, sizeof(drv
->hostapd_addr_udp
));
1938 drv
->hostapd_addr_udp
.sin_family
= AF_INET
;
1939 #if defined(CONFIG_NATIVE_WINDOWS) || defined(CONFIG_ANSI_C_EXTRA)
1943 sscanf(dst
, "%d.%d.%d.%d", &a
[0], &a
[1], &a
[2], &a
[3]);
1944 pos
= (u8
*) &drv
->hostapd_addr_udp
.sin_addr
;
1950 #else /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */
1951 inet_aton(dst
, &drv
->hostapd_addr_udp
.sin_addr
);
1952 #endif /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */
1953 drv
->hostapd_addr_udp
.sin_port
= htons(atoi(pos
));
1955 drv
->hostapd_addr_udp_set
= 1;
1957 eloop_register_read_sock(drv
->test_socket
,
1958 wpa_driver_test_receive_unix
, drv
, NULL
);
1964 static int wpa_driver_test_set_param(void *priv
, const char *param
)
1966 struct wpa_driver_test_data
*drv
= priv
;
1969 wpa_printf(MSG_DEBUG
, "%s: param='%s'", __func__
, param
);
1973 wpa_driver_test_close_test_socket(drv
);
1975 #ifdef DRIVER_TEST_UNIX
1976 pos
= os_strstr(param
, "test_socket=");
1982 pos2
= os_strchr(pos
, ' ');
1986 len
= os_strlen(pos
);
1987 if (len
> sizeof(drv
->hostapd_addr
.sun_path
))
1989 os_memset(&drv
->hostapd_addr
, 0, sizeof(drv
->hostapd_addr
));
1990 drv
->hostapd_addr
.sun_family
= AF_UNIX
;
1991 os_memcpy(drv
->hostapd_addr
.sun_path
, pos
, len
);
1992 drv
->hostapd_addr_set
= 1;
1994 #endif /* DRIVER_TEST_UNIX */
1996 pos
= os_strstr(param
, "test_dir=");
1999 os_free(drv
->test_dir
);
2000 drv
->test_dir
= os_strdup(pos
+ 9);
2001 if (drv
->test_dir
== NULL
)
2003 end
= os_strchr(drv
->test_dir
, ' ');
2006 if (wpa_driver_test_attach(drv
, drv
->test_dir
))
2009 pos
= os_strstr(param
, "test_udp=");
2012 dst
= os_strdup(pos
+ 9);
2015 epos
= os_strchr(dst
, ' ');
2018 if (wpa_driver_test_attach_udp(drv
, dst
))
2021 } else if (wpa_driver_test_attach(drv
, NULL
))
2025 if (os_strstr(param
, "use_associnfo=1")) {
2026 wpa_printf(MSG_DEBUG
, "test_driver: Use AssocInfo events");
2027 drv
->use_associnfo
= 1;
2030 #ifdef CONFIG_CLIENT_MLME
2031 if (os_strstr(param
, "use_mlme=1")) {
2032 wpa_printf(MSG_DEBUG
, "test_driver: Use internal MLME");
2035 #endif /* CONFIG_CLIENT_MLME */
2041 static const u8
* wpa_driver_test_get_mac_addr(void *priv
)
2043 struct wpa_driver_test_data
*drv
= priv
;
2044 wpa_printf(MSG_DEBUG
, "%s", __func__
);
2045 return drv
->own_addr
;
2049 static int wpa_driver_test_send_eapol(void *priv
, const u8
*dest
, u16 proto
,
2050 const u8
*data
, size_t data_len
)
2052 struct wpa_driver_test_data
*drv
= priv
;
2055 struct l2_ethhdr eth
;
2056 struct sockaddr
*addr
;
2058 #ifdef DRIVER_TEST_UNIX
2059 struct sockaddr_un addr_un
;
2060 #endif /* DRIVER_TEST_UNIX */
2062 wpa_hexdump(MSG_MSGDUMP
, "test_send_eapol TX frame", data
, data_len
);
2064 os_memset(ð
, 0, sizeof(eth
));
2065 os_memcpy(eth
.h_dest
, dest
, ETH_ALEN
);
2066 os_memcpy(eth
.h_source
, drv
->own_addr
, ETH_ALEN
);
2067 eth
.h_proto
= host_to_be16(proto
);
2069 msg_len
= 6 + sizeof(eth
) + data_len
;
2070 msg
= os_malloc(msg_len
);
2073 os_memcpy(msg
, "EAPOL ", 6);
2074 os_memcpy(msg
+ 6, ð
, sizeof(eth
));
2075 os_memcpy(msg
+ 6 + sizeof(eth
), data
, data_len
);
2077 if (os_memcmp(dest
, drv
->bssid
, ETH_ALEN
) == 0 ||
2078 drv
->test_dir
== NULL
) {
2079 if (drv
->hostapd_addr_udp_set
) {
2080 addr
= (struct sockaddr
*) &drv
->hostapd_addr_udp
;
2081 alen
= sizeof(drv
->hostapd_addr_udp
);
2083 #ifdef DRIVER_TEST_UNIX
2084 addr
= (struct sockaddr
*) &drv
->hostapd_addr
;
2085 alen
= sizeof(drv
->hostapd_addr
);
2086 #else /* DRIVER_TEST_UNIX */
2089 #endif /* DRIVER_TEST_UNIX */
2092 #ifdef DRIVER_TEST_UNIX
2094 os_memset(&addr_un
, 0, sizeof(addr_un
));
2095 addr_un
.sun_family
= AF_UNIX
;
2096 os_snprintf(addr_un
.sun_path
, sizeof(addr_un
.sun_path
),
2097 "%s/STA-" MACSTR
, drv
->test_dir
, MAC2STR(dest
));
2098 if (stat(addr_un
.sun_path
, &st
) < 0) {
2099 os_snprintf(addr_un
.sun_path
, sizeof(addr_un
.sun_path
),
2101 drv
->test_dir
, MAC2STR(dest
));
2103 addr
= (struct sockaddr
*) &addr_un
;
2104 alen
= sizeof(addr_un
);
2105 #else /* DRIVER_TEST_UNIX */
2108 #endif /* DRIVER_TEST_UNIX */
2111 if (sendto(drv
->test_socket
, msg
, msg_len
, 0, addr
, alen
) < 0) {
2112 perror("sendmsg(test_socket)");
2122 static int wpa_driver_test_get_capa(void *priv
, struct wpa_driver_capa
*capa
)
2124 struct wpa_driver_test_data
*drv
= priv
;
2125 os_memset(capa
, 0, sizeof(*capa
));
2126 capa
->key_mgmt
= WPA_DRIVER_CAPA_KEY_MGMT_WPA
|
2127 WPA_DRIVER_CAPA_KEY_MGMT_WPA2
|
2128 WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK
|
2129 WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK
|
2130 WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE
|
2131 WPA_DRIVER_CAPA_KEY_MGMT_FT
|
2132 WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK
;
2133 capa
->enc
= WPA_DRIVER_CAPA_ENC_WEP40
|
2134 WPA_DRIVER_CAPA_ENC_WEP104
|
2135 WPA_DRIVER_CAPA_ENC_TKIP
|
2136 WPA_DRIVER_CAPA_ENC_CCMP
;
2137 capa
->auth
= WPA_DRIVER_AUTH_OPEN
|
2138 WPA_DRIVER_AUTH_SHARED
|
2139 WPA_DRIVER_AUTH_LEAP
;
2141 capa
->flags
|= WPA_DRIVER_FLAGS_USER_SPACE_MLME
;
2142 capa
->max_scan_ssids
= 2;
2148 static int wpa_driver_test_mlme_setprotection(void *priv
, const u8
*addr
,
2152 wpa_printf(MSG_DEBUG
, "%s: protect_type=%d key_type=%d",
2153 __func__
, protect_type
, key_type
);
2156 wpa_printf(MSG_DEBUG
, "%s: addr=" MACSTR
,
2157 __func__
, MAC2STR(addr
));
2164 #ifdef CONFIG_CLIENT_MLME
2165 static int wpa_driver_test_set_channel(void *priv
, hostapd_hw_mode phymode
,
2168 wpa_printf(MSG_DEBUG
, "%s: phymode=%d chan=%d freq=%d",
2169 __func__
, phymode
, chan
, freq
);
2174 static int wpa_driver_test_send_mlme(void *priv
, const u8
*data
,
2177 struct wpa_driver_test_data
*drv
= priv
;
2180 struct sockaddr_un addr
;
2182 struct dirent
*dent
;
2185 wpa_hexdump(MSG_MSGDUMP
, "test_send_mlme", data
, data_len
);
2190 io
[0].iov_base
= "MLME ";
2192 io
[1].iov_base
= (u8
*) data
;
2193 io
[1].iov_len
= data_len
;
2195 os_memset(&msg
, 0, sizeof(msg
));
2198 if (os_memcmp(dest
, drv
->bssid
, ETH_ALEN
) == 0 ||
2199 drv
->test_dir
== NULL
) {
2200 if (drv
->hostapd_addr_udp_set
) {
2201 msg
.msg_name
= &drv
->hostapd_addr_udp
;
2202 msg
.msg_namelen
= sizeof(drv
->hostapd_addr_udp
);
2204 #ifdef DRIVER_TEST_UNIX
2205 msg
.msg_name
= &drv
->hostapd_addr
;
2206 msg
.msg_namelen
= sizeof(drv
->hostapd_addr
);
2207 #endif /* DRIVER_TEST_UNIX */
2209 } else if (os_memcmp(dest
, "\xff\xff\xff\xff\xff\xff", ETH_ALEN
) == 0)
2211 dir
= opendir(drv
->test_dir
);
2214 while ((dent
= readdir(dir
))) {
2215 #ifdef _DIRENT_HAVE_D_TYPE
2216 /* Skip the file if it is not a socket.
2217 * Also accept DT_UNKNOWN (0) in case
2218 * the C library or underlying file
2219 * system does not support d_type. */
2220 if (dent
->d_type
!= DT_SOCK
&&
2221 dent
->d_type
!= DT_UNKNOWN
)
2223 #endif /* _DIRENT_HAVE_D_TYPE */
2224 if (os_strcmp(dent
->d_name
, ".") == 0 ||
2225 os_strcmp(dent
->d_name
, "..") == 0)
2227 wpa_printf(MSG_DEBUG
, "%s: Send broadcast MLME to %s",
2228 __func__
, dent
->d_name
);
2229 os_memset(&addr
, 0, sizeof(addr
));
2230 addr
.sun_family
= AF_UNIX
;
2231 os_snprintf(addr
.sun_path
, sizeof(addr
.sun_path
),
2232 "%s/%s", drv
->test_dir
, dent
->d_name
);
2234 msg
.msg_name
= &addr
;
2235 msg
.msg_namelen
= sizeof(addr
);
2237 if (sendmsg(drv
->test_socket
, &msg
, 0) < 0)
2238 perror("sendmsg(test_socket)");
2244 os_memset(&addr
, 0, sizeof(addr
));
2245 addr
.sun_family
= AF_UNIX
;
2246 os_snprintf(addr
.sun_path
, sizeof(addr
.sun_path
),
2247 "%s/AP-" MACSTR
, drv
->test_dir
, MAC2STR(dest
));
2248 if (stat(addr
.sun_path
, &st
) < 0) {
2249 os_snprintf(addr
.sun_path
, sizeof(addr
.sun_path
),
2251 drv
->test_dir
, MAC2STR(dest
));
2253 msg
.msg_name
= &addr
;
2254 msg
.msg_namelen
= sizeof(addr
);
2257 if (sendmsg(drv
->test_socket
, &msg
, 0) < 0) {
2258 perror("sendmsg(test_socket)");
2266 static int wpa_driver_test_mlme_add_sta(void *priv
, const u8
*addr
,
2267 const u8
*supp_rates
,
2268 size_t supp_rates_len
)
2270 wpa_printf(MSG_DEBUG
, "%s: addr=" MACSTR
, __func__
, MAC2STR(addr
));
2275 static int wpa_driver_test_mlme_remove_sta(void *priv
, const u8
*addr
)
2277 wpa_printf(MSG_DEBUG
, "%s: addr=" MACSTR
, __func__
, MAC2STR(addr
));
2282 static int wpa_driver_test_set_ssid(void *priv
, const u8
*ssid
,
2285 wpa_printf(MSG_DEBUG
, "%s", __func__
);
2290 static int wpa_driver_test_set_bssid(void *priv
, const u8
*bssid
)
2292 wpa_printf(MSG_DEBUG
, "%s: bssid=" MACSTR
, __func__
, MAC2STR(bssid
));
2295 #endif /* CONFIG_CLIENT_MLME */
2298 static int wpa_driver_test_set_probe_req_ie(void *priv
, const u8
*ies
,
2301 struct wpa_driver_test_data
*drv
= priv
;
2303 os_free(drv
->probe_req_ie
);
2305 drv
->probe_req_ie
= os_malloc(ies_len
);
2306 if (drv
->probe_req_ie
== NULL
) {
2307 drv
->probe_req_ie_len
= 0;
2310 os_memcpy(drv
->probe_req_ie
, ies
, ies_len
);
2311 drv
->probe_req_ie_len
= ies_len
;
2313 drv
->probe_req_ie
= NULL
;
2314 drv
->probe_req_ie_len
= 0;
2320 static void * wpa_driver_test_global_init(void)
2322 struct wpa_driver_test_global
*global
;
2324 global
= os_zalloc(sizeof(*global
));
2329 static void wpa_driver_test_global_deinit(void *priv
)
2331 struct wpa_driver_test_global
*global
= priv
;
2336 static struct wpa_interface_info
*
2337 wpa_driver_test_get_interfaces(void *global_priv
)
2339 /* struct wpa_driver_test_global *global = priv; */
2340 struct wpa_interface_info
*iface
;
2342 iface
= os_zalloc(sizeof(*iface
));
2345 iface
->ifname
= os_strdup("sta0");
2346 iface
->desc
= os_strdup("test interface 0");
2347 iface
->drv_name
= "test";
2348 iface
->next
= os_zalloc(sizeof(*iface
));
2350 iface
->next
->ifname
= os_strdup("sta1");
2351 iface
->next
->desc
= os_strdup("test interface 1");
2352 iface
->next
->drv_name
= "test";
2358 #endif /* HOSTAPD */
2361 #if defined(HOSTAPD) || defined(CONFIG_CLIENT_MLME)
2362 static struct hostapd_hw_modes
*
2363 wpa_driver_test_get_hw_feature_data(void *priv
, u16
*num_modes
, u16
*flags
)
2365 struct hostapd_hw_modes
*modes
;
2369 modes
= os_zalloc(*num_modes
* sizeof(struct hostapd_hw_modes
));
2372 modes
[0].mode
= HOSTAPD_MODE_IEEE80211G
;
2373 modes
[0].num_channels
= 1;
2374 modes
[0].num_rates
= 1;
2375 modes
[0].channels
= os_zalloc(sizeof(struct hostapd_channel_data
));
2376 modes
[0].rates
= os_zalloc(sizeof(struct hostapd_rate_data
));
2377 if (modes
[0].channels
== NULL
|| modes
[0].rates
== NULL
)
2379 modes
[0].channels
[0].chan
= 1;
2380 modes
[0].channels
[0].freq
= 2412;
2381 modes
[0].channels
[0].flag
= 0;
2382 modes
[0].rates
[0].rate
= 10;
2383 modes
[0].rates
[0].flags
= HOSTAPD_RATE_BASIC
| HOSTAPD_RATE_SUPPORTED
|
2384 HOSTAPD_RATE_CCK
| HOSTAPD_RATE_MANDATORY
;
2386 modes
[1].mode
= HOSTAPD_MODE_IEEE80211B
;
2387 modes
[1].num_channels
= 1;
2388 modes
[1].num_rates
= 1;
2389 modes
[1].channels
= os_zalloc(sizeof(struct hostapd_channel_data
));
2390 modes
[1].rates
= os_zalloc(sizeof(struct hostapd_rate_data
));
2391 if (modes
[1].channels
== NULL
|| modes
[1].rates
== NULL
)
2393 modes
[1].channels
[0].chan
= 1;
2394 modes
[1].channels
[0].freq
= 2412;
2395 modes
[1].channels
[0].flag
= 0;
2396 modes
[1].rates
[0].rate
= 10;
2397 modes
[1].rates
[0].flags
= HOSTAPD_RATE_BASIC
| HOSTAPD_RATE_SUPPORTED
|
2398 HOSTAPD_RATE_CCK
| HOSTAPD_RATE_MANDATORY
;
2400 modes
[2].mode
= HOSTAPD_MODE_IEEE80211A
;
2401 modes
[2].num_channels
= 1;
2402 modes
[2].num_rates
= 1;
2403 modes
[2].channels
= os_zalloc(sizeof(struct hostapd_channel_data
));
2404 modes
[2].rates
= os_zalloc(sizeof(struct hostapd_rate_data
));
2405 if (modes
[2].channels
== NULL
|| modes
[2].rates
== NULL
)
2407 modes
[2].channels
[0].chan
= 60;
2408 modes
[2].channels
[0].freq
= 5300;
2409 modes
[2].channels
[0].flag
= 0;
2410 modes
[2].rates
[0].rate
= 60;
2411 modes
[2].rates
[0].flags
= HOSTAPD_RATE_BASIC
| HOSTAPD_RATE_SUPPORTED
|
2412 HOSTAPD_RATE_MANDATORY
;
2419 for (i
= 0; i
< *num_modes
; i
++) {
2420 os_free(modes
[i
].channels
);
2421 os_free(modes
[i
].rates
);
2427 #endif /* HOSTAPD || CONFIG_CLIENT_MLME */
2430 const struct wpa_driver_ops wpa_driver_test_ops
= {
2432 "wpa_supplicant test driver",
2434 .hapd_init
= test_driver_init
,
2435 .hapd_deinit
= test_driver_deinit
,
2436 .hapd_send_eapol
= test_driver_send_eapol
,
2437 .send_mlme
= wpa_driver_test_send_mlme
,
2438 .set_generic_elem
= test_driver_set_generic_elem
,
2439 .sta_deauth
= test_driver_sta_deauth
,
2440 .sta_disassoc
= test_driver_sta_disassoc
,
2441 .get_hw_feature_data
= wpa_driver_test_get_hw_feature_data
,
2442 .bss_add
= test_driver_bss_add
,
2443 .bss_remove
= test_driver_bss_remove
,
2444 .if_add
= test_driver_if_add
,
2445 .if_update
= test_driver_if_update
,
2446 .if_remove
= test_driver_if_remove
,
2447 .valid_bss_mask
= test_driver_valid_bss_mask
,
2448 .hapd_set_ssid
= test_driver_set_ssid
,
2449 .set_privacy
= test_driver_set_privacy
,
2450 .hapd_set_key
= test_driver_set_key
,
2451 .set_sta_vlan
= test_driver_set_sta_vlan
,
2452 .sta_add
= test_driver_sta_add
,
2453 .send_ether
= test_driver_send_ether
,
2454 .set_wps_beacon_ie
= test_driver_set_wps_beacon_ie
,
2455 .set_wps_probe_resp_ie
= test_driver_set_wps_probe_resp_ie
,
2457 .get_bssid
= wpa_driver_test_get_bssid
,
2458 .get_ssid
= wpa_driver_test_get_ssid
,
2459 .set_wpa
= wpa_driver_test_set_wpa
,
2460 .set_key
= wpa_driver_test_set_key
,
2461 .deinit
= wpa_driver_test_deinit
,
2462 .set_param
= wpa_driver_test_set_param
,
2463 .deauthenticate
= wpa_driver_test_deauthenticate
,
2464 .disassociate
= wpa_driver_test_disassociate
,
2465 .associate
= wpa_driver_test_associate
,
2466 .get_capa
= wpa_driver_test_get_capa
,
2467 .get_mac_addr
= wpa_driver_test_get_mac_addr
,
2468 .send_eapol
= wpa_driver_test_send_eapol
,
2469 .mlme_setprotection
= wpa_driver_test_mlme_setprotection
,
2470 #ifdef CONFIG_CLIENT_MLME
2471 .get_hw_feature_data
= wpa_driver_test_get_hw_feature_data
,
2472 .set_channel
= wpa_driver_test_set_channel
,
2473 .set_ssid
= wpa_driver_test_set_ssid
,
2474 .set_bssid
= wpa_driver_test_set_bssid
,
2475 .send_mlme
= wpa_driver_test_send_mlme
,
2476 .mlme_add_sta
= wpa_driver_test_mlme_add_sta
,
2477 .mlme_remove_sta
= wpa_driver_test_mlme_remove_sta
,
2478 #endif /* CONFIG_CLIENT_MLME */
2479 .get_scan_results2
= wpa_driver_test_get_scan_results2
,
2480 .set_probe_req_ie
= wpa_driver_test_set_probe_req_ie
,
2481 .global_init
= wpa_driver_test_global_init
,
2482 .global_deinit
= wpa_driver_test_global_deinit
,
2483 .init2
= wpa_driver_test_init2
,
2484 .get_interfaces
= wpa_driver_test_get_interfaces
,
2485 .scan2
= wpa_driver_test_scan
,
2486 #endif /* HOSTAPD */