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