2 * Testing driver interface for a simulated network driver
3 * Copyright (c) 2004-2010, 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 */
21 #include "utils/includes.h"
23 #ifndef CONFIG_NATIVE_WINDOWS
27 #define DRIVER_TEST_UNIX
28 #endif /* CONFIG_NATIVE_WINDOWS */
30 #include "utils/common.h"
31 #include "utils/eloop.h"
32 #include "utils/list.h"
33 #include "utils/trace.h"
34 #include "common/ieee802_11_defs.h"
35 #include "crypto/sha1.h"
36 #include "l2_packet/l2_packet.h"
40 struct test_client_socket
{
41 struct test_client_socket
*next
;
43 struct sockaddr_un un
;
45 struct test_driver_bss
*bss
;
48 struct test_driver_bss
{
49 struct wpa_driver_test_data
*drv
;
52 char ifname
[IFNAMSIZ
];
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
{
67 u8 req_addr
[ETH_ALEN
];
70 struct wpa_driver_test_data
{
71 struct wpa_driver_test_global
*global
;
74 u8 own_addr
[ETH_ALEN
];
76 #ifdef DRIVER_TEST_UNIX
77 struct sockaddr_un hostapd_addr
;
78 #endif /* DRIVER_TEST_UNIX */
80 struct sockaddr_in hostapd_addr_udp
;
81 int hostapd_addr_udp_set
;
82 char *own_socket_path
;
84 #define MAX_SCAN_RESULTS 30
85 struct wpa_scan_res
*scanres
[MAX_SCAN_RESULTS
];
89 size_t assoc_wpa_ie_len
;
93 size_t probe_req_ie_len
;
94 u8 probe_req_ssid
[32];
95 size_t probe_req_ssid_len
;
99 struct test_client_socket
*cli
;
105 int probe_req_report
;
106 unsigned int remain_on_channel_freq
;
107 unsigned int remain_on_channel_duration
;
113 static void wpa_driver_test_deinit(void *priv
);
114 static int wpa_driver_test_attach(struct wpa_driver_test_data
*drv
,
115 const char *dir
, int ap
);
116 static void wpa_driver_test_close_test_socket(
117 struct wpa_driver_test_data
*drv
);
118 static void test_remain_on_channel_timeout(void *eloop_ctx
, void *timeout_ctx
);
121 static void test_driver_free_bss(struct test_driver_bss
*bss
)
124 os_free(bss
->wps_beacon_ie
);
125 os_free(bss
->wps_probe_resp_ie
);
130 static void test_driver_free_bsses(struct wpa_driver_test_data
*drv
)
132 struct test_driver_bss
*bss
, *tmp
;
134 dl_list_for_each_safe(bss
, tmp
, &drv
->bss
, struct test_driver_bss
,
136 dl_list_del(&bss
->list
);
137 test_driver_free_bss(bss
);
142 static struct test_client_socket
*
143 test_driver_get_cli(struct wpa_driver_test_data
*drv
, struct sockaddr_un
*from
,
146 struct test_client_socket
*cli
= drv
->cli
;
149 if (cli
->unlen
== fromlen
&&
150 strncmp(cli
->un
.sun_path
, from
->sun_path
,
151 fromlen
- sizeof(cli
->un
.sun_family
)) == 0)
160 static int test_driver_send_eapol(void *priv
, const u8
*addr
, const u8
*data
,
161 size_t data_len
, int encrypt
,
164 struct test_driver_bss
*dbss
= priv
;
165 struct wpa_driver_test_data
*drv
= dbss
->drv
;
166 struct test_client_socket
*cli
;
169 struct l2_ethhdr eth
;
171 if (drv
->test_socket
< 0)
176 if (memcmp(cli
->addr
, addr
, ETH_ALEN
) == 0)
182 wpa_printf(MSG_DEBUG
, "%s: no destination client entry",
187 memcpy(eth
.h_dest
, addr
, ETH_ALEN
);
188 memcpy(eth
.h_source
, own_addr
, ETH_ALEN
);
189 eth
.h_proto
= host_to_be16(ETH_P_EAPOL
);
191 io
[0].iov_base
= "EAPOL ";
193 io
[1].iov_base
= ð
;
194 io
[1].iov_len
= sizeof(eth
);
195 io
[2].iov_base
= (u8
*) data
;
196 io
[2].iov_len
= data_len
;
198 memset(&msg
, 0, sizeof(msg
));
201 msg
.msg_name
= &cli
->un
;
202 msg
.msg_namelen
= cli
->unlen
;
203 return sendmsg(drv
->test_socket
, &msg
, 0);
207 static int test_driver_send_ether(void *priv
, const u8
*dst
, const u8
*src
,
208 u16 proto
, const u8
*data
, size_t data_len
)
210 struct test_driver_bss
*dbss
= priv
;
211 struct wpa_driver_test_data
*drv
= dbss
->drv
;
214 struct l2_ethhdr eth
;
216 struct sockaddr_un addr
;
219 int ret
= 0, broadcast
= 0, count
= 0;
221 if (drv
->test_socket
< 0 || drv
->test_dir
== NULL
) {
222 wpa_printf(MSG_DEBUG
, "%s: invalid parameters (sock=%d "
224 __func__
, drv
->test_socket
, drv
->test_dir
);
228 broadcast
= memcmp(dst
, "\xff\xff\xff\xff\xff\xff", ETH_ALEN
) == 0;
229 snprintf(desttxt
, sizeof(desttxt
), MACSTR
, MAC2STR(dst
));
231 memcpy(eth
.h_dest
, dst
, ETH_ALEN
);
232 memcpy(eth
.h_source
, src
, ETH_ALEN
);
233 eth
.h_proto
= host_to_be16(proto
);
235 io
[0].iov_base
= "ETHER ";
237 io
[1].iov_base
= ð
;
238 io
[1].iov_len
= sizeof(eth
);
239 io
[2].iov_base
= (u8
*) data
;
240 io
[2].iov_len
= data_len
;
242 memset(&msg
, 0, sizeof(msg
));
246 dir
= opendir(drv
->test_dir
);
248 perror("test_driver: opendir");
251 while ((dent
= readdir(dir
))) {
252 #ifdef _DIRENT_HAVE_D_TYPE
253 /* Skip the file if it is not a socket. Also accept
254 * DT_UNKNOWN (0) in case the C library or underlying file
255 * system does not support d_type. */
256 if (dent
->d_type
!= DT_SOCK
&& dent
->d_type
!= DT_UNKNOWN
)
258 #endif /* _DIRENT_HAVE_D_TYPE */
259 if (strcmp(dent
->d_name
, ".") == 0 ||
260 strcmp(dent
->d_name
, "..") == 0)
263 memset(&addr
, 0, sizeof(addr
));
264 addr
.sun_family
= AF_UNIX
;
265 snprintf(addr
.sun_path
, sizeof(addr
.sun_path
), "%s/%s",
266 drv
->test_dir
, dent
->d_name
);
268 if (strcmp(addr
.sun_path
, drv
->own_socket_path
) == 0)
270 if (!broadcast
&& strstr(dent
->d_name
, desttxt
) == NULL
)
273 wpa_printf(MSG_DEBUG
, "%s: Send ether frame to %s",
274 __func__
, dent
->d_name
);
276 msg
.msg_name
= &addr
;
277 msg
.msg_namelen
= sizeof(addr
);
278 ret
= sendmsg(drv
->test_socket
, &msg
, 0);
280 perror("driver_test: sendmsg");
285 if (!broadcast
&& count
== 0) {
286 wpa_printf(MSG_DEBUG
, "%s: Destination " MACSTR
" not found",
287 __func__
, MAC2STR(dst
));
295 static int wpa_driver_test_send_mlme(void *priv
, const u8
*data
,
298 struct test_driver_bss
*dbss
= priv
;
299 struct wpa_driver_test_data
*drv
= dbss
->drv
;
303 struct sockaddr_un addr
;
308 struct ieee80211_hdr
*hdr
;
315 union wpa_event_data event
;
317 wpa_hexdump(MSG_MSGDUMP
, "test_send_mlme", data
, data_len
);
318 if (drv
->test_socket
< 0 || data_len
< 10) {
319 wpa_printf(MSG_DEBUG
, "%s: invalid parameters (sock=%d len=%lu"
321 __func__
, drv
->test_socket
,
322 (unsigned long) data_len
,
328 broadcast
= os_memcmp(dest
, "\xff\xff\xff\xff\xff\xff", ETH_ALEN
) == 0;
331 snprintf(desttxt
, sizeof(desttxt
), MACSTR
, MAC2STR(dest
));
334 if (drv
->remain_on_channel_freq
)
335 freq
= drv
->remain_on_channel_freq
;
337 freq
= drv
->current_freq
;
338 wpa_printf(MSG_DEBUG
, "test_driver(%s): MLME TX on freq %d MHz",
340 os_snprintf(cmd
, sizeof(cmd
), "MLME freq=%d ", freq
);
341 io
[0].iov_base
= cmd
;
342 io
[0].iov_len
= os_strlen(cmd
);
343 io
[1].iov_base
= (void *) data
;
344 io
[1].iov_len
= data_len
;
346 os_memset(&msg
, 0, sizeof(msg
));
351 if (drv
->test_dir
== NULL
) {
352 wpa_printf(MSG_DEBUG
, "%s: test_dir == NULL", __func__
);
356 dir
= opendir(drv
->test_dir
);
358 perror("test_driver: opendir");
361 while ((dent
= readdir(dir
))) {
362 #ifdef _DIRENT_HAVE_D_TYPE
363 /* Skip the file if it is not a socket. Also accept
364 * DT_UNKNOWN (0) in case the C library or underlying file
365 * system does not support d_type. */
366 if (dent
->d_type
!= DT_SOCK
&& dent
->d_type
!= DT_UNKNOWN
)
368 #endif /* _DIRENT_HAVE_D_TYPE */
369 if (os_strcmp(dent
->d_name
, ".") == 0 ||
370 os_strcmp(dent
->d_name
, "..") == 0)
373 os_memset(&addr
, 0, sizeof(addr
));
374 addr
.sun_family
= AF_UNIX
;
375 os_snprintf(addr
.sun_path
, sizeof(addr
.sun_path
), "%s/%s",
376 drv
->test_dir
, dent
->d_name
);
378 if (os_strcmp(addr
.sun_path
, drv
->own_socket_path
) == 0)
380 if (!broadcast
&& os_strstr(dent
->d_name
, desttxt
) == NULL
)
383 wpa_printf(MSG_DEBUG
, "%s: Send management frame to %s",
384 __func__
, dent
->d_name
);
386 msg
.msg_name
= &addr
;
387 msg
.msg_namelen
= sizeof(addr
);
388 ret
= sendmsg(drv
->test_socket
, &msg
, 0);
390 perror("driver_test: sendmsg(test_socket)");
395 if (os_memcmp(dest
, dbss
->bssid
, ETH_ALEN
) == 0 ||
396 drv
->test_dir
== NULL
) {
397 if (drv
->hostapd_addr_udp_set
) {
398 msg
.msg_name
= &drv
->hostapd_addr_udp
;
399 msg
.msg_namelen
= sizeof(drv
->hostapd_addr_udp
);
401 #ifdef DRIVER_TEST_UNIX
402 msg
.msg_name
= &drv
->hostapd_addr
;
403 msg
.msg_namelen
= sizeof(drv
->hostapd_addr
);
404 #endif /* DRIVER_TEST_UNIX */
406 } else if (broadcast
) {
407 dir
= opendir(drv
->test_dir
);
410 while ((dent
= readdir(dir
))) {
411 #ifdef _DIRENT_HAVE_D_TYPE
412 /* Skip the file if it is not a socket.
413 * Also accept DT_UNKNOWN (0) in case
414 * the C library or underlying file
415 * system does not support d_type. */
416 if (dent
->d_type
!= DT_SOCK
&&
417 dent
->d_type
!= DT_UNKNOWN
)
419 #endif /* _DIRENT_HAVE_D_TYPE */
420 if (os_strcmp(dent
->d_name
, ".") == 0 ||
421 os_strcmp(dent
->d_name
, "..") == 0)
423 wpa_printf(MSG_DEBUG
, "%s: Send broadcast MLME to %s",
424 __func__
, dent
->d_name
);
425 os_memset(&addr
, 0, sizeof(addr
));
426 addr
.sun_family
= AF_UNIX
;
427 os_snprintf(addr
.sun_path
, sizeof(addr
.sun_path
),
428 "%s/%s", drv
->test_dir
, dent
->d_name
);
430 msg
.msg_name
= &addr
;
431 msg
.msg_namelen
= sizeof(addr
);
433 ret
= sendmsg(drv
->test_socket
, &msg
, 0);
435 perror("driver_test: sendmsg(test_socket)");
441 os_memset(&addr
, 0, sizeof(addr
));
442 addr
.sun_family
= AF_UNIX
;
443 os_snprintf(addr
.sun_path
, sizeof(addr
.sun_path
),
444 "%s/AP-" MACSTR
, drv
->test_dir
, MAC2STR(dest
));
445 if (stat(addr
.sun_path
, &st
) < 0) {
446 os_snprintf(addr
.sun_path
, sizeof(addr
.sun_path
),
448 drv
->test_dir
, MAC2STR(dest
));
450 msg
.msg_name
= &addr
;
451 msg
.msg_namelen
= sizeof(addr
);
454 if (sendmsg(drv
->test_socket
, &msg
, 0) < 0) {
455 perror("sendmsg(test_socket)");
460 hdr
= (struct ieee80211_hdr
*) data
;
461 fc
= le_to_host16(hdr
->frame_control
);
463 os_memset(&event
, 0, sizeof(event
));
464 event
.tx_status
.type
= WLAN_FC_GET_TYPE(fc
);
465 event
.tx_status
.stype
= WLAN_FC_GET_STYPE(fc
);
466 event
.tx_status
.dst
= hdr
->addr1
;
467 event
.tx_status
.data
= data
;
468 event
.tx_status
.data_len
= data_len
;
469 event
.tx_status
.ack
= ret
>= 0;
470 wpa_supplicant_event(drv
->ctx
, EVENT_TX_STATUS
, &event
);
476 static void test_driver_scan(struct wpa_driver_test_data
*drv
,
477 struct sockaddr_un
*from
, socklen_t fromlen
,
480 char buf
[512], *pos
, *end
;
482 struct test_driver_bss
*bss
;
486 union wpa_event_data event
;
488 /* data: optional [ ' ' | STA-addr | ' ' | IEs(hex) ] */
490 wpa_printf(MSG_DEBUG
, "test_driver: SCAN");
494 hwaddr_aton(data
+ 1, sa
)) {
495 wpa_printf(MSG_DEBUG
, "test_driver: Unexpected SCAN "
503 ielen
= os_strlen(data
) / 2;
504 if (ielen
> sizeof(ie
))
506 if (hexstr2bin(data
, ie
, ielen
) < 0)
509 wpa_printf(MSG_DEBUG
, "test_driver: Scan from " MACSTR
,
511 wpa_hexdump(MSG_MSGDUMP
, "test_driver: scan IEs", ie
, ielen
);
513 os_memset(&event
, 0, sizeof(event
));
514 event
.rx_probe_req
.sa
= sa
;
515 event
.rx_probe_req
.ie
= ie
;
516 event
.rx_probe_req
.ie_len
= ielen
;
517 wpa_supplicant_event(drv
->ctx
, EVENT_RX_PROBE_REQ
, &event
);
520 dl_list_for_each(bss
, &drv
->bss
, struct test_driver_bss
, list
) {
522 end
= buf
+ sizeof(buf
);
524 /* reply: SCANRESP BSSID SSID IEs */
525 ret
= snprintf(pos
, end
- pos
, "SCANRESP " MACSTR
" ",
526 MAC2STR(bss
->bssid
));
527 if (ret
< 0 || ret
>= end
- pos
)
530 pos
+= wpa_snprintf_hex(pos
, end
- pos
,
531 bss
->ssid
, bss
->ssid_len
);
532 ret
= snprintf(pos
, end
- pos
, " ");
533 if (ret
< 0 || ret
>= end
- pos
)
536 pos
+= wpa_snprintf_hex(pos
, end
- pos
, bss
->ie
, bss
->ielen
);
537 pos
+= wpa_snprintf_hex(pos
, end
- pos
, bss
->wps_probe_resp_ie
,
538 bss
->wps_probe_resp_ie_len
);
541 ret
= snprintf(pos
, end
- pos
, " PRIVACY");
542 if (ret
< 0 || ret
>= end
- pos
)
547 sendto(drv
->test_socket
, buf
, pos
- buf
, 0,
548 (struct sockaddr
*) from
, fromlen
);
553 static void test_driver_assoc(struct wpa_driver_test_data
*drv
,
554 struct sockaddr_un
*from
, socklen_t fromlen
,
557 struct test_client_socket
*cli
;
558 u8 ie
[256], ssid
[32];
559 size_t ielen
, ssid_len
= 0;
560 char *pos
, *pos2
, cmd
[50];
561 struct test_driver_bss
*bss
, *tmp
;
563 /* data: STA-addr SSID(hex) IEs(hex) */
565 cli
= os_zalloc(sizeof(*cli
));
569 if (hwaddr_aton(data
, cli
->addr
)) {
570 printf("test_socket: Invalid MAC address '%s' in ASSOC\n",
578 pos2
= strchr(pos
, ' ');
581 ssid_len
= (pos2
- pos
) / 2;
582 if (hexstr2bin(pos
, ssid
, ssid_len
) < 0) {
583 wpa_printf(MSG_DEBUG
, "%s: Invalid SSID", __func__
);
587 wpa_hexdump_ascii(MSG_DEBUG
, "test_driver_assoc: SSID",
591 ielen
= strlen(pos
) / 2;
592 if (ielen
> sizeof(ie
))
594 if (hexstr2bin(pos
, ie
, ielen
) < 0)
599 dl_list_for_each(tmp
, &drv
->bss
, struct test_driver_bss
, list
) {
600 if (tmp
->ssid_len
== ssid_len
&&
601 os_memcmp(tmp
->ssid
, ssid
, ssid_len
) == 0) {
607 wpa_printf(MSG_DEBUG
, "%s: No matching SSID found from "
608 "configured BSSes", __func__
);
614 memcpy(&cli
->un
, from
, sizeof(cli
->un
));
615 cli
->unlen
= fromlen
;
616 cli
->next
= drv
->cli
;
618 wpa_hexdump_ascii(MSG_DEBUG
, "test_socket: ASSOC sun_path",
619 (const u8
*) cli
->un
.sun_path
,
620 cli
->unlen
- sizeof(cli
->un
.sun_family
));
622 snprintf(cmd
, sizeof(cmd
), "ASSOCRESP " MACSTR
" 0",
623 MAC2STR(bss
->bssid
));
624 sendto(drv
->test_socket
, cmd
, strlen(cmd
), 0,
625 (struct sockaddr
*) from
, fromlen
);
627 drv_event_assoc(bss
->bss_ctx
, cli
->addr
, ie
, ielen
);
631 static void test_driver_disassoc(struct wpa_driver_test_data
*drv
,
632 struct sockaddr_un
*from
, socklen_t fromlen
)
634 struct test_client_socket
*cli
;
636 cli
= test_driver_get_cli(drv
, from
, fromlen
);
640 drv_event_disassoc(drv
->ctx
, cli
->addr
);
644 static void test_driver_eapol(struct wpa_driver_test_data
*drv
,
645 struct sockaddr_un
*from
, socklen_t fromlen
,
646 u8
*data
, size_t datalen
)
649 struct test_client_socket
*cli
;
651 const u8
*src
= NULL
;
654 /* Skip Ethernet header */
655 src
= data
+ ETH_ALEN
;
656 wpa_printf(MSG_DEBUG
, "test_driver: dst=" MACSTR
" src="
657 MACSTR
" proto=%04x",
658 MAC2STR(data
), MAC2STR(src
),
659 WPA_GET_BE16(data
+ 2 * ETH_ALEN
));
665 cli
= test_driver_get_cli(drv
, from
, fromlen
);
667 drv_event_eapol_rx(cli
->bss
->bss_ctx
, cli
->addr
, data
,
670 wpa_printf(MSG_DEBUG
, "test_socket: EAPOL from unknown "
675 drv_event_eapol_rx(drv
->ctx
, src
, data
, datalen
);
680 static void test_driver_ether(struct wpa_driver_test_data
*drv
,
681 struct sockaddr_un
*from
, socklen_t fromlen
,
682 u8
*data
, size_t datalen
)
684 struct l2_ethhdr
*eth
;
686 if (datalen
< sizeof(*eth
))
689 eth
= (struct l2_ethhdr
*) data
;
690 wpa_printf(MSG_DEBUG
, "test_driver: RX ETHER dst=" MACSTR
" src="
691 MACSTR
" proto=%04x",
692 MAC2STR(eth
->h_dest
), MAC2STR(eth
->h_source
),
693 be_to_host16(eth
->h_proto
));
695 #ifdef CONFIG_IEEE80211R
696 if (be_to_host16(eth
->h_proto
) == ETH_P_RRB
) {
697 union wpa_event_data ev
;
698 os_memset(&ev
, 0, sizeof(ev
));
699 ev
.ft_rrb_rx
.src
= eth
->h_source
;
700 ev
.ft_rrb_rx
.data
= data
+ sizeof(*eth
);
701 ev
.ft_rrb_rx
.data_len
= datalen
- sizeof(*eth
);
703 #endif /* CONFIG_IEEE80211R */
707 static void test_driver_mlme(struct wpa_driver_test_data
*drv
,
708 struct sockaddr_un
*from
, socklen_t fromlen
,
709 u8
*data
, size_t datalen
)
711 struct ieee80211_hdr
*hdr
;
713 union wpa_event_data event
;
714 int freq
= 0, own_freq
;
715 struct test_driver_bss
*bss
;
717 bss
= dl_list_first(&drv
->bss
, struct test_driver_bss
, list
);
719 if (datalen
> 6 && os_memcmp(data
, "freq=", 5) == 0) {
721 for (pos
= 5; pos
< datalen
; pos
++) {
722 if (data
[pos
] == ' ')
726 freq
= atoi((const char *) &data
[5]);
727 wpa_printf(MSG_DEBUG
, "test_driver(%s): MLME RX on "
728 "freq %d MHz", bss
->ifname
, freq
);
735 if (drv
->remain_on_channel_freq
)
736 own_freq
= drv
->remain_on_channel_freq
;
738 own_freq
= drv
->current_freq
;
740 if (freq
&& own_freq
&& freq
!= own_freq
) {
741 wpa_printf(MSG_DEBUG
, "test_driver(%s): Ignore MLME RX on "
742 "another frequency %d MHz (own %d MHz)",
743 bss
->ifname
, freq
, own_freq
);
747 hdr
= (struct ieee80211_hdr
*) data
;
749 if (test_driver_get_cli(drv
, from
, fromlen
) == NULL
&& datalen
>= 16) {
750 struct test_client_socket
*cli
;
751 cli
= os_zalloc(sizeof(*cli
));
754 wpa_printf(MSG_DEBUG
, "Adding client entry for " MACSTR
,
755 MAC2STR(hdr
->addr2
));
756 memcpy(cli
->addr
, hdr
->addr2
, ETH_ALEN
);
757 memcpy(&cli
->un
, from
, sizeof(cli
->un
));
758 cli
->unlen
= fromlen
;
759 cli
->next
= drv
->cli
;
763 wpa_hexdump(MSG_MSGDUMP
, "test_driver_mlme: received frame",
765 fc
= le_to_host16(hdr
->frame_control
);
766 if (WLAN_FC_GET_TYPE(fc
) != WLAN_FC_TYPE_MGMT
) {
767 wpa_printf(MSG_ERROR
, "%s: received non-mgmt frame",
772 os_memset(&event
, 0, sizeof(event
));
773 event
.rx_mgmt
.frame
= data
;
774 event
.rx_mgmt
.frame_len
= datalen
;
775 wpa_supplicant_event(drv
->ctx
, EVENT_RX_MGMT
, &event
);
779 static void test_driver_receive_unix(int sock
, void *eloop_ctx
, void *sock_ctx
)
781 struct wpa_driver_test_data
*drv
= eloop_ctx
;
784 struct sockaddr_un from
;
785 socklen_t fromlen
= sizeof(from
);
787 res
= recvfrom(sock
, buf
, sizeof(buf
) - 1, 0,
788 (struct sockaddr
*) &from
, &fromlen
);
790 perror("recvfrom(test_socket)");
795 wpa_printf(MSG_DEBUG
, "test_driver: received %u bytes", res
);
797 if (strncmp(buf
, "SCAN", 4) == 0) {
798 test_driver_scan(drv
, &from
, fromlen
, buf
+ 4);
799 } else if (strncmp(buf
, "ASSOC ", 6) == 0) {
800 test_driver_assoc(drv
, &from
, fromlen
, buf
+ 6);
801 } else if (strcmp(buf
, "DISASSOC") == 0) {
802 test_driver_disassoc(drv
, &from
, fromlen
);
803 } else if (strncmp(buf
, "EAPOL ", 6) == 0) {
804 test_driver_eapol(drv
, &from
, fromlen
, (u8
*) buf
+ 6,
806 } else if (strncmp(buf
, "ETHER ", 6) == 0) {
807 test_driver_ether(drv
, &from
, fromlen
, (u8
*) buf
+ 6,
809 } else if (strncmp(buf
, "MLME ", 5) == 0) {
810 test_driver_mlme(drv
, &from
, fromlen
, (u8
*) buf
+ 5, res
- 5);
812 wpa_hexdump_ascii(MSG_DEBUG
, "Unknown test_socket command",
818 static int test_driver_set_generic_elem(void *priv
,
819 const u8
*elem
, size_t elem_len
)
821 struct test_driver_bss
*bss
= priv
;
831 bss
->ie
= os_malloc(elem_len
);
832 if (bss
->ie
== NULL
) {
837 memcpy(bss
->ie
, elem
, elem_len
);
838 bss
->ielen
= elem_len
;
843 static int test_driver_set_ap_wps_ie(void *priv
, const struct wpabuf
*beacon
,
844 const struct wpabuf
*proberesp
)
846 struct test_driver_bss
*bss
= priv
;
849 wpa_printf(MSG_DEBUG
, "test_driver: Clear Beacon WPS IE");
851 wpa_hexdump_buf(MSG_DEBUG
, "test_driver: Beacon WPS IE",
854 os_free(bss
->wps_beacon_ie
);
856 if (beacon
== NULL
) {
857 bss
->wps_beacon_ie
= NULL
;
858 bss
->wps_beacon_ie_len
= 0;
860 bss
->wps_beacon_ie
= os_malloc(wpabuf_len(beacon
));
861 if (bss
->wps_beacon_ie
== NULL
) {
862 bss
->wps_beacon_ie_len
= 0;
866 os_memcpy(bss
->wps_beacon_ie
, wpabuf_head(beacon
),
868 bss
->wps_beacon_ie_len
= wpabuf_len(beacon
);
871 if (proberesp
== NULL
)
872 wpa_printf(MSG_DEBUG
, "test_driver: Clear Probe Response WPS "
875 wpa_hexdump_buf(MSG_DEBUG
, "test_driver: Probe Response WPS "
878 os_free(bss
->wps_probe_resp_ie
);
880 if (proberesp
== NULL
) {
881 bss
->wps_probe_resp_ie
= NULL
;
882 bss
->wps_probe_resp_ie_len
= 0;
884 bss
->wps_probe_resp_ie
= os_malloc(wpabuf_len(proberesp
));
885 if (bss
->wps_probe_resp_ie
== NULL
) {
886 bss
->wps_probe_resp_ie_len
= 0;
890 os_memcpy(bss
->wps_probe_resp_ie
, wpabuf_head(proberesp
),
891 wpabuf_len(proberesp
));
892 bss
->wps_probe_resp_ie_len
= wpabuf_len(proberesp
);
899 static int test_driver_sta_deauth(void *priv
, const u8
*own_addr
,
900 const u8
*addr
, int reason
)
902 struct test_driver_bss
*dbss
= priv
;
903 struct wpa_driver_test_data
*drv
= dbss
->drv
;
904 struct test_client_socket
*cli
;
906 if (drv
->test_socket
< 0)
911 if (memcmp(cli
->addr
, addr
, ETH_ALEN
) == 0)
919 return sendto(drv
->test_socket
, "DEAUTH", 6, 0,
920 (struct sockaddr
*) &cli
->un
, cli
->unlen
);
924 static int test_driver_sta_disassoc(void *priv
, const u8
*own_addr
,
925 const u8
*addr
, int reason
)
927 struct test_driver_bss
*dbss
= priv
;
928 struct wpa_driver_test_data
*drv
= dbss
->drv
;
929 struct test_client_socket
*cli
;
931 if (drv
->test_socket
< 0)
936 if (memcmp(cli
->addr
, addr
, ETH_ALEN
) == 0)
944 return sendto(drv
->test_socket
, "DISASSOC", 8, 0,
945 (struct sockaddr
*) &cli
->un
, cli
->unlen
);
949 static int test_driver_bss_add(void *priv
, const char *ifname
, const u8
*bssid
,
950 void *bss_ctx
, void **drv_priv
)
952 struct test_driver_bss
*dbss
= priv
;
953 struct wpa_driver_test_data
*drv
= dbss
->drv
;
954 struct test_driver_bss
*bss
;
956 wpa_printf(MSG_DEBUG
, "%s(ifname=%s bssid=" MACSTR
")",
957 __func__
, ifname
, MAC2STR(bssid
));
959 bss
= os_zalloc(sizeof(*bss
));
963 bss
->bss_ctx
= bss_ctx
;
965 os_strlcpy(bss
->ifname
, ifname
, IFNAMSIZ
);
966 os_memcpy(bss
->bssid
, bssid
, ETH_ALEN
);
968 dl_list_add(&drv
->bss
, &bss
->list
);
970 drv
->global
->bss_add_used
= 1;
971 os_memcpy(drv
->global
->req_addr
, bssid
, ETH_ALEN
);
981 static int test_driver_bss_remove(void *priv
, const char *ifname
)
983 struct test_driver_bss
*dbss
= priv
;
984 struct wpa_driver_test_data
*drv
= dbss
->drv
;
985 struct test_driver_bss
*bss
;
986 struct test_client_socket
*cli
, *prev_c
;
988 wpa_printf(MSG_DEBUG
, "%s(ifname=%s)", __func__
, ifname
);
990 dl_list_for_each(bss
, &drv
->bss
, struct test_driver_bss
, list
) {
991 if (strcmp(bss
->ifname
, ifname
) != 0)
994 for (prev_c
= NULL
, cli
= drv
->cli
; cli
;
995 prev_c
= cli
, cli
= cli
->next
) {
999 prev_c
->next
= cli
->next
;
1001 drv
->cli
= cli
->next
;
1006 dl_list_del(&bss
->list
);
1007 test_driver_free_bss(bss
);
1015 static int test_driver_if_add(void *priv
, enum wpa_driver_if_type type
,
1016 const char *ifname
, const u8
*addr
,
1017 void *bss_ctx
, void **drv_priv
,
1018 char *force_ifname
, u8
*if_addr
)
1020 struct test_driver_bss
*dbss
= priv
;
1021 struct wpa_driver_test_data
*drv
= dbss
->drv
;
1023 wpa_printf(MSG_DEBUG
, "%s(type=%d ifname=%s bss_ctx=%p)",
1024 __func__
, type
, ifname
, bss_ctx
);
1026 os_memcpy(if_addr
, addr
, ETH_ALEN
);
1028 drv
->alloc_iface_idx
++;
1029 if_addr
[0] = 0x02; /* locally administered */
1030 sha1_prf(drv
->own_addr
, ETH_ALEN
,
1031 "hostapd test addr generation",
1032 (const u8
*) &drv
->alloc_iface_idx
,
1033 sizeof(drv
->alloc_iface_idx
),
1034 if_addr
+ 1, ETH_ALEN
- 1);
1036 if (type
== WPA_IF_AP_BSS
)
1037 return test_driver_bss_add(priv
, ifname
, if_addr
, bss_ctx
,
1043 static int test_driver_if_remove(void *priv
, enum wpa_driver_if_type type
,
1046 wpa_printf(MSG_DEBUG
, "%s(type=%d ifname=%s)", __func__
, type
, ifname
);
1047 if (type
== WPA_IF_AP_BSS
)
1048 return test_driver_bss_remove(priv
, ifname
);
1053 static int test_driver_valid_bss_mask(void *priv
, const u8
*addr
,
1060 static int test_driver_set_ssid(void *priv
, const u8
*buf
, int len
)
1062 struct test_driver_bss
*bss
= priv
;
1064 wpa_printf(MSG_DEBUG
, "%s(ifname=%s)", __func__
, bss
->ifname
);
1065 wpa_hexdump_ascii(MSG_DEBUG
, "test_driver_set_ssid: SSID", buf
, len
);
1067 if (len
< 0 || (size_t) len
> sizeof(bss
->ssid
))
1070 os_memcpy(bss
->ssid
, buf
, len
);
1071 bss
->ssid_len
= len
;
1077 static int test_driver_set_privacy(void *priv
, int enabled
)
1079 struct test_driver_bss
*dbss
= priv
;
1081 wpa_printf(MSG_DEBUG
, "%s(enabled=%d)", __func__
, enabled
);
1082 dbss
->privacy
= enabled
;
1088 static int test_driver_set_sta_vlan(void *priv
, const u8
*addr
,
1089 const char *ifname
, int vlan_id
)
1091 wpa_printf(MSG_DEBUG
, "%s(addr=" MACSTR
" ifname=%s vlan_id=%d)",
1092 __func__
, MAC2STR(addr
), ifname
, vlan_id
);
1097 static int test_driver_sta_add(void *priv
,
1098 struct hostapd_sta_add_params
*params
)
1100 struct test_driver_bss
*bss
= priv
;
1101 struct wpa_driver_test_data
*drv
= bss
->drv
;
1102 struct test_client_socket
*cli
;
1104 wpa_printf(MSG_DEBUG
, "%s(ifname=%s addr=" MACSTR
" aid=%d "
1105 "capability=0x%x listen_interval=%d)",
1106 __func__
, bss
->ifname
, MAC2STR(params
->addr
), params
->aid
,
1107 params
->capability
, params
->listen_interval
);
1108 wpa_hexdump(MSG_DEBUG
, "test_driver_sta_add - supp_rates",
1109 params
->supp_rates
, params
->supp_rates_len
);
1113 if (os_memcmp(cli
->addr
, params
->addr
, ETH_ALEN
) == 0)
1118 wpa_printf(MSG_DEBUG
, "%s: no matching client entry",
1129 static struct wpa_driver_test_data
* test_alloc_data(void *ctx
,
1132 struct wpa_driver_test_data
*drv
;
1133 struct test_driver_bss
*bss
;
1135 drv
= os_zalloc(sizeof(struct wpa_driver_test_data
));
1137 wpa_printf(MSG_ERROR
, "Could not allocate memory for test "
1142 bss
= os_zalloc(sizeof(struct test_driver_bss
));
1149 wpa_trace_add_ref(drv
, ctx
, ctx
);
1150 dl_list_init(&drv
->bss
);
1151 dl_list_add(&drv
->bss
, &bss
->list
);
1152 os_strlcpy(bss
->ifname
, ifname
, IFNAMSIZ
);
1156 /* Generate a MAC address to help testing with multiple STAs */
1157 drv
->own_addr
[0] = 0x02; /* locally administered */
1158 sha1_prf((const u8
*) ifname
, os_strlen(ifname
),
1159 "test mac addr generation",
1160 NULL
, 0, drv
->own_addr
+ 1, ETH_ALEN
- 1);
1166 static void * test_driver_init(struct hostapd_data
*hapd
,
1167 struct wpa_init_params
*params
)
1169 struct wpa_driver_test_data
*drv
;
1170 struct sockaddr_un addr_un
;
1171 struct sockaddr_in addr_in
;
1172 struct sockaddr
*addr
;
1174 struct test_driver_bss
*bss
;
1176 drv
= test_alloc_data(hapd
, params
->ifname
);
1180 bss
= dl_list_first(&drv
->bss
, struct test_driver_bss
, list
);
1182 bss
->bss_ctx
= hapd
;
1183 os_memcpy(bss
->bssid
, drv
->own_addr
, ETH_ALEN
);
1184 os_memcpy(params
->own_addr
, drv
->own_addr
, ETH_ALEN
);
1186 if (params
->test_socket
) {
1187 if (os_strlen(params
->test_socket
) >=
1188 sizeof(addr_un
.sun_path
)) {
1189 printf("Too long test_socket path\n");
1190 wpa_driver_test_deinit(bss
);
1193 if (strncmp(params
->test_socket
, "DIR:", 4) == 0) {
1194 size_t len
= strlen(params
->test_socket
) + 30;
1195 drv
->test_dir
= os_strdup(params
->test_socket
+ 4);
1196 drv
->own_socket_path
= os_malloc(len
);
1197 if (drv
->own_socket_path
) {
1198 snprintf(drv
->own_socket_path
, len
,
1200 params
->test_socket
+ 4,
1201 MAC2STR(params
->own_addr
));
1203 } else if (strncmp(params
->test_socket
, "UDP:", 4) == 0) {
1204 drv
->udp_port
= atoi(params
->test_socket
+ 4);
1206 drv
->own_socket_path
= os_strdup(params
->test_socket
);
1208 if (drv
->own_socket_path
== NULL
&& drv
->udp_port
== 0) {
1209 wpa_driver_test_deinit(bss
);
1213 drv
->test_socket
= socket(drv
->udp_port
? PF_INET
: PF_UNIX
,
1215 if (drv
->test_socket
< 0) {
1217 wpa_driver_test_deinit(bss
);
1221 if (drv
->udp_port
) {
1222 os_memset(&addr_in
, 0, sizeof(addr_in
));
1223 addr_in
.sin_family
= AF_INET
;
1224 addr_in
.sin_port
= htons(drv
->udp_port
);
1225 addr
= (struct sockaddr
*) &addr_in
;
1226 alen
= sizeof(addr_in
);
1228 os_memset(&addr_un
, 0, sizeof(addr_un
));
1229 addr_un
.sun_family
= AF_UNIX
;
1230 os_strlcpy(addr_un
.sun_path
, drv
->own_socket_path
,
1231 sizeof(addr_un
.sun_path
));
1232 addr
= (struct sockaddr
*) &addr_un
;
1233 alen
= sizeof(addr_un
);
1235 if (bind(drv
->test_socket
, addr
, alen
) < 0) {
1236 perror("bind(PF_UNIX)");
1237 close(drv
->test_socket
);
1238 if (drv
->own_socket_path
)
1239 unlink(drv
->own_socket_path
);
1240 wpa_driver_test_deinit(bss
);
1243 eloop_register_read_sock(drv
->test_socket
,
1244 test_driver_receive_unix
, drv
, NULL
);
1246 drv
->test_socket
= -1;
1252 static void wpa_driver_test_poll(void *eloop_ctx
, void *timeout_ctx
)
1254 struct wpa_driver_test_data
*drv
= eloop_ctx
;
1256 #ifdef DRIVER_TEST_UNIX
1257 if (drv
->associated
&& drv
->hostapd_addr_set
) {
1259 if (stat(drv
->hostapd_addr
.sun_path
, &st
) < 0) {
1260 wpa_printf(MSG_DEBUG
, "%s: lost connection to AP: %s",
1261 __func__
, strerror(errno
));
1262 drv
->associated
= 0;
1263 wpa_supplicant_event(drv
->ctx
, EVENT_DISASSOC
, NULL
);
1266 #endif /* DRIVER_TEST_UNIX */
1268 eloop_register_timeout(1, 0, wpa_driver_test_poll
, drv
, NULL
);
1272 static void wpa_driver_test_scan_timeout(void *eloop_ctx
, void *timeout_ctx
)
1274 wpa_printf(MSG_DEBUG
, "Scan timeout - try to get results");
1275 wpa_supplicant_event(timeout_ctx
, EVENT_SCAN_RESULTS
, NULL
);
1279 #ifdef DRIVER_TEST_UNIX
1280 static void wpa_driver_scan_dir(struct wpa_driver_test_data
*drv
,
1283 struct dirent
*dent
;
1285 struct sockaddr_un addr
;
1286 char cmd
[512], *pos
, *end
;
1289 dir
= opendir(path
);
1293 end
= cmd
+ sizeof(cmd
);
1295 ret
= os_snprintf(pos
, end
- pos
, "SCAN " MACSTR
,
1296 MAC2STR(drv
->own_addr
));
1297 if (ret
>= 0 && ret
< end
- pos
)
1299 if (drv
->probe_req_ie
) {
1300 ret
= os_snprintf(pos
, end
- pos
, " ");
1301 if (ret
>= 0 && ret
< end
- pos
)
1303 pos
+= wpa_snprintf_hex(pos
, end
- pos
, drv
->probe_req_ie
,
1304 drv
->probe_req_ie_len
);
1306 if (drv
->probe_req_ssid_len
) {
1308 ret
= os_snprintf(pos
, end
- pos
, "%02x%02x",
1310 (unsigned int) drv
->probe_req_ssid_len
);
1311 if (ret
>= 0 && ret
< end
- pos
)
1313 pos
+= wpa_snprintf_hex(pos
, end
- pos
, drv
->probe_req_ssid
,
1314 drv
->probe_req_ssid_len
);
1318 while ((dent
= readdir(dir
))) {
1319 if (os_strncmp(dent
->d_name
, "AP-", 3) != 0 &&
1320 os_strncmp(dent
->d_name
, "STA-", 4) != 0)
1322 if (drv
->own_socket_path
) {
1324 olen
= os_strlen(drv
->own_socket_path
);
1325 dlen
= os_strlen(dent
->d_name
);
1327 os_strcmp(dent
->d_name
,
1328 drv
->own_socket_path
+ olen
- dlen
) == 0)
1331 wpa_printf(MSG_DEBUG
, "%s: SCAN %s", __func__
, dent
->d_name
);
1333 os_memset(&addr
, 0, sizeof(addr
));
1334 addr
.sun_family
= AF_UNIX
;
1335 os_snprintf(addr
.sun_path
, sizeof(addr
.sun_path
), "%s/%s",
1336 path
, dent
->d_name
);
1338 if (sendto(drv
->test_socket
, cmd
, os_strlen(cmd
), 0,
1339 (struct sockaddr
*) &addr
, sizeof(addr
)) < 0) {
1340 perror("sendto(test_socket)");
1345 #endif /* DRIVER_TEST_UNIX */
1348 static int wpa_driver_test_scan(void *priv
,
1349 struct wpa_driver_scan_params
*params
)
1351 struct test_driver_bss
*dbss
= priv
;
1352 struct wpa_driver_test_data
*drv
= dbss
->drv
;
1355 wpa_printf(MSG_DEBUG
, "%s: priv=%p", __func__
, priv
);
1357 os_free(drv
->probe_req_ie
);
1358 if (params
->extra_ies
) {
1359 drv
->probe_req_ie
= os_malloc(params
->extra_ies_len
);
1360 if (drv
->probe_req_ie
== NULL
) {
1361 drv
->probe_req_ie_len
= 0;
1364 os_memcpy(drv
->probe_req_ie
, params
->extra_ies
,
1365 params
->extra_ies_len
);
1366 drv
->probe_req_ie_len
= params
->extra_ies_len
;
1368 drv
->probe_req_ie
= NULL
;
1369 drv
->probe_req_ie_len
= 0;
1372 for (i
= 0; i
< params
->num_ssids
; i
++)
1373 wpa_hexdump(MSG_DEBUG
, "Scan SSID",
1374 params
->ssids
[i
].ssid
, params
->ssids
[i
].ssid_len
);
1375 drv
->probe_req_ssid_len
= 0;
1376 if (params
->num_ssids
) {
1377 os_memcpy(drv
->probe_req_ssid
, params
->ssids
[0].ssid
,
1378 params
->ssids
[0].ssid_len
);
1379 drv
->probe_req_ssid_len
= params
->ssids
[0].ssid_len
;
1381 wpa_hexdump(MSG_DEBUG
, "Scan extra IE(s)",
1382 params
->extra_ies
, params
->extra_ies_len
);
1384 drv
->num_scanres
= 0;
1386 #ifdef DRIVER_TEST_UNIX
1387 if (drv
->test_socket
>= 0 && drv
->test_dir
)
1388 wpa_driver_scan_dir(drv
, drv
->test_dir
);
1390 if (drv
->test_socket
>= 0 && drv
->hostapd_addr_set
&&
1391 sendto(drv
->test_socket
, "SCAN", 4, 0,
1392 (struct sockaddr
*) &drv
->hostapd_addr
,
1393 sizeof(drv
->hostapd_addr
)) < 0) {
1394 perror("sendto(test_socket)");
1396 #endif /* DRIVER_TEST_UNIX */
1398 if (drv
->test_socket
>= 0 && drv
->hostapd_addr_udp_set
&&
1399 sendto(drv
->test_socket
, "SCAN", 4, 0,
1400 (struct sockaddr
*) &drv
->hostapd_addr_udp
,
1401 sizeof(drv
->hostapd_addr_udp
)) < 0) {
1402 perror("sendto(test_socket)");
1405 eloop_cancel_timeout(wpa_driver_test_scan_timeout
, drv
, drv
->ctx
);
1406 eloop_register_timeout(1, 0, wpa_driver_test_scan_timeout
, drv
,
1412 static struct wpa_scan_results
* wpa_driver_test_get_scan_results2(void *priv
)
1414 struct test_driver_bss
*dbss
= priv
;
1415 struct wpa_driver_test_data
*drv
= dbss
->drv
;
1416 struct wpa_scan_results
*res
;
1419 res
= os_zalloc(sizeof(*res
));
1423 res
->res
= os_zalloc(drv
->num_scanres
* sizeof(struct wpa_scan_res
*));
1424 if (res
->res
== NULL
) {
1429 for (i
= 0; i
< drv
->num_scanres
; i
++) {
1430 struct wpa_scan_res
*r
;
1431 if (drv
->scanres
[i
] == NULL
)
1433 r
= os_malloc(sizeof(*r
) + drv
->scanres
[i
]->ie_len
);
1436 os_memcpy(r
, drv
->scanres
[i
],
1437 sizeof(*r
) + drv
->scanres
[i
]->ie_len
);
1438 res
->res
[res
->num
++] = r
;
1445 static int wpa_driver_test_set_key(const char *ifname
, void *priv
,
1446 enum wpa_alg alg
, const u8
*addr
,
1447 int key_idx
, int set_tx
,
1448 const u8
*seq
, size_t seq_len
,
1449 const u8
*key
, size_t key_len
)
1451 wpa_printf(MSG_DEBUG
, "%s: ifname=%s priv=%p alg=%d key_idx=%d "
1453 __func__
, ifname
, priv
, alg
, key_idx
, set_tx
);
1455 wpa_printf(MSG_DEBUG
, " addr=" MACSTR
, MAC2STR(addr
));
1457 wpa_hexdump(MSG_DEBUG
, " seq", seq
, seq_len
);
1459 wpa_hexdump_key(MSG_DEBUG
, " key", key
, key_len
);
1464 static int wpa_driver_update_mode(struct wpa_driver_test_data
*drv
, int ap
)
1466 if (ap
&& !drv
->ap
) {
1467 wpa_driver_test_close_test_socket(drv
);
1468 wpa_driver_test_attach(drv
, drv
->test_dir
, 1);
1470 } else if (!ap
&& drv
->ap
) {
1471 wpa_driver_test_close_test_socket(drv
);
1472 wpa_driver_test_attach(drv
, drv
->test_dir
, 0);
1480 static int wpa_driver_test_associate(
1481 void *priv
, struct wpa_driver_associate_params
*params
)
1483 struct test_driver_bss
*dbss
= priv
;
1484 struct wpa_driver_test_data
*drv
= dbss
->drv
;
1485 wpa_printf(MSG_DEBUG
, "%s: priv=%p freq=%d pairwise_suite=%d "
1486 "group_suite=%d key_mgmt_suite=%d auth_alg=%d mode=%d",
1487 __func__
, priv
, params
->freq
, params
->pairwise_suite
,
1488 params
->group_suite
, params
->key_mgmt_suite
,
1489 params
->auth_alg
, params
->mode
);
1490 if (params
->bssid
) {
1491 wpa_printf(MSG_DEBUG
, " bssid=" MACSTR
,
1492 MAC2STR(params
->bssid
));
1495 wpa_hexdump_ascii(MSG_DEBUG
, " ssid",
1496 params
->ssid
, params
->ssid_len
);
1498 if (params
->wpa_ie
) {
1499 wpa_hexdump(MSG_DEBUG
, " wpa_ie",
1500 params
->wpa_ie
, params
->wpa_ie_len
);
1501 drv
->assoc_wpa_ie_len
= params
->wpa_ie_len
;
1502 if (drv
->assoc_wpa_ie_len
> sizeof(drv
->assoc_wpa_ie
))
1503 drv
->assoc_wpa_ie_len
= sizeof(drv
->assoc_wpa_ie
);
1504 os_memcpy(drv
->assoc_wpa_ie
, params
->wpa_ie
,
1505 drv
->assoc_wpa_ie_len
);
1507 drv
->assoc_wpa_ie_len
= 0;
1509 wpa_driver_update_mode(drv
, params
->mode
== IEEE80211_MODE_AP
);
1511 drv
->ibss
= params
->mode
== IEEE80211_MODE_IBSS
;
1512 dbss
->privacy
= params
->key_mgmt_suite
&
1513 (WPA_KEY_MGMT_IEEE8021X
|
1515 WPA_KEY_MGMT_WPA_NONE
|
1516 WPA_KEY_MGMT_FT_IEEE8021X
|
1517 WPA_KEY_MGMT_FT_PSK
|
1518 WPA_KEY_MGMT_IEEE8021X_SHA256
|
1519 WPA_KEY_MGMT_PSK_SHA256
);
1520 if (params
->wep_key_len
[params
->wep_tx_keyidx
])
1523 #ifdef DRIVER_TEST_UNIX
1524 if (drv
->test_dir
&& params
->bssid
&&
1525 params
->mode
!= IEEE80211_MODE_IBSS
) {
1526 os_memset(&drv
->hostapd_addr
, 0, sizeof(drv
->hostapd_addr
));
1527 drv
->hostapd_addr
.sun_family
= AF_UNIX
;
1528 os_snprintf(drv
->hostapd_addr
.sun_path
,
1529 sizeof(drv
->hostapd_addr
.sun_path
),
1531 drv
->test_dir
, MAC2STR(params
->bssid
));
1532 drv
->hostapd_addr_set
= 1;
1534 #endif /* DRIVER_TEST_UNIX */
1536 if (params
->mode
== IEEE80211_MODE_AP
) {
1537 os_memcpy(dbss
->ssid
, params
->ssid
, params
->ssid_len
);
1538 dbss
->ssid_len
= params
->ssid_len
;
1539 os_memcpy(dbss
->bssid
, drv
->own_addr
, ETH_ALEN
);
1540 if (params
->wpa_ie
&& params
->wpa_ie_len
) {
1541 dbss
->ie
= os_malloc(params
->wpa_ie_len
);
1543 os_memcpy(dbss
->ie
, params
->wpa_ie
,
1544 params
->wpa_ie_len
);
1545 dbss
->ielen
= params
->wpa_ie_len
;
1548 } else if (drv
->test_socket
>= 0 &&
1549 (drv
->hostapd_addr_set
|| drv
->hostapd_addr_udp_set
)) {
1550 char cmd
[200], *pos
, *end
;
1552 end
= cmd
+ sizeof(cmd
);
1554 ret
= os_snprintf(pos
, end
- pos
, "ASSOC " MACSTR
" ",
1555 MAC2STR(drv
->own_addr
));
1556 if (ret
>= 0 && ret
< end
- pos
)
1558 pos
+= wpa_snprintf_hex(pos
, end
- pos
, params
->ssid
,
1560 ret
= os_snprintf(pos
, end
- pos
, " ");
1561 if (ret
>= 0 && ret
< end
- pos
)
1563 pos
+= wpa_snprintf_hex(pos
, end
- pos
, params
->wpa_ie
,
1564 params
->wpa_ie_len
);
1566 #ifdef DRIVER_TEST_UNIX
1567 if (drv
->hostapd_addr_set
&&
1568 sendto(drv
->test_socket
, cmd
, os_strlen(cmd
), 0,
1569 (struct sockaddr
*) &drv
->hostapd_addr
,
1570 sizeof(drv
->hostapd_addr
)) < 0) {
1571 perror("sendto(test_socket)");
1574 #endif /* DRIVER_TEST_UNIX */
1575 if (drv
->hostapd_addr_udp_set
&&
1576 sendto(drv
->test_socket
, cmd
, os_strlen(cmd
), 0,
1577 (struct sockaddr
*) &drv
->hostapd_addr_udp
,
1578 sizeof(drv
->hostapd_addr_udp
)) < 0) {
1579 perror("sendto(test_socket)");
1583 os_memcpy(dbss
->ssid
, params
->ssid
, params
->ssid_len
);
1584 dbss
->ssid_len
= params
->ssid_len
;
1586 drv
->associated
= 1;
1587 if (params
->mode
== IEEE80211_MODE_IBSS
) {
1588 os_memcpy(dbss
->ssid
, params
->ssid
, params
->ssid_len
);
1589 dbss
->ssid_len
= params
->ssid_len
;
1591 os_memcpy(dbss
->bssid
, params
->bssid
,
1594 os_get_random(dbss
->bssid
, ETH_ALEN
);
1595 dbss
->bssid
[0] &= ~0x01;
1596 dbss
->bssid
[0] |= 0x02;
1599 wpa_supplicant_event(drv
->ctx
, EVENT_ASSOC
, NULL
);
1606 static int wpa_driver_test_get_bssid(void *priv
, u8
*bssid
)
1608 struct test_driver_bss
*dbss
= priv
;
1609 os_memcpy(bssid
, dbss
->bssid
, ETH_ALEN
);
1614 static int wpa_driver_test_get_ssid(void *priv
, u8
*ssid
)
1616 struct test_driver_bss
*dbss
= priv
;
1617 os_memcpy(ssid
, dbss
->ssid
, 32);
1618 return dbss
->ssid_len
;
1622 static int wpa_driver_test_send_disassoc(struct wpa_driver_test_data
*drv
)
1624 #ifdef DRIVER_TEST_UNIX
1625 if (drv
->test_socket
>= 0 &&
1626 sendto(drv
->test_socket
, "DISASSOC", 8, 0,
1627 (struct sockaddr
*) &drv
->hostapd_addr
,
1628 sizeof(drv
->hostapd_addr
)) < 0) {
1629 perror("sendto(test_socket)");
1632 #endif /* DRIVER_TEST_UNIX */
1633 if (drv
->test_socket
>= 0 && drv
->hostapd_addr_udp_set
&&
1634 sendto(drv
->test_socket
, "DISASSOC", 8, 0,
1635 (struct sockaddr
*) &drv
->hostapd_addr_udp
,
1636 sizeof(drv
->hostapd_addr_udp
)) < 0) {
1637 perror("sendto(test_socket)");
1644 static int wpa_driver_test_deauthenticate(void *priv
, const u8
*addr
,
1647 struct test_driver_bss
*dbss
= priv
;
1648 struct wpa_driver_test_data
*drv
= dbss
->drv
;
1649 wpa_printf(MSG_DEBUG
, "%s addr=" MACSTR
" reason_code=%d",
1650 __func__
, MAC2STR(addr
), reason_code
);
1651 os_memset(dbss
->bssid
, 0, ETH_ALEN
);
1652 drv
->associated
= 0;
1653 wpa_supplicant_event(drv
->ctx
, EVENT_DISASSOC
, NULL
);
1654 return wpa_driver_test_send_disassoc(drv
);
1658 static int wpa_driver_test_disassociate(void *priv
, const u8
*addr
,
1661 struct test_driver_bss
*dbss
= priv
;
1662 struct wpa_driver_test_data
*drv
= dbss
->drv
;
1663 wpa_printf(MSG_DEBUG
, "%s addr=" MACSTR
" reason_code=%d",
1664 __func__
, MAC2STR(addr
), reason_code
);
1665 os_memset(dbss
->bssid
, 0, ETH_ALEN
);
1666 drv
->associated
= 0;
1667 wpa_supplicant_event(drv
->ctx
, EVENT_DISASSOC
, NULL
);
1668 return wpa_driver_test_send_disassoc(drv
);
1672 static const u8
* wpa_scan_get_ie(const struct wpa_scan_res
*res
, u8 ie
)
1674 const u8
*end
, *pos
;
1676 pos
= (const u8
*) (res
+ 1);
1677 end
= pos
+ res
->ie_len
;
1679 while (pos
+ 1 < end
) {
1680 if (pos
+ 2 + pos
[1] > end
)
1691 static void wpa_driver_test_scanresp(struct wpa_driver_test_data
*drv
,
1692 struct sockaddr
*from
,
1696 struct wpa_scan_res
*res
;
1697 const char *pos
, *pos2
;
1699 u8
*ie_pos
, *ie_start
, *ie_end
;
1700 #define MAX_IE_LEN 1000
1701 const u8
*ds_params
;
1703 wpa_printf(MSG_DEBUG
, "test_driver: SCANRESP %s", data
);
1704 if (drv
->num_scanres
>= MAX_SCAN_RESULTS
) {
1705 wpa_printf(MSG_DEBUG
, "test_driver: No room for the new scan "
1710 /* SCANRESP BSSID SSID IEs */
1712 res
= os_zalloc(sizeof(*res
) + MAX_IE_LEN
);
1715 ie_start
= ie_pos
= (u8
*) (res
+ 1);
1716 ie_end
= ie_pos
+ MAX_IE_LEN
;
1718 if (hwaddr_aton(data
, res
->bssid
)) {
1719 wpa_printf(MSG_DEBUG
, "test_driver: invalid BSSID in scanres");
1727 pos2
= os_strchr(pos
, ' ');
1729 wpa_printf(MSG_DEBUG
, "test_driver: invalid SSID termination "
1734 len
= (pos2
- pos
) / 2;
1738 * Generate SSID IE from the SSID field since this IE is not included
1739 * in the main IE field.
1741 *ie_pos
++ = WLAN_EID_SSID
;
1743 if (hexstr2bin(pos
, ie_pos
, len
) < 0) {
1744 wpa_printf(MSG_DEBUG
, "test_driver: invalid SSID in scanres");
1751 pos2
= os_strchr(pos
, ' ');
1753 len
= os_strlen(pos
) / 2;
1755 len
= (pos2
- pos
) / 2;
1756 if ((int) len
> ie_end
- ie_pos
)
1757 len
= ie_end
- ie_pos
;
1758 if (hexstr2bin(pos
, ie_pos
, len
) < 0) {
1759 wpa_printf(MSG_DEBUG
, "test_driver: invalid IEs in scanres");
1764 res
->ie_len
= ie_pos
- ie_start
;
1770 if (os_strstr(pos
, "PRIVACY"))
1771 res
->caps
|= IEEE80211_CAP_PRIVACY
;
1772 if (os_strstr(pos
, "IBSS"))
1773 res
->caps
|= IEEE80211_CAP_IBSS
;
1776 ds_params
= wpa_scan_get_ie(res
, WLAN_EID_DS_PARAMS
);
1777 if (ds_params
&& ds_params
[1] > 0) {
1778 if (ds_params
[2] >= 1 && ds_params
[2] <= 13)
1779 res
->freq
= 2407 + ds_params
[2] * 5;
1782 os_free(drv
->scanres
[drv
->num_scanres
]);
1783 drv
->scanres
[drv
->num_scanres
++] = res
;
1787 static void wpa_driver_test_assocresp(struct wpa_driver_test_data
*drv
,
1788 struct sockaddr
*from
,
1792 struct test_driver_bss
*bss
;
1794 bss
= dl_list_first(&drv
->bss
, struct test_driver_bss
, list
);
1796 /* ASSOCRESP BSSID <res> */
1797 if (hwaddr_aton(data
, bss
->bssid
)) {
1798 wpa_printf(MSG_DEBUG
, "test_driver: invalid BSSID in "
1801 if (drv
->use_associnfo
) {
1802 union wpa_event_data event
;
1803 os_memset(&event
, 0, sizeof(event
));
1804 event
.assoc_info
.req_ies
= drv
->assoc_wpa_ie
;
1805 event
.assoc_info
.req_ies_len
= drv
->assoc_wpa_ie_len
;
1806 wpa_supplicant_event(drv
->ctx
, EVENT_ASSOCINFO
, &event
);
1808 drv
->associated
= 1;
1809 wpa_supplicant_event(drv
->ctx
, EVENT_ASSOC
, NULL
);
1813 static void wpa_driver_test_disassoc(struct wpa_driver_test_data
*drv
,
1814 struct sockaddr
*from
,
1817 drv
->associated
= 0;
1818 wpa_supplicant_event(drv
->ctx
, EVENT_DISASSOC
, NULL
);
1822 static void wpa_driver_test_eapol(struct wpa_driver_test_data
*drv
,
1823 struct sockaddr
*from
,
1825 const u8
*data
, size_t data_len
)
1828 struct test_driver_bss
*bss
;
1830 bss
= dl_list_first(&drv
->bss
, struct test_driver_bss
, list
);
1832 if (data_len
> 14) {
1833 /* Skip Ethernet header */
1834 src
= data
+ ETH_ALEN
;
1840 drv_event_eapol_rx(drv
->ctx
, src
, data
, data_len
);
1844 static void wpa_driver_test_mlme(struct wpa_driver_test_data
*drv
,
1845 struct sockaddr
*from
,
1847 const u8
*data
, size_t data_len
)
1849 int freq
= 0, own_freq
;
1850 union wpa_event_data event
;
1851 struct test_driver_bss
*bss
;
1853 bss
= dl_list_first(&drv
->bss
, struct test_driver_bss
, list
);
1854 if (data_len
> 6 && os_memcmp(data
, "freq=", 5) == 0) {
1856 for (pos
= 5; pos
< data_len
; pos
++) {
1857 if (data
[pos
] == ' ')
1860 if (pos
< data_len
) {
1861 freq
= atoi((const char *) &data
[5]);
1862 wpa_printf(MSG_DEBUG
, "test_driver(%s): MLME RX on "
1863 "freq %d MHz", bss
->ifname
, freq
);
1870 if (drv
->remain_on_channel_freq
)
1871 own_freq
= drv
->remain_on_channel_freq
;
1873 own_freq
= drv
->current_freq
;
1875 if (freq
&& own_freq
&& freq
!= own_freq
) {
1876 wpa_printf(MSG_DEBUG
, "test_driver(%s): Ignore MLME RX on "
1877 "another frequency %d MHz (own %d MHz)",
1878 bss
->ifname
, freq
, own_freq
);
1882 os_memset(&event
, 0, sizeof(event
));
1883 event
.mlme_rx
.buf
= data
;
1884 event
.mlme_rx
.len
= data_len
;
1885 event
.mlme_rx
.freq
= freq
;
1886 wpa_supplicant_event(drv
->ctx
, EVENT_MLME_RX
, &event
);
1888 if (drv
->probe_req_report
&& data_len
>= 24) {
1889 const struct ieee80211_mgmt
*mgmt
;
1892 mgmt
= (const struct ieee80211_mgmt
*) data
;
1893 fc
= le_to_host16(mgmt
->frame_control
);
1894 if (WLAN_FC_GET_TYPE(fc
) == WLAN_FC_TYPE_MGMT
&&
1895 WLAN_FC_GET_STYPE(fc
) == WLAN_FC_STYPE_PROBE_REQ
) {
1896 os_memset(&event
, 0, sizeof(event
));
1897 event
.rx_probe_req
.sa
= mgmt
->sa
;
1898 event
.rx_probe_req
.ie
= mgmt
->u
.probe_req
.variable
;
1899 event
.rx_probe_req
.ie_len
=
1900 data_len
- (mgmt
->u
.probe_req
.variable
- data
);
1901 wpa_supplicant_event(drv
->ctx
, EVENT_RX_PROBE_REQ
,
1908 static void wpa_driver_test_scan_cmd(struct wpa_driver_test_data
*drv
,
1909 struct sockaddr
*from
,
1911 const u8
*data
, size_t data_len
)
1913 char buf
[512], *pos
, *end
;
1915 struct test_driver_bss
*bss
;
1917 bss
= dl_list_first(&drv
->bss
, struct test_driver_bss
, list
);
1919 /* data: optional [ STA-addr | ' ' | IEs(hex) ] */
1925 end
= buf
+ sizeof(buf
);
1927 /* reply: SCANRESP BSSID SSID IEs */
1928 ret
= snprintf(pos
, end
- pos
, "SCANRESP " MACSTR
" ",
1929 MAC2STR(bss
->bssid
));
1930 if (ret
< 0 || ret
>= end
- pos
)
1933 pos
+= wpa_snprintf_hex(pos
, end
- pos
,
1934 bss
->ssid
, bss
->ssid_len
);
1935 ret
= snprintf(pos
, end
- pos
, " ");
1936 if (ret
< 0 || ret
>= end
- pos
)
1939 pos
+= wpa_snprintf_hex(pos
, end
- pos
, drv
->assoc_wpa_ie
,
1940 drv
->assoc_wpa_ie_len
);
1943 ret
= snprintf(pos
, end
- pos
, " PRIVACY");
1944 if (ret
< 0 || ret
>= end
- pos
)
1949 ret
= snprintf(pos
, end
- pos
, " IBSS");
1950 if (ret
< 0 || ret
>= end
- pos
)
1954 sendto(drv
->test_socket
, buf
, pos
- buf
, 0,
1955 (struct sockaddr
*) from
, fromlen
);
1959 static void wpa_driver_test_receive_unix(int sock
, void *eloop_ctx
,
1962 struct wpa_driver_test_data
*drv
= eloop_ctx
;
1965 struct sockaddr_storage from
;
1966 socklen_t fromlen
= sizeof(from
);
1967 const size_t buflen
= 2000;
1970 test_driver_receive_unix(sock
, eloop_ctx
, sock_ctx
);
1974 buf
= os_malloc(buflen
);
1977 res
= recvfrom(sock
, buf
, buflen
- 1, 0,
1978 (struct sockaddr
*) &from
, &fromlen
);
1980 perror("recvfrom(test_socket)");
1986 wpa_printf(MSG_DEBUG
, "test_driver: received %u bytes", res
);
1988 if (os_strncmp(buf
, "SCANRESP ", 9) == 0) {
1989 wpa_driver_test_scanresp(drv
, (struct sockaddr
*) &from
,
1991 } else if (os_strncmp(buf
, "ASSOCRESP ", 10) == 0) {
1992 wpa_driver_test_assocresp(drv
, (struct sockaddr
*) &from
,
1994 } else if (os_strcmp(buf
, "DISASSOC") == 0) {
1995 wpa_driver_test_disassoc(drv
, (struct sockaddr
*) &from
,
1997 } else if (os_strcmp(buf
, "DEAUTH") == 0) {
1998 wpa_driver_test_disassoc(drv
, (struct sockaddr
*) &from
,
2000 } else if (os_strncmp(buf
, "EAPOL ", 6) == 0) {
2001 wpa_driver_test_eapol(drv
, (struct sockaddr
*) &from
, fromlen
,
2002 (const u8
*) buf
+ 6, res
- 6);
2003 } else if (os_strncmp(buf
, "MLME ", 5) == 0) {
2004 wpa_driver_test_mlme(drv
, (struct sockaddr
*) &from
, fromlen
,
2005 (const u8
*) buf
+ 5, res
- 5);
2006 } else if (os_strncmp(buf
, "SCAN ", 5) == 0) {
2007 wpa_driver_test_scan_cmd(drv
, (struct sockaddr
*) &from
,
2009 (const u8
*) buf
+ 5, res
- 5);
2011 wpa_hexdump_ascii(MSG_DEBUG
, "Unknown test_socket command",
2018 static void * wpa_driver_test_init2(void *ctx
, const char *ifname
,
2021 struct wpa_driver_test_data
*drv
;
2022 struct wpa_driver_test_global
*global
= global_priv
;
2023 struct test_driver_bss
*bss
;
2025 drv
= test_alloc_data(ctx
, ifname
);
2028 bss
= dl_list_first(&drv
->bss
, struct test_driver_bss
, list
);
2029 drv
->global
= global_priv
;
2030 drv
->test_socket
= -1;
2032 /* Set dummy BSSID and SSID for testing. */
2033 bss
->bssid
[0] = 0x02;
2034 bss
->bssid
[1] = 0x00;
2035 bss
->bssid
[2] = 0x00;
2036 bss
->bssid
[3] = 0x00;
2037 bss
->bssid
[4] = 0x00;
2038 bss
->bssid
[5] = 0x01;
2039 os_memcpy(bss
->ssid
, "test", 5);
2042 if (global
->bss_add_used
) {
2043 os_memcpy(drv
->own_addr
, global
->req_addr
, ETH_ALEN
);
2044 global
->bss_add_used
= 0;
2047 eloop_register_timeout(1, 0, wpa_driver_test_poll
, drv
, NULL
);
2053 static void wpa_driver_test_close_test_socket(struct wpa_driver_test_data
*drv
)
2055 if (drv
->test_socket
>= 0) {
2056 eloop_unregister_read_sock(drv
->test_socket
);
2057 close(drv
->test_socket
);
2058 drv
->test_socket
= -1;
2061 if (drv
->own_socket_path
) {
2062 unlink(drv
->own_socket_path
);
2063 os_free(drv
->own_socket_path
);
2064 drv
->own_socket_path
= NULL
;
2069 static void wpa_driver_test_deinit(void *priv
)
2071 struct test_driver_bss
*dbss
= priv
;
2072 struct wpa_driver_test_data
*drv
= dbss
->drv
;
2073 struct test_client_socket
*cli
, *prev
;
2084 /* There should be only one BSS remaining at this point. */
2085 if (dl_list_len(&drv
->bss
) != 1)
2086 wpa_printf(MSG_ERROR
, "%s: %u remaining BSS entries",
2087 __func__
, dl_list_len(&drv
->bss
));
2088 #endif /* HOSTAPD */
2090 test_driver_free_bsses(drv
);
2092 wpa_driver_test_close_test_socket(drv
);
2093 eloop_cancel_timeout(wpa_driver_test_scan_timeout
, drv
, drv
->ctx
);
2094 eloop_cancel_timeout(wpa_driver_test_poll
, drv
, NULL
);
2095 eloop_cancel_timeout(test_remain_on_channel_timeout
, drv
, NULL
);
2096 os_free(drv
->test_dir
);
2097 for (i
= 0; i
< MAX_SCAN_RESULTS
; i
++)
2098 os_free(drv
->scanres
[i
]);
2099 os_free(drv
->probe_req_ie
);
2100 wpa_trace_remove_ref(drv
, ctx
, drv
->ctx
);
2105 static int wpa_driver_test_attach(struct wpa_driver_test_data
*drv
,
2106 const char *dir
, int ap
)
2108 #ifdef DRIVER_TEST_UNIX
2109 static unsigned int counter
= 0;
2110 struct sockaddr_un addr
;
2113 os_free(drv
->own_socket_path
);
2115 len
= os_strlen(dir
) + 30;
2116 drv
->own_socket_path
= os_malloc(len
);
2117 if (drv
->own_socket_path
== NULL
)
2119 os_snprintf(drv
->own_socket_path
, len
, "%s/%s-" MACSTR
,
2120 dir
, ap
? "AP" : "STA", MAC2STR(drv
->own_addr
));
2122 drv
->own_socket_path
= os_malloc(100);
2123 if (drv
->own_socket_path
== NULL
)
2125 os_snprintf(drv
->own_socket_path
, 100,
2126 "/tmp/wpa_supplicant_test-%d-%d",
2127 getpid(), counter
++);
2130 drv
->test_socket
= socket(PF_UNIX
, SOCK_DGRAM
, 0);
2131 if (drv
->test_socket
< 0) {
2132 perror("socket(PF_UNIX)");
2133 os_free(drv
->own_socket_path
);
2134 drv
->own_socket_path
= NULL
;
2138 os_memset(&addr
, 0, sizeof(addr
));
2139 addr
.sun_family
= AF_UNIX
;
2140 os_strlcpy(addr
.sun_path
, drv
->own_socket_path
, sizeof(addr
.sun_path
));
2141 if (bind(drv
->test_socket
, (struct sockaddr
*) &addr
,
2142 sizeof(addr
)) < 0) {
2143 perror("bind(PF_UNIX)");
2144 close(drv
->test_socket
);
2145 unlink(drv
->own_socket_path
);
2146 os_free(drv
->own_socket_path
);
2147 drv
->own_socket_path
= NULL
;
2151 eloop_register_read_sock(drv
->test_socket
,
2152 wpa_driver_test_receive_unix
, drv
, NULL
);
2155 #else /* DRIVER_TEST_UNIX */
2157 #endif /* DRIVER_TEST_UNIX */
2161 static int wpa_driver_test_attach_udp(struct wpa_driver_test_data
*drv
,
2166 pos
= os_strchr(dst
, ':');
2170 wpa_printf(MSG_DEBUG
, "%s: addr=%s port=%s", __func__
, dst
, pos
);
2172 drv
->test_socket
= socket(PF_INET
, SOCK_DGRAM
, 0);
2173 if (drv
->test_socket
< 0) {
2174 perror("socket(PF_INET)");
2178 os_memset(&drv
->hostapd_addr_udp
, 0, sizeof(drv
->hostapd_addr_udp
));
2179 drv
->hostapd_addr_udp
.sin_family
= AF_INET
;
2180 #if defined(CONFIG_NATIVE_WINDOWS) || defined(CONFIG_ANSI_C_EXTRA)
2184 sscanf(dst
, "%d.%d.%d.%d", &a
[0], &a
[1], &a
[2], &a
[3]);
2185 pos
= (u8
*) &drv
->hostapd_addr_udp
.sin_addr
;
2191 #else /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */
2192 inet_aton(dst
, &drv
->hostapd_addr_udp
.sin_addr
);
2193 #endif /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */
2194 drv
->hostapd_addr_udp
.sin_port
= htons(atoi(pos
));
2196 drv
->hostapd_addr_udp_set
= 1;
2198 eloop_register_read_sock(drv
->test_socket
,
2199 wpa_driver_test_receive_unix
, drv
, NULL
);
2205 static int wpa_driver_test_set_param(void *priv
, const char *param
)
2207 struct test_driver_bss
*dbss
= priv
;
2208 struct wpa_driver_test_data
*drv
= dbss
->drv
;
2211 wpa_printf(MSG_DEBUG
, "%s: param='%s'", __func__
, param
);
2215 wpa_driver_test_close_test_socket(drv
);
2217 #ifdef DRIVER_TEST_UNIX
2218 pos
= os_strstr(param
, "test_socket=");
2224 pos2
= os_strchr(pos
, ' ');
2228 len
= os_strlen(pos
);
2229 if (len
> sizeof(drv
->hostapd_addr
.sun_path
))
2231 os_memset(&drv
->hostapd_addr
, 0, sizeof(drv
->hostapd_addr
));
2232 drv
->hostapd_addr
.sun_family
= AF_UNIX
;
2233 os_memcpy(drv
->hostapd_addr
.sun_path
, pos
, len
);
2234 drv
->hostapd_addr_set
= 1;
2236 #endif /* DRIVER_TEST_UNIX */
2238 pos
= os_strstr(param
, "test_dir=");
2241 os_free(drv
->test_dir
);
2242 drv
->test_dir
= os_strdup(pos
+ 9);
2243 if (drv
->test_dir
== NULL
)
2245 end
= os_strchr(drv
->test_dir
, ' ');
2248 if (wpa_driver_test_attach(drv
, drv
->test_dir
, 0))
2251 pos
= os_strstr(param
, "test_udp=");
2254 dst
= os_strdup(pos
+ 9);
2257 epos
= os_strchr(dst
, ' ');
2260 if (wpa_driver_test_attach_udp(drv
, dst
))
2263 } else if (wpa_driver_test_attach(drv
, NULL
, 0))
2267 if (os_strstr(param
, "use_associnfo=1")) {
2268 wpa_printf(MSG_DEBUG
, "test_driver: Use AssocInfo events");
2269 drv
->use_associnfo
= 1;
2272 #ifdef CONFIG_CLIENT_MLME
2273 if (os_strstr(param
, "use_mlme=1")) {
2274 wpa_printf(MSG_DEBUG
, "test_driver: Use internal MLME");
2277 #endif /* CONFIG_CLIENT_MLME */
2283 static const u8
* wpa_driver_test_get_mac_addr(void *priv
)
2285 struct test_driver_bss
*dbss
= priv
;
2286 struct wpa_driver_test_data
*drv
= dbss
->drv
;
2287 wpa_printf(MSG_DEBUG
, "%s", __func__
);
2288 return drv
->own_addr
;
2292 static int wpa_driver_test_send_eapol(void *priv
, const u8
*dest
, u16 proto
,
2293 const u8
*data
, size_t data_len
)
2295 struct test_driver_bss
*dbss
= priv
;
2296 struct wpa_driver_test_data
*drv
= dbss
->drv
;
2299 struct l2_ethhdr eth
;
2300 struct sockaddr
*addr
;
2302 #ifdef DRIVER_TEST_UNIX
2303 struct sockaddr_un addr_un
;
2304 #endif /* DRIVER_TEST_UNIX */
2306 wpa_hexdump(MSG_MSGDUMP
, "test_send_eapol TX frame", data
, data_len
);
2308 os_memset(ð
, 0, sizeof(eth
));
2309 os_memcpy(eth
.h_dest
, dest
, ETH_ALEN
);
2310 os_memcpy(eth
.h_source
, drv
->own_addr
, ETH_ALEN
);
2311 eth
.h_proto
= host_to_be16(proto
);
2313 msg_len
= 6 + sizeof(eth
) + data_len
;
2314 msg
= os_malloc(msg_len
);
2317 os_memcpy(msg
, "EAPOL ", 6);
2318 os_memcpy(msg
+ 6, ð
, sizeof(eth
));
2319 os_memcpy(msg
+ 6 + sizeof(eth
), data
, data_len
);
2321 if (os_memcmp(dest
, dbss
->bssid
, ETH_ALEN
) == 0 ||
2322 drv
->test_dir
== NULL
) {
2323 if (drv
->hostapd_addr_udp_set
) {
2324 addr
= (struct sockaddr
*) &drv
->hostapd_addr_udp
;
2325 alen
= sizeof(drv
->hostapd_addr_udp
);
2327 #ifdef DRIVER_TEST_UNIX
2328 addr
= (struct sockaddr
*) &drv
->hostapd_addr
;
2329 alen
= sizeof(drv
->hostapd_addr
);
2330 #else /* DRIVER_TEST_UNIX */
2333 #endif /* DRIVER_TEST_UNIX */
2336 #ifdef DRIVER_TEST_UNIX
2338 os_memset(&addr_un
, 0, sizeof(addr_un
));
2339 addr_un
.sun_family
= AF_UNIX
;
2340 os_snprintf(addr_un
.sun_path
, sizeof(addr_un
.sun_path
),
2341 "%s/STA-" MACSTR
, drv
->test_dir
, MAC2STR(dest
));
2342 if (stat(addr_un
.sun_path
, &st
) < 0) {
2343 os_snprintf(addr_un
.sun_path
, sizeof(addr_un
.sun_path
),
2345 drv
->test_dir
, MAC2STR(dest
));
2347 addr
= (struct sockaddr
*) &addr_un
;
2348 alen
= sizeof(addr_un
);
2349 #else /* DRIVER_TEST_UNIX */
2352 #endif /* DRIVER_TEST_UNIX */
2355 if (sendto(drv
->test_socket
, msg
, msg_len
, 0, addr
, alen
) < 0) {
2356 perror("sendmsg(test_socket)");
2366 static int wpa_driver_test_get_capa(void *priv
, struct wpa_driver_capa
*capa
)
2368 struct test_driver_bss
*dbss
= priv
;
2369 struct wpa_driver_test_data
*drv
= dbss
->drv
;
2370 os_memset(capa
, 0, sizeof(*capa
));
2371 capa
->key_mgmt
= WPA_DRIVER_CAPA_KEY_MGMT_WPA
|
2372 WPA_DRIVER_CAPA_KEY_MGMT_WPA2
|
2373 WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK
|
2374 WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK
|
2375 WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE
|
2376 WPA_DRIVER_CAPA_KEY_MGMT_FT
|
2377 WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK
;
2378 capa
->enc
= WPA_DRIVER_CAPA_ENC_WEP40
|
2379 WPA_DRIVER_CAPA_ENC_WEP104
|
2380 WPA_DRIVER_CAPA_ENC_TKIP
|
2381 WPA_DRIVER_CAPA_ENC_CCMP
;
2382 capa
->auth
= WPA_DRIVER_AUTH_OPEN
|
2383 WPA_DRIVER_AUTH_SHARED
|
2384 WPA_DRIVER_AUTH_LEAP
;
2386 capa
->flags
|= WPA_DRIVER_FLAGS_USER_SPACE_MLME
;
2387 capa
->flags
|= WPA_DRIVER_FLAGS_AP
;
2388 capa
->max_scan_ssids
= 2;
2389 capa
->max_remain_on_chan
= 60000;
2395 static int wpa_driver_test_mlme_setprotection(void *priv
, const u8
*addr
,
2399 wpa_printf(MSG_DEBUG
, "%s: protect_type=%d key_type=%d",
2400 __func__
, protect_type
, key_type
);
2403 wpa_printf(MSG_DEBUG
, "%s: addr=" MACSTR
,
2404 __func__
, MAC2STR(addr
));
2411 static int wpa_driver_test_set_channel(void *priv
,
2412 enum hostapd_hw_mode phymode
,
2415 struct test_driver_bss
*dbss
= priv
;
2416 struct wpa_driver_test_data
*drv
= dbss
->drv
;
2417 wpa_printf(MSG_DEBUG
, "%s: phymode=%d chan=%d freq=%d",
2418 __func__
, phymode
, chan
, freq
);
2419 drv
->current_freq
= freq
;
2424 static int wpa_driver_test_mlme_add_sta(void *priv
, const u8
*addr
,
2425 const u8
*supp_rates
,
2426 size_t supp_rates_len
)
2428 wpa_printf(MSG_DEBUG
, "%s: addr=" MACSTR
, __func__
, MAC2STR(addr
));
2433 static int wpa_driver_test_mlme_remove_sta(void *priv
, const u8
*addr
)
2435 wpa_printf(MSG_DEBUG
, "%s: addr=" MACSTR
, __func__
, MAC2STR(addr
));
2440 static int wpa_driver_test_set_ssid(void *priv
, const u8
*ssid
,
2443 wpa_printf(MSG_DEBUG
, "%s", __func__
);
2448 static int wpa_driver_test_set_bssid(void *priv
, const u8
*bssid
)
2450 wpa_printf(MSG_DEBUG
, "%s: bssid=" MACSTR
, __func__
, MAC2STR(bssid
));
2455 static void * wpa_driver_test_global_init(void)
2457 struct wpa_driver_test_global
*global
;
2459 global
= os_zalloc(sizeof(*global
));
2464 static void wpa_driver_test_global_deinit(void *priv
)
2466 struct wpa_driver_test_global
*global
= priv
;
2471 static struct wpa_interface_info
*
2472 wpa_driver_test_get_interfaces(void *global_priv
)
2474 /* struct wpa_driver_test_global *global = priv; */
2475 struct wpa_interface_info
*iface
;
2477 iface
= os_zalloc(sizeof(*iface
));
2480 iface
->ifname
= os_strdup("sta0");
2481 iface
->desc
= os_strdup("test interface 0");
2482 iface
->drv_name
= "test";
2483 iface
->next
= os_zalloc(sizeof(*iface
));
2485 iface
->next
->ifname
= os_strdup("sta1");
2486 iface
->next
->desc
= os_strdup("test interface 1");
2487 iface
->next
->drv_name
= "test";
2494 static struct hostapd_hw_modes
*
2495 wpa_driver_test_get_hw_feature_data(void *priv
, u16
*num_modes
, u16
*flags
)
2497 struct hostapd_hw_modes
*modes
;
2502 modes
= os_zalloc(*num_modes
* sizeof(struct hostapd_hw_modes
));
2505 modes
[0].mode
= HOSTAPD_MODE_IEEE80211G
;
2506 modes
[0].num_channels
= 11;
2507 modes
[0].num_rates
= 12;
2509 os_zalloc(11 * sizeof(struct hostapd_channel_data
));
2510 modes
[0].rates
= os_zalloc(modes
[0].num_rates
* sizeof(int));
2511 if (modes
[0].channels
== NULL
|| modes
[0].rates
== NULL
)
2513 for (i
= 0; i
< 11; i
++) {
2514 modes
[0].channels
[i
].chan
= i
+ 1;
2515 modes
[0].channels
[i
].freq
= 2412 + 5 * i
;
2516 modes
[0].channels
[i
].flag
= 0;
2518 modes
[0].rates
[0] = 10;
2519 modes
[0].rates
[1] = 20;
2520 modes
[0].rates
[2] = 55;
2521 modes
[0].rates
[3] = 110;
2522 modes
[0].rates
[4] = 60;
2523 modes
[0].rates
[5] = 90;
2524 modes
[0].rates
[6] = 120;
2525 modes
[0].rates
[7] = 180;
2526 modes
[0].rates
[8] = 240;
2527 modes
[0].rates
[9] = 360;
2528 modes
[0].rates
[10] = 480;
2529 modes
[0].rates
[11] = 540;
2531 modes
[1].mode
= HOSTAPD_MODE_IEEE80211B
;
2532 modes
[1].num_channels
= 11;
2533 modes
[1].num_rates
= 4;
2535 os_zalloc(11 * sizeof(struct hostapd_channel_data
));
2536 modes
[1].rates
= os_zalloc(modes
[1].num_rates
* sizeof(int));
2537 if (modes
[1].channels
== NULL
|| modes
[1].rates
== NULL
)
2539 for (i
= 0; i
< 11; i
++) {
2540 modes
[1].channels
[i
].chan
= i
+ 1;
2541 modes
[1].channels
[i
].freq
= 2412 + 5 * i
;
2542 modes
[1].channels
[i
].flag
= 0;
2544 modes
[1].rates
[0] = 10;
2545 modes
[1].rates
[1] = 20;
2546 modes
[1].rates
[2] = 55;
2547 modes
[1].rates
[3] = 110;
2549 modes
[2].mode
= HOSTAPD_MODE_IEEE80211A
;
2550 modes
[2].num_channels
= 1;
2551 modes
[2].num_rates
= 8;
2552 modes
[2].channels
= os_zalloc(sizeof(struct hostapd_channel_data
));
2553 modes
[2].rates
= os_zalloc(modes
[2].num_rates
* sizeof(int));
2554 if (modes
[2].channels
== NULL
|| modes
[2].rates
== NULL
)
2556 modes
[2].channels
[0].chan
= 60;
2557 modes
[2].channels
[0].freq
= 5300;
2558 modes
[2].channels
[0].flag
= 0;
2559 modes
[2].rates
[0] = 60;
2560 modes
[2].rates
[1] = 90;
2561 modes
[2].rates
[2] = 120;
2562 modes
[2].rates
[3] = 180;
2563 modes
[2].rates
[4] = 240;
2564 modes
[2].rates
[5] = 360;
2565 modes
[2].rates
[6] = 480;
2566 modes
[2].rates
[7] = 540;
2572 for (i
= 0; i
< *num_modes
; i
++) {
2573 os_free(modes
[i
].channels
);
2574 os_free(modes
[i
].rates
);
2582 static int wpa_driver_test_set_freq(void *priv
,
2583 struct hostapd_freq_params
*freq
)
2585 struct test_driver_bss
*dbss
= priv
;
2586 struct wpa_driver_test_data
*drv
= dbss
->drv
;
2587 wpa_printf(MSG_DEBUG
, "test: set_freq %u MHz", freq
->freq
);
2588 drv
->current_freq
= freq
->freq
;
2593 static int wpa_driver_test_send_action(void *priv
, unsigned int freq
,
2594 const u8
*dst
, const u8
*src
,
2596 const u8
*data
, size_t data_len
)
2598 struct test_driver_bss
*dbss
= priv
;
2599 struct wpa_driver_test_data
*drv
= dbss
->drv
;
2602 struct ieee80211_hdr
*hdr
;
2604 wpa_printf(MSG_DEBUG
, "test: Send Action frame");
2606 if ((drv
->remain_on_channel_freq
&&
2607 freq
!= drv
->remain_on_channel_freq
) ||
2608 (drv
->remain_on_channel_freq
== 0 &&
2609 freq
!= (unsigned int) drv
->current_freq
)) {
2610 wpa_printf(MSG_DEBUG
, "test: Reject Action frame TX on "
2611 "unexpected channel: freq=%u MHz (current_freq=%u "
2612 "MHz, remain-on-channel freq=%u MHz)",
2613 freq
, drv
->current_freq
,
2614 drv
->remain_on_channel_freq
);
2618 buf
= os_zalloc(24 + data_len
);
2621 os_memcpy(buf
+ 24, data
, data_len
);
2622 hdr
= (struct ieee80211_hdr
*) buf
;
2623 hdr
->frame_control
=
2624 IEEE80211_FC(WLAN_FC_TYPE_MGMT
, WLAN_FC_STYPE_ACTION
);
2625 os_memcpy(hdr
->addr1
, dst
, ETH_ALEN
);
2626 os_memcpy(hdr
->addr2
, src
, ETH_ALEN
);
2627 os_memcpy(hdr
->addr3
, bssid
, ETH_ALEN
);
2629 ret
= wpa_driver_test_send_mlme(priv
, buf
, 24 + data_len
);
2635 static void test_remain_on_channel_timeout(void *eloop_ctx
, void *timeout_ctx
)
2637 struct wpa_driver_test_data
*drv
= eloop_ctx
;
2638 union wpa_event_data data
;
2640 wpa_printf(MSG_DEBUG
, "test: Remain-on-channel timeout");
2642 os_memset(&data
, 0, sizeof(data
));
2643 data
.remain_on_channel
.freq
= drv
->remain_on_channel_freq
;
2644 data
.remain_on_channel
.duration
= drv
->remain_on_channel_duration
;
2645 wpa_supplicant_event(drv
->ctx
, EVENT_CANCEL_REMAIN_ON_CHANNEL
, &data
);
2647 drv
->remain_on_channel_freq
= 0;
2651 static int wpa_driver_test_remain_on_channel(void *priv
, unsigned int freq
,
2652 unsigned int duration
)
2654 struct test_driver_bss
*dbss
= priv
;
2655 struct wpa_driver_test_data
*drv
= dbss
->drv
;
2656 union wpa_event_data data
;
2658 wpa_printf(MSG_DEBUG
, "%s(freq=%u, duration=%u)",
2659 __func__
, freq
, duration
);
2660 if (drv
->remain_on_channel_freq
&&
2661 drv
->remain_on_channel_freq
!= freq
) {
2662 wpa_printf(MSG_DEBUG
, "test: Refuse concurrent "
2663 "remain_on_channel request");
2667 drv
->remain_on_channel_freq
= freq
;
2668 drv
->remain_on_channel_duration
= duration
;
2669 eloop_cancel_timeout(test_remain_on_channel_timeout
, drv
, NULL
);
2670 eloop_register_timeout(duration
/ 1000, (duration
% 1000) * 1000,
2671 test_remain_on_channel_timeout
, drv
, NULL
);
2673 os_memset(&data
, 0, sizeof(data
));
2674 data
.remain_on_channel
.freq
= freq
;
2675 data
.remain_on_channel
.duration
= duration
;
2676 wpa_supplicant_event(drv
->ctx
, EVENT_REMAIN_ON_CHANNEL
, &data
);
2682 static int wpa_driver_test_cancel_remain_on_channel(void *priv
)
2684 struct test_driver_bss
*dbss
= priv
;
2685 struct wpa_driver_test_data
*drv
= dbss
->drv
;
2686 wpa_printf(MSG_DEBUG
, "%s", __func__
);
2687 if (!drv
->remain_on_channel_freq
)
2689 drv
->remain_on_channel_freq
= 0;
2690 eloop_cancel_timeout(test_remain_on_channel_timeout
, drv
, NULL
);
2695 static int wpa_driver_test_probe_req_report(void *priv
, int report
)
2697 struct test_driver_bss
*dbss
= priv
;
2698 struct wpa_driver_test_data
*drv
= dbss
->drv
;
2699 wpa_printf(MSG_DEBUG
, "%s(report=%d)", __func__
, report
);
2700 drv
->probe_req_report
= report
;
2705 const struct wpa_driver_ops wpa_driver_test_ops
= {
2707 "wpa_supplicant test driver",
2708 .hapd_init
= test_driver_init
,
2709 .hapd_deinit
= wpa_driver_test_deinit
,
2710 .hapd_send_eapol
= test_driver_send_eapol
,
2711 .send_mlme
= wpa_driver_test_send_mlme
,
2712 .set_generic_elem
= test_driver_set_generic_elem
,
2713 .sta_deauth
= test_driver_sta_deauth
,
2714 .sta_disassoc
= test_driver_sta_disassoc
,
2715 .get_hw_feature_data
= wpa_driver_test_get_hw_feature_data
,
2716 .if_add
= test_driver_if_add
,
2717 .if_remove
= test_driver_if_remove
,
2718 .valid_bss_mask
= test_driver_valid_bss_mask
,
2719 .hapd_set_ssid
= test_driver_set_ssid
,
2720 .set_privacy
= test_driver_set_privacy
,
2721 .set_sta_vlan
= test_driver_set_sta_vlan
,
2722 .sta_add
= test_driver_sta_add
,
2723 .send_ether
= test_driver_send_ether
,
2724 .set_ap_wps_ie
= test_driver_set_ap_wps_ie
,
2725 .get_bssid
= wpa_driver_test_get_bssid
,
2726 .get_ssid
= wpa_driver_test_get_ssid
,
2727 .set_key
= wpa_driver_test_set_key
,
2728 .deinit
= wpa_driver_test_deinit
,
2729 .set_param
= wpa_driver_test_set_param
,
2730 .deauthenticate
= wpa_driver_test_deauthenticate
,
2731 .disassociate
= wpa_driver_test_disassociate
,
2732 .associate
= wpa_driver_test_associate
,
2733 .get_capa
= wpa_driver_test_get_capa
,
2734 .get_mac_addr
= wpa_driver_test_get_mac_addr
,
2735 .send_eapol
= wpa_driver_test_send_eapol
,
2736 .mlme_setprotection
= wpa_driver_test_mlme_setprotection
,
2737 .set_channel
= wpa_driver_test_set_channel
,
2738 .set_ssid
= wpa_driver_test_set_ssid
,
2739 .set_bssid
= wpa_driver_test_set_bssid
,
2740 .mlme_add_sta
= wpa_driver_test_mlme_add_sta
,
2741 .mlme_remove_sta
= wpa_driver_test_mlme_remove_sta
,
2742 .get_scan_results2
= wpa_driver_test_get_scan_results2
,
2743 .global_init
= wpa_driver_test_global_init
,
2744 .global_deinit
= wpa_driver_test_global_deinit
,
2745 .init2
= wpa_driver_test_init2
,
2746 .get_interfaces
= wpa_driver_test_get_interfaces
,
2747 .scan2
= wpa_driver_test_scan
,
2748 .set_freq
= wpa_driver_test_set_freq
,
2749 .send_action
= wpa_driver_test_send_action
,
2750 .remain_on_channel
= wpa_driver_test_remain_on_channel
,
2751 .cancel_remain_on_channel
= wpa_driver_test_cancel_remain_on_channel
,
2752 .probe_req_report
= wpa_driver_test_probe_req_report
,