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