Add a driver op for enabling Probe Request reporting in station mode
[libeap.git] / src / drivers / driver_test.c
1 /*
2  * Testing driver interface for a simulated network driver
3  * Copyright (c) 2004-2009, Jouni Malinen <j@w1.fi>
4  *
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.
8  *
9  * Alternatively, this software may be distributed under the terms of BSD
10  * license.
11  *
12  * See README and COPYING for more details.
13  */
14
15 /* Make sure we get winsock2.h for Windows build to get sockaddr_storage */
16 #include "build_config.h"
17 #ifdef CONFIG_NATIVE_WINDOWS
18 #include <winsock2.h>
19 #endif /* CONFIG_NATIVE_WINDOWS */
20
21 #include "utils/includes.h"
22
23 #ifndef CONFIG_NATIVE_WINDOWS
24 #include <sys/un.h>
25 #include <dirent.h>
26 #include <sys/stat.h>
27 #define DRIVER_TEST_UNIX
28 #endif /* CONFIG_NATIVE_WINDOWS */
29
30 #include "utils/common.h"
31 #include "utils/eloop.h"
32 #include "utils/trace.h"
33 #include "common/ieee802_11_defs.h"
34 #include "crypto/sha1.h"
35 #include "l2_packet/l2_packet.h"
36 #include "driver.h"
37
38
39 struct test_client_socket {
40         struct test_client_socket *next;
41         u8 addr[ETH_ALEN];
42         struct sockaddr_un un;
43         socklen_t unlen;
44         struct test_driver_bss *bss;
45 };
46
47 struct test_driver_bss {
48         struct test_driver_bss *next;
49         void *bss_ctx;
50         char ifname[IFNAMSIZ + 1];
51         u8 bssid[ETH_ALEN];
52         u8 *ie;
53         size_t ielen;
54         u8 *wps_beacon_ie;
55         size_t wps_beacon_ie_len;
56         u8 *wps_probe_resp_ie;
57         size_t wps_probe_resp_ie_len;
58         u8 ssid[32];
59         size_t ssid_len;
60         int privacy;
61 };
62
63 struct wpa_driver_test_global {
64         int bss_add_used;
65         u8 req_addr[ETH_ALEN];
66 };
67
68 struct wpa_driver_test_data {
69         struct wpa_driver_test_global *global;
70         void *ctx;
71         WPA_TRACE_REF(ctx);
72         char ifname[IFNAMSIZ + 1];
73         u8 own_addr[ETH_ALEN];
74         int test_socket;
75 #ifdef DRIVER_TEST_UNIX
76         struct sockaddr_un hostapd_addr;
77 #endif /* DRIVER_TEST_UNIX */
78         int hostapd_addr_set;
79         struct sockaddr_in hostapd_addr_udp;
80         int hostapd_addr_udp_set;
81         char *own_socket_path;
82         char *test_dir;
83         u8 bssid[ETH_ALEN];
84         u8 ssid[32];
85         size_t ssid_len;
86 #define MAX_SCAN_RESULTS 30
87         struct wpa_scan_res *scanres[MAX_SCAN_RESULTS];
88         size_t num_scanres;
89         int use_associnfo;
90         u8 assoc_wpa_ie[80];
91         size_t assoc_wpa_ie_len;
92         int use_mlme;
93         int associated;
94         u8 *probe_req_ie;
95         size_t probe_req_ie_len;
96         int ibss;
97         int privacy;
98         int ap;
99
100         struct test_client_socket *cli;
101         struct test_driver_bss *bss;
102         int udp_port;
103
104         int probe_req_report;
105 };
106
107
108 static void wpa_driver_test_deinit(void *priv);
109 static int wpa_driver_test_attach(struct wpa_driver_test_data *drv,
110                                   const char *dir, int ap);
111 static void wpa_driver_test_close_test_socket(
112         struct wpa_driver_test_data *drv);
113
114
115 static void test_driver_free_bss(struct test_driver_bss *bss)
116 {
117         os_free(bss->ie);
118         os_free(bss->wps_beacon_ie);
119         os_free(bss->wps_probe_resp_ie);
120         os_free(bss);
121 }
122
123
124 static void test_driver_free_bsses(struct wpa_driver_test_data *drv)
125 {
126         struct test_driver_bss *bss, *prev_bss;
127
128         bss = drv->bss;
129         while (bss) {
130                 prev_bss = bss;
131                 bss = bss->next;
132                 test_driver_free_bss(prev_bss);
133         }
134
135         drv->bss = NULL;
136 }
137
138
139 static struct test_client_socket *
140 test_driver_get_cli(struct wpa_driver_test_data *drv, struct sockaddr_un *from,
141                     socklen_t fromlen)
142 {
143         struct test_client_socket *cli = drv->cli;
144
145         while (cli) {
146                 if (cli->unlen == fromlen &&
147                     strncmp(cli->un.sun_path, from->sun_path,
148                             fromlen - sizeof(cli->un.sun_family)) == 0)
149                         return cli;
150                 cli = cli->next;
151         }
152
153         return NULL;
154 }
155
156
157 static int test_driver_send_eapol(void *priv, const u8 *addr, const u8 *data,
158                                   size_t data_len, int encrypt,
159                                   const u8 *own_addr)
160 {
161         struct wpa_driver_test_data *drv = priv;
162         struct test_client_socket *cli;
163         struct msghdr msg;
164         struct iovec io[3];
165         struct l2_ethhdr eth;
166
167         if (drv->test_socket < 0)
168                 return -1;
169
170         cli = drv->cli;
171         while (cli) {
172                 if (memcmp(cli->addr, addr, ETH_ALEN) == 0)
173                         break;
174                 cli = cli->next;
175         }
176
177         if (!cli) {
178                 wpa_printf(MSG_DEBUG, "%s: no destination client entry",
179                            __func__);
180                 return -1;
181         }
182
183         memcpy(eth.h_dest, addr, ETH_ALEN);
184         memcpy(eth.h_source, own_addr, ETH_ALEN);
185         eth.h_proto = host_to_be16(ETH_P_EAPOL);
186
187         io[0].iov_base = "EAPOL ";
188         io[0].iov_len = 6;
189         io[1].iov_base = &eth;
190         io[1].iov_len = sizeof(eth);
191         io[2].iov_base = (u8 *) data;
192         io[2].iov_len = data_len;
193
194         memset(&msg, 0, sizeof(msg));
195         msg.msg_iov = io;
196         msg.msg_iovlen = 3;
197         msg.msg_name = &cli->un;
198         msg.msg_namelen = cli->unlen;
199         return sendmsg(drv->test_socket, &msg, 0);
200 }
201
202
203 static int test_driver_send_ether(void *priv, const u8 *dst, const u8 *src,
204                                   u16 proto, const u8 *data, size_t data_len)
205 {
206         struct wpa_driver_test_data *drv = priv;
207         struct msghdr msg;
208         struct iovec io[3];
209         struct l2_ethhdr eth;
210         char desttxt[30];
211         struct sockaddr_un addr;
212         struct dirent *dent;
213         DIR *dir;
214         int ret = 0, broadcast = 0, count = 0;
215
216         if (drv->test_socket < 0 || drv->test_dir == NULL) {
217                 wpa_printf(MSG_DEBUG, "%s: invalid parameters (sock=%d "
218                            "test_dir=%p)",
219                            __func__, drv->test_socket, drv->test_dir);
220                 return -1;
221         }
222
223         broadcast = memcmp(dst, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0;
224         snprintf(desttxt, sizeof(desttxt), MACSTR, MAC2STR(dst));
225
226         memcpy(eth.h_dest, dst, ETH_ALEN);
227         memcpy(eth.h_source, src, ETH_ALEN);
228         eth.h_proto = host_to_be16(proto);
229
230         io[0].iov_base = "ETHER ";
231         io[0].iov_len = 6;
232         io[1].iov_base = &eth;
233         io[1].iov_len = sizeof(eth);
234         io[2].iov_base = (u8 *) data;
235         io[2].iov_len = data_len;
236
237         memset(&msg, 0, sizeof(msg));
238         msg.msg_iov = io;
239         msg.msg_iovlen = 3;
240
241         dir = opendir(drv->test_dir);
242         if (dir == NULL) {
243                 perror("test_driver: opendir");
244                 return -1;
245         }
246         while ((dent = readdir(dir))) {
247 #ifdef _DIRENT_HAVE_D_TYPE
248                 /* Skip the file if it is not a socket. Also accept
249                  * DT_UNKNOWN (0) in case the C library or underlying file
250                  * system does not support d_type. */
251                 if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
252                         continue;
253 #endif /* _DIRENT_HAVE_D_TYPE */
254                 if (strcmp(dent->d_name, ".") == 0 ||
255                     strcmp(dent->d_name, "..") == 0)
256                         continue;
257
258                 memset(&addr, 0, sizeof(addr));
259                 addr.sun_family = AF_UNIX;
260                 snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s",
261                          drv->test_dir, dent->d_name);
262
263                 if (strcmp(addr.sun_path, drv->own_socket_path) == 0)
264                         continue;
265                 if (!broadcast && strstr(dent->d_name, desttxt) == NULL)
266                         continue;
267
268                 wpa_printf(MSG_DEBUG, "%s: Send ether frame to %s",
269                            __func__, dent->d_name);
270
271                 msg.msg_name = &addr;
272                 msg.msg_namelen = sizeof(addr);
273                 ret = sendmsg(drv->test_socket, &msg, 0);
274                 if (ret < 0)
275                         perror("driver_test: sendmsg");
276                 count++;
277         }
278         closedir(dir);
279
280         if (!broadcast && count == 0) {
281                 wpa_printf(MSG_DEBUG, "%s: Destination " MACSTR " not found",
282                            __func__, MAC2STR(dst));
283                 return -1;
284         }
285
286         return ret;
287 }
288
289
290 static int wpa_driver_test_send_mlme(void *priv, const u8 *data,
291                                      size_t data_len)
292 {
293         struct wpa_driver_test_data *drv = priv;
294         struct msghdr msg;
295         struct iovec io[2];
296         const u8 *dest;
297         struct sockaddr_un addr;
298         struct dirent *dent;
299         DIR *dir;
300         int broadcast;
301         int ret = 0;
302         struct ieee80211_hdr *hdr;
303         u16 fc;
304 #ifdef HOSTAPD
305         char desttxt[30];
306 #endif /* HOSTAPD */
307         union wpa_event_data event;
308
309         wpa_hexdump(MSG_MSGDUMP, "test_send_mlme", data, data_len);
310         if (drv->test_socket < 0 || data_len < 10) {
311                 wpa_printf(MSG_DEBUG, "%s: invalid parameters (sock=%d len=%lu"
312                            " test_dir=%p)",
313                            __func__, drv->test_socket,
314                            (unsigned long) data_len,
315                            drv->test_dir);
316                 return -1;
317         }
318
319         dest = data + 4;
320         broadcast = os_memcmp(dest, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0;
321
322 #ifdef HOSTAPD
323         snprintf(desttxt, sizeof(desttxt), MACSTR, MAC2STR(dest));
324 #endif /* HOSTAPD */
325
326         io[0].iov_base = "MLME ";
327         io[0].iov_len = 5;
328         io[1].iov_base = (void *) data;
329         io[1].iov_len = data_len;
330
331         os_memset(&msg, 0, sizeof(msg));
332         msg.msg_iov = io;
333         msg.msg_iovlen = 2;
334
335 #ifdef HOSTAPD
336         if (drv->test_dir == NULL) {
337                 wpa_printf(MSG_DEBUG, "%s: test_dir == NULL", __func__);
338                 return -1;
339         }
340
341         dir = opendir(drv->test_dir);
342         if (dir == NULL) {
343                 perror("test_driver: opendir");
344                 return -1;
345         }
346         while ((dent = readdir(dir))) {
347 #ifdef _DIRENT_HAVE_D_TYPE
348                 /* Skip the file if it is not a socket. Also accept
349                  * DT_UNKNOWN (0) in case the C library or underlying file
350                  * system does not support d_type. */
351                 if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
352                         continue;
353 #endif /* _DIRENT_HAVE_D_TYPE */
354                 if (os_strcmp(dent->d_name, ".") == 0 ||
355                     os_strcmp(dent->d_name, "..") == 0)
356                         continue;
357
358                 os_memset(&addr, 0, sizeof(addr));
359                 addr.sun_family = AF_UNIX;
360                 os_snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s",
361                             drv->test_dir, dent->d_name);
362
363                 if (os_strcmp(addr.sun_path, drv->own_socket_path) == 0)
364                         continue;
365                 if (!broadcast && os_strstr(dent->d_name, desttxt) == NULL)
366                         continue;
367
368                 wpa_printf(MSG_DEBUG, "%s: Send management frame to %s",
369                            __func__, dent->d_name);
370
371                 msg.msg_name = &addr;
372                 msg.msg_namelen = sizeof(addr);
373                 ret = sendmsg(drv->test_socket, &msg, 0);
374                 if (ret < 0)
375                         perror("driver_test: sendmsg(test_socket)");
376         }
377         closedir(dir);
378 #else /* HOSTAPD */
379
380         if (os_memcmp(dest, drv->bssid, ETH_ALEN) == 0 ||
381             drv->test_dir == NULL) {
382                 if (drv->hostapd_addr_udp_set) {
383                         msg.msg_name = &drv->hostapd_addr_udp;
384                         msg.msg_namelen = sizeof(drv->hostapd_addr_udp);
385                 } else {
386 #ifdef DRIVER_TEST_UNIX
387                         msg.msg_name = &drv->hostapd_addr;
388                         msg.msg_namelen = sizeof(drv->hostapd_addr);
389 #endif /* DRIVER_TEST_UNIX */
390                 }
391         } else if (broadcast) {
392                 dir = opendir(drv->test_dir);
393                 if (dir == NULL)
394                         return -1;
395                 while ((dent = readdir(dir))) {
396 #ifdef _DIRENT_HAVE_D_TYPE
397                         /* Skip the file if it is not a socket.
398                          * Also accept DT_UNKNOWN (0) in case
399                          * the C library or underlying file
400                          * system does not support d_type. */
401                         if (dent->d_type != DT_SOCK &&
402                             dent->d_type != DT_UNKNOWN)
403                                 continue;
404 #endif /* _DIRENT_HAVE_D_TYPE */
405                         if (os_strcmp(dent->d_name, ".") == 0 ||
406                             os_strcmp(dent->d_name, "..") == 0)
407                                 continue;
408                         wpa_printf(MSG_DEBUG, "%s: Send broadcast MLME to %s",
409                                    __func__, dent->d_name);
410                         os_memset(&addr, 0, sizeof(addr));
411                         addr.sun_family = AF_UNIX;
412                         os_snprintf(addr.sun_path, sizeof(addr.sun_path),
413                                     "%s/%s", drv->test_dir, dent->d_name);
414
415                         msg.msg_name = &addr;
416                         msg.msg_namelen = sizeof(addr);
417
418                         ret = sendmsg(drv->test_socket, &msg, 0);
419                         if (ret < 0)
420                                 perror("driver_test: sendmsg(test_socket)");
421                 }
422                 closedir(dir);
423                 return ret;
424         } else {
425                 struct stat st;
426                 os_memset(&addr, 0, sizeof(addr));
427                 addr.sun_family = AF_UNIX;
428                 os_snprintf(addr.sun_path, sizeof(addr.sun_path),
429                             "%s/AP-" MACSTR, drv->test_dir, MAC2STR(dest));
430                 if (stat(addr.sun_path, &st) < 0) {
431                         os_snprintf(addr.sun_path, sizeof(addr.sun_path),
432                                     "%s/STA-" MACSTR,
433                                     drv->test_dir, MAC2STR(dest));
434                 }
435                 msg.msg_name = &addr;
436                 msg.msg_namelen = sizeof(addr);
437         }
438
439         if (sendmsg(drv->test_socket, &msg, 0) < 0) {
440                 perror("sendmsg(test_socket)");
441                 return -1;
442         }
443 #endif /* HOSTAPD */
444
445         hdr = (struct ieee80211_hdr *) data;
446         fc = le_to_host16(hdr->frame_control);
447
448         os_memset(&event, 0, sizeof(event));
449         event.tx_status.type = WLAN_FC_GET_TYPE(fc);
450         event.tx_status.stype = WLAN_FC_GET_STYPE(fc);
451         event.tx_status.dst = hdr->addr1;
452         event.tx_status.data = data;
453         event.tx_status.data_len = data_len;
454         event.tx_status.ack = ret >= 0;
455         wpa_supplicant_event(drv->ctx, EVENT_TX_STATUS, &event);
456
457         return ret;
458 }
459
460
461 static void test_driver_scan(struct wpa_driver_test_data *drv,
462                              struct sockaddr_un *from, socklen_t fromlen,
463                              char *data)
464 {
465         char buf[512], *pos, *end;
466         int ret;
467         struct test_driver_bss *bss;
468         u8 sa[ETH_ALEN];
469         u8 ie[512];
470         size_t ielen;
471         union wpa_event_data event;
472
473         /* data: optional [ ' ' | STA-addr | ' ' | IEs(hex) ] */
474
475         wpa_printf(MSG_DEBUG, "test_driver: SCAN");
476
477         if (*data) {
478                 if (*data != ' ' ||
479                     hwaddr_aton(data + 1, sa)) {
480                         wpa_printf(MSG_DEBUG, "test_driver: Unexpected SCAN "
481                                    "command format");
482                         return;
483                 }
484
485                 data += 18;
486                 while (*data == ' ')
487                         data++;
488                 ielen = os_strlen(data) / 2;
489                 if (ielen > sizeof(ie))
490                         ielen = sizeof(ie);
491                 if (hexstr2bin(data, ie, ielen) < 0)
492                         ielen = 0;
493
494                 wpa_printf(MSG_DEBUG, "test_driver: Scan from " MACSTR,
495                            MAC2STR(sa));
496                 wpa_hexdump(MSG_MSGDUMP, "test_driver: scan IEs", ie, ielen);
497
498                 os_memset(&event, 0, sizeof(event));
499                 event.rx_probe_req.sa = sa;
500                 event.rx_probe_req.ie = ie;
501                 event.rx_probe_req.ie_len = ielen;
502                 wpa_supplicant_event(drv->ctx, EVENT_RX_PROBE_REQ, &event);
503         }
504
505         for (bss = drv->bss; bss; bss = bss->next) {
506                 pos = buf;
507                 end = buf + sizeof(buf);
508
509                 /* reply: SCANRESP BSSID SSID IEs */
510                 ret = snprintf(pos, end - pos, "SCANRESP " MACSTR " ",
511                                MAC2STR(bss->bssid));
512                 if (ret < 0 || ret >= end - pos)
513                         return;
514                 pos += ret;
515                 pos += wpa_snprintf_hex(pos, end - pos,
516                                         bss->ssid, bss->ssid_len);
517                 ret = snprintf(pos, end - pos, " ");
518                 if (ret < 0 || ret >= end - pos)
519                         return;
520                 pos += ret;
521                 pos += wpa_snprintf_hex(pos, end - pos, bss->ie, bss->ielen);
522                 pos += wpa_snprintf_hex(pos, end - pos, bss->wps_probe_resp_ie,
523                                         bss->wps_probe_resp_ie_len);
524
525                 if (bss->privacy) {
526                         ret = snprintf(pos, end - pos, " PRIVACY");
527                         if (ret < 0 || ret >= end - pos)
528                                 return;
529                         pos += ret;
530                 }
531
532                 sendto(drv->test_socket, buf, pos - buf, 0,
533                        (struct sockaddr *) from, fromlen);
534         }
535 }
536
537
538 static void test_driver_assoc(struct wpa_driver_test_data *drv,
539                               struct sockaddr_un *from, socklen_t fromlen,
540                               char *data)
541 {
542         struct test_client_socket *cli;
543         u8 ie[256], ssid[32];
544         size_t ielen, ssid_len = 0;
545         char *pos, *pos2, cmd[50];
546         struct test_driver_bss *bss;
547
548         /* data: STA-addr SSID(hex) IEs(hex) */
549
550         cli = os_zalloc(sizeof(*cli));
551         if (cli == NULL)
552                 return;
553
554         if (hwaddr_aton(data, cli->addr)) {
555                 printf("test_socket: Invalid MAC address '%s' in ASSOC\n",
556                        data);
557                 os_free(cli);
558                 return;
559         }
560         pos = data + 17;
561         while (*pos == ' ')
562                 pos++;
563         pos2 = strchr(pos, ' ');
564         ielen = 0;
565         if (pos2) {
566                 ssid_len = (pos2 - pos) / 2;
567                 if (hexstr2bin(pos, ssid, ssid_len) < 0) {
568                         wpa_printf(MSG_DEBUG, "%s: Invalid SSID", __func__);
569                         os_free(cli);
570                         return;
571                 }
572                 wpa_hexdump_ascii(MSG_DEBUG, "test_driver_assoc: SSID",
573                                   ssid, ssid_len);
574
575                 pos = pos2 + 1;
576                 ielen = strlen(pos) / 2;
577                 if (ielen > sizeof(ie))
578                         ielen = sizeof(ie);
579                 if (hexstr2bin(pos, ie, ielen) < 0)
580                         ielen = 0;
581         }
582
583         for (bss = drv->bss; bss; bss = bss->next) {
584                 if (bss->ssid_len == ssid_len &&
585                     memcmp(bss->ssid, ssid, ssid_len) == 0)
586                         break;
587         }
588         if (bss == NULL) {
589                 wpa_printf(MSG_DEBUG, "%s: No matching SSID found from "
590                            "configured BSSes", __func__);
591                 os_free(cli);
592                 return;
593         }
594
595         cli->bss = bss;
596         memcpy(&cli->un, from, sizeof(cli->un));
597         cli->unlen = fromlen;
598         cli->next = drv->cli;
599         drv->cli = cli;
600         wpa_hexdump_ascii(MSG_DEBUG, "test_socket: ASSOC sun_path",
601                           (const u8 *) cli->un.sun_path,
602                           cli->unlen - sizeof(cli->un.sun_family));
603
604         snprintf(cmd, sizeof(cmd), "ASSOCRESP " MACSTR " 0",
605                  MAC2STR(bss->bssid));
606         sendto(drv->test_socket, cmd, strlen(cmd), 0,
607                (struct sockaddr *) from, fromlen);
608
609 #ifdef HOSTAPD
610         if (hostapd_notif_assoc(bss->bss_ctx, cli->addr, ie, ielen) < 0)
611                 wpa_printf(MSG_DEBUG, "test_driver: failed to add new STA");
612 #endif /* HOSTAPD */
613 }
614
615
616 static void test_driver_disassoc(struct wpa_driver_test_data *drv,
617                                  struct sockaddr_un *from, socklen_t fromlen)
618 {
619         struct test_client_socket *cli;
620
621         cli = test_driver_get_cli(drv, from, fromlen);
622         if (!cli)
623                 return;
624
625 #ifdef HOSTAPD
626         hostapd_notif_disassoc(drv->ctx, cli->addr);
627 #endif /* HOSTAPD */
628 }
629
630
631 static void test_driver_eapol(struct wpa_driver_test_data *drv,
632                               struct sockaddr_un *from, socklen_t fromlen,
633                               u8 *data, size_t datalen)
634 {
635 #ifdef HOSTAPD
636         struct test_client_socket *cli;
637 #endif /* HOSTAPD */
638         const u8 *src = NULL;
639
640         if (datalen > 14) {
641                 /* Skip Ethernet header */
642                 src = data + ETH_ALEN;
643                 wpa_printf(MSG_DEBUG, "test_driver: dst=" MACSTR " src="
644                            MACSTR " proto=%04x",
645                            MAC2STR(data), MAC2STR(src),
646                            WPA_GET_BE16(data + 2 * ETH_ALEN));
647                 data += 14;
648                 datalen -= 14;
649         }
650 #ifdef HOSTAPD
651         cli = test_driver_get_cli(drv, from, fromlen);
652         if (cli) {
653                 hostapd_eapol_receive(cli->bss->bss_ctx, cli->addr, data,
654                                       datalen);
655         } else {
656                 wpa_printf(MSG_DEBUG, "test_socket: EAPOL from unknown "
657                            "client");
658         }
659 #else /* HOSTAPD */
660         if (src)
661                 wpa_supplicant_rx_eapol(drv->ctx, src, data, datalen);
662 #endif /* HOSTAPD */
663 }
664
665
666 static void test_driver_ether(struct wpa_driver_test_data *drv,
667                               struct sockaddr_un *from, socklen_t fromlen,
668                               u8 *data, size_t datalen)
669 {
670         struct l2_ethhdr *eth;
671
672         if (datalen < sizeof(*eth))
673                 return;
674
675         eth = (struct l2_ethhdr *) data;
676         wpa_printf(MSG_DEBUG, "test_driver: RX ETHER dst=" MACSTR " src="
677                    MACSTR " proto=%04x",
678                    MAC2STR(eth->h_dest), MAC2STR(eth->h_source),
679                    be_to_host16(eth->h_proto));
680
681 #ifdef CONFIG_IEEE80211R
682         if (be_to_host16(eth->h_proto) == ETH_P_RRB) {
683                 union wpa_event_data ev;
684                 os_memset(&ev, 0, sizeof(ev));
685                 ev.ft_rrb_rx.src = eth->h_source;
686                 ev.ft_rrb_rx.data = data + sizeof(*eth);
687                 ev.ft_rrb_rx.data_len = datalen - sizeof(*eth);
688         }
689 #endif /* CONFIG_IEEE80211R */
690 }
691
692
693 static void test_driver_mlme(struct wpa_driver_test_data *drv,
694                              struct sockaddr_un *from, socklen_t fromlen,
695                              u8 *data, size_t datalen)
696 {
697         struct ieee80211_hdr *hdr;
698         u16 fc;
699         union wpa_event_data event;
700
701         hdr = (struct ieee80211_hdr *) data;
702
703         if (test_driver_get_cli(drv, from, fromlen) == NULL && datalen >= 16) {
704                 struct test_client_socket *cli;
705                 cli = os_zalloc(sizeof(*cli));
706                 if (cli == NULL)
707                         return;
708                 wpa_printf(MSG_DEBUG, "Adding client entry for " MACSTR,
709                            MAC2STR(hdr->addr2));
710                 memcpy(cli->addr, hdr->addr2, ETH_ALEN);
711                 memcpy(&cli->un, from, sizeof(cli->un));
712                 cli->unlen = fromlen;
713                 cli->next = drv->cli;
714                 drv->cli = cli;
715         }
716
717         wpa_hexdump(MSG_MSGDUMP, "test_driver_mlme: received frame",
718                     data, datalen);
719         fc = le_to_host16(hdr->frame_control);
720         if (WLAN_FC_GET_TYPE(fc) != WLAN_FC_TYPE_MGMT) {
721                 wpa_printf(MSG_ERROR, "%s: received non-mgmt frame",
722                            __func__);
723                 return;
724         }
725
726         os_memset(&event, 0, sizeof(event));
727         event.rx_mgmt.frame = data;
728         event.rx_mgmt.frame_len = datalen;
729         wpa_supplicant_event(drv->ctx, EVENT_RX_MGMT, &event);
730 }
731
732
733 static void test_driver_receive_unix(int sock, void *eloop_ctx, void *sock_ctx)
734 {
735         struct wpa_driver_test_data *drv = eloop_ctx;
736         char buf[2000];
737         int res;
738         struct sockaddr_un from;
739         socklen_t fromlen = sizeof(from);
740
741         res = recvfrom(sock, buf, sizeof(buf) - 1, 0,
742                        (struct sockaddr *) &from, &fromlen);
743         if (res < 0) {
744                 perror("recvfrom(test_socket)");
745                 return;
746         }
747         buf[res] = '\0';
748
749         wpa_printf(MSG_DEBUG, "test_driver: received %u bytes", res);
750
751         if (strncmp(buf, "SCAN", 4) == 0) {
752                 test_driver_scan(drv, &from, fromlen, buf + 4);
753         } else if (strncmp(buf, "ASSOC ", 6) == 0) {
754                 test_driver_assoc(drv, &from, fromlen, buf + 6);
755         } else if (strcmp(buf, "DISASSOC") == 0) {
756                 test_driver_disassoc(drv, &from, fromlen);
757         } else if (strncmp(buf, "EAPOL ", 6) == 0) {
758                 test_driver_eapol(drv, &from, fromlen, (u8 *) buf + 6,
759                                   res - 6);
760         } else if (strncmp(buf, "ETHER ", 6) == 0) {
761                 test_driver_ether(drv, &from, fromlen, (u8 *) buf + 6,
762                                   res - 6);
763         } else if (strncmp(buf, "MLME ", 5) == 0) {
764                 test_driver_mlme(drv, &from, fromlen, (u8 *) buf + 5, res - 5);
765         } else {
766                 wpa_hexdump_ascii(MSG_DEBUG, "Unknown test_socket command",
767                                   (u8 *) buf, res);
768         }
769 }
770
771
772 static struct test_driver_bss *
773 test_driver_get_bss(struct wpa_driver_test_data *drv, const char *ifname)
774 {
775         struct test_driver_bss *bss;
776
777         for (bss = drv->bss; bss; bss = bss->next) {
778                 if (os_strcmp(bss->ifname, ifname) == 0)
779                         return bss;
780         }
781         return NULL;
782 }
783
784
785 static int test_driver_set_generic_elem(const char *ifname, void *priv,
786                                         const u8 *elem, size_t elem_len)
787 {
788         struct wpa_driver_test_data *drv = priv;
789         struct test_driver_bss *bss;
790
791         bss = test_driver_get_bss(drv, ifname);
792         if (bss == NULL)
793                 return -1;
794
795         os_free(bss->ie);
796
797         if (elem == NULL) {
798                 bss->ie = NULL;
799                 bss->ielen = 0;
800                 return 0;
801         }
802
803         bss->ie = os_malloc(elem_len);
804         if (bss->ie == NULL) {
805                 bss->ielen = 0;
806                 return -1;
807         }
808
809         memcpy(bss->ie, elem, elem_len);
810         bss->ielen = elem_len;
811         return 0;
812 }
813
814
815 static int test_driver_set_ap_wps_ie(const char *ifname, void *priv,
816                                      const struct wpabuf *beacon,
817                                      const struct wpabuf *proberesp)
818 {
819         struct wpa_driver_test_data *drv = priv;
820         struct test_driver_bss *bss;
821
822         bss = test_driver_get_bss(drv, ifname);
823         if (bss == NULL)
824                 return -1;
825
826         if (beacon == NULL)
827                 wpa_printf(MSG_DEBUG, "test_driver: Clear Beacon WPS IE");
828         else
829                 wpa_hexdump_buf(MSG_DEBUG, "test_driver: Beacon WPS IE",
830                                 beacon);
831
832         os_free(bss->wps_beacon_ie);
833
834         if (beacon == NULL) {
835                 bss->wps_beacon_ie = NULL;
836                 bss->wps_beacon_ie_len = 0;
837         } else {
838                 bss->wps_beacon_ie = os_malloc(wpabuf_len(beacon));
839                 if (bss->wps_beacon_ie == NULL) {
840                         bss->wps_beacon_ie_len = 0;
841                         return -1;
842                 }
843
844                 os_memcpy(bss->wps_beacon_ie, wpabuf_head(beacon),
845                           wpabuf_len(beacon));
846                 bss->wps_beacon_ie_len = wpabuf_len(beacon);
847         }
848
849         if (proberesp == NULL)
850                 wpa_printf(MSG_DEBUG, "test_driver: Clear Probe Response WPS "
851                            "IE");
852         else
853                 wpa_hexdump_buf(MSG_DEBUG, "test_driver: Probe Response WPS "
854                                 "IE", proberesp);
855
856         os_free(bss->wps_probe_resp_ie);
857
858         if (proberesp == NULL) {
859                 bss->wps_probe_resp_ie = NULL;
860                 bss->wps_probe_resp_ie_len = 0;
861         } else {
862                 bss->wps_probe_resp_ie = os_malloc(wpabuf_len(proberesp));
863                 if (bss->wps_probe_resp_ie == NULL) {
864                         bss->wps_probe_resp_ie_len = 0;
865                         return -1;
866                 }
867
868                 os_memcpy(bss->wps_probe_resp_ie, wpabuf_head(proberesp),
869                           wpabuf_len(proberesp));
870                 bss->wps_probe_resp_ie_len = wpabuf_len(proberesp);
871         }
872
873         return 0;
874 }
875
876
877 static int test_driver_sta_deauth(void *priv, const u8 *own_addr,
878                                   const u8 *addr, int reason)
879 {
880         struct wpa_driver_test_data *drv = priv;
881         struct test_client_socket *cli;
882
883         if (drv->test_socket < 0)
884                 return -1;
885
886         cli = drv->cli;
887         while (cli) {
888                 if (memcmp(cli->addr, addr, ETH_ALEN) == 0)
889                         break;
890                 cli = cli->next;
891         }
892
893         if (!cli)
894                 return -1;
895
896         return sendto(drv->test_socket, "DEAUTH", 6, 0,
897                       (struct sockaddr *) &cli->un, cli->unlen);
898 }
899
900
901 static int test_driver_sta_disassoc(void *priv, const u8 *own_addr,
902                                     const u8 *addr, int reason)
903 {
904         struct wpa_driver_test_data *drv = priv;
905         struct test_client_socket *cli;
906
907         if (drv->test_socket < 0)
908                 return -1;
909
910         cli = drv->cli;
911         while (cli) {
912                 if (memcmp(cli->addr, addr, ETH_ALEN) == 0)
913                         break;
914                 cli = cli->next;
915         }
916
917         if (!cli)
918                 return -1;
919
920         return sendto(drv->test_socket, "DISASSOC", 8, 0,
921                       (struct sockaddr *) &cli->un, cli->unlen);
922 }
923
924
925 static int test_driver_bss_add(void *priv, const char *ifname, const u8 *bssid,
926                                void *bss_ctx)
927 {
928         struct wpa_driver_test_data *drv = priv;
929         struct test_driver_bss *bss;
930
931         wpa_printf(MSG_DEBUG, "%s(ifname=%s bssid=" MACSTR ")",
932                    __func__, ifname, MAC2STR(bssid));
933
934         bss = os_zalloc(sizeof(*bss));
935         if (bss == NULL)
936                 return -1;
937
938         bss->bss_ctx = bss_ctx;
939         os_strlcpy(bss->ifname, ifname, IFNAMSIZ);
940         memcpy(bss->bssid, bssid, ETH_ALEN);
941
942         bss->next = drv->bss;
943         drv->bss = bss;
944         drv->global->bss_add_used = 1;
945         os_memcpy(drv->global->req_addr, bssid, ETH_ALEN);
946
947         return 0;
948 }
949
950
951 static int test_driver_bss_remove(void *priv, const char *ifname)
952 {
953         struct wpa_driver_test_data *drv = priv;
954         struct test_driver_bss *bss, *prev;
955         struct test_client_socket *cli, *prev_c;
956
957         wpa_printf(MSG_DEBUG, "%s(ifname=%s)", __func__, ifname);
958
959         for (prev = NULL, bss = drv->bss; bss; prev = bss, bss = bss->next) {
960                 if (strcmp(bss->ifname, ifname) != 0)
961                         continue;
962
963                 if (prev)
964                         prev->next = bss->next;
965                 else
966                         drv->bss = bss->next;
967
968                 for (prev_c = NULL, cli = drv->cli; cli;
969                      prev_c = cli, cli = cli->next) {
970                         if (cli->bss != bss)
971                                 continue;
972                         if (prev_c)
973                                 prev_c->next = cli->next;
974                         else
975                                 drv->cli = cli->next;
976                         os_free(cli);
977                         break;
978                 }
979
980                 test_driver_free_bss(bss);
981                 return 0;
982         }
983
984         return -1;
985 }
986
987
988 static int test_driver_if_add(const char *iface, void *priv,
989                               enum wpa_driver_if_type type, const char *ifname,
990                               const u8 *addr, void *bss_ctx)
991 {
992         wpa_printf(MSG_DEBUG, "%s(iface=%s type=%d ifname=%s bss_ctx=%p)",
993                    __func__, iface, type, ifname, bss_ctx);
994         if (type == WPA_IF_AP_BSS)
995                 return test_driver_bss_add(priv, ifname, addr, bss_ctx);
996         return 0;
997 }
998
999
1000 static int test_driver_if_remove(void *priv, enum wpa_driver_if_type type,
1001                                  const char *ifname)
1002 {
1003         wpa_printf(MSG_DEBUG, "%s(type=%d ifname=%s)", __func__, type, ifname);
1004         if (type == WPA_IF_AP_BSS)
1005                 return test_driver_bss_remove(priv, ifname);
1006         return 0;
1007 }
1008
1009
1010 static int test_driver_valid_bss_mask(void *priv, const u8 *addr,
1011                                       const u8 *mask)
1012 {
1013         return 0;
1014 }
1015
1016
1017 static int test_driver_set_ssid(const char *ifname, void *priv, const u8 *buf,
1018                                 int len)
1019 {
1020         struct wpa_driver_test_data *drv = priv;
1021         struct test_driver_bss *bss;
1022
1023         wpa_printf(MSG_DEBUG, "%s(ifname=%s)", __func__, ifname);
1024         wpa_hexdump_ascii(MSG_DEBUG, "test_driver_set_ssid: SSID", buf, len);
1025
1026         bss = test_driver_get_bss(drv, ifname);
1027         if (bss == NULL) {
1028                 wpa_printf(MSG_DEBUG, "%s(ifname=%s): failed to find BSS data",
1029                            __func__, ifname);
1030                 return -1;
1031         }
1032
1033         if (len < 0 || (size_t) len > sizeof(bss->ssid))
1034                 return -1;
1035
1036         os_memcpy(bss->ssid, buf, len);
1037         bss->ssid_len = len;
1038
1039         return 0;
1040 }
1041
1042
1043 static int test_driver_set_privacy(const char *ifname, void *priv, int enabled)
1044 {
1045         struct wpa_driver_test_data *drv = priv;
1046         struct test_driver_bss *bss;
1047
1048         wpa_printf(MSG_DEBUG, "%s(ifname=%s enabled=%d)",
1049                    __func__, ifname, enabled);
1050
1051         bss = test_driver_get_bss(drv, ifname);
1052         if (bss == NULL)
1053                 return -1;
1054
1055         bss->privacy = enabled;
1056
1057         return 0;
1058 }
1059
1060
1061 static int test_driver_set_sta_vlan(void *priv, const u8 *addr,
1062                                     const char *ifname, int vlan_id)
1063 {
1064         wpa_printf(MSG_DEBUG, "%s(addr=" MACSTR " ifname=%s vlan_id=%d)",
1065                    __func__, MAC2STR(addr), ifname, vlan_id);
1066         return 0;
1067 }
1068
1069
1070 static int test_driver_sta_add(const char *ifname, void *priv,
1071                                struct hostapd_sta_add_params *params)
1072 {
1073         struct wpa_driver_test_data *drv = priv;
1074         struct test_client_socket *cli;
1075         struct test_driver_bss *bss;
1076
1077         wpa_printf(MSG_DEBUG, "%s(ifname=%s addr=" MACSTR " aid=%d "
1078                    "capability=0x%x listen_interval=%d)",
1079                    __func__, ifname, MAC2STR(params->addr), params->aid,
1080                    params->capability, params->listen_interval);
1081         wpa_hexdump(MSG_DEBUG, "test_driver_sta_add - supp_rates",
1082                     params->supp_rates, params->supp_rates_len);
1083
1084         cli = drv->cli;
1085         while (cli) {
1086                 if (os_memcmp(cli->addr, params->addr, ETH_ALEN) == 0)
1087                         break;
1088                 cli = cli->next;
1089         }
1090         if (!cli) {
1091                 wpa_printf(MSG_DEBUG, "%s: no matching client entry",
1092                            __func__);
1093                 return -1;
1094         }
1095
1096         bss = test_driver_get_bss(drv, ifname);
1097         if (bss == NULL) {
1098                 wpa_printf(MSG_DEBUG, "%s: No matching interface found from "
1099                            "configured BSSes", __func__);
1100                 return -1;
1101         }
1102
1103         cli->bss = bss;
1104
1105         return 0;
1106 }
1107
1108
1109 static struct wpa_driver_test_data * test_alloc_data(void *ctx,
1110                                                      const char *ifname)
1111 {
1112         struct wpa_driver_test_data *drv;
1113
1114         drv = os_zalloc(sizeof(struct wpa_driver_test_data));
1115         if (drv == NULL) {
1116                 wpa_printf(MSG_ERROR, "Could not allocate memory for test "
1117                            "driver data");
1118                 return NULL;
1119         }
1120
1121         drv->ctx = ctx;
1122         wpa_trace_add_ref(drv, ctx, ctx);
1123         os_strlcpy(drv->ifname, ifname, IFNAMSIZ);
1124
1125         /* Generate a MAC address to help testing with multiple STAs */
1126         drv->own_addr[0] = 0x02; /* locally administered */
1127         sha1_prf((const u8 *) ifname, os_strlen(ifname),
1128                  "test mac addr generation",
1129                  NULL, 0, drv->own_addr + 1, ETH_ALEN - 1);
1130
1131         return drv;
1132 }
1133
1134
1135 static void * test_driver_init(struct hostapd_data *hapd,
1136                                struct wpa_init_params *params)
1137 {
1138         struct wpa_driver_test_data *drv;
1139         struct sockaddr_un addr_un;
1140         struct sockaddr_in addr_in;
1141         struct sockaddr *addr;
1142         socklen_t alen;
1143
1144         drv = test_alloc_data(hapd, params->ifname);
1145         if (drv == NULL)
1146                 return NULL;
1147         drv->ap = 1;
1148         drv->bss = os_zalloc(sizeof(*drv->bss));
1149         if (drv->bss == NULL) {
1150                 wpa_printf(MSG_ERROR, "Could not allocate memory for test "
1151                            "driver BSS data");
1152                 os_free(drv);
1153                 return NULL;
1154         }
1155
1156         drv->bss->bss_ctx = hapd;
1157         os_strlcpy(drv->bss->ifname, params->ifname, IFNAMSIZ);
1158         os_memcpy(drv->bss->bssid, drv->own_addr, ETH_ALEN);
1159         os_memcpy(params->own_addr, drv->own_addr, ETH_ALEN);
1160
1161         if (params->test_socket) {
1162                 if (os_strlen(params->test_socket) >=
1163                     sizeof(addr_un.sun_path)) {
1164                         printf("Too long test_socket path\n");
1165                         wpa_driver_test_deinit(drv);
1166                         return NULL;
1167                 }
1168                 if (strncmp(params->test_socket, "DIR:", 4) == 0) {
1169                         size_t len = strlen(params->test_socket) + 30;
1170                         drv->test_dir = os_strdup(params->test_socket + 4);
1171                         drv->own_socket_path = os_malloc(len);
1172                         if (drv->own_socket_path) {
1173                                 snprintf(drv->own_socket_path, len,
1174                                          "%s/AP-" MACSTR,
1175                                          params->test_socket + 4,
1176                                          MAC2STR(params->own_addr));
1177                         }
1178                 } else if (strncmp(params->test_socket, "UDP:", 4) == 0) {
1179                         drv->udp_port = atoi(params->test_socket + 4);
1180                 } else {
1181                         drv->own_socket_path = os_strdup(params->test_socket);
1182                 }
1183                 if (drv->own_socket_path == NULL && drv->udp_port == 0) {
1184                         wpa_driver_test_deinit(drv);
1185                         return NULL;
1186                 }
1187
1188                 drv->test_socket = socket(drv->udp_port ? PF_INET : PF_UNIX,
1189                                           SOCK_DGRAM, 0);
1190                 if (drv->test_socket < 0) {
1191                         perror("socket");
1192                         wpa_driver_test_deinit(drv);
1193                         return NULL;
1194                 }
1195
1196                 if (drv->udp_port) {
1197                         os_memset(&addr_in, 0, sizeof(addr_in));
1198                         addr_in.sin_family = AF_INET;
1199                         addr_in.sin_port = htons(drv->udp_port);
1200                         addr = (struct sockaddr *) &addr_in;
1201                         alen = sizeof(addr_in);
1202                 } else {
1203                         os_memset(&addr_un, 0, sizeof(addr_un));
1204                         addr_un.sun_family = AF_UNIX;
1205                         os_strlcpy(addr_un.sun_path, drv->own_socket_path,
1206                                    sizeof(addr_un.sun_path));
1207                         addr = (struct sockaddr *) &addr_un;
1208                         alen = sizeof(addr_un);
1209                 }
1210                 if (bind(drv->test_socket, addr, alen) < 0) {
1211                         perror("bind(PF_UNIX)");
1212                         close(drv->test_socket);
1213                         if (drv->own_socket_path)
1214                                 unlink(drv->own_socket_path);
1215                         wpa_driver_test_deinit(drv);
1216                         return NULL;
1217                 }
1218                 eloop_register_read_sock(drv->test_socket,
1219                                          test_driver_receive_unix, drv, NULL);
1220         } else
1221                 drv->test_socket = -1;
1222
1223         return drv;
1224 }
1225
1226
1227 static void wpa_driver_test_poll(void *eloop_ctx, void *timeout_ctx)
1228 {
1229         struct wpa_driver_test_data *drv = eloop_ctx;
1230
1231 #ifdef DRIVER_TEST_UNIX
1232         if (drv->associated && drv->hostapd_addr_set) {
1233                 struct stat st;
1234                 if (stat(drv->hostapd_addr.sun_path, &st) < 0) {
1235                         wpa_printf(MSG_DEBUG, "%s: lost connection to AP: %s",
1236                                    __func__, strerror(errno));
1237                         drv->associated = 0;
1238                         wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
1239                 }
1240         }
1241 #endif /* DRIVER_TEST_UNIX */
1242
1243         eloop_register_timeout(1, 0, wpa_driver_test_poll, drv, NULL);
1244 }
1245
1246
1247 static void wpa_driver_test_scan_timeout(void *eloop_ctx, void *timeout_ctx)
1248 {
1249         wpa_printf(MSG_DEBUG, "Scan timeout - try to get results");
1250         wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL);
1251 }
1252
1253
1254 #ifdef DRIVER_TEST_UNIX
1255 static void wpa_driver_scan_dir(struct wpa_driver_test_data *drv,
1256                                 const char *path)
1257 {
1258         struct dirent *dent;
1259         DIR *dir;
1260         struct sockaddr_un addr;
1261         char cmd[512], *pos, *end;
1262         int ret;
1263
1264         dir = opendir(path);
1265         if (dir == NULL)
1266                 return;
1267
1268         end = cmd + sizeof(cmd);
1269         pos = cmd;
1270         ret = os_snprintf(pos, end - pos, "SCAN " MACSTR,
1271                           MAC2STR(drv->own_addr));
1272         if (ret >= 0 && ret < end - pos)
1273                 pos += ret;
1274         if (drv->probe_req_ie) {
1275                 ret = os_snprintf(pos, end - pos, " ");
1276                 if (ret >= 0 && ret < end - pos)
1277                         pos += ret;
1278                 pos += wpa_snprintf_hex(pos, end - pos, drv->probe_req_ie,
1279                                         drv->probe_req_ie_len);
1280         }
1281         end[-1] = '\0';
1282
1283         while ((dent = readdir(dir))) {
1284                 if (os_strncmp(dent->d_name, "AP-", 3) != 0 &&
1285                     os_strncmp(dent->d_name, "STA-", 4) != 0)
1286                         continue;
1287                 if (drv->own_socket_path) {
1288                         size_t olen, dlen;
1289                         olen = os_strlen(drv->own_socket_path);
1290                         dlen = os_strlen(dent->d_name);
1291                         if (olen >= dlen &&
1292                             os_strcmp(dent->d_name,
1293                                       drv->own_socket_path + olen - dlen) == 0)
1294                                 continue;
1295                 }
1296                 wpa_printf(MSG_DEBUG, "%s: SCAN %s", __func__, dent->d_name);
1297
1298                 os_memset(&addr, 0, sizeof(addr));
1299                 addr.sun_family = AF_UNIX;
1300                 os_snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s",
1301                             path, dent->d_name);
1302
1303                 if (sendto(drv->test_socket, cmd, os_strlen(cmd), 0,
1304                            (struct sockaddr *) &addr, sizeof(addr)) < 0) {
1305                         perror("sendto(test_socket)");
1306                 }
1307         }
1308         closedir(dir);
1309 }
1310 #endif /* DRIVER_TEST_UNIX */
1311
1312
1313 static int wpa_driver_test_scan(void *priv,
1314                                 struct wpa_driver_scan_params *params)
1315 {
1316         struct wpa_driver_test_data *drv = priv;
1317         size_t i;
1318
1319         wpa_printf(MSG_DEBUG, "%s: priv=%p", __func__, priv);
1320
1321         os_free(drv->probe_req_ie);
1322         if (params->extra_ies) {
1323                 drv->probe_req_ie = os_malloc(params->extra_ies_len);
1324                 if (drv->probe_req_ie == NULL) {
1325                         drv->probe_req_ie_len = 0;
1326                         return -1;
1327                 }
1328                 os_memcpy(drv->probe_req_ie, params->extra_ies,
1329                           params->extra_ies_len);
1330                 drv->probe_req_ie_len = params->extra_ies_len;
1331         } else {
1332                 drv->probe_req_ie = NULL;
1333                 drv->probe_req_ie_len = 0;
1334         }
1335
1336         for (i = 0; i < params->num_ssids; i++)
1337                 wpa_hexdump(MSG_DEBUG, "Scan SSID",
1338                             params->ssids[i].ssid, params->ssids[i].ssid_len);
1339         wpa_hexdump(MSG_DEBUG, "Scan extra IE(s)",
1340                     params->extra_ies, params->extra_ies_len);
1341
1342         drv->num_scanres = 0;
1343
1344 #ifdef DRIVER_TEST_UNIX
1345         if (drv->test_socket >= 0 && drv->test_dir)
1346                 wpa_driver_scan_dir(drv, drv->test_dir);
1347
1348         if (drv->test_socket >= 0 && drv->hostapd_addr_set &&
1349             sendto(drv->test_socket, "SCAN", 4, 0,
1350                    (struct sockaddr *) &drv->hostapd_addr,
1351                    sizeof(drv->hostapd_addr)) < 0) {
1352                 perror("sendto(test_socket)");
1353         }
1354 #endif /* DRIVER_TEST_UNIX */
1355
1356         if (drv->test_socket >= 0 && drv->hostapd_addr_udp_set &&
1357             sendto(drv->test_socket, "SCAN", 4, 0,
1358                    (struct sockaddr *) &drv->hostapd_addr_udp,
1359                    sizeof(drv->hostapd_addr_udp)) < 0) {
1360                 perror("sendto(test_socket)");
1361         }
1362
1363         eloop_cancel_timeout(wpa_driver_test_scan_timeout, drv, drv->ctx);
1364         eloop_register_timeout(1, 0, wpa_driver_test_scan_timeout, drv,
1365                                drv->ctx);
1366         return 0;
1367 }
1368
1369
1370 static struct wpa_scan_results * wpa_driver_test_get_scan_results2(void *priv)
1371 {
1372         struct wpa_driver_test_data *drv = priv;
1373         struct wpa_scan_results *res;
1374         size_t i;
1375
1376         res = os_zalloc(sizeof(*res));
1377         if (res == NULL)
1378                 return NULL;
1379
1380         res->res = os_zalloc(drv->num_scanres * sizeof(struct wpa_scan_res *));
1381         if (res->res == NULL) {
1382                 os_free(res);
1383                 return NULL;
1384         }
1385
1386         for (i = 0; i < drv->num_scanres; i++) {
1387                 struct wpa_scan_res *r;
1388                 if (drv->scanres[i] == NULL)
1389                         continue;
1390                 r = os_malloc(sizeof(*r) + drv->scanres[i]->ie_len);
1391                 if (r == NULL)
1392                         break;
1393                 os_memcpy(r, drv->scanres[i],
1394                           sizeof(*r) + drv->scanres[i]->ie_len);
1395                 res->res[res->num++] = r;
1396         }
1397
1398         return res;
1399 }
1400
1401
1402 static int wpa_driver_test_set_key(const char *ifname, void *priv,
1403                                    enum wpa_alg alg, const u8 *addr,
1404                                    int key_idx, int set_tx,
1405                                    const u8 *seq, size_t seq_len,
1406                                    const u8 *key, size_t key_len)
1407 {
1408         wpa_printf(MSG_DEBUG, "%s: ifname=%s priv=%p alg=%d key_idx=%d "
1409                    "set_tx=%d",
1410                    __func__, ifname, priv, alg, key_idx, set_tx);
1411         if (addr)
1412                 wpa_printf(MSG_DEBUG, "   addr=" MACSTR, MAC2STR(addr));
1413         if (seq)
1414                 wpa_hexdump(MSG_DEBUG, "   seq", seq, seq_len);
1415         if (key)
1416                 wpa_hexdump_key(MSG_DEBUG, "   key", key, key_len);
1417         return 0;
1418 }
1419
1420
1421 static int wpa_driver_update_mode(struct wpa_driver_test_data *drv, int ap)
1422 {
1423         if (ap && !drv->ap) {
1424                 wpa_driver_test_close_test_socket(drv);
1425                 wpa_driver_test_attach(drv, drv->test_dir, 1);
1426                 drv->ap = 1;
1427         } else if (!ap && drv->ap) {
1428                 wpa_driver_test_close_test_socket(drv);
1429                 wpa_driver_test_attach(drv, drv->test_dir, 0);
1430                 drv->ap = 0;
1431         }
1432
1433         return 0;
1434 }
1435
1436
1437 static int wpa_driver_test_associate(
1438         void *priv, struct wpa_driver_associate_params *params)
1439 {
1440         struct wpa_driver_test_data *drv = priv;
1441         wpa_printf(MSG_DEBUG, "%s: priv=%p freq=%d pairwise_suite=%d "
1442                    "group_suite=%d key_mgmt_suite=%d auth_alg=%d mode=%d",
1443                    __func__, priv, params->freq, params->pairwise_suite,
1444                    params->group_suite, params->key_mgmt_suite,
1445                    params->auth_alg, params->mode);
1446         if (params->bssid) {
1447                 wpa_printf(MSG_DEBUG, "   bssid=" MACSTR,
1448                            MAC2STR(params->bssid));
1449         }
1450         if (params->ssid) {
1451                 wpa_hexdump_ascii(MSG_DEBUG, "   ssid",
1452                                   params->ssid, params->ssid_len);
1453         }
1454         if (params->wpa_ie) {
1455                 wpa_hexdump(MSG_DEBUG, "   wpa_ie",
1456                             params->wpa_ie, params->wpa_ie_len);
1457                 drv->assoc_wpa_ie_len = params->wpa_ie_len;
1458                 if (drv->assoc_wpa_ie_len > sizeof(drv->assoc_wpa_ie))
1459                         drv->assoc_wpa_ie_len = sizeof(drv->assoc_wpa_ie);
1460                 os_memcpy(drv->assoc_wpa_ie, params->wpa_ie,
1461                           drv->assoc_wpa_ie_len);
1462         } else
1463                 drv->assoc_wpa_ie_len = 0;
1464
1465         wpa_driver_update_mode(drv, params->mode == IEEE80211_MODE_AP);
1466
1467         drv->ibss = params->mode == IEEE80211_MODE_IBSS;
1468         drv->privacy = params->key_mgmt_suite &
1469                 (WPA_KEY_MGMT_IEEE8021X |
1470                  WPA_KEY_MGMT_PSK |
1471                  WPA_KEY_MGMT_WPA_NONE |
1472                  WPA_KEY_MGMT_FT_IEEE8021X |
1473                  WPA_KEY_MGMT_FT_PSK |
1474                  WPA_KEY_MGMT_IEEE8021X_SHA256 |
1475                  WPA_KEY_MGMT_PSK_SHA256);
1476         if (params->wep_key_len[params->wep_tx_keyidx])
1477                 drv->privacy = 1;
1478
1479 #ifdef DRIVER_TEST_UNIX
1480         if (drv->test_dir && params->bssid &&
1481             params->mode != IEEE80211_MODE_IBSS) {
1482                 os_memset(&drv->hostapd_addr, 0, sizeof(drv->hostapd_addr));
1483                 drv->hostapd_addr.sun_family = AF_UNIX;
1484                 os_snprintf(drv->hostapd_addr.sun_path,
1485                             sizeof(drv->hostapd_addr.sun_path),
1486                             "%s/AP-" MACSTR,
1487                             drv->test_dir, MAC2STR(params->bssid));
1488                 drv->hostapd_addr_set = 1;
1489         }
1490 #endif /* DRIVER_TEST_UNIX */
1491
1492         if (params->mode == IEEE80211_MODE_AP) {
1493                 struct test_driver_bss *bss;
1494                 os_memcpy(drv->ssid, params->ssid, params->ssid_len);
1495                 drv->ssid_len = params->ssid_len;
1496
1497                 test_driver_free_bsses(drv);
1498                 bss = drv->bss = os_zalloc(sizeof(*drv->bss));
1499                 if (bss == NULL)
1500                         return -1;
1501                 os_strlcpy(bss->ifname, drv->ifname, IFNAMSIZ);
1502                 os_memcpy(bss->bssid, drv->own_addr, ETH_ALEN);
1503                 os_memcpy(bss->ssid, params->ssid, params->ssid_len);
1504                 bss->ssid_len = params->ssid_len;
1505                 bss->privacy = drv->privacy;
1506                 if (params->wpa_ie && params->wpa_ie_len) {
1507                         bss->ie = os_malloc(params->wpa_ie_len);
1508                         if (bss->ie) {
1509                                 os_memcpy(bss->ie, params->wpa_ie,
1510                                           params->wpa_ie_len);
1511                                 bss->ielen = params->wpa_ie_len;
1512                         }
1513                 }
1514         } else if (drv->test_socket >= 0 &&
1515                    (drv->hostapd_addr_set || drv->hostapd_addr_udp_set)) {
1516                 char cmd[200], *pos, *end;
1517                 int ret;
1518                 end = cmd + sizeof(cmd);
1519                 pos = cmd;
1520                 ret = os_snprintf(pos, end - pos, "ASSOC " MACSTR " ",
1521                                   MAC2STR(drv->own_addr));
1522                 if (ret >= 0 && ret < end - pos)
1523                         pos += ret;
1524                 pos += wpa_snprintf_hex(pos, end - pos, params->ssid,
1525                                         params->ssid_len);
1526                 ret = os_snprintf(pos, end - pos, " ");
1527                 if (ret >= 0 && ret < end - pos)
1528                         pos += ret;
1529                 pos += wpa_snprintf_hex(pos, end - pos, params->wpa_ie,
1530                                         params->wpa_ie_len);
1531                 end[-1] = '\0';
1532 #ifdef DRIVER_TEST_UNIX
1533                 if (drv->hostapd_addr_set &&
1534                     sendto(drv->test_socket, cmd, os_strlen(cmd), 0,
1535                            (struct sockaddr *) &drv->hostapd_addr,
1536                            sizeof(drv->hostapd_addr)) < 0) {
1537                         perror("sendto(test_socket)");
1538                         return -1;
1539                 }
1540 #endif /* DRIVER_TEST_UNIX */
1541                 if (drv->hostapd_addr_udp_set &&
1542                     sendto(drv->test_socket, cmd, os_strlen(cmd), 0,
1543                            (struct sockaddr *) &drv->hostapd_addr_udp,
1544                            sizeof(drv->hostapd_addr_udp)) < 0) {
1545                         perror("sendto(test_socket)");
1546                         return -1;
1547                 }
1548
1549                 os_memcpy(drv->ssid, params->ssid, params->ssid_len);
1550                 drv->ssid_len = params->ssid_len;
1551         } else {
1552                 drv->associated = 1;
1553                 if (params->mode == IEEE80211_MODE_IBSS) {
1554                         os_memcpy(drv->ssid, params->ssid, params->ssid_len);
1555                         drv->ssid_len = params->ssid_len;
1556                         if (params->bssid)
1557                                 os_memcpy(drv->bssid, params->bssid, ETH_ALEN);
1558                         else {
1559                                 os_get_random(drv->bssid, ETH_ALEN);
1560                                 drv->bssid[0] &= ~0x01;
1561                                 drv->bssid[0] |= 0x02;
1562                         }
1563                 }
1564                 wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
1565         }
1566
1567         return 0;
1568 }
1569
1570
1571 static int wpa_driver_test_get_bssid(void *priv, u8 *bssid)
1572 {
1573         struct wpa_driver_test_data *drv = priv;
1574         os_memcpy(bssid, drv->bssid, ETH_ALEN);
1575         return 0;
1576 }
1577
1578
1579 static int wpa_driver_test_get_ssid(void *priv, u8 *ssid)
1580 {
1581         struct wpa_driver_test_data *drv = priv;
1582         os_memcpy(ssid, drv->ssid, 32);
1583         return drv->ssid_len;
1584 }
1585
1586
1587 static int wpa_driver_test_send_disassoc(struct wpa_driver_test_data *drv)
1588 {
1589 #ifdef DRIVER_TEST_UNIX
1590         if (drv->test_socket >= 0 &&
1591             sendto(drv->test_socket, "DISASSOC", 8, 0,
1592                    (struct sockaddr *) &drv->hostapd_addr,
1593                    sizeof(drv->hostapd_addr)) < 0) {
1594                 perror("sendto(test_socket)");
1595                 return -1;
1596         }
1597 #endif /* DRIVER_TEST_UNIX */
1598         if (drv->test_socket >= 0 && drv->hostapd_addr_udp_set &&
1599             sendto(drv->test_socket, "DISASSOC", 8, 0,
1600                    (struct sockaddr *) &drv->hostapd_addr_udp,
1601                    sizeof(drv->hostapd_addr_udp)) < 0) {
1602                 perror("sendto(test_socket)");
1603                 return -1;
1604         }
1605         return 0;
1606 }
1607
1608
1609 static int wpa_driver_test_deauthenticate(void *priv, const u8 *addr,
1610                                           int reason_code)
1611 {
1612         struct wpa_driver_test_data *drv = priv;
1613         wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d",
1614                    __func__, MAC2STR(addr), reason_code);
1615         os_memset(drv->bssid, 0, ETH_ALEN);
1616         drv->associated = 0;
1617         wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
1618         return wpa_driver_test_send_disassoc(drv);
1619 }
1620
1621
1622 static int wpa_driver_test_disassociate(void *priv, const u8 *addr,
1623                                         int reason_code)
1624 {
1625         struct wpa_driver_test_data *drv = priv;
1626         wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d",
1627                    __func__, MAC2STR(addr), reason_code);
1628         os_memset(drv->bssid, 0, ETH_ALEN);
1629         drv->associated = 0;
1630         wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
1631         return wpa_driver_test_send_disassoc(drv);
1632 }
1633
1634
1635 static void wpa_driver_test_scanresp(struct wpa_driver_test_data *drv,
1636                                      struct sockaddr *from,
1637                                      socklen_t fromlen,
1638                                      const char *data)
1639 {
1640         struct wpa_scan_res *res;
1641         const char *pos, *pos2;
1642         size_t len;
1643         u8 *ie_pos, *ie_start, *ie_end;
1644 #define MAX_IE_LEN 1000
1645
1646         wpa_printf(MSG_DEBUG, "test_driver: SCANRESP %s", data);
1647         if (drv->num_scanres >= MAX_SCAN_RESULTS) {
1648                 wpa_printf(MSG_DEBUG, "test_driver: No room for the new scan "
1649                            "result");
1650                 return;
1651         }
1652
1653         /* SCANRESP BSSID SSID IEs */
1654
1655         res = os_zalloc(sizeof(*res) + MAX_IE_LEN);
1656         if (res == NULL)
1657                 return;
1658         ie_start = ie_pos = (u8 *) (res + 1);
1659         ie_end = ie_pos + MAX_IE_LEN;
1660
1661         if (hwaddr_aton(data, res->bssid)) {
1662                 wpa_printf(MSG_DEBUG, "test_driver: invalid BSSID in scanres");
1663                 os_free(res);
1664                 return;
1665         }
1666
1667         pos = data + 17;
1668         while (*pos == ' ')
1669                 pos++;
1670         pos2 = os_strchr(pos, ' ');
1671         if (pos2 == NULL) {
1672                 wpa_printf(MSG_DEBUG, "test_driver: invalid SSID termination "
1673                            "in scanres");
1674                 os_free(res);
1675                 return;
1676         }
1677         len = (pos2 - pos) / 2;
1678         if (len > 32)
1679                 len = 32;
1680         /*
1681          * Generate SSID IE from the SSID field since this IE is not included
1682          * in the main IE field.
1683          */
1684         *ie_pos++ = WLAN_EID_SSID;
1685         *ie_pos++ = len;
1686         if (hexstr2bin(pos, ie_pos, len) < 0) {
1687                 wpa_printf(MSG_DEBUG, "test_driver: invalid SSID in scanres");
1688                 os_free(res);
1689                 return;
1690         }
1691         ie_pos += len;
1692
1693         pos = pos2 + 1;
1694         pos2 = os_strchr(pos, ' ');
1695         if (pos2 == NULL)
1696                 len = os_strlen(pos) / 2;
1697         else
1698                 len = (pos2 - pos) / 2;
1699         if ((int) len > ie_end - ie_pos)
1700                 len = ie_end - ie_pos;
1701         if (hexstr2bin(pos, ie_pos, len) < 0) {
1702                 wpa_printf(MSG_DEBUG, "test_driver: invalid IEs in scanres");
1703                 os_free(res);
1704                 return;
1705         }
1706         ie_pos += len;
1707         res->ie_len = ie_pos - ie_start;
1708
1709         if (pos2) {
1710                 pos = pos2 + 1;
1711                 while (*pos == ' ')
1712                         pos++;
1713                 if (os_strstr(pos, "PRIVACY"))
1714                         res->caps |= IEEE80211_CAP_PRIVACY;
1715                 if (os_strstr(pos, "IBSS"))
1716                         res->caps |= IEEE80211_CAP_IBSS;
1717         }
1718
1719         os_free(drv->scanres[drv->num_scanres]);
1720         drv->scanres[drv->num_scanres++] = res;
1721 }
1722
1723
1724 static void wpa_driver_test_assocresp(struct wpa_driver_test_data *drv,
1725                                       struct sockaddr *from,
1726                                       socklen_t fromlen,
1727                                       const char *data)
1728 {
1729         /* ASSOCRESP BSSID <res> */
1730         if (hwaddr_aton(data, drv->bssid)) {
1731                 wpa_printf(MSG_DEBUG, "test_driver: invalid BSSID in "
1732                            "assocresp");
1733         }
1734         if (drv->use_associnfo) {
1735                 union wpa_event_data event;
1736                 os_memset(&event, 0, sizeof(event));
1737                 event.assoc_info.req_ies = drv->assoc_wpa_ie;
1738                 event.assoc_info.req_ies_len = drv->assoc_wpa_ie_len;
1739                 wpa_supplicant_event(drv->ctx, EVENT_ASSOCINFO, &event);
1740         }
1741         drv->associated = 1;
1742         wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
1743 }
1744
1745
1746 static void wpa_driver_test_disassoc(struct wpa_driver_test_data *drv,
1747                                      struct sockaddr *from,
1748                                      socklen_t fromlen)
1749 {
1750         drv->associated = 0;
1751         wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
1752 }
1753
1754
1755 static void wpa_driver_test_eapol(struct wpa_driver_test_data *drv,
1756                                   struct sockaddr *from,
1757                                   socklen_t fromlen,
1758                                   const u8 *data, size_t data_len)
1759 {
1760         const u8 *src = drv->bssid;
1761
1762         if (data_len > 14) {
1763                 /* Skip Ethernet header */
1764                 src = data + ETH_ALEN;
1765                 data += 14;
1766                 data_len -= 14;
1767         }
1768 #ifndef HOSTAPD
1769         wpa_supplicant_rx_eapol(drv->ctx, src, data, data_len);
1770 #endif /* HOSTAPD */
1771 }
1772
1773
1774 static void wpa_driver_test_mlme(struct wpa_driver_test_data *drv,
1775                                  struct sockaddr *from,
1776                                  socklen_t fromlen,
1777                                  const u8 *data, size_t data_len)
1778 {
1779         union wpa_event_data event;
1780         os_memset(&event, 0, sizeof(event));
1781         event.mlme_rx.buf = data;
1782         event.mlme_rx.len = data_len;
1783         wpa_supplicant_event(drv->ctx, EVENT_MLME_RX, &event);
1784
1785         if (drv->probe_req_report && data_len >= 24) {
1786                 const struct ieee80211_mgmt *mgmt;
1787                 u16 fc;
1788
1789                 mgmt = (const struct ieee80211_mgmt *) data;
1790                 fc = le_to_host16(mgmt->frame_control);
1791                 if (WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT &&
1792                     WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_PROBE_REQ) {
1793                         os_memset(&event, 0, sizeof(event));
1794                         event.rx_probe_req.sa = mgmt->sa;
1795                         event.rx_probe_req.ie = mgmt->u.probe_req.variable;
1796                         event.rx_probe_req.ie_len =
1797                                 data_len - (mgmt->u.probe_req.variable - data);
1798                         wpa_supplicant_event(drv->ctx, EVENT_RX_PROBE_REQ,
1799                                              &event);
1800                 }
1801         }
1802 }
1803
1804
1805 static void wpa_driver_test_scan_cmd(struct wpa_driver_test_data *drv,
1806                                      struct sockaddr *from,
1807                                      socklen_t fromlen,
1808                                      const u8 *data, size_t data_len)
1809 {
1810         char buf[512], *pos, *end;
1811         int ret;
1812
1813         /* data: optional [ STA-addr | ' ' | IEs(hex) ] */
1814
1815         if (!drv->ibss)
1816                 return;
1817
1818         pos = buf;
1819         end = buf + sizeof(buf);
1820
1821         /* reply: SCANRESP BSSID SSID IEs */
1822         ret = snprintf(pos, end - pos, "SCANRESP " MACSTR " ",
1823                        MAC2STR(drv->bssid));
1824         if (ret < 0 || ret >= end - pos)
1825                 return;
1826         pos += ret;
1827         pos += wpa_snprintf_hex(pos, end - pos,
1828                                 drv->ssid, drv->ssid_len);
1829         ret = snprintf(pos, end - pos, " ");
1830         if (ret < 0 || ret >= end - pos)
1831                 return;
1832         pos += ret;
1833         pos += wpa_snprintf_hex(pos, end - pos, drv->assoc_wpa_ie,
1834                                 drv->assoc_wpa_ie_len);
1835
1836         if (drv->privacy) {
1837                 ret = snprintf(pos, end - pos, " PRIVACY");
1838                 if (ret < 0 || ret >= end - pos)
1839                         return;
1840                 pos += ret;
1841         }
1842
1843         ret = snprintf(pos, end - pos, " IBSS");
1844         if (ret < 0 || ret >= end - pos)
1845                 return;
1846         pos += ret;
1847
1848         sendto(drv->test_socket, buf, pos - buf, 0,
1849                (struct sockaddr *) from, fromlen);
1850 }
1851
1852
1853 static void wpa_driver_test_receive_unix(int sock, void *eloop_ctx,
1854                                          void *sock_ctx)
1855 {
1856         struct wpa_driver_test_data *drv = eloop_ctx;
1857         char *buf;
1858         int res;
1859         struct sockaddr_storage from;
1860         socklen_t fromlen = sizeof(from);
1861         const size_t buflen = 2000;
1862
1863         if (drv->ap) {
1864                 test_driver_receive_unix(sock, eloop_ctx, sock_ctx);
1865                 return;
1866         }
1867
1868         buf = os_malloc(buflen);
1869         if (buf == NULL)
1870                 return;
1871         res = recvfrom(sock, buf, buflen - 1, 0,
1872                        (struct sockaddr *) &from, &fromlen);
1873         if (res < 0) {
1874                 perror("recvfrom(test_socket)");
1875                 os_free(buf);
1876                 return;
1877         }
1878         buf[res] = '\0';
1879
1880         wpa_printf(MSG_DEBUG, "test_driver: received %u bytes", res);
1881
1882         if (os_strncmp(buf, "SCANRESP ", 9) == 0) {
1883                 wpa_driver_test_scanresp(drv, (struct sockaddr *) &from,
1884                                          fromlen, buf + 9);
1885         } else if (os_strncmp(buf, "ASSOCRESP ", 10) == 0) {
1886                 wpa_driver_test_assocresp(drv, (struct sockaddr *) &from,
1887                                           fromlen, buf + 10);
1888         } else if (os_strcmp(buf, "DISASSOC") == 0) {
1889                 wpa_driver_test_disassoc(drv, (struct sockaddr *) &from,
1890                                          fromlen);
1891         } else if (os_strcmp(buf, "DEAUTH") == 0) {
1892                 wpa_driver_test_disassoc(drv, (struct sockaddr *) &from,
1893                                          fromlen);
1894         } else if (os_strncmp(buf, "EAPOL ", 6) == 0) {
1895                 wpa_driver_test_eapol(drv, (struct sockaddr *) &from, fromlen,
1896                                       (const u8 *) buf + 6, res - 6);
1897         } else if (os_strncmp(buf, "MLME ", 5) == 0) {
1898                 wpa_driver_test_mlme(drv, (struct sockaddr *) &from, fromlen,
1899                                      (const u8 *) buf + 5, res - 5);
1900         } else if (os_strncmp(buf, "SCAN ", 5) == 0) {
1901                 wpa_driver_test_scan_cmd(drv, (struct sockaddr *) &from,
1902                                          fromlen,
1903                                          (const u8 *) buf + 5, res - 5);
1904         } else {
1905                 wpa_hexdump_ascii(MSG_DEBUG, "Unknown test_socket command",
1906                                   (u8 *) buf, res);
1907         }
1908         os_free(buf);
1909 }
1910
1911
1912 static void * wpa_driver_test_init2(void *ctx, const char *ifname,
1913                                     void *global_priv)
1914 {
1915         struct wpa_driver_test_data *drv;
1916         struct wpa_driver_test_global *global = global_priv;
1917
1918         drv = test_alloc_data(ctx, ifname);
1919         if (drv == NULL)
1920                 return NULL;
1921         drv->global = global_priv;
1922         drv->test_socket = -1;
1923
1924         /* Set dummy BSSID and SSID for testing. */
1925         drv->bssid[0] = 0x02;
1926         drv->bssid[1] = 0x00;
1927         drv->bssid[2] = 0x00;
1928         drv->bssid[3] = 0x00;
1929         drv->bssid[4] = 0x00;
1930         drv->bssid[5] = 0x01;
1931         os_memcpy(drv->ssid, "test", 5);
1932         drv->ssid_len = 4;
1933
1934         if (global->bss_add_used) {
1935                 os_memcpy(drv->own_addr, global->req_addr, ETH_ALEN);
1936                 global->bss_add_used = 0;
1937         }
1938
1939         eloop_register_timeout(1, 0, wpa_driver_test_poll, drv, NULL);
1940
1941         return drv;
1942 }
1943
1944
1945 static void wpa_driver_test_close_test_socket(struct wpa_driver_test_data *drv)
1946 {
1947         if (drv->test_socket >= 0) {
1948                 eloop_unregister_read_sock(drv->test_socket);
1949                 close(drv->test_socket);
1950                 drv->test_socket = -1;
1951         }
1952
1953         if (drv->own_socket_path) {
1954                 unlink(drv->own_socket_path);
1955                 os_free(drv->own_socket_path);
1956                 drv->own_socket_path = NULL;
1957         }
1958 }
1959
1960
1961 static void wpa_driver_test_deinit(void *priv)
1962 {
1963         struct wpa_driver_test_data *drv = priv;
1964         struct test_client_socket *cli, *prev;
1965         int i;
1966
1967         cli = drv->cli;
1968         while (cli) {
1969                 prev = cli;
1970                 cli = cli->next;
1971                 os_free(prev);
1972         }
1973
1974 #ifdef HOSTAPD
1975         /* There should be only one BSS remaining at this point. */
1976         if (drv->bss == NULL)
1977                 wpa_printf(MSG_ERROR, "%s: drv->bss == NULL", __func__);
1978         else if (drv->bss->next)
1979                 wpa_printf(MSG_ERROR, "%s: drv->bss->next != NULL", __func__);
1980 #endif /* HOSTAPD */
1981
1982         test_driver_free_bsses(drv);
1983
1984         wpa_driver_test_close_test_socket(drv);
1985         eloop_cancel_timeout(wpa_driver_test_scan_timeout, drv, drv->ctx);
1986         eloop_cancel_timeout(wpa_driver_test_poll, drv, NULL);
1987         os_free(drv->test_dir);
1988         for (i = 0; i < MAX_SCAN_RESULTS; i++)
1989                 os_free(drv->scanres[i]);
1990         os_free(drv->probe_req_ie);
1991         wpa_trace_remove_ref(drv, ctx, drv->ctx);
1992         os_free(drv);
1993 }
1994
1995
1996 static int wpa_driver_test_attach(struct wpa_driver_test_data *drv,
1997                                   const char *dir, int ap)
1998 {
1999 #ifdef DRIVER_TEST_UNIX
2000         static unsigned int counter = 0;
2001         struct sockaddr_un addr;
2002         size_t len;
2003
2004         os_free(drv->own_socket_path);
2005         if (dir) {
2006                 len = os_strlen(dir) + 30;
2007                 drv->own_socket_path = os_malloc(len);
2008                 if (drv->own_socket_path == NULL)
2009                         return -1;
2010                 os_snprintf(drv->own_socket_path, len, "%s/%s-" MACSTR,
2011                             dir, ap ? "AP" : "STA", MAC2STR(drv->own_addr));
2012         } else {
2013                 drv->own_socket_path = os_malloc(100);
2014                 if (drv->own_socket_path == NULL)
2015                         return -1;
2016                 os_snprintf(drv->own_socket_path, 100,
2017                             "/tmp/wpa_supplicant_test-%d-%d",
2018                             getpid(), counter++);
2019         }
2020
2021         drv->test_socket = socket(PF_UNIX, SOCK_DGRAM, 0);
2022         if (drv->test_socket < 0) {
2023                 perror("socket(PF_UNIX)");
2024                 os_free(drv->own_socket_path);
2025                 drv->own_socket_path = NULL;
2026                 return -1;
2027         }
2028
2029         os_memset(&addr, 0, sizeof(addr));
2030         addr.sun_family = AF_UNIX;
2031         os_strlcpy(addr.sun_path, drv->own_socket_path, sizeof(addr.sun_path));
2032         if (bind(drv->test_socket, (struct sockaddr *) &addr,
2033                  sizeof(addr)) < 0) {
2034                 perror("bind(PF_UNIX)");
2035                 close(drv->test_socket);
2036                 unlink(drv->own_socket_path);
2037                 os_free(drv->own_socket_path);
2038                 drv->own_socket_path = NULL;
2039                 return -1;
2040         }
2041
2042         eloop_register_read_sock(drv->test_socket,
2043                                  wpa_driver_test_receive_unix, drv, NULL);
2044
2045         return 0;
2046 #else /* DRIVER_TEST_UNIX */
2047         return -1;
2048 #endif /* DRIVER_TEST_UNIX */
2049 }
2050
2051
2052 static int wpa_driver_test_attach_udp(struct wpa_driver_test_data *drv,
2053                                       char *dst)
2054 {
2055         char *pos;
2056
2057         pos = os_strchr(dst, ':');
2058         if (pos == NULL)
2059                 return -1;
2060         *pos++ = '\0';
2061         wpa_printf(MSG_DEBUG, "%s: addr=%s port=%s", __func__, dst, pos);
2062
2063         drv->test_socket = socket(PF_INET, SOCK_DGRAM, 0);
2064         if (drv->test_socket < 0) {
2065                 perror("socket(PF_INET)");
2066                 return -1;
2067         }
2068
2069         os_memset(&drv->hostapd_addr_udp, 0, sizeof(drv->hostapd_addr_udp));
2070         drv->hostapd_addr_udp.sin_family = AF_INET;
2071 #if defined(CONFIG_NATIVE_WINDOWS) || defined(CONFIG_ANSI_C_EXTRA)
2072         {
2073                 int a[4];
2074                 u8 *pos;
2075                 sscanf(dst, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]);
2076                 pos = (u8 *) &drv->hostapd_addr_udp.sin_addr;
2077                 *pos++ = a[0];
2078                 *pos++ = a[1];
2079                 *pos++ = a[2];
2080                 *pos++ = a[3];
2081         }
2082 #else /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */
2083         inet_aton(dst, &drv->hostapd_addr_udp.sin_addr);
2084 #endif /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */
2085         drv->hostapd_addr_udp.sin_port = htons(atoi(pos));
2086
2087         drv->hostapd_addr_udp_set = 1;
2088
2089         eloop_register_read_sock(drv->test_socket,
2090                                  wpa_driver_test_receive_unix, drv, NULL);
2091
2092         return 0;
2093 }
2094
2095
2096 static int wpa_driver_test_set_param(void *priv, const char *param)
2097 {
2098         struct wpa_driver_test_data *drv = priv;
2099         const char *pos;
2100
2101         wpa_printf(MSG_DEBUG, "%s: param='%s'", __func__, param);
2102         if (param == NULL)
2103                 return 0;
2104
2105         wpa_driver_test_close_test_socket(drv);
2106
2107 #ifdef DRIVER_TEST_UNIX
2108         pos = os_strstr(param, "test_socket=");
2109         if (pos) {
2110                 const char *pos2;
2111                 size_t len;
2112
2113                 pos += 12;
2114                 pos2 = os_strchr(pos, ' ');
2115                 if (pos2)
2116                         len = pos2 - pos;
2117                 else
2118                         len = os_strlen(pos);
2119                 if (len > sizeof(drv->hostapd_addr.sun_path))
2120                         return -1;
2121                 os_memset(&drv->hostapd_addr, 0, sizeof(drv->hostapd_addr));
2122                 drv->hostapd_addr.sun_family = AF_UNIX;
2123                 os_memcpy(drv->hostapd_addr.sun_path, pos, len);
2124                 drv->hostapd_addr_set = 1;
2125         }
2126 #endif /* DRIVER_TEST_UNIX */
2127
2128         pos = os_strstr(param, "test_dir=");
2129         if (pos) {
2130                 char *end;
2131                 os_free(drv->test_dir);
2132                 drv->test_dir = os_strdup(pos + 9);
2133                 if (drv->test_dir == NULL)
2134                         return -1;
2135                 end = os_strchr(drv->test_dir, ' ');
2136                 if (end)
2137                         *end = '\0';
2138                 if (wpa_driver_test_attach(drv, drv->test_dir, 0))
2139                         return -1;
2140         } else {
2141                 pos = os_strstr(param, "test_udp=");
2142                 if (pos) {
2143                         char *dst, *epos;
2144                         dst = os_strdup(pos + 9);
2145                         if (dst == NULL)
2146                                 return -1;
2147                         epos = os_strchr(dst, ' ');
2148                         if (epos)
2149                                 *epos = '\0';
2150                         if (wpa_driver_test_attach_udp(drv, dst))
2151                                 return -1;
2152                         os_free(dst);
2153                 } else if (wpa_driver_test_attach(drv, NULL, 0))
2154                         return -1;
2155         }
2156
2157         if (os_strstr(param, "use_associnfo=1")) {
2158                 wpa_printf(MSG_DEBUG, "test_driver: Use AssocInfo events");
2159                 drv->use_associnfo = 1;
2160         }
2161
2162 #ifdef CONFIG_CLIENT_MLME
2163         if (os_strstr(param, "use_mlme=1")) {
2164                 wpa_printf(MSG_DEBUG, "test_driver: Use internal MLME");
2165                 drv->use_mlme = 1;
2166         }
2167 #endif /* CONFIG_CLIENT_MLME */
2168
2169         return 0;
2170 }
2171
2172
2173 static const u8 * wpa_driver_test_get_mac_addr(void *priv)
2174 {
2175         struct wpa_driver_test_data *drv = priv;
2176         wpa_printf(MSG_DEBUG, "%s", __func__);
2177         return drv->own_addr;
2178 }
2179
2180
2181 static int wpa_driver_test_send_eapol(void *priv, const u8 *dest, u16 proto,
2182                                       const u8 *data, size_t data_len)
2183 {
2184         struct wpa_driver_test_data *drv = priv;
2185         char *msg;
2186         size_t msg_len;
2187         struct l2_ethhdr eth;
2188         struct sockaddr *addr;
2189         socklen_t alen;
2190 #ifdef DRIVER_TEST_UNIX
2191         struct sockaddr_un addr_un;
2192 #endif /* DRIVER_TEST_UNIX */
2193
2194         wpa_hexdump(MSG_MSGDUMP, "test_send_eapol TX frame", data, data_len);
2195
2196         os_memset(&eth, 0, sizeof(eth));
2197         os_memcpy(eth.h_dest, dest, ETH_ALEN);
2198         os_memcpy(eth.h_source, drv->own_addr, ETH_ALEN);
2199         eth.h_proto = host_to_be16(proto);
2200
2201         msg_len = 6 + sizeof(eth) + data_len;
2202         msg = os_malloc(msg_len);
2203         if (msg == NULL)
2204                 return -1;
2205         os_memcpy(msg, "EAPOL ", 6);
2206         os_memcpy(msg + 6, &eth, sizeof(eth));
2207         os_memcpy(msg + 6 + sizeof(eth), data, data_len);
2208
2209         if (os_memcmp(dest, drv->bssid, ETH_ALEN) == 0 ||
2210             drv->test_dir == NULL) {
2211                 if (drv->hostapd_addr_udp_set) {
2212                         addr = (struct sockaddr *) &drv->hostapd_addr_udp;
2213                         alen = sizeof(drv->hostapd_addr_udp);
2214                 } else {
2215 #ifdef DRIVER_TEST_UNIX
2216                         addr = (struct sockaddr *) &drv->hostapd_addr;
2217                         alen = sizeof(drv->hostapd_addr);
2218 #else /* DRIVER_TEST_UNIX */
2219                         os_free(msg);
2220                         return -1;
2221 #endif /* DRIVER_TEST_UNIX */
2222                 }
2223         } else {
2224 #ifdef DRIVER_TEST_UNIX
2225                 struct stat st;
2226                 os_memset(&addr_un, 0, sizeof(addr_un));
2227                 addr_un.sun_family = AF_UNIX;
2228                 os_snprintf(addr_un.sun_path, sizeof(addr_un.sun_path),
2229                             "%s/STA-" MACSTR, drv->test_dir, MAC2STR(dest));
2230                 if (stat(addr_un.sun_path, &st) < 0) {
2231                         os_snprintf(addr_un.sun_path, sizeof(addr_un.sun_path),
2232                                     "%s/AP-" MACSTR,
2233                                     drv->test_dir, MAC2STR(dest));
2234                 }
2235                 addr = (struct sockaddr *) &addr_un;
2236                 alen = sizeof(addr_un);
2237 #else /* DRIVER_TEST_UNIX */
2238                 os_free(msg);
2239                 return -1;
2240 #endif /* DRIVER_TEST_UNIX */
2241         }
2242
2243         if (sendto(drv->test_socket, msg, msg_len, 0, addr, alen) < 0) {
2244                 perror("sendmsg(test_socket)");
2245                 os_free(msg);
2246                 return -1;
2247         }
2248
2249         os_free(msg);
2250         return 0;
2251 }
2252
2253
2254 static int wpa_driver_test_get_capa(void *priv, struct wpa_driver_capa *capa)
2255 {
2256         struct wpa_driver_test_data *drv = priv;
2257         os_memset(capa, 0, sizeof(*capa));
2258         capa->key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA |
2259                 WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
2260                 WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
2261                 WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK |
2262                 WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE |
2263                 WPA_DRIVER_CAPA_KEY_MGMT_FT |
2264                 WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK;
2265         capa->enc = WPA_DRIVER_CAPA_ENC_WEP40 |
2266                 WPA_DRIVER_CAPA_ENC_WEP104 |
2267                 WPA_DRIVER_CAPA_ENC_TKIP |
2268                 WPA_DRIVER_CAPA_ENC_CCMP;
2269         capa->auth = WPA_DRIVER_AUTH_OPEN |
2270                 WPA_DRIVER_AUTH_SHARED |
2271                 WPA_DRIVER_AUTH_LEAP;
2272         if (drv->use_mlme)
2273                 capa->flags |= WPA_DRIVER_FLAGS_USER_SPACE_MLME;
2274         capa->flags |= WPA_DRIVER_FLAGS_AP;
2275         capa->max_scan_ssids = 2;
2276
2277         return 0;
2278 }
2279
2280
2281 static int wpa_driver_test_mlme_setprotection(void *priv, const u8 *addr,
2282                                               int protect_type,
2283                                               int key_type)
2284 {
2285         wpa_printf(MSG_DEBUG, "%s: protect_type=%d key_type=%d",
2286                    __func__, protect_type, key_type);
2287
2288         if (addr) {
2289                 wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR,
2290                            __func__, MAC2STR(addr));
2291         }
2292
2293         return 0;
2294 }
2295
2296
2297 static int wpa_driver_test_set_channel(void *priv,
2298                                        enum hostapd_hw_mode phymode,
2299                                        int chan, int freq)
2300 {
2301         wpa_printf(MSG_DEBUG, "%s: phymode=%d chan=%d freq=%d",
2302                    __func__, phymode, chan, freq);
2303         return 0;
2304 }
2305
2306
2307 static int wpa_driver_test_mlme_add_sta(void *priv, const u8 *addr,
2308                                         const u8 *supp_rates,
2309                                         size_t supp_rates_len)
2310 {
2311         wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR, __func__, MAC2STR(addr));
2312         return 0;
2313 }
2314
2315
2316 static int wpa_driver_test_mlme_remove_sta(void *priv, const u8 *addr)
2317 {
2318         wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR, __func__, MAC2STR(addr));
2319         return 0;
2320 }
2321
2322
2323 static int wpa_driver_test_set_ssid(void *priv, const u8 *ssid,
2324                                     size_t ssid_len)
2325 {
2326         wpa_printf(MSG_DEBUG, "%s", __func__);
2327         return 0;
2328 }
2329
2330
2331 static int wpa_driver_test_set_bssid(void *priv, const u8 *bssid)
2332 {
2333         wpa_printf(MSG_DEBUG, "%s: bssid=" MACSTR, __func__, MAC2STR(bssid));
2334         return 0;
2335 }
2336
2337
2338 static void * wpa_driver_test_global_init(void)
2339 {
2340         struct wpa_driver_test_global *global;
2341
2342         global = os_zalloc(sizeof(*global));
2343         return global;
2344 }
2345
2346
2347 static void wpa_driver_test_global_deinit(void *priv)
2348 {
2349         struct wpa_driver_test_global *global = priv;
2350         os_free(global);
2351 }
2352
2353
2354 static struct wpa_interface_info *
2355 wpa_driver_test_get_interfaces(void *global_priv)
2356 {
2357         /* struct wpa_driver_test_global *global = priv; */
2358         struct wpa_interface_info *iface;
2359
2360         iface = os_zalloc(sizeof(*iface));
2361         if (iface == NULL)
2362                 return iface;
2363         iface->ifname = os_strdup("sta0");
2364         iface->desc = os_strdup("test interface 0");
2365         iface->drv_name = "test";
2366         iface->next = os_zalloc(sizeof(*iface));
2367         if (iface->next) {
2368                 iface->next->ifname = os_strdup("sta1");
2369                 iface->next->desc = os_strdup("test interface 1");
2370                 iface->next->drv_name = "test";
2371         }
2372
2373         return iface;
2374 }
2375
2376
2377 static struct hostapd_hw_modes *
2378 wpa_driver_test_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags)
2379 {
2380         struct hostapd_hw_modes *modes;
2381         size_t i;
2382
2383         *num_modes = 3;
2384         *flags = 0;
2385         modes = os_zalloc(*num_modes * sizeof(struct hostapd_hw_modes));
2386         if (modes == NULL)
2387                 return NULL;
2388         modes[0].mode = HOSTAPD_MODE_IEEE80211G;
2389         modes[0].num_channels = 11;
2390         modes[0].num_rates = 12;
2391         modes[0].channels =
2392                 os_zalloc(11 * sizeof(struct hostapd_channel_data));
2393         modes[0].rates = os_zalloc(modes[0].num_rates * sizeof(int));
2394         if (modes[0].channels == NULL || modes[0].rates == NULL)
2395                 goto fail;
2396         for (i = 0; i < 11; i++) {
2397                 modes[0].channels[i].chan = i + 1;
2398                 modes[0].channels[i].freq = 2412 + 5 * i;
2399                 modes[0].channels[i].flag = 0;
2400         }
2401         modes[0].rates[0] = 10;
2402         modes[0].rates[1] = 20;
2403         modes[0].rates[2] = 55;
2404         modes[0].rates[3] = 110;
2405         modes[0].rates[4] = 60;
2406         modes[0].rates[5] = 90;
2407         modes[0].rates[6] = 120;
2408         modes[0].rates[7] = 180;
2409         modes[0].rates[8] = 240;
2410         modes[0].rates[9] = 360;
2411         modes[0].rates[10] = 480;
2412         modes[0].rates[11] = 540;
2413
2414         modes[1].mode = HOSTAPD_MODE_IEEE80211B;
2415         modes[1].num_channels = 11;
2416         modes[1].num_rates = 4;
2417         modes[1].channels =
2418                 os_zalloc(11 * sizeof(struct hostapd_channel_data));
2419         modes[1].rates = os_zalloc(modes[1].num_rates * sizeof(int));
2420         if (modes[1].channels == NULL || modes[1].rates == NULL)
2421                 goto fail;
2422         for (i = 0; i < 11; i++) {
2423                 modes[1].channels[i].chan = i + 1;
2424                 modes[1].channels[i].freq = 2412 + 5 * i;
2425                 modes[1].channels[i].flag = 0;
2426         }
2427         modes[1].rates[0] = 10;
2428         modes[1].rates[1] = 20;
2429         modes[1].rates[2] = 55;
2430         modes[1].rates[3] = 110;
2431
2432         modes[2].mode = HOSTAPD_MODE_IEEE80211A;
2433         modes[2].num_channels = 1;
2434         modes[2].num_rates = 8;
2435         modes[2].channels = os_zalloc(sizeof(struct hostapd_channel_data));
2436         modes[2].rates = os_zalloc(modes[2].num_rates * sizeof(int));
2437         if (modes[2].channels == NULL || modes[2].rates == NULL)
2438                 goto fail;
2439         modes[2].channels[0].chan = 60;
2440         modes[2].channels[0].freq = 5300;
2441         modes[2].channels[0].flag = 0;
2442         modes[2].rates[0] = 60;
2443         modes[2].rates[1] = 90;
2444         modes[2].rates[2] = 120;
2445         modes[2].rates[3] = 180;
2446         modes[2].rates[4] = 240;
2447         modes[2].rates[5] = 360;
2448         modes[2].rates[6] = 480;
2449         modes[2].rates[7] = 540;
2450
2451         return modes;
2452
2453 fail:
2454         if (modes) {
2455                 for (i = 0; i < *num_modes; i++) {
2456                         os_free(modes[i].channels);
2457                         os_free(modes[i].rates);
2458                 }
2459                 os_free(modes);
2460         }
2461         return NULL;
2462 }
2463
2464
2465 static int wpa_driver_test_probe_req_report(void *priv, int report)
2466 {
2467         struct wpa_driver_test_data *drv = priv;
2468         wpa_printf(MSG_DEBUG, "%s(report=%d)", __func__, report);
2469         drv->probe_req_report = report;
2470         return 0;
2471 }
2472
2473
2474 const struct wpa_driver_ops wpa_driver_test_ops = {
2475         "test",
2476         "wpa_supplicant test driver",
2477         .hapd_init = test_driver_init,
2478         .hapd_deinit = wpa_driver_test_deinit,
2479         .hapd_send_eapol = test_driver_send_eapol,
2480         .send_mlme = wpa_driver_test_send_mlme,
2481         .set_generic_elem = test_driver_set_generic_elem,
2482         .sta_deauth = test_driver_sta_deauth,
2483         .sta_disassoc = test_driver_sta_disassoc,
2484         .get_hw_feature_data = wpa_driver_test_get_hw_feature_data,
2485         .if_add = test_driver_if_add,
2486         .if_remove = test_driver_if_remove,
2487         .valid_bss_mask = test_driver_valid_bss_mask,
2488         .hapd_set_ssid = test_driver_set_ssid,
2489         .set_privacy = test_driver_set_privacy,
2490         .set_sta_vlan = test_driver_set_sta_vlan,
2491         .sta_add = test_driver_sta_add,
2492         .send_ether = test_driver_send_ether,
2493         .set_ap_wps_ie = test_driver_set_ap_wps_ie,
2494         .get_bssid = wpa_driver_test_get_bssid,
2495         .get_ssid = wpa_driver_test_get_ssid,
2496         .set_key = wpa_driver_test_set_key,
2497         .deinit = wpa_driver_test_deinit,
2498         .set_param = wpa_driver_test_set_param,
2499         .deauthenticate = wpa_driver_test_deauthenticate,
2500         .disassociate = wpa_driver_test_disassociate,
2501         .associate = wpa_driver_test_associate,
2502         .get_capa = wpa_driver_test_get_capa,
2503         .get_mac_addr = wpa_driver_test_get_mac_addr,
2504         .send_eapol = wpa_driver_test_send_eapol,
2505         .mlme_setprotection = wpa_driver_test_mlme_setprotection,
2506         .set_channel = wpa_driver_test_set_channel,
2507         .set_ssid = wpa_driver_test_set_ssid,
2508         .set_bssid = wpa_driver_test_set_bssid,
2509         .mlme_add_sta = wpa_driver_test_mlme_add_sta,
2510         .mlme_remove_sta = wpa_driver_test_mlme_remove_sta,
2511         .get_scan_results2 = wpa_driver_test_get_scan_results2,
2512         .global_init = wpa_driver_test_global_init,
2513         .global_deinit = wpa_driver_test_global_deinit,
2514         .init2 = wpa_driver_test_init2,
2515         .get_interfaces = wpa_driver_test_get_interfaces,
2516         .scan2 = wpa_driver_test_scan,
2517         .probe_req_report = wpa_driver_test_probe_req_report,
2518 };