67
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;
71
1252
static void wpa_driver_test_poll(void *eloop_ctx, void *timeout_ctx)
73
1254
struct wpa_driver_test_data *drv = eloop_ctx;
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;
1175
2705
const struct wpa_driver_ops wpa_driver_test_ops = {
1177
2707
"wpa_supplicant test driver",
1178
wpa_driver_test_get_bssid,
1179
wpa_driver_test_get_ssid,
1180
wpa_driver_test_set_wpa,
1181
wpa_driver_test_set_key,
1183
wpa_driver_test_deinit,
1184
wpa_driver_test_set_param,
1185
NULL /* set_countermeasures */,
1186
NULL /* set_drop_unencrypted */,
1187
wpa_driver_test_scan,
1188
NULL /* get_scan_results */,
1189
wpa_driver_test_deauthenticate,
1190
wpa_driver_test_disassociate,
1191
wpa_driver_test_associate,
1192
NULL /* set_auth_alg */,
1193
NULL /* add_pmkid */,
1194
NULL /* remove_pmkid */,
1195
NULL /* flush_pmkid */,
1196
wpa_driver_test_get_capa,
1198
NULL /* get_ifname */,
1199
wpa_driver_test_get_mac_addr,
1200
wpa_driver_test_send_eapol,
1201
NULL /* set_operstate */,
1202
wpa_driver_test_mlme_setprotection,
1203
#ifdef CONFIG_CLIENT_MLME
1204
wpa_driver_test_get_hw_feature_data,
1205
wpa_driver_test_set_channel,
1206
wpa_driver_test_set_ssid,
1207
wpa_driver_test_set_bssid,
1208
wpa_driver_test_send_mlme,
1209
wpa_driver_test_mlme_add_sta,
1210
wpa_driver_test_mlme_remove_sta,
1211
#else /* CONFIG_CLIENT_MLME */
1212
NULL /* get_hw_feature_data */,
1213
NULL /* set_channel */,
1214
NULL /* set_ssid */,
1215
NULL /* set_bssid */,
1216
NULL /* send_mlme */,
1217
NULL /* mlme_add_sta */,
1218
NULL /* mlme_remove_sta */,
1219
#endif /* CONFIG_CLIENT_MLME */
1220
NULL /* update_ft_ies */,
1221
NULL /* send_ft_action */,
1222
wpa_driver_test_get_scan_results2,
1223
wpa_driver_test_set_probe_req_ie,
1224
NULL /* set_mode */,
1225
NULL /* set_country */,
1226
wpa_driver_test_global_init,
1227
wpa_driver_test_global_deinit,
1228
wpa_driver_test_init2,
1229
wpa_driver_test_get_interfaces
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,