• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Testing driver interface for a simulated network driver
3  * Copyright (c) 2004-2010, Jouni Malinen <j@w1.fi>
4  *
5  * This software may be distributed under the terms of the BSD license.
6  * See README for more details.
7  */
8 
9 /* Make sure we get winsock2.h for Windows build to get sockaddr_storage */
10 #include "build_config.h"
11 #ifdef CONFIG_NATIVE_WINDOWS
12 #include <winsock2.h>
13 #endif /* CONFIG_NATIVE_WINDOWS */
14 
15 #include "utils/includes.h"
16 
17 #ifndef CONFIG_NATIVE_WINDOWS
18 #include <sys/un.h>
19 #include <dirent.h>
20 #include <sys/stat.h>
21 #define DRIVER_TEST_UNIX
22 #endif /* CONFIG_NATIVE_WINDOWS */
23 
24 #include "utils/common.h"
25 #include "utils/eloop.h"
26 #include "utils/list.h"
27 #include "utils/trace.h"
28 #include "common/ieee802_11_defs.h"
29 #include "crypto/sha1.h"
30 #include "l2_packet/l2_packet.h"
31 #include "p2p/p2p.h"
32 #include "wps/wps.h"
33 #include "driver.h"
34 
35 
36 struct test_client_socket {
37 	struct test_client_socket *next;
38 	u8 addr[ETH_ALEN];
39 	struct sockaddr_un un;
40 	socklen_t unlen;
41 	struct test_driver_bss *bss;
42 };
43 
44 struct test_driver_bss {
45 	struct wpa_driver_test_data *drv;
46 	struct dl_list list;
47 	void *bss_ctx;
48 	char ifname[IFNAMSIZ];
49 	u8 bssid[ETH_ALEN];
50 	u8 *ie;
51 	size_t ielen;
52 	u8 *wps_beacon_ie;
53 	size_t wps_beacon_ie_len;
54 	u8 *wps_probe_resp_ie;
55 	size_t wps_probe_resp_ie_len;
56 	u8 ssid[32];
57 	size_t ssid_len;
58 	int privacy;
59 };
60 
61 struct wpa_driver_test_global {
62 	int bss_add_used;
63 	u8 req_addr[ETH_ALEN];
64 };
65 
66 struct wpa_driver_test_data {
67 	struct wpa_driver_test_global *global;
68 	void *ctx;
69 	WPA_TRACE_REF(ctx);
70 	u8 own_addr[ETH_ALEN];
71 	int test_socket;
72 #ifdef DRIVER_TEST_UNIX
73 	struct sockaddr_un hostapd_addr;
74 #endif /* DRIVER_TEST_UNIX */
75 	int hostapd_addr_set;
76 	struct sockaddr_in hostapd_addr_udp;
77 	int hostapd_addr_udp_set;
78 	char *own_socket_path;
79 	char *test_dir;
80 #define MAX_SCAN_RESULTS 30
81 	struct wpa_scan_res *scanres[MAX_SCAN_RESULTS];
82 	size_t num_scanres;
83 	int use_associnfo;
84 	u8 assoc_wpa_ie[80];
85 	size_t assoc_wpa_ie_len;
86 	int associated;
87 	u8 *probe_req_ie;
88 	size_t probe_req_ie_len;
89 	u8 probe_req_ssid[32];
90 	size_t probe_req_ssid_len;
91 	int ibss;
92 	int ap;
93 
94 	struct test_client_socket *cli;
95 	struct dl_list bss;
96 	int udp_port;
97 
98 	int alloc_iface_idx;
99 
100 	int probe_req_report;
101 	unsigned int remain_on_channel_freq;
102 	unsigned int remain_on_channel_duration;
103 
104 	int current_freq;
105 
106 	struct p2p_data *p2p;
107 	unsigned int off_channel_freq;
108 	struct wpabuf *pending_action_tx;
109 	u8 pending_action_src[ETH_ALEN];
110 	u8 pending_action_dst[ETH_ALEN];
111 	u8 pending_action_bssid[ETH_ALEN];
112 	unsigned int pending_action_freq;
113 	unsigned int pending_action_no_cck;
114 	unsigned int pending_listen_freq;
115 	unsigned int pending_listen_duration;
116 	int pending_p2p_scan;
117 	struct sockaddr *probe_from;
118 	socklen_t probe_from_len;
119 };
120 
121 
122 static void wpa_driver_test_deinit(void *priv);
123 static int wpa_driver_test_attach(struct wpa_driver_test_data *drv,
124 				  const char *dir, int ap);
125 static void wpa_driver_test_close_test_socket(
126 	struct wpa_driver_test_data *drv);
127 static void test_remain_on_channel_timeout(void *eloop_ctx, void *timeout_ctx);
128 static int wpa_driver_test_init_p2p(struct wpa_driver_test_data *drv);
129 
130 
test_driver_free_bss(struct test_driver_bss * bss)131 static void test_driver_free_bss(struct test_driver_bss *bss)
132 {
133 	os_free(bss->ie);
134 	os_free(bss->wps_beacon_ie);
135 	os_free(bss->wps_probe_resp_ie);
136 	os_free(bss);
137 }
138 
139 
test_driver_free_bsses(struct wpa_driver_test_data * drv)140 static void test_driver_free_bsses(struct wpa_driver_test_data *drv)
141 {
142 	struct test_driver_bss *bss, *tmp;
143 
144 	dl_list_for_each_safe(bss, tmp, &drv->bss, struct test_driver_bss,
145 			      list) {
146 		dl_list_del(&bss->list);
147 		test_driver_free_bss(bss);
148 	}
149 }
150 
151 
152 static struct test_client_socket *
test_driver_get_cli(struct wpa_driver_test_data * drv,struct sockaddr_un * from,socklen_t fromlen)153 test_driver_get_cli(struct wpa_driver_test_data *drv, struct sockaddr_un *from,
154 		    socklen_t fromlen)
155 {
156 	struct test_client_socket *cli = drv->cli;
157 
158 	while (cli) {
159 		if (cli->unlen == fromlen &&
160 		    strncmp(cli->un.sun_path, from->sun_path,
161 			    fromlen - sizeof(cli->un.sun_family)) == 0)
162 			return cli;
163 		cli = cli->next;
164 	}
165 
166 	return NULL;
167 }
168 
169 
test_driver_send_eapol(void * priv,const u8 * addr,const u8 * data,size_t data_len,int encrypt,const u8 * own_addr,u32 flags)170 static int test_driver_send_eapol(void *priv, const u8 *addr, const u8 *data,
171 				  size_t data_len, int encrypt,
172 				  const u8 *own_addr, u32 flags)
173 {
174 	struct test_driver_bss *dbss = priv;
175 	struct wpa_driver_test_data *drv = dbss->drv;
176 	struct test_client_socket *cli;
177 	struct msghdr msg;
178 	struct iovec io[3];
179 	struct l2_ethhdr eth;
180 
181 	if (drv->test_socket < 0)
182 		return -1;
183 
184 	cli = drv->cli;
185 	while (cli) {
186 		if (memcmp(cli->addr, addr, ETH_ALEN) == 0)
187 			break;
188 		cli = cli->next;
189 	}
190 
191 	if (!cli) {
192 		wpa_printf(MSG_DEBUG, "%s: no destination client entry",
193 			   __func__);
194 		return -1;
195 	}
196 
197 	memcpy(eth.h_dest, addr, ETH_ALEN);
198 	memcpy(eth.h_source, own_addr, ETH_ALEN);
199 	eth.h_proto = host_to_be16(ETH_P_EAPOL);
200 
201 	io[0].iov_base = "EAPOL ";
202 	io[0].iov_len = 6;
203 	io[1].iov_base = &eth;
204 	io[1].iov_len = sizeof(eth);
205 	io[2].iov_base = (u8 *) data;
206 	io[2].iov_len = data_len;
207 
208 	memset(&msg, 0, sizeof(msg));
209 	msg.msg_iov = io;
210 	msg.msg_iovlen = 3;
211 	msg.msg_name = &cli->un;
212 	msg.msg_namelen = cli->unlen;
213 	return sendmsg(drv->test_socket, &msg, 0);
214 }
215 
216 
test_driver_send_ether(void * priv,const u8 * dst,const u8 * src,u16 proto,const u8 * data,size_t data_len)217 static int test_driver_send_ether(void *priv, const u8 *dst, const u8 *src,
218 				  u16 proto, const u8 *data, size_t data_len)
219 {
220 	struct test_driver_bss *dbss = priv;
221 	struct wpa_driver_test_data *drv = dbss->drv;
222 	struct msghdr msg;
223 	struct iovec io[3];
224 	struct l2_ethhdr eth;
225 	char desttxt[30];
226 	struct sockaddr_un addr;
227 	struct dirent *dent;
228 	DIR *dir;
229 	int ret = 0, broadcast = 0, count = 0;
230 
231 	if (drv->test_socket < 0 || drv->test_dir == NULL) {
232 		wpa_printf(MSG_DEBUG, "%s: invalid parameters (sock=%d "
233 			   "test_dir=%p)",
234 			   __func__, drv->test_socket, drv->test_dir);
235 		return -1;
236 	}
237 
238 	broadcast = memcmp(dst, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0;
239 	snprintf(desttxt, sizeof(desttxt), MACSTR, MAC2STR(dst));
240 
241 	memcpy(eth.h_dest, dst, ETH_ALEN);
242 	memcpy(eth.h_source, src, ETH_ALEN);
243 	eth.h_proto = host_to_be16(proto);
244 
245 	io[0].iov_base = "ETHER ";
246 	io[0].iov_len = 6;
247 	io[1].iov_base = &eth;
248 	io[1].iov_len = sizeof(eth);
249 	io[2].iov_base = (u8 *) data;
250 	io[2].iov_len = data_len;
251 
252 	memset(&msg, 0, sizeof(msg));
253 	msg.msg_iov = io;
254 	msg.msg_iovlen = 3;
255 
256 	dir = opendir(drv->test_dir);
257 	if (dir == NULL) {
258 		perror("test_driver: opendir");
259 		return -1;
260 	}
261 	while ((dent = readdir(dir))) {
262 #ifdef _DIRENT_HAVE_D_TYPE
263 		/* Skip the file if it is not a socket. Also accept
264 		 * DT_UNKNOWN (0) in case the C library or underlying file
265 		 * system does not support d_type. */
266 		if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
267 			continue;
268 #endif /* _DIRENT_HAVE_D_TYPE */
269 		if (strcmp(dent->d_name, ".") == 0 ||
270 		    strcmp(dent->d_name, "..") == 0)
271 			continue;
272 
273 		memset(&addr, 0, sizeof(addr));
274 		addr.sun_family = AF_UNIX;
275 		snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s",
276 			 drv->test_dir, dent->d_name);
277 
278 		if (strcmp(addr.sun_path, drv->own_socket_path) == 0)
279 			continue;
280 		if (!broadcast && strstr(dent->d_name, desttxt) == NULL)
281 			continue;
282 
283 		wpa_printf(MSG_DEBUG, "%s: Send ether frame to %s",
284 			   __func__, dent->d_name);
285 
286 		msg.msg_name = &addr;
287 		msg.msg_namelen = sizeof(addr);
288 		ret = sendmsg(drv->test_socket, &msg, 0);
289 		if (ret < 0)
290 			perror("driver_test: sendmsg");
291 		count++;
292 	}
293 	closedir(dir);
294 
295 	if (!broadcast && count == 0) {
296 		wpa_printf(MSG_DEBUG, "%s: Destination " MACSTR " not found",
297 			   __func__, MAC2STR(dst));
298 		return -1;
299 	}
300 
301 	return ret;
302 }
303 
304 
wpa_driver_test_send_mlme(void * priv,const u8 * data,size_t data_len,int noack)305 static int wpa_driver_test_send_mlme(void *priv, const u8 *data,
306 				     size_t data_len, int noack)
307 {
308 	struct test_driver_bss *dbss = priv;
309 	struct wpa_driver_test_data *drv = dbss->drv;
310 	struct msghdr msg;
311 	struct iovec io[2];
312 	const u8 *dest;
313 	struct sockaddr_un addr;
314 	struct dirent *dent;
315 	DIR *dir;
316 	int broadcast;
317 	int ret = 0;
318 	struct ieee80211_hdr *hdr;
319 	u16 fc;
320 	char cmd[50];
321 	int freq;
322 #ifdef HOSTAPD
323 	char desttxt[30];
324 #endif /* HOSTAPD */
325 	union wpa_event_data event;
326 
327 	wpa_hexdump(MSG_MSGDUMP, "test_send_mlme", data, data_len);
328 	if (drv->test_socket < 0 || data_len < 10) {
329 		wpa_printf(MSG_DEBUG, "%s: invalid parameters (sock=%d len=%lu"
330 			   " test_dir=%p)",
331 			   __func__, drv->test_socket,
332 			   (unsigned long) data_len,
333 			   drv->test_dir);
334 		return -1;
335 	}
336 
337 	dest = data + 4;
338 	broadcast = os_memcmp(dest, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0;
339 
340 #ifdef HOSTAPD
341 	snprintf(desttxt, sizeof(desttxt), MACSTR, MAC2STR(dest));
342 #endif /* HOSTAPD */
343 
344 	if (drv->remain_on_channel_freq)
345 		freq = drv->remain_on_channel_freq;
346 	else
347 		freq = drv->current_freq;
348 	wpa_printf(MSG_DEBUG, "test_driver(%s): MLME TX on freq %d MHz",
349 		   dbss->ifname, freq);
350 	os_snprintf(cmd, sizeof(cmd), "MLME freq=%d ", freq);
351 	io[0].iov_base = cmd;
352 	io[0].iov_len = os_strlen(cmd);
353 	io[1].iov_base = (void *) data;
354 	io[1].iov_len = data_len;
355 
356 	os_memset(&msg, 0, sizeof(msg));
357 	msg.msg_iov = io;
358 	msg.msg_iovlen = 2;
359 
360 #ifdef HOSTAPD
361 	if (drv->test_dir == NULL) {
362 		wpa_printf(MSG_DEBUG, "%s: test_dir == NULL", __func__);
363 		return -1;
364 	}
365 
366 	dir = opendir(drv->test_dir);
367 	if (dir == NULL) {
368 		perror("test_driver: opendir");
369 		return -1;
370 	}
371 	while ((dent = readdir(dir))) {
372 #ifdef _DIRENT_HAVE_D_TYPE
373 		/* Skip the file if it is not a socket. Also accept
374 		 * DT_UNKNOWN (0) in case the C library or underlying file
375 		 * system does not support d_type. */
376 		if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
377 			continue;
378 #endif /* _DIRENT_HAVE_D_TYPE */
379 		if (os_strcmp(dent->d_name, ".") == 0 ||
380 		    os_strcmp(dent->d_name, "..") == 0)
381 			continue;
382 
383 		os_memset(&addr, 0, sizeof(addr));
384 		addr.sun_family = AF_UNIX;
385 		os_snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s",
386 			    drv->test_dir, dent->d_name);
387 
388 		if (os_strcmp(addr.sun_path, drv->own_socket_path) == 0)
389 			continue;
390 		if (!broadcast && os_strstr(dent->d_name, desttxt) == NULL)
391 			continue;
392 
393 		wpa_printf(MSG_DEBUG, "%s: Send management frame to %s",
394 			   __func__, dent->d_name);
395 
396 		msg.msg_name = &addr;
397 		msg.msg_namelen = sizeof(addr);
398 		ret = sendmsg(drv->test_socket, &msg, 0);
399 		if (ret < 0)
400 			perror("driver_test: sendmsg(test_socket)");
401 	}
402 	closedir(dir);
403 #else /* HOSTAPD */
404 
405 	if (os_memcmp(dest, dbss->bssid, ETH_ALEN) == 0 ||
406 	    drv->test_dir == NULL) {
407 		if (drv->hostapd_addr_udp_set) {
408 			msg.msg_name = &drv->hostapd_addr_udp;
409 			msg.msg_namelen = sizeof(drv->hostapd_addr_udp);
410 		} else {
411 #ifdef DRIVER_TEST_UNIX
412 			msg.msg_name = &drv->hostapd_addr;
413 			msg.msg_namelen = sizeof(drv->hostapd_addr);
414 #endif /* DRIVER_TEST_UNIX */
415 		}
416 	} else if (broadcast) {
417 		dir = opendir(drv->test_dir);
418 		if (dir == NULL)
419 			return -1;
420 		while ((dent = readdir(dir))) {
421 #ifdef _DIRENT_HAVE_D_TYPE
422 			/* Skip the file if it is not a socket.
423 			 * Also accept DT_UNKNOWN (0) in case
424 			 * the C library or underlying file
425 			 * system does not support d_type. */
426 			if (dent->d_type != DT_SOCK &&
427 			    dent->d_type != DT_UNKNOWN)
428 				continue;
429 #endif /* _DIRENT_HAVE_D_TYPE */
430 			if (os_strcmp(dent->d_name, ".") == 0 ||
431 			    os_strcmp(dent->d_name, "..") == 0)
432 				continue;
433 			wpa_printf(MSG_DEBUG, "%s: Send broadcast MLME to %s",
434 				   __func__, dent->d_name);
435 			os_memset(&addr, 0, sizeof(addr));
436 			addr.sun_family = AF_UNIX;
437 			os_snprintf(addr.sun_path, sizeof(addr.sun_path),
438 				    "%s/%s", drv->test_dir, dent->d_name);
439 
440 			msg.msg_name = &addr;
441 			msg.msg_namelen = sizeof(addr);
442 
443 			ret = sendmsg(drv->test_socket, &msg, 0);
444 			if (ret < 0)
445 				perror("driver_test: sendmsg(test_socket)");
446 		}
447 		closedir(dir);
448 		return ret;
449 	} else {
450 		struct stat st;
451 		os_memset(&addr, 0, sizeof(addr));
452 		addr.sun_family = AF_UNIX;
453 		os_snprintf(addr.sun_path, sizeof(addr.sun_path),
454 			    "%s/AP-" MACSTR, drv->test_dir, MAC2STR(dest));
455 		if (stat(addr.sun_path, &st) < 0) {
456 			os_snprintf(addr.sun_path, sizeof(addr.sun_path),
457 				    "%s/STA-" MACSTR,
458 				    drv->test_dir, MAC2STR(dest));
459 		}
460 		msg.msg_name = &addr;
461 		msg.msg_namelen = sizeof(addr);
462 	}
463 
464 	if (sendmsg(drv->test_socket, &msg, 0) < 0) {
465 		perror("sendmsg(test_socket)");
466 		return -1;
467 	}
468 #endif /* HOSTAPD */
469 
470 	hdr = (struct ieee80211_hdr *) data;
471 	fc = le_to_host16(hdr->frame_control);
472 
473 	os_memset(&event, 0, sizeof(event));
474 	event.tx_status.type = WLAN_FC_GET_TYPE(fc);
475 	event.tx_status.stype = WLAN_FC_GET_STYPE(fc);
476 	event.tx_status.dst = hdr->addr1;
477 	event.tx_status.data = data;
478 	event.tx_status.data_len = data_len;
479 	event.tx_status.ack = ret >= 0;
480 	wpa_supplicant_event(drv->ctx, EVENT_TX_STATUS, &event);
481 
482 #ifdef CONFIG_P2P
483 	if (drv->p2p &&
484 	    WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT &&
485 	    WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_ACTION) {
486 		if (drv->pending_action_tx == NULL) {
487 			wpa_printf(MSG_DEBUG, "P2P: Ignore Action TX status - "
488 				   "no pending operation");
489 			return ret;
490 		}
491 
492 		if (os_memcmp(hdr->addr1, drv->pending_action_dst, ETH_ALEN) !=
493 		    0) {
494 			wpa_printf(MSG_DEBUG, "P2P: Ignore Action TX status - "
495 				   "unknown destination address");
496 			return ret;
497 		}
498 
499 		wpabuf_free(drv->pending_action_tx);
500 		drv->pending_action_tx = NULL;
501 
502 		p2p_send_action_cb(drv->p2p, drv->pending_action_freq,
503 				   drv->pending_action_dst,
504 				   drv->pending_action_src,
505 				   drv->pending_action_bssid,
506 				   ret >= 0);
507 	}
508 #endif /* CONFIG_P2P */
509 
510 	return ret;
511 }
512 
513 
test_driver_scan(struct wpa_driver_test_data * drv,struct sockaddr_un * from,socklen_t fromlen,char * data)514 static void test_driver_scan(struct wpa_driver_test_data *drv,
515 			     struct sockaddr_un *from, socklen_t fromlen,
516 			     char *data)
517 {
518 	char buf[512], *pos, *end;
519 	int ret;
520 	struct test_driver_bss *bss;
521 	u8 sa[ETH_ALEN];
522 	u8 ie[512];
523 	size_t ielen;
524 	union wpa_event_data event;
525 
526 	/* data: optional [ ' ' | STA-addr | ' ' | IEs(hex) ] */
527 
528 	wpa_printf(MSG_DEBUG, "test_driver: SCAN");
529 
530 	if (*data) {
531 		if (*data != ' ' ||
532 		    hwaddr_aton(data + 1, sa)) {
533 			wpa_printf(MSG_DEBUG, "test_driver: Unexpected SCAN "
534 				   "command format");
535 			return;
536 		}
537 
538 		data += 18;
539 		while (*data == ' ')
540 			data++;
541 		ielen = os_strlen(data) / 2;
542 		if (ielen > sizeof(ie))
543 			ielen = sizeof(ie);
544 		if (hexstr2bin(data, ie, ielen) < 0)
545 			ielen = 0;
546 
547 		wpa_printf(MSG_DEBUG, "test_driver: Scan from " MACSTR,
548 			   MAC2STR(sa));
549 		wpa_hexdump(MSG_MSGDUMP, "test_driver: scan IEs", ie, ielen);
550 
551 		os_memset(&event, 0, sizeof(event));
552 		event.rx_probe_req.sa = sa;
553 		event.rx_probe_req.ie = ie;
554 		event.rx_probe_req.ie_len = ielen;
555 		wpa_supplicant_event(drv->ctx, EVENT_RX_PROBE_REQ, &event);
556 #ifdef CONFIG_P2P
557 		if (drv->p2p)
558 			p2p_probe_req_rx(drv->p2p, sa, NULL, NULL, ie, ielen);
559 #endif /* CONFIG_P2P */
560 	}
561 
562 	dl_list_for_each(bss, &drv->bss, struct test_driver_bss, list) {
563 		pos = buf;
564 		end = buf + sizeof(buf);
565 
566 		/* reply: SCANRESP BSSID SSID IEs */
567 		ret = snprintf(pos, end - pos, "SCANRESP " MACSTR " ",
568 			       MAC2STR(bss->bssid));
569 		if (ret < 0 || ret >= end - pos)
570 			return;
571 		pos += ret;
572 		pos += wpa_snprintf_hex(pos, end - pos,
573 					bss->ssid, bss->ssid_len);
574 		ret = snprintf(pos, end - pos, " ");
575 		if (ret < 0 || ret >= end - pos)
576 			return;
577 		pos += ret;
578 		pos += wpa_snprintf_hex(pos, end - pos, bss->ie, bss->ielen);
579 		pos += wpa_snprintf_hex(pos, end - pos, bss->wps_probe_resp_ie,
580 					bss->wps_probe_resp_ie_len);
581 
582 		if (bss->privacy) {
583 			ret = snprintf(pos, end - pos, " PRIVACY");
584 			if (ret < 0 || ret >= end - pos)
585 				return;
586 			pos += ret;
587 		}
588 
589 		sendto(drv->test_socket, buf, pos - buf, 0,
590 		       (struct sockaddr *) from, fromlen);
591 	}
592 }
593 
594 
test_driver_assoc(struct wpa_driver_test_data * drv,struct sockaddr_un * from,socklen_t fromlen,char * data)595 static void test_driver_assoc(struct wpa_driver_test_data *drv,
596 			      struct sockaddr_un *from, socklen_t fromlen,
597 			      char *data)
598 {
599 	struct test_client_socket *cli;
600 	u8 ie[256], ssid[32];
601 	size_t ielen, ssid_len = 0;
602 	char *pos, *pos2, cmd[50];
603 	struct test_driver_bss *bss, *tmp;
604 
605 	/* data: STA-addr SSID(hex) IEs(hex) */
606 
607 	cli = os_zalloc(sizeof(*cli));
608 	if (cli == NULL)
609 		return;
610 
611 	if (hwaddr_aton(data, cli->addr)) {
612 		printf("test_socket: Invalid MAC address '%s' in ASSOC\n",
613 		       data);
614 		os_free(cli);
615 		return;
616 	}
617 	pos = data + 17;
618 	while (*pos == ' ')
619 		pos++;
620 	pos2 = strchr(pos, ' ');
621 	ielen = 0;
622 	if (pos2) {
623 		ssid_len = (pos2 - pos) / 2;
624 		if (hexstr2bin(pos, ssid, ssid_len) < 0) {
625 			wpa_printf(MSG_DEBUG, "%s: Invalid SSID", __func__);
626 			os_free(cli);
627 			return;
628 		}
629 		wpa_hexdump_ascii(MSG_DEBUG, "test_driver_assoc: SSID",
630 				  ssid, ssid_len);
631 
632 		pos = pos2 + 1;
633 		ielen = strlen(pos) / 2;
634 		if (ielen > sizeof(ie))
635 			ielen = sizeof(ie);
636 		if (hexstr2bin(pos, ie, ielen) < 0)
637 			ielen = 0;
638 	}
639 
640 	bss = NULL;
641 	dl_list_for_each(tmp, &drv->bss, struct test_driver_bss, list) {
642 		if (tmp->ssid_len == ssid_len &&
643 		    os_memcmp(tmp->ssid, ssid, ssid_len) == 0) {
644 			bss = tmp;
645 			break;
646 		}
647 	}
648 	if (bss == NULL) {
649 		wpa_printf(MSG_DEBUG, "%s: No matching SSID found from "
650 			   "configured BSSes", __func__);
651 		os_free(cli);
652 		return;
653 	}
654 
655 	cli->bss = bss;
656 	memcpy(&cli->un, from, sizeof(cli->un));
657 	cli->unlen = fromlen;
658 	cli->next = drv->cli;
659 	drv->cli = cli;
660 	wpa_hexdump_ascii(MSG_DEBUG, "test_socket: ASSOC sun_path",
661 			  (const u8 *) cli->un.sun_path,
662 			  cli->unlen - sizeof(cli->un.sun_family));
663 
664 	snprintf(cmd, sizeof(cmd), "ASSOCRESP " MACSTR " 0",
665 		 MAC2STR(bss->bssid));
666 	sendto(drv->test_socket, cmd, strlen(cmd), 0,
667 	       (struct sockaddr *) from, fromlen);
668 
669 	drv_event_assoc(bss->bss_ctx, cli->addr, ie, ielen, 0);
670 }
671 
672 
test_driver_disassoc(struct wpa_driver_test_data * drv,struct sockaddr_un * from,socklen_t fromlen)673 static void test_driver_disassoc(struct wpa_driver_test_data *drv,
674 				 struct sockaddr_un *from, socklen_t fromlen)
675 {
676 	struct test_client_socket *cli;
677 
678 	cli = test_driver_get_cli(drv, from, fromlen);
679 	if (!cli)
680 		return;
681 
682 	drv_event_disassoc(drv->ctx, cli->addr);
683 }
684 
685 
test_driver_eapol(struct wpa_driver_test_data * drv,struct sockaddr_un * from,socklen_t fromlen,u8 * data,size_t datalen)686 static void test_driver_eapol(struct wpa_driver_test_data *drv,
687 			      struct sockaddr_un *from, socklen_t fromlen,
688 			      u8 *data, size_t datalen)
689 {
690 #ifdef HOSTAPD
691 	struct test_client_socket *cli;
692 #endif /* HOSTAPD */
693 	const u8 *src = NULL;
694 
695 	if (datalen > 14) {
696 		/* Skip Ethernet header */
697 		src = data + ETH_ALEN;
698 		wpa_printf(MSG_DEBUG, "test_driver: dst=" MACSTR " src="
699 			   MACSTR " proto=%04x",
700 			   MAC2STR(data), MAC2STR(src),
701 			   WPA_GET_BE16(data + 2 * ETH_ALEN));
702 		data += 14;
703 		datalen -= 14;
704 	}
705 
706 #ifdef HOSTAPD
707 	cli = test_driver_get_cli(drv, from, fromlen);
708 	if (cli) {
709 		drv_event_eapol_rx(cli->bss->bss_ctx, cli->addr, data,
710 				   datalen);
711 	} else {
712 		wpa_printf(MSG_DEBUG, "test_socket: EAPOL from unknown "
713 			   "client");
714 	}
715 #else /* HOSTAPD */
716 	if (src)
717 		drv_event_eapol_rx(drv->ctx, src, data, datalen);
718 #endif /* HOSTAPD */
719 }
720 
721 
test_driver_ether(struct wpa_driver_test_data * drv,struct sockaddr_un * from,socklen_t fromlen,u8 * data,size_t datalen)722 static void test_driver_ether(struct wpa_driver_test_data *drv,
723 			      struct sockaddr_un *from, socklen_t fromlen,
724 			      u8 *data, size_t datalen)
725 {
726 	struct l2_ethhdr *eth;
727 
728 	if (datalen < sizeof(*eth))
729 		return;
730 
731 	eth = (struct l2_ethhdr *) data;
732 	wpa_printf(MSG_DEBUG, "test_driver: RX ETHER dst=" MACSTR " src="
733 		   MACSTR " proto=%04x",
734 		   MAC2STR(eth->h_dest), MAC2STR(eth->h_source),
735 		   be_to_host16(eth->h_proto));
736 
737 #ifdef CONFIG_IEEE80211R
738 	if (be_to_host16(eth->h_proto) == ETH_P_RRB) {
739 		union wpa_event_data ev;
740 		os_memset(&ev, 0, sizeof(ev));
741 		ev.ft_rrb_rx.src = eth->h_source;
742 		ev.ft_rrb_rx.data = data + sizeof(*eth);
743 		ev.ft_rrb_rx.data_len = datalen - sizeof(*eth);
744 	}
745 #endif /* CONFIG_IEEE80211R */
746 }
747 
748 
test_driver_mlme(struct wpa_driver_test_data * drv,struct sockaddr_un * from,socklen_t fromlen,u8 * data,size_t datalen)749 static void test_driver_mlme(struct wpa_driver_test_data *drv,
750 			     struct sockaddr_un *from, socklen_t fromlen,
751 			     u8 *data, size_t datalen)
752 {
753 	struct ieee80211_hdr *hdr;
754 	u16 fc;
755 	union wpa_event_data event;
756 	int freq = 0, own_freq;
757 	struct test_driver_bss *bss;
758 
759 	bss = dl_list_first(&drv->bss, struct test_driver_bss, list);
760 
761 	if (datalen > 6 && os_memcmp(data, "freq=", 5) == 0) {
762 		size_t pos;
763 		for (pos = 5; pos < datalen; pos++) {
764 			if (data[pos] == ' ')
765 				break;
766 		}
767 		if (pos < datalen) {
768 			freq = atoi((const char *) &data[5]);
769 			wpa_printf(MSG_DEBUG, "test_driver(%s): MLME RX on "
770 				   "freq %d MHz", bss->ifname, freq);
771 			pos++;
772 			data += pos;
773 			datalen -= pos;
774 		}
775 	}
776 
777 	if (drv->remain_on_channel_freq)
778 		own_freq = drv->remain_on_channel_freq;
779 	else
780 		own_freq = drv->current_freq;
781 
782 	if (freq && own_freq && freq != own_freq) {
783 		wpa_printf(MSG_DEBUG, "test_driver(%s): Ignore MLME RX on "
784 			   "another frequency %d MHz (own %d MHz)",
785 			   bss->ifname, freq, own_freq);
786 		return;
787 	}
788 
789 	hdr = (struct ieee80211_hdr *) data;
790 
791 	if (test_driver_get_cli(drv, from, fromlen) == NULL && datalen >= 16) {
792 		struct test_client_socket *cli;
793 		cli = os_zalloc(sizeof(*cli));
794 		if (cli == NULL)
795 			return;
796 		wpa_printf(MSG_DEBUG, "Adding client entry for " MACSTR,
797 			   MAC2STR(hdr->addr2));
798 		memcpy(cli->addr, hdr->addr2, ETH_ALEN);
799 		memcpy(&cli->un, from, sizeof(cli->un));
800 		cli->unlen = fromlen;
801 		cli->next = drv->cli;
802 		drv->cli = cli;
803 	}
804 
805 	wpa_hexdump(MSG_MSGDUMP, "test_driver_mlme: received frame",
806 		    data, datalen);
807 	fc = le_to_host16(hdr->frame_control);
808 	if (WLAN_FC_GET_TYPE(fc) != WLAN_FC_TYPE_MGMT) {
809 		wpa_printf(MSG_ERROR, "%s: received non-mgmt frame",
810 			   __func__);
811 		return;
812 	}
813 
814 	os_memset(&event, 0, sizeof(event));
815 	event.rx_mgmt.frame = data;
816 	event.rx_mgmt.frame_len = datalen;
817 	wpa_supplicant_event(drv->ctx, EVENT_RX_MGMT, &event);
818 }
819 
820 
test_driver_receive_unix(int sock,void * eloop_ctx,void * sock_ctx)821 static void test_driver_receive_unix(int sock, void *eloop_ctx, void *sock_ctx)
822 {
823 	struct wpa_driver_test_data *drv = eloop_ctx;
824 	char buf[2000];
825 	int res;
826 	struct sockaddr_un from;
827 	socklen_t fromlen = sizeof(from);
828 
829 	res = recvfrom(sock, buf, sizeof(buf) - 1, 0,
830 		       (struct sockaddr *) &from, &fromlen);
831 	if (res < 0) {
832 		perror("recvfrom(test_socket)");
833 		return;
834 	}
835 	buf[res] = '\0';
836 
837 	wpa_printf(MSG_DEBUG, "test_driver: received %u bytes", res);
838 
839 	if (strncmp(buf, "SCAN", 4) == 0) {
840 		test_driver_scan(drv, &from, fromlen, buf + 4);
841 	} else if (strncmp(buf, "ASSOC ", 6) == 0) {
842 		test_driver_assoc(drv, &from, fromlen, buf + 6);
843 	} else if (strcmp(buf, "DISASSOC") == 0) {
844 		test_driver_disassoc(drv, &from, fromlen);
845 	} else if (strncmp(buf, "EAPOL ", 6) == 0) {
846 		test_driver_eapol(drv, &from, fromlen, (u8 *) buf + 6,
847 				  res - 6);
848 	} else if (strncmp(buf, "ETHER ", 6) == 0) {
849 		test_driver_ether(drv, &from, fromlen, (u8 *) buf + 6,
850 				  res - 6);
851 	} else if (strncmp(buf, "MLME ", 5) == 0) {
852 		test_driver_mlme(drv, &from, fromlen, (u8 *) buf + 5, res - 5);
853 	} else {
854 		wpa_hexdump_ascii(MSG_DEBUG, "Unknown test_socket command",
855 				  (u8 *) buf, res);
856 	}
857 }
858 
859 
test_driver_set_generic_elem(void * priv,const u8 * elem,size_t elem_len)860 static int test_driver_set_generic_elem(void *priv,
861 					const u8 *elem, size_t elem_len)
862 {
863 	struct test_driver_bss *bss = priv;
864 
865 	os_free(bss->ie);
866 
867 	if (elem == NULL) {
868 		bss->ie = NULL;
869 		bss->ielen = 0;
870 		return 0;
871 	}
872 
873 	bss->ie = os_malloc(elem_len);
874 	if (bss->ie == NULL) {
875 		bss->ielen = 0;
876 		return -1;
877 	}
878 
879 	memcpy(bss->ie, elem, elem_len);
880 	bss->ielen = elem_len;
881 	return 0;
882 }
883 
884 
test_driver_set_ap_wps_ie(void * priv,const struct wpabuf * beacon,const struct wpabuf * proberesp,const struct wpabuf * assocresp)885 static int test_driver_set_ap_wps_ie(void *priv, const struct wpabuf *beacon,
886 				     const struct wpabuf *proberesp,
887 				     const struct wpabuf *assocresp)
888 {
889 	struct test_driver_bss *bss = priv;
890 
891 	if (beacon == NULL)
892 		wpa_printf(MSG_DEBUG, "test_driver: Clear Beacon WPS IE");
893 	else
894 		wpa_hexdump_buf(MSG_DEBUG, "test_driver: Beacon WPS IE",
895 				beacon);
896 
897 	os_free(bss->wps_beacon_ie);
898 
899 	if (beacon == NULL) {
900 		bss->wps_beacon_ie = NULL;
901 		bss->wps_beacon_ie_len = 0;
902 	} else {
903 		bss->wps_beacon_ie = os_malloc(wpabuf_len(beacon));
904 		if (bss->wps_beacon_ie == NULL) {
905 			bss->wps_beacon_ie_len = 0;
906 			return -1;
907 		}
908 
909 		os_memcpy(bss->wps_beacon_ie, wpabuf_head(beacon),
910 			  wpabuf_len(beacon));
911 		bss->wps_beacon_ie_len = wpabuf_len(beacon);
912 	}
913 
914 	if (proberesp == NULL)
915 		wpa_printf(MSG_DEBUG, "test_driver: Clear Probe Response WPS "
916 			   "IE");
917 	else
918 		wpa_hexdump_buf(MSG_DEBUG, "test_driver: Probe Response WPS "
919 				"IE", proberesp);
920 
921 	os_free(bss->wps_probe_resp_ie);
922 
923 	if (proberesp == NULL) {
924 		bss->wps_probe_resp_ie = NULL;
925 		bss->wps_probe_resp_ie_len = 0;
926 	} else {
927 		bss->wps_probe_resp_ie = os_malloc(wpabuf_len(proberesp));
928 		if (bss->wps_probe_resp_ie == NULL) {
929 			bss->wps_probe_resp_ie_len = 0;
930 			return -1;
931 		}
932 
933 		os_memcpy(bss->wps_probe_resp_ie, wpabuf_head(proberesp),
934 			  wpabuf_len(proberesp));
935 		bss->wps_probe_resp_ie_len = wpabuf_len(proberesp);
936 	}
937 
938 	return 0;
939 }
940 
941 
test_driver_sta_deauth(void * priv,const u8 * own_addr,const u8 * addr,int reason)942 static int test_driver_sta_deauth(void *priv, const u8 *own_addr,
943 				  const u8 *addr, int reason)
944 {
945 	struct test_driver_bss *dbss = priv;
946 	struct wpa_driver_test_data *drv = dbss->drv;
947 	struct test_client_socket *cli;
948 
949 	if (drv->test_socket < 0)
950 		return -1;
951 
952 	cli = drv->cli;
953 	while (cli) {
954 		if (memcmp(cli->addr, addr, ETH_ALEN) == 0)
955 			break;
956 		cli = cli->next;
957 	}
958 
959 	if (!cli)
960 		return -1;
961 
962 	return sendto(drv->test_socket, "DEAUTH", 6, 0,
963 		      (struct sockaddr *) &cli->un, cli->unlen);
964 }
965 
966 
test_driver_sta_disassoc(void * priv,const u8 * own_addr,const u8 * addr,int reason)967 static int test_driver_sta_disassoc(void *priv, const u8 *own_addr,
968 				    const u8 *addr, int reason)
969 {
970 	struct test_driver_bss *dbss = priv;
971 	struct wpa_driver_test_data *drv = dbss->drv;
972 	struct test_client_socket *cli;
973 
974 	if (drv->test_socket < 0)
975 		return -1;
976 
977 	cli = drv->cli;
978 	while (cli) {
979 		if (memcmp(cli->addr, addr, ETH_ALEN) == 0)
980 			break;
981 		cli = cli->next;
982 	}
983 
984 	if (!cli)
985 		return -1;
986 
987 	return sendto(drv->test_socket, "DISASSOC", 8, 0,
988 		      (struct sockaddr *) &cli->un, cli->unlen);
989 }
990 
991 
test_driver_bss_add(void * priv,const char * ifname,const u8 * bssid,void * bss_ctx,void ** drv_priv)992 static int test_driver_bss_add(void *priv, const char *ifname, const u8 *bssid,
993 			       void *bss_ctx, void **drv_priv)
994 {
995 	struct test_driver_bss *dbss = priv;
996 	struct wpa_driver_test_data *drv = dbss->drv;
997 	struct test_driver_bss *bss;
998 
999 	wpa_printf(MSG_DEBUG, "%s(ifname=%s bssid=" MACSTR ")",
1000 		   __func__, ifname, MAC2STR(bssid));
1001 
1002 	bss = os_zalloc(sizeof(*bss));
1003 	if (bss == NULL)
1004 		return -1;
1005 
1006 	bss->bss_ctx = bss_ctx;
1007 	bss->drv = drv;
1008 	os_strlcpy(bss->ifname, ifname, IFNAMSIZ);
1009 	os_memcpy(bss->bssid, bssid, ETH_ALEN);
1010 
1011 	dl_list_add(&drv->bss, &bss->list);
1012 	if (drv->global) {
1013 		drv->global->bss_add_used = 1;
1014 		os_memcpy(drv->global->req_addr, bssid, ETH_ALEN);
1015 	}
1016 
1017 	if (drv_priv)
1018 		*drv_priv = bss;
1019 
1020 	return 0;
1021 }
1022 
1023 
test_driver_bss_remove(void * priv,const char * ifname)1024 static int test_driver_bss_remove(void *priv, const char *ifname)
1025 {
1026 	struct test_driver_bss *dbss = priv;
1027 	struct wpa_driver_test_data *drv = dbss->drv;
1028 	struct test_driver_bss *bss;
1029 	struct test_client_socket *cli, *prev_c;
1030 
1031 	wpa_printf(MSG_DEBUG, "%s(ifname=%s)", __func__, ifname);
1032 
1033 	dl_list_for_each(bss, &drv->bss, struct test_driver_bss, list) {
1034 		if (strcmp(bss->ifname, ifname) != 0)
1035 			continue;
1036 
1037 		for (prev_c = NULL, cli = drv->cli; cli;
1038 		     prev_c = cli, cli = cli->next) {
1039 			if (cli->bss != bss)
1040 				continue;
1041 			if (prev_c)
1042 				prev_c->next = cli->next;
1043 			else
1044 				drv->cli = cli->next;
1045 			os_free(cli);
1046 			break;
1047 		}
1048 
1049 		dl_list_del(&bss->list);
1050 		test_driver_free_bss(bss);
1051 		return 0;
1052 	}
1053 
1054 	return -1;
1055 }
1056 
1057 
test_driver_if_add(void * priv,enum wpa_driver_if_type type,const char * ifname,const u8 * addr,void * bss_ctx,void ** drv_priv,char * force_ifname,u8 * if_addr,const char * bridge)1058 static int test_driver_if_add(void *priv, enum wpa_driver_if_type type,
1059 			      const char *ifname, const u8 *addr,
1060 			      void *bss_ctx, void **drv_priv,
1061 			      char *force_ifname, u8 *if_addr,
1062 			      const char *bridge)
1063 {
1064 	struct test_driver_bss *dbss = priv;
1065 	struct wpa_driver_test_data *drv = dbss->drv;
1066 
1067 	wpa_printf(MSG_DEBUG, "%s(type=%d ifname=%s bss_ctx=%p)",
1068 		   __func__, type, ifname, bss_ctx);
1069 	if (addr)
1070 		os_memcpy(if_addr, addr, ETH_ALEN);
1071 	else {
1072 		drv->alloc_iface_idx++;
1073 		if_addr[0] = 0x02; /* locally administered */
1074 		sha1_prf(drv->own_addr, ETH_ALEN,
1075 			 "hostapd test addr generation",
1076 			 (const u8 *) &drv->alloc_iface_idx,
1077 			 sizeof(drv->alloc_iface_idx),
1078 			 if_addr + 1, ETH_ALEN - 1);
1079 	}
1080 	if (type == WPA_IF_AP_BSS || type == WPA_IF_P2P_GO ||
1081 	    type == WPA_IF_P2P_CLIENT || type == WPA_IF_P2P_GROUP)
1082 		return test_driver_bss_add(priv, ifname, if_addr, bss_ctx,
1083 					   drv_priv);
1084 	return 0;
1085 }
1086 
1087 
test_driver_if_remove(void * priv,enum wpa_driver_if_type type,const char * ifname)1088 static int test_driver_if_remove(void *priv, enum wpa_driver_if_type type,
1089 				 const char *ifname)
1090 {
1091 	wpa_printf(MSG_DEBUG, "%s(type=%d ifname=%s)", __func__, type, ifname);
1092 	if (type == WPA_IF_AP_BSS || type == WPA_IF_P2P_GO ||
1093 	    type == WPA_IF_P2P_CLIENT || type == WPA_IF_P2P_GROUP)
1094 		return test_driver_bss_remove(priv, ifname);
1095 	return 0;
1096 }
1097 
1098 
test_driver_set_ssid(void * priv,const u8 * buf,int len)1099 static int test_driver_set_ssid(void *priv, const u8 *buf, int len)
1100 {
1101 	struct test_driver_bss *bss = priv;
1102 
1103 	wpa_printf(MSG_DEBUG, "%s(ifname=%s)", __func__, bss->ifname);
1104 	if (len < 0)
1105 		return -1;
1106 	wpa_hexdump_ascii(MSG_DEBUG, "test_driver_set_ssid: SSID", buf, len);
1107 
1108 	if ((size_t) len > sizeof(bss->ssid))
1109 		return -1;
1110 
1111 	os_memcpy(bss->ssid, buf, len);
1112 	bss->ssid_len = len;
1113 
1114 	return 0;
1115 }
1116 
1117 
test_driver_set_privacy(void * priv,int enabled)1118 static int test_driver_set_privacy(void *priv, int enabled)
1119 {
1120 	struct test_driver_bss *dbss = priv;
1121 
1122 	wpa_printf(MSG_DEBUG, "%s(enabled=%d)",  __func__, enabled);
1123 	dbss->privacy = enabled;
1124 
1125 	return 0;
1126 }
1127 
1128 
test_driver_set_sta_vlan(void * priv,const u8 * addr,const char * ifname,int vlan_id)1129 static int test_driver_set_sta_vlan(void *priv, const u8 *addr,
1130 				    const char *ifname, int vlan_id)
1131 {
1132 	wpa_printf(MSG_DEBUG, "%s(addr=" MACSTR " ifname=%s vlan_id=%d)",
1133 		   __func__, MAC2STR(addr), ifname, vlan_id);
1134 	return 0;
1135 }
1136 
1137 
test_driver_sta_add(void * priv,struct hostapd_sta_add_params * params)1138 static int test_driver_sta_add(void *priv,
1139 			       struct hostapd_sta_add_params *params)
1140 {
1141 	struct test_driver_bss *bss = priv;
1142 	struct wpa_driver_test_data *drv = bss->drv;
1143 	struct test_client_socket *cli;
1144 
1145 	wpa_printf(MSG_DEBUG, "%s(ifname=%s addr=" MACSTR " aid=%d "
1146 		   "capability=0x%x listen_interval=%d)",
1147 		   __func__, bss->ifname, MAC2STR(params->addr), params->aid,
1148 		   params->capability, params->listen_interval);
1149 	wpa_hexdump(MSG_DEBUG, "test_driver_sta_add - supp_rates",
1150 		    params->supp_rates, params->supp_rates_len);
1151 
1152 	cli = drv->cli;
1153 	while (cli) {
1154 		if (os_memcmp(cli->addr, params->addr, ETH_ALEN) == 0)
1155 			break;
1156 		cli = cli->next;
1157 	}
1158 	if (!cli) {
1159 		wpa_printf(MSG_DEBUG, "%s: no matching client entry",
1160 			   __func__);
1161 		return -1;
1162 	}
1163 
1164 	cli->bss = bss;
1165 
1166 	return 0;
1167 }
1168 
1169 
test_alloc_data(void * ctx,const char * ifname)1170 static struct wpa_driver_test_data * test_alloc_data(void *ctx,
1171 						     const char *ifname)
1172 {
1173 	struct wpa_driver_test_data *drv;
1174 	struct test_driver_bss *bss;
1175 
1176 	drv = os_zalloc(sizeof(struct wpa_driver_test_data));
1177 	if (drv == NULL) {
1178 		wpa_printf(MSG_ERROR, "Could not allocate memory for test "
1179 			   "driver data");
1180 		return NULL;
1181 	}
1182 
1183 	bss = os_zalloc(sizeof(struct test_driver_bss));
1184 	if (bss == NULL) {
1185 		os_free(drv);
1186 		return NULL;
1187 	}
1188 
1189 	drv->ctx = ctx;
1190 	wpa_trace_add_ref(drv, ctx, ctx);
1191 	dl_list_init(&drv->bss);
1192 	dl_list_add(&drv->bss, &bss->list);
1193 	os_strlcpy(bss->ifname, ifname, IFNAMSIZ);
1194 	bss->bss_ctx = ctx;
1195 	bss->drv = drv;
1196 
1197 	/* Generate a MAC address to help testing with multiple STAs */
1198 	drv->own_addr[0] = 0x02; /* locally administered */
1199 	sha1_prf((const u8 *) ifname, os_strlen(ifname),
1200 		 "test mac addr generation",
1201 		 NULL, 0, drv->own_addr + 1, ETH_ALEN - 1);
1202 
1203 	return drv;
1204 }
1205 
1206 
test_driver_init(struct hostapd_data * hapd,struct wpa_init_params * params)1207 static void * test_driver_init(struct hostapd_data *hapd,
1208 			       struct wpa_init_params *params)
1209 {
1210 	struct wpa_driver_test_data *drv;
1211 	struct sockaddr_un addr_un;
1212 	struct sockaddr_in addr_in;
1213 	struct sockaddr *addr;
1214 	socklen_t alen;
1215 	struct test_driver_bss *bss;
1216 
1217 	drv = test_alloc_data(hapd, params->ifname);
1218 	if (drv == NULL)
1219 		return NULL;
1220 	drv->ap = 1;
1221 	bss = dl_list_first(&drv->bss, struct test_driver_bss, list);
1222 	drv->global = params->global_priv;
1223 
1224 	bss->bss_ctx = hapd;
1225 	os_memcpy(bss->bssid, drv->own_addr, ETH_ALEN);
1226 	os_memcpy(params->own_addr, drv->own_addr, ETH_ALEN);
1227 
1228 	if (params->test_socket) {
1229 		if (os_strlen(params->test_socket) >=
1230 		    sizeof(addr_un.sun_path)) {
1231 			printf("Too long test_socket path\n");
1232 			wpa_driver_test_deinit(bss);
1233 			return NULL;
1234 		}
1235 		if (strncmp(params->test_socket, "DIR:", 4) == 0) {
1236 			size_t len = strlen(params->test_socket) + 30;
1237 			drv->test_dir = os_strdup(params->test_socket + 4);
1238 			drv->own_socket_path = os_malloc(len);
1239 			if (drv->own_socket_path) {
1240 				snprintf(drv->own_socket_path, len,
1241 					 "%s/AP-" MACSTR,
1242 					 params->test_socket + 4,
1243 					 MAC2STR(params->own_addr));
1244 			}
1245 		} else if (strncmp(params->test_socket, "UDP:", 4) == 0) {
1246 			drv->udp_port = atoi(params->test_socket + 4);
1247 		} else {
1248 			drv->own_socket_path = os_strdup(params->test_socket);
1249 		}
1250 		if (drv->own_socket_path == NULL && drv->udp_port == 0) {
1251 			wpa_driver_test_deinit(bss);
1252 			return NULL;
1253 		}
1254 
1255 		drv->test_socket = socket(drv->udp_port ? PF_INET : PF_UNIX,
1256 					  SOCK_DGRAM, 0);
1257 		if (drv->test_socket < 0) {
1258 			perror("socket");
1259 			wpa_driver_test_deinit(bss);
1260 			return NULL;
1261 		}
1262 
1263 		if (drv->udp_port) {
1264 			os_memset(&addr_in, 0, sizeof(addr_in));
1265 			addr_in.sin_family = AF_INET;
1266 			addr_in.sin_port = htons(drv->udp_port);
1267 			addr = (struct sockaddr *) &addr_in;
1268 			alen = sizeof(addr_in);
1269 		} else {
1270 			os_memset(&addr_un, 0, sizeof(addr_un));
1271 			addr_un.sun_family = AF_UNIX;
1272 			os_strlcpy(addr_un.sun_path, drv->own_socket_path,
1273 				   sizeof(addr_un.sun_path));
1274 			addr = (struct sockaddr *) &addr_un;
1275 			alen = sizeof(addr_un);
1276 		}
1277 		if (bind(drv->test_socket, addr, alen) < 0) {
1278 			perror("bind(PF_UNIX)");
1279 			close(drv->test_socket);
1280 			if (drv->own_socket_path)
1281 				unlink(drv->own_socket_path);
1282 			wpa_driver_test_deinit(bss);
1283 			return NULL;
1284 		}
1285 		eloop_register_read_sock(drv->test_socket,
1286 					 test_driver_receive_unix, drv, NULL);
1287 	} else
1288 		drv->test_socket = -1;
1289 
1290 	return bss;
1291 }
1292 
1293 
wpa_driver_test_poll(void * eloop_ctx,void * timeout_ctx)1294 static void wpa_driver_test_poll(void *eloop_ctx, void *timeout_ctx)
1295 {
1296 	struct wpa_driver_test_data *drv = eloop_ctx;
1297 
1298 #ifdef DRIVER_TEST_UNIX
1299 	if (drv->associated && drv->hostapd_addr_set) {
1300 		struct stat st;
1301 		if (stat(drv->hostapd_addr.sun_path, &st) < 0) {
1302 			wpa_printf(MSG_DEBUG, "%s: lost connection to AP: %s",
1303 				   __func__, strerror(errno));
1304 			drv->associated = 0;
1305 			wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
1306 		}
1307 	}
1308 #endif /* DRIVER_TEST_UNIX */
1309 
1310 	eloop_register_timeout(1, 0, wpa_driver_test_poll, drv, NULL);
1311 }
1312 
1313 
wpa_driver_test_scan_timeout(void * eloop_ctx,void * timeout_ctx)1314 static void wpa_driver_test_scan_timeout(void *eloop_ctx, void *timeout_ctx)
1315 {
1316 	struct wpa_driver_test_data *drv = eloop_ctx;
1317 	wpa_printf(MSG_DEBUG, "Scan timeout - try to get results");
1318 	if (drv->pending_p2p_scan && drv->p2p) {
1319 #ifdef CONFIG_P2P
1320 		size_t i;
1321 		for (i = 0; i < drv->num_scanres; i++) {
1322 			struct wpa_scan_res *bss = drv->scanres[i];
1323 			if (p2p_scan_res_handler(drv->p2p, bss->bssid,
1324 						 bss->freq, bss->level,
1325 						 (const u8 *) (bss + 1),
1326 						 bss->ie_len) > 0)
1327 				return;
1328 		}
1329 		p2p_scan_res_handled(drv->p2p);
1330 #endif /* CONFIG_P2P */
1331 		return;
1332 	}
1333 	wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL);
1334 }
1335 
1336 
1337 #ifdef DRIVER_TEST_UNIX
wpa_driver_scan_dir(struct wpa_driver_test_data * drv,const char * path)1338 static void wpa_driver_scan_dir(struct wpa_driver_test_data *drv,
1339 				const char *path)
1340 {
1341 	struct dirent *dent;
1342 	DIR *dir;
1343 	struct sockaddr_un addr;
1344 	char cmd[512], *pos, *end;
1345 	int ret;
1346 
1347 	dir = opendir(path);
1348 	if (dir == NULL)
1349 		return;
1350 
1351 	end = cmd + sizeof(cmd);
1352 	pos = cmd;
1353 	ret = os_snprintf(pos, end - pos, "SCAN " MACSTR,
1354 			  MAC2STR(drv->own_addr));
1355 	if (ret >= 0 && ret < end - pos)
1356 		pos += ret;
1357 	if (drv->probe_req_ie) {
1358 		ret = os_snprintf(pos, end - pos, " ");
1359 		if (ret >= 0 && ret < end - pos)
1360 			pos += ret;
1361 		pos += wpa_snprintf_hex(pos, end - pos, drv->probe_req_ie,
1362 					drv->probe_req_ie_len);
1363 	}
1364 	if (drv->probe_req_ssid_len) {
1365 		/* Add SSID IE */
1366 		ret = os_snprintf(pos, end - pos, "%02x%02x",
1367 				  WLAN_EID_SSID,
1368 				  (unsigned int) drv->probe_req_ssid_len);
1369 		if (ret >= 0 && ret < end - pos)
1370 			pos += ret;
1371 		pos += wpa_snprintf_hex(pos, end - pos, drv->probe_req_ssid,
1372 					drv->probe_req_ssid_len);
1373 	}
1374 	end[-1] = '\0';
1375 
1376 	while ((dent = readdir(dir))) {
1377 		if (os_strncmp(dent->d_name, "AP-", 3) != 0 &&
1378 		    os_strncmp(dent->d_name, "STA-", 4) != 0)
1379 			continue;
1380 		if (drv->own_socket_path) {
1381 			size_t olen, dlen;
1382 			olen = os_strlen(drv->own_socket_path);
1383 			dlen = os_strlen(dent->d_name);
1384 			if (olen >= dlen &&
1385 			    os_strcmp(dent->d_name,
1386 				      drv->own_socket_path + olen - dlen) == 0)
1387 				continue;
1388 		}
1389 		wpa_printf(MSG_DEBUG, "%s: SCAN %s", __func__, dent->d_name);
1390 
1391 		os_memset(&addr, 0, sizeof(addr));
1392 		addr.sun_family = AF_UNIX;
1393 		os_snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s",
1394 			    path, dent->d_name);
1395 
1396 		if (sendto(drv->test_socket, cmd, os_strlen(cmd), 0,
1397 			   (struct sockaddr *) &addr, sizeof(addr)) < 0) {
1398 			perror("sendto(test_socket)");
1399 		}
1400 	}
1401 	closedir(dir);
1402 }
1403 #endif /* DRIVER_TEST_UNIX */
1404 
1405 
wpa_driver_test_scan(void * priv,struct wpa_driver_scan_params * params)1406 static int wpa_driver_test_scan(void *priv,
1407 				struct wpa_driver_scan_params *params)
1408 {
1409 	struct test_driver_bss *dbss = priv;
1410 	struct wpa_driver_test_data *drv = dbss->drv;
1411 	size_t i;
1412 
1413 	wpa_printf(MSG_DEBUG, "%s: priv=%p", __func__, priv);
1414 
1415 	os_free(drv->probe_req_ie);
1416 	if (params->extra_ies) {
1417 		drv->probe_req_ie = os_malloc(params->extra_ies_len);
1418 		if (drv->probe_req_ie == NULL) {
1419 			drv->probe_req_ie_len = 0;
1420 			return -1;
1421 		}
1422 		os_memcpy(drv->probe_req_ie, params->extra_ies,
1423 			  params->extra_ies_len);
1424 		drv->probe_req_ie_len = params->extra_ies_len;
1425 	} else {
1426 		drv->probe_req_ie = NULL;
1427 		drv->probe_req_ie_len = 0;
1428 	}
1429 
1430 	for (i = 0; i < params->num_ssids; i++)
1431 		wpa_hexdump(MSG_DEBUG, "Scan SSID",
1432 			    params->ssids[i].ssid, params->ssids[i].ssid_len);
1433 	drv->probe_req_ssid_len = 0;
1434 	if (params->num_ssids) {
1435 		os_memcpy(drv->probe_req_ssid, params->ssids[0].ssid,
1436 			  params->ssids[0].ssid_len);
1437 		drv->probe_req_ssid_len = params->ssids[0].ssid_len;
1438 	}
1439 	wpa_hexdump(MSG_DEBUG, "Scan extra IE(s)",
1440 		    params->extra_ies, params->extra_ies_len);
1441 
1442 	drv->num_scanres = 0;
1443 
1444 #ifdef DRIVER_TEST_UNIX
1445 	if (drv->test_socket >= 0 && drv->test_dir)
1446 		wpa_driver_scan_dir(drv, drv->test_dir);
1447 
1448 	if (drv->test_socket >= 0 && drv->hostapd_addr_set &&
1449 	    sendto(drv->test_socket, "SCAN", 4, 0,
1450 		   (struct sockaddr *) &drv->hostapd_addr,
1451 		   sizeof(drv->hostapd_addr)) < 0) {
1452 		perror("sendto(test_socket)");
1453 	}
1454 #endif /* DRIVER_TEST_UNIX */
1455 
1456 	if (drv->test_socket >= 0 && drv->hostapd_addr_udp_set &&
1457 	    sendto(drv->test_socket, "SCAN", 4, 0,
1458 		   (struct sockaddr *) &drv->hostapd_addr_udp,
1459 		   sizeof(drv->hostapd_addr_udp)) < 0) {
1460 		perror("sendto(test_socket)");
1461 	}
1462 
1463 	eloop_cancel_timeout(wpa_driver_test_scan_timeout, drv, drv->ctx);
1464 	eloop_register_timeout(1, 0, wpa_driver_test_scan_timeout, drv,
1465 			       drv->ctx);
1466 	return 0;
1467 }
1468 
1469 
wpa_driver_test_get_scan_results2(void * priv)1470 static struct wpa_scan_results * wpa_driver_test_get_scan_results2(void *priv)
1471 {
1472 	struct test_driver_bss *dbss = priv;
1473 	struct wpa_driver_test_data *drv = dbss->drv;
1474 	struct wpa_scan_results *res;
1475 	size_t i;
1476 
1477 	res = os_zalloc(sizeof(*res));
1478 	if (res == NULL)
1479 		return NULL;
1480 
1481 	res->res = os_zalloc(drv->num_scanres * sizeof(struct wpa_scan_res *));
1482 	if (res->res == NULL) {
1483 		os_free(res);
1484 		return NULL;
1485 	}
1486 
1487 	for (i = 0; i < drv->num_scanres; i++) {
1488 		struct wpa_scan_res *r;
1489 		if (drv->scanres[i] == NULL)
1490 			continue;
1491 		r = os_malloc(sizeof(*r) + drv->scanres[i]->ie_len);
1492 		if (r == NULL)
1493 			break;
1494 		os_memcpy(r, drv->scanres[i],
1495 			  sizeof(*r) + drv->scanres[i]->ie_len);
1496 		res->res[res->num++] = r;
1497 	}
1498 
1499 	return res;
1500 }
1501 
1502 
wpa_driver_test_set_key(const char * ifname,void * priv,enum wpa_alg alg,const u8 * addr,int key_idx,int set_tx,const u8 * seq,size_t seq_len,const u8 * key,size_t key_len)1503 static int wpa_driver_test_set_key(const char *ifname, void *priv,
1504 				   enum wpa_alg alg, const u8 *addr,
1505 				   int key_idx, int set_tx,
1506 				   const u8 *seq, size_t seq_len,
1507 				   const u8 *key, size_t key_len)
1508 {
1509 	wpa_printf(MSG_DEBUG, "%s: ifname=%s priv=%p alg=%d key_idx=%d "
1510 		   "set_tx=%d",
1511 		   __func__, ifname, priv, alg, key_idx, set_tx);
1512 	if (addr)
1513 		wpa_printf(MSG_DEBUG, "   addr=" MACSTR, MAC2STR(addr));
1514 	if (seq)
1515 		wpa_hexdump(MSG_DEBUG, "   seq", seq, seq_len);
1516 	if (key)
1517 		wpa_hexdump_key(MSG_DEBUG, "   key", key, key_len);
1518 	return 0;
1519 }
1520 
1521 
wpa_driver_update_mode(struct wpa_driver_test_data * drv,int ap)1522 static int wpa_driver_update_mode(struct wpa_driver_test_data *drv, int ap)
1523 {
1524 	if (ap && !drv->ap) {
1525 		wpa_driver_test_close_test_socket(drv);
1526 		wpa_driver_test_attach(drv, drv->test_dir, 1);
1527 		drv->ap = 1;
1528 	} else if (!ap && drv->ap) {
1529 		wpa_driver_test_close_test_socket(drv);
1530 		wpa_driver_test_attach(drv, drv->test_dir, 0);
1531 		drv->ap = 0;
1532 	}
1533 
1534 	return 0;
1535 }
1536 
1537 
wpa_driver_test_associate(void * priv,struct wpa_driver_associate_params * params)1538 static int wpa_driver_test_associate(
1539 	void *priv, struct wpa_driver_associate_params *params)
1540 {
1541 	struct test_driver_bss *dbss = priv;
1542 	struct wpa_driver_test_data *drv = dbss->drv;
1543 	wpa_printf(MSG_DEBUG, "%s: priv=%p freq=%d pairwise_suite=%d "
1544 		   "group_suite=%d key_mgmt_suite=%d auth_alg=%d mode=%d",
1545 		   __func__, priv, params->freq, params->pairwise_suite,
1546 		   params->group_suite, params->key_mgmt_suite,
1547 		   params->auth_alg, params->mode);
1548 	wpa_driver_update_mode(drv, params->mode == IEEE80211_MODE_AP);
1549 	if (params->bssid) {
1550 		wpa_printf(MSG_DEBUG, "   bssid=" MACSTR,
1551 			   MAC2STR(params->bssid));
1552 	}
1553 	if (params->ssid) {
1554 		wpa_hexdump_ascii(MSG_DEBUG, "   ssid",
1555 				  params->ssid, params->ssid_len);
1556 	}
1557 	if (params->wpa_ie) {
1558 		wpa_hexdump(MSG_DEBUG, "   wpa_ie",
1559 			    params->wpa_ie, params->wpa_ie_len);
1560 		drv->assoc_wpa_ie_len = params->wpa_ie_len;
1561 		if (drv->assoc_wpa_ie_len > sizeof(drv->assoc_wpa_ie))
1562 			drv->assoc_wpa_ie_len = sizeof(drv->assoc_wpa_ie);
1563 		os_memcpy(drv->assoc_wpa_ie, params->wpa_ie,
1564 			  drv->assoc_wpa_ie_len);
1565 	} else
1566 		drv->assoc_wpa_ie_len = 0;
1567 
1568 	wpa_driver_update_mode(drv, params->mode == IEEE80211_MODE_AP);
1569 
1570 	drv->ibss = params->mode == IEEE80211_MODE_IBSS;
1571 	dbss->privacy = params->key_mgmt_suite &
1572 		(WPA_KEY_MGMT_IEEE8021X |
1573 		 WPA_KEY_MGMT_PSK |
1574 		 WPA_KEY_MGMT_WPA_NONE |
1575 		 WPA_KEY_MGMT_FT_IEEE8021X |
1576 		 WPA_KEY_MGMT_FT_PSK |
1577 		 WPA_KEY_MGMT_IEEE8021X_SHA256 |
1578 		 WPA_KEY_MGMT_PSK_SHA256);
1579 	if (params->wep_key_len[params->wep_tx_keyidx])
1580 		dbss->privacy = 1;
1581 
1582 #ifdef DRIVER_TEST_UNIX
1583 	if (drv->test_dir && params->bssid &&
1584 	    params->mode != IEEE80211_MODE_IBSS) {
1585 		os_memset(&drv->hostapd_addr, 0, sizeof(drv->hostapd_addr));
1586 		drv->hostapd_addr.sun_family = AF_UNIX;
1587 		os_snprintf(drv->hostapd_addr.sun_path,
1588 			    sizeof(drv->hostapd_addr.sun_path),
1589 			    "%s/AP-" MACSTR,
1590 			    drv->test_dir, MAC2STR(params->bssid));
1591 		drv->hostapd_addr_set = 1;
1592 	}
1593 #endif /* DRIVER_TEST_UNIX */
1594 
1595 	if (params->mode == IEEE80211_MODE_AP) {
1596 		os_memcpy(dbss->ssid, params->ssid, params->ssid_len);
1597 		dbss->ssid_len = params->ssid_len;
1598 		os_memcpy(dbss->bssid, drv->own_addr, ETH_ALEN);
1599 		if (params->wpa_ie && params->wpa_ie_len) {
1600 			dbss->ie = os_malloc(params->wpa_ie_len);
1601 			if (dbss->ie) {
1602 				os_memcpy(dbss->ie, params->wpa_ie,
1603 					  params->wpa_ie_len);
1604 				dbss->ielen = params->wpa_ie_len;
1605 			}
1606 		}
1607 	} else if (drv->test_socket >= 0 &&
1608 		   (drv->hostapd_addr_set || drv->hostapd_addr_udp_set)) {
1609 		char cmd[200], *pos, *end;
1610 		int ret;
1611 		end = cmd + sizeof(cmd);
1612 		pos = cmd;
1613 		ret = os_snprintf(pos, end - pos, "ASSOC " MACSTR " ",
1614 				  MAC2STR(drv->own_addr));
1615 		if (ret >= 0 && ret < end - pos)
1616 			pos += ret;
1617 		pos += wpa_snprintf_hex(pos, end - pos, params->ssid,
1618 					params->ssid_len);
1619 		ret = os_snprintf(pos, end - pos, " ");
1620 		if (ret >= 0 && ret < end - pos)
1621 			pos += ret;
1622 		pos += wpa_snprintf_hex(pos, end - pos, params->wpa_ie,
1623 					params->wpa_ie_len);
1624 		end[-1] = '\0';
1625 #ifdef DRIVER_TEST_UNIX
1626 		if (drv->hostapd_addr_set &&
1627 		    sendto(drv->test_socket, cmd, os_strlen(cmd), 0,
1628 			   (struct sockaddr *) &drv->hostapd_addr,
1629 			   sizeof(drv->hostapd_addr)) < 0) {
1630 			perror("sendto(test_socket)");
1631 			return -1;
1632 		}
1633 #endif /* DRIVER_TEST_UNIX */
1634 		if (drv->hostapd_addr_udp_set &&
1635 		    sendto(drv->test_socket, cmd, os_strlen(cmd), 0,
1636 			   (struct sockaddr *) &drv->hostapd_addr_udp,
1637 			   sizeof(drv->hostapd_addr_udp)) < 0) {
1638 			perror("sendto(test_socket)");
1639 			return -1;
1640 		}
1641 
1642 		os_memcpy(dbss->ssid, params->ssid, params->ssid_len);
1643 		dbss->ssid_len = params->ssid_len;
1644 	} else {
1645 		drv->associated = 1;
1646 		if (params->mode == IEEE80211_MODE_IBSS) {
1647 			os_memcpy(dbss->ssid, params->ssid, params->ssid_len);
1648 			dbss->ssid_len = params->ssid_len;
1649 			if (params->bssid)
1650 				os_memcpy(dbss->bssid, params->bssid,
1651 					  ETH_ALEN);
1652 			else {
1653 				os_get_random(dbss->bssid, ETH_ALEN);
1654 				dbss->bssid[0] &= ~0x01;
1655 				dbss->bssid[0] |= 0x02;
1656 			}
1657 		}
1658 		wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
1659 	}
1660 
1661 	return 0;
1662 }
1663 
1664 
wpa_driver_test_get_bssid(void * priv,u8 * bssid)1665 static int wpa_driver_test_get_bssid(void *priv, u8 *bssid)
1666 {
1667 	struct test_driver_bss *dbss = priv;
1668 	os_memcpy(bssid, dbss->bssid, ETH_ALEN);
1669 	return 0;
1670 }
1671 
1672 
wpa_driver_test_get_ssid(void * priv,u8 * ssid)1673 static int wpa_driver_test_get_ssid(void *priv, u8 *ssid)
1674 {
1675 	struct test_driver_bss *dbss = priv;
1676 	os_memcpy(ssid, dbss->ssid, 32);
1677 	return dbss->ssid_len;
1678 }
1679 
1680 
wpa_driver_test_send_disassoc(struct wpa_driver_test_data * drv)1681 static int wpa_driver_test_send_disassoc(struct wpa_driver_test_data *drv)
1682 {
1683 #ifdef DRIVER_TEST_UNIX
1684 	if (drv->test_socket >= 0 &&
1685 	    sendto(drv->test_socket, "DISASSOC", 8, 0,
1686 		   (struct sockaddr *) &drv->hostapd_addr,
1687 		   sizeof(drv->hostapd_addr)) < 0) {
1688 		perror("sendto(test_socket)");
1689 		return -1;
1690 	}
1691 #endif /* DRIVER_TEST_UNIX */
1692 	if (drv->test_socket >= 0 && drv->hostapd_addr_udp_set &&
1693 	    sendto(drv->test_socket, "DISASSOC", 8, 0,
1694 		   (struct sockaddr *) &drv->hostapd_addr_udp,
1695 		   sizeof(drv->hostapd_addr_udp)) < 0) {
1696 		perror("sendto(test_socket)");
1697 		return -1;
1698 	}
1699 	return 0;
1700 }
1701 
1702 
wpa_driver_test_deauthenticate(void * priv,const u8 * addr,int reason_code)1703 static int wpa_driver_test_deauthenticate(void *priv, const u8 *addr,
1704 					  int reason_code)
1705 {
1706 	struct test_driver_bss *dbss = priv;
1707 	struct wpa_driver_test_data *drv = dbss->drv;
1708 	wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d",
1709 		   __func__, MAC2STR(addr), reason_code);
1710 	os_memset(dbss->bssid, 0, ETH_ALEN);
1711 	drv->associated = 0;
1712 	wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
1713 	return wpa_driver_test_send_disassoc(drv);
1714 }
1715 
1716 
wpa_driver_test_disassociate(void * priv,const u8 * addr,int reason_code)1717 static int wpa_driver_test_disassociate(void *priv, const u8 *addr,
1718 					int reason_code)
1719 {
1720 	struct test_driver_bss *dbss = priv;
1721 	struct wpa_driver_test_data *drv = dbss->drv;
1722 	wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d",
1723 		   __func__, MAC2STR(addr), reason_code);
1724 	os_memset(dbss->bssid, 0, ETH_ALEN);
1725 	drv->associated = 0;
1726 	wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
1727 	return wpa_driver_test_send_disassoc(drv);
1728 }
1729 
1730 
wpa_scan_get_ie(const struct wpa_scan_res * res,u8 ie)1731 static const u8 * wpa_scan_get_ie(const struct wpa_scan_res *res, u8 ie)
1732 {
1733 	const u8 *end, *pos;
1734 
1735 	pos = (const u8 *) (res + 1);
1736 	end = pos + res->ie_len;
1737 
1738 	while (pos + 1 < end) {
1739 		if (pos + 2 + pos[1] > end)
1740 			break;
1741 		if (pos[0] == ie)
1742 			return pos;
1743 		pos += 2 + pos[1];
1744 	}
1745 
1746 	return NULL;
1747 }
1748 
1749 
wpa_driver_test_scanresp(struct wpa_driver_test_data * drv,struct sockaddr * from,socklen_t fromlen,const char * data)1750 static void wpa_driver_test_scanresp(struct wpa_driver_test_data *drv,
1751 				     struct sockaddr *from,
1752 				     socklen_t fromlen,
1753 				     const char *data)
1754 {
1755 	struct wpa_scan_res *res;
1756 	const char *pos, *pos2;
1757 	size_t len;
1758 	u8 *ie_pos, *ie_start, *ie_end;
1759 #define MAX_IE_LEN 1000
1760 	const u8 *ds_params;
1761 
1762 	wpa_printf(MSG_DEBUG, "test_driver: SCANRESP %s", data);
1763 	if (drv->num_scanres >= MAX_SCAN_RESULTS) {
1764 		wpa_printf(MSG_DEBUG, "test_driver: No room for the new scan "
1765 			   "result");
1766 		return;
1767 	}
1768 
1769 	/* SCANRESP BSSID SSID IEs */
1770 
1771 	res = os_zalloc(sizeof(*res) + MAX_IE_LEN);
1772 	if (res == NULL)
1773 		return;
1774 	ie_start = ie_pos = (u8 *) (res + 1);
1775 	ie_end = ie_pos + MAX_IE_LEN;
1776 
1777 	if (hwaddr_aton(data, res->bssid)) {
1778 		wpa_printf(MSG_DEBUG, "test_driver: invalid BSSID in scanres");
1779 		os_free(res);
1780 		return;
1781 	}
1782 
1783 	pos = data + 17;
1784 	while (*pos == ' ')
1785 		pos++;
1786 	pos2 = os_strchr(pos, ' ');
1787 	if (pos2 == NULL) {
1788 		wpa_printf(MSG_DEBUG, "test_driver: invalid SSID termination "
1789 			   "in scanres");
1790 		os_free(res);
1791 		return;
1792 	}
1793 	len = (pos2 - pos) / 2;
1794 	if (len > 32)
1795 		len = 32;
1796 	/*
1797 	 * Generate SSID IE from the SSID field since this IE is not included
1798 	 * in the main IE field.
1799 	 */
1800 	*ie_pos++ = WLAN_EID_SSID;
1801 	*ie_pos++ = len;
1802 	if (hexstr2bin(pos, ie_pos, len) < 0) {
1803 		wpa_printf(MSG_DEBUG, "test_driver: invalid SSID in scanres");
1804 		os_free(res);
1805 		return;
1806 	}
1807 	ie_pos += len;
1808 
1809 	pos = pos2 + 1;
1810 	pos2 = os_strchr(pos, ' ');
1811 	if (pos2 == NULL)
1812 		len = os_strlen(pos) / 2;
1813 	else
1814 		len = (pos2 - pos) / 2;
1815 	if ((int) len > ie_end - ie_pos)
1816 		len = ie_end - ie_pos;
1817 	if (hexstr2bin(pos, ie_pos, len) < 0) {
1818 		wpa_printf(MSG_DEBUG, "test_driver: invalid IEs in scanres");
1819 		os_free(res);
1820 		return;
1821 	}
1822 	ie_pos += len;
1823 	res->ie_len = ie_pos - ie_start;
1824 
1825 	if (pos2) {
1826 		pos = pos2 + 1;
1827 		while (*pos == ' ')
1828 			pos++;
1829 		if (os_strstr(pos, "PRIVACY"))
1830 			res->caps |= IEEE80211_CAP_PRIVACY;
1831 		if (os_strstr(pos, "IBSS"))
1832 			res->caps |= IEEE80211_CAP_IBSS;
1833 	}
1834 
1835 	ds_params = wpa_scan_get_ie(res, WLAN_EID_DS_PARAMS);
1836 	if (ds_params && ds_params[1] > 0) {
1837 		if (ds_params[2] >= 1 && ds_params[2] <= 13)
1838 			res->freq = 2407 + ds_params[2] * 5;
1839 	}
1840 
1841 	os_free(drv->scanres[drv->num_scanres]);
1842 	drv->scanres[drv->num_scanres++] = res;
1843 }
1844 
1845 
wpa_driver_test_assocresp(struct wpa_driver_test_data * drv,struct sockaddr * from,socklen_t fromlen,const char * data)1846 static void wpa_driver_test_assocresp(struct wpa_driver_test_data *drv,
1847 				      struct sockaddr *from,
1848 				      socklen_t fromlen,
1849 				      const char *data)
1850 {
1851 	struct test_driver_bss *bss;
1852 
1853 	bss = dl_list_first(&drv->bss, struct test_driver_bss, list);
1854 
1855 	/* ASSOCRESP BSSID <res> */
1856 	if (hwaddr_aton(data, bss->bssid)) {
1857 		wpa_printf(MSG_DEBUG, "test_driver: invalid BSSID in "
1858 			   "assocresp");
1859 	}
1860 	if (drv->use_associnfo) {
1861 		union wpa_event_data event;
1862 		os_memset(&event, 0, sizeof(event));
1863 		event.assoc_info.req_ies = drv->assoc_wpa_ie;
1864 		event.assoc_info.req_ies_len = drv->assoc_wpa_ie_len;
1865 		wpa_supplicant_event(drv->ctx, EVENT_ASSOCINFO, &event);
1866 	}
1867 	drv->associated = 1;
1868 	wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
1869 }
1870 
1871 
wpa_driver_test_disassoc(struct wpa_driver_test_data * drv,struct sockaddr * from,socklen_t fromlen)1872 static void wpa_driver_test_disassoc(struct wpa_driver_test_data *drv,
1873 				     struct sockaddr *from,
1874 				     socklen_t fromlen)
1875 {
1876 	drv->associated = 0;
1877 	wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
1878 }
1879 
1880 
wpa_driver_test_eapol(struct wpa_driver_test_data * drv,struct sockaddr * from,socklen_t fromlen,const u8 * data,size_t data_len)1881 static void wpa_driver_test_eapol(struct wpa_driver_test_data *drv,
1882 				  struct sockaddr *from,
1883 				  socklen_t fromlen,
1884 				  const u8 *data, size_t data_len)
1885 {
1886 	const u8 *src;
1887 	struct test_driver_bss *bss;
1888 
1889 	bss = dl_list_first(&drv->bss, struct test_driver_bss, list);
1890 
1891 	if (data_len > 14) {
1892 		/* Skip Ethernet header */
1893 		src = data + ETH_ALEN;
1894 		data += 14;
1895 		data_len -= 14;
1896 	} else
1897 		src = bss->bssid;
1898 
1899 	drv_event_eapol_rx(drv->ctx, src, data, data_len);
1900 }
1901 
1902 
wpa_driver_test_mlme(struct wpa_driver_test_data * drv,struct sockaddr * from,socklen_t fromlen,const u8 * data,size_t data_len)1903 static void wpa_driver_test_mlme(struct wpa_driver_test_data *drv,
1904 				 struct sockaddr *from,
1905 				 socklen_t fromlen,
1906 				 const u8 *data, size_t data_len)
1907 {
1908 	int freq = 0, own_freq;
1909 	union wpa_event_data event;
1910 	const struct ieee80211_mgmt *mgmt;
1911 	u16 fc;
1912 	struct test_driver_bss *bss;
1913 
1914 	bss = dl_list_first(&drv->bss, struct test_driver_bss, list);
1915 	if (data_len > 6 && os_memcmp(data, "freq=", 5) == 0) {
1916 		size_t pos;
1917 		for (pos = 5; pos < data_len; pos++) {
1918 			if (data[pos] == ' ')
1919 				break;
1920 		}
1921 		if (pos < data_len) {
1922 			freq = atoi((const char *) &data[5]);
1923 			wpa_printf(MSG_DEBUG, "test_driver(%s): MLME RX on "
1924 				   "freq %d MHz", bss->ifname, freq);
1925 			pos++;
1926 			data += pos;
1927 			data_len -= pos;
1928 		}
1929 	}
1930 
1931 	if (drv->remain_on_channel_freq)
1932 		own_freq = drv->remain_on_channel_freq;
1933 	else
1934 		own_freq = drv->current_freq;
1935 
1936 	if (freq && own_freq && freq != own_freq) {
1937 		wpa_printf(MSG_DEBUG, "test_driver(%s): Ignore MLME RX on "
1938 			   "another frequency %d MHz (own %d MHz)",
1939 			   bss->ifname, freq, own_freq);
1940 		return;
1941 	}
1942 
1943 	os_memset(&event, 0, sizeof(event));
1944 	event.mlme_rx.buf = data;
1945 	event.mlme_rx.len = data_len;
1946 	event.mlme_rx.freq = freq;
1947 	wpa_supplicant_event(drv->ctx, EVENT_MLME_RX, &event);
1948 
1949 	mgmt = (const struct ieee80211_mgmt *) data;
1950 	fc = le_to_host16(mgmt->frame_control);
1951 
1952 	if (drv->probe_req_report && data_len >= 24) {
1953 		if (WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT &&
1954 		    WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_PROBE_REQ) {
1955 			os_memset(&event, 0, sizeof(event));
1956 			event.rx_probe_req.sa = mgmt->sa;
1957 			event.rx_probe_req.da = mgmt->da;
1958 			event.rx_probe_req.bssid = mgmt->bssid;
1959 			event.rx_probe_req.ie = mgmt->u.probe_req.variable;
1960 			event.rx_probe_req.ie_len =
1961 				data_len - (mgmt->u.probe_req.variable - data);
1962 			wpa_supplicant_event(drv->ctx, EVENT_RX_PROBE_REQ,
1963 					     &event);
1964 #ifdef CONFIG_P2P
1965 			if (drv->p2p)
1966 				p2p_probe_req_rx(drv->p2p, mgmt->sa,
1967 						 mgmt->da, mgmt->bssid,
1968 						 event.rx_probe_req.ie,
1969 						 event.rx_probe_req.ie_len);
1970 #endif /* CONFIG_P2P */
1971 		}
1972 	}
1973 
1974 #ifdef CONFIG_P2P
1975 	if (drv->p2p &&
1976 	    WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT &&
1977 	    WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_ACTION) {
1978 		size_t hdr_len;
1979 		hdr_len = (const u8 *)
1980 			&mgmt->u.action.u.vs_public_action.action - data;
1981 		p2p_rx_action(drv->p2p, mgmt->da, mgmt->sa, mgmt->bssid,
1982 			      mgmt->u.action.category,
1983 			      &mgmt->u.action.u.vs_public_action.action,
1984 			      data_len - hdr_len, freq);
1985 	}
1986 #endif /* CONFIG_P2P */
1987 
1988 }
1989 
1990 
wpa_driver_test_scan_cmd(struct wpa_driver_test_data * drv,struct sockaddr * from,socklen_t fromlen,const u8 * data,size_t data_len)1991 static void wpa_driver_test_scan_cmd(struct wpa_driver_test_data *drv,
1992 				     struct sockaddr *from,
1993 				     socklen_t fromlen,
1994 				     const u8 *data, size_t data_len)
1995 {
1996 	char buf[512], *pos, *end;
1997 	int ret;
1998 	struct test_driver_bss *bss;
1999 
2000 	bss = dl_list_first(&drv->bss, struct test_driver_bss, list);
2001 
2002 	/* data: optional [ STA-addr | ' ' | IEs(hex) ] */
2003 #ifdef CONFIG_P2P
2004 	if (drv->probe_req_report && drv->p2p && data_len) {
2005 		const char *d = (const char *) data;
2006 		u8 sa[ETH_ALEN];
2007 		u8 ie[512];
2008 		size_t ielen;
2009 
2010 		if (hwaddr_aton(d, sa))
2011 			return;
2012 		d += 18;
2013 		while (*d == ' ')
2014 			d++;
2015 		ielen = os_strlen(d) / 2;
2016 		if (ielen > sizeof(ie))
2017 			ielen = sizeof(ie);
2018 		if (hexstr2bin(d, ie, ielen) < 0)
2019 			ielen = 0;
2020 		drv->probe_from = from;
2021 		drv->probe_from_len = fromlen;
2022 		p2p_probe_req_rx(drv->p2p, sa, NULL, NULL, ie, ielen);
2023 		drv->probe_from = NULL;
2024 	}
2025 #endif /* CONFIG_P2P */
2026 
2027 	if (!drv->ibss)
2028 		return;
2029 
2030 	pos = buf;
2031 	end = buf + sizeof(buf);
2032 
2033 	/* reply: SCANRESP BSSID SSID IEs */
2034 	ret = snprintf(pos, end - pos, "SCANRESP " MACSTR " ",
2035 		       MAC2STR(bss->bssid));
2036 	if (ret < 0 || ret >= end - pos)
2037 		return;
2038 	pos += ret;
2039 	pos += wpa_snprintf_hex(pos, end - pos,
2040 				bss->ssid, bss->ssid_len);
2041 	ret = snprintf(pos, end - pos, " ");
2042 	if (ret < 0 || ret >= end - pos)
2043 		return;
2044 	pos += ret;
2045 	pos += wpa_snprintf_hex(pos, end - pos, drv->assoc_wpa_ie,
2046 				drv->assoc_wpa_ie_len);
2047 
2048 	if (bss->privacy) {
2049 		ret = snprintf(pos, end - pos, " PRIVACY");
2050 		if (ret < 0 || ret >= end - pos)
2051 			return;
2052 		pos += ret;
2053 	}
2054 
2055 	ret = snprintf(pos, end - pos, " IBSS");
2056 	if (ret < 0 || ret >= end - pos)
2057 		return;
2058 	pos += ret;
2059 
2060 	sendto(drv->test_socket, buf, pos - buf, 0,
2061 	       (struct sockaddr *) from, fromlen);
2062 }
2063 
2064 
wpa_driver_test_receive_unix(int sock,void * eloop_ctx,void * sock_ctx)2065 static void wpa_driver_test_receive_unix(int sock, void *eloop_ctx,
2066 					 void *sock_ctx)
2067 {
2068 	struct wpa_driver_test_data *drv = eloop_ctx;
2069 	char *buf;
2070 	int res;
2071 	struct sockaddr_storage from;
2072 	socklen_t fromlen = sizeof(from);
2073 	const size_t buflen = 2000;
2074 
2075 	if (drv->ap) {
2076 		test_driver_receive_unix(sock, eloop_ctx, sock_ctx);
2077 		return;
2078 	}
2079 
2080 	buf = os_malloc(buflen);
2081 	if (buf == NULL)
2082 		return;
2083 	res = recvfrom(sock, buf, buflen - 1, 0,
2084 		       (struct sockaddr *) &from, &fromlen);
2085 	if (res < 0) {
2086 		perror("recvfrom(test_socket)");
2087 		os_free(buf);
2088 		return;
2089 	}
2090 	buf[res] = '\0';
2091 
2092 	wpa_printf(MSG_DEBUG, "test_driver: received %u bytes", res);
2093 
2094 	if (os_strncmp(buf, "SCANRESP ", 9) == 0) {
2095 		wpa_driver_test_scanresp(drv, (struct sockaddr *) &from,
2096 					 fromlen, buf + 9);
2097 	} else if (os_strncmp(buf, "ASSOCRESP ", 10) == 0) {
2098 		wpa_driver_test_assocresp(drv, (struct sockaddr *) &from,
2099 					  fromlen, buf + 10);
2100 	} else if (os_strcmp(buf, "DISASSOC") == 0) {
2101 		wpa_driver_test_disassoc(drv, (struct sockaddr *) &from,
2102 					 fromlen);
2103 	} else if (os_strcmp(buf, "DEAUTH") == 0) {
2104 		wpa_driver_test_disassoc(drv, (struct sockaddr *) &from,
2105 					 fromlen);
2106 	} else if (os_strncmp(buf, "EAPOL ", 6) == 0) {
2107 		wpa_driver_test_eapol(drv, (struct sockaddr *) &from, fromlen,
2108 				      (const u8 *) buf + 6, res - 6);
2109 	} else if (os_strncmp(buf, "MLME ", 5) == 0) {
2110 		wpa_driver_test_mlme(drv, (struct sockaddr *) &from, fromlen,
2111 				     (const u8 *) buf + 5, res - 5);
2112 	} else if (os_strncmp(buf, "SCAN ", 5) == 0) {
2113 		wpa_driver_test_scan_cmd(drv, (struct sockaddr *) &from,
2114 					 fromlen,
2115 					 (const u8 *) buf + 5, res - 5);
2116 	} else {
2117 		wpa_hexdump_ascii(MSG_DEBUG, "Unknown test_socket command",
2118 				  (u8 *) buf, res);
2119 	}
2120 	os_free(buf);
2121 }
2122 
2123 
wpa_driver_test_init2(void * ctx,const char * ifname,void * global_priv)2124 static void * wpa_driver_test_init2(void *ctx, const char *ifname,
2125 				    void *global_priv)
2126 {
2127 	struct wpa_driver_test_data *drv;
2128 	struct wpa_driver_test_global *global = global_priv;
2129 	struct test_driver_bss *bss;
2130 
2131 	drv = test_alloc_data(ctx, ifname);
2132 	if (drv == NULL)
2133 		return NULL;
2134 	bss = dl_list_first(&drv->bss, struct test_driver_bss, list);
2135 	drv->global = global_priv;
2136 	drv->test_socket = -1;
2137 
2138 	/* Set dummy BSSID and SSID for testing. */
2139 	bss->bssid[0] = 0x02;
2140 	bss->bssid[1] = 0x00;
2141 	bss->bssid[2] = 0x00;
2142 	bss->bssid[3] = 0x00;
2143 	bss->bssid[4] = 0x00;
2144 	bss->bssid[5] = 0x01;
2145 	os_memcpy(bss->ssid, "test", 5);
2146 	bss->ssid_len = 4;
2147 
2148 	if (global->bss_add_used) {
2149 		os_memcpy(drv->own_addr, global->req_addr, ETH_ALEN);
2150 		global->bss_add_used = 0;
2151 	}
2152 
2153 	eloop_register_timeout(1, 0, wpa_driver_test_poll, drv, NULL);
2154 
2155 	return bss;
2156 }
2157 
2158 
wpa_driver_test_close_test_socket(struct wpa_driver_test_data * drv)2159 static void wpa_driver_test_close_test_socket(struct wpa_driver_test_data *drv)
2160 {
2161 	if (drv->test_socket >= 0) {
2162 		eloop_unregister_read_sock(drv->test_socket);
2163 		close(drv->test_socket);
2164 		drv->test_socket = -1;
2165 	}
2166 
2167 	if (drv->own_socket_path) {
2168 		unlink(drv->own_socket_path);
2169 		os_free(drv->own_socket_path);
2170 		drv->own_socket_path = NULL;
2171 	}
2172 }
2173 
2174 
wpa_driver_test_deinit(void * priv)2175 static void wpa_driver_test_deinit(void *priv)
2176 {
2177 	struct test_driver_bss *dbss = priv;
2178 	struct wpa_driver_test_data *drv = dbss->drv;
2179 	struct test_client_socket *cli, *prev;
2180 	int i;
2181 
2182 #ifdef CONFIG_P2P
2183 	if (drv->p2p)
2184 		p2p_deinit(drv->p2p);
2185 	wpabuf_free(drv->pending_action_tx);
2186 #endif /* CONFIG_P2P */
2187 
2188 	cli = drv->cli;
2189 	while (cli) {
2190 		prev = cli;
2191 		cli = cli->next;
2192 		os_free(prev);
2193 	}
2194 
2195 #ifdef HOSTAPD
2196 	/* There should be only one BSS remaining at this point. */
2197 	if (dl_list_len(&drv->bss) != 1)
2198 		wpa_printf(MSG_ERROR, "%s: %u remaining BSS entries",
2199 			   __func__, dl_list_len(&drv->bss));
2200 #endif /* HOSTAPD */
2201 
2202 	test_driver_free_bsses(drv);
2203 
2204 	wpa_driver_test_close_test_socket(drv);
2205 	eloop_cancel_timeout(wpa_driver_test_scan_timeout, drv, drv->ctx);
2206 	eloop_cancel_timeout(wpa_driver_test_poll, drv, NULL);
2207 	eloop_cancel_timeout(test_remain_on_channel_timeout, drv, NULL);
2208 	os_free(drv->test_dir);
2209 	for (i = 0; i < MAX_SCAN_RESULTS; i++)
2210 		os_free(drv->scanres[i]);
2211 	os_free(drv->probe_req_ie);
2212 	wpa_trace_remove_ref(drv, ctx, drv->ctx);
2213 	os_free(drv);
2214 }
2215 
2216 
wpa_driver_test_attach(struct wpa_driver_test_data * drv,const char * dir,int ap)2217 static int wpa_driver_test_attach(struct wpa_driver_test_data *drv,
2218 				  const char *dir, int ap)
2219 {
2220 #ifdef DRIVER_TEST_UNIX
2221 	static unsigned int counter = 0;
2222 	struct sockaddr_un addr;
2223 	size_t len;
2224 
2225 	os_free(drv->own_socket_path);
2226 	if (dir) {
2227 		len = os_strlen(dir) + 30;
2228 		drv->own_socket_path = os_malloc(len);
2229 		if (drv->own_socket_path == NULL)
2230 			return -1;
2231 		os_snprintf(drv->own_socket_path, len, "%s/%s-" MACSTR,
2232 			    dir, ap ? "AP" : "STA", MAC2STR(drv->own_addr));
2233 	} else {
2234 		drv->own_socket_path = os_malloc(100);
2235 		if (drv->own_socket_path == NULL)
2236 			return -1;
2237 		os_snprintf(drv->own_socket_path, 100,
2238 			    "/tmp/wpa_supplicant_test-%d-%d",
2239 			    getpid(), counter++);
2240 	}
2241 
2242 	drv->test_socket = socket(PF_UNIX, SOCK_DGRAM, 0);
2243 	if (drv->test_socket < 0) {
2244 		perror("socket(PF_UNIX)");
2245 		os_free(drv->own_socket_path);
2246 		drv->own_socket_path = NULL;
2247 		return -1;
2248 	}
2249 
2250 	os_memset(&addr, 0, sizeof(addr));
2251 	addr.sun_family = AF_UNIX;
2252 	os_strlcpy(addr.sun_path, drv->own_socket_path, sizeof(addr.sun_path));
2253 	if (bind(drv->test_socket, (struct sockaddr *) &addr,
2254 		 sizeof(addr)) < 0) {
2255 		perror("bind(PF_UNIX)");
2256 		close(drv->test_socket);
2257 		unlink(drv->own_socket_path);
2258 		os_free(drv->own_socket_path);
2259 		drv->own_socket_path = NULL;
2260 		return -1;
2261 	}
2262 
2263 	eloop_register_read_sock(drv->test_socket,
2264 				 wpa_driver_test_receive_unix, drv, NULL);
2265 
2266 	return 0;
2267 #else /* DRIVER_TEST_UNIX */
2268 	return -1;
2269 #endif /* DRIVER_TEST_UNIX */
2270 }
2271 
2272 
wpa_driver_test_attach_udp(struct wpa_driver_test_data * drv,char * dst)2273 static int wpa_driver_test_attach_udp(struct wpa_driver_test_data *drv,
2274 				      char *dst)
2275 {
2276 	char *pos;
2277 
2278 	pos = os_strchr(dst, ':');
2279 	if (pos == NULL)
2280 		return -1;
2281 	*pos++ = '\0';
2282 	wpa_printf(MSG_DEBUG, "%s: addr=%s port=%s", __func__, dst, pos);
2283 
2284 	drv->test_socket = socket(PF_INET, SOCK_DGRAM, 0);
2285 	if (drv->test_socket < 0) {
2286 		perror("socket(PF_INET)");
2287 		return -1;
2288 	}
2289 
2290 	os_memset(&drv->hostapd_addr_udp, 0, sizeof(drv->hostapd_addr_udp));
2291 	drv->hostapd_addr_udp.sin_family = AF_INET;
2292 #if defined(CONFIG_NATIVE_WINDOWS) || defined(CONFIG_ANSI_C_EXTRA)
2293 	{
2294 		int a[4];
2295 		u8 *pos;
2296 		sscanf(dst, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]);
2297 		pos = (u8 *) &drv->hostapd_addr_udp.sin_addr;
2298 		*pos++ = a[0];
2299 		*pos++ = a[1];
2300 		*pos++ = a[2];
2301 		*pos++ = a[3];
2302 	}
2303 #else /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */
2304 	inet_aton(dst, &drv->hostapd_addr_udp.sin_addr);
2305 #endif /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */
2306 	drv->hostapd_addr_udp.sin_port = htons(atoi(pos));
2307 
2308 	drv->hostapd_addr_udp_set = 1;
2309 
2310 	eloop_register_read_sock(drv->test_socket,
2311 				 wpa_driver_test_receive_unix, drv, NULL);
2312 
2313 	return 0;
2314 }
2315 
2316 
wpa_driver_test_set_param(void * priv,const char * param)2317 static int wpa_driver_test_set_param(void *priv, const char *param)
2318 {
2319 	struct test_driver_bss *dbss = priv;
2320 	struct wpa_driver_test_data *drv = dbss->drv;
2321 	const char *pos;
2322 
2323 	wpa_printf(MSG_DEBUG, "%s: param='%s'", __func__, param);
2324 	if (param == NULL)
2325 		return 0;
2326 
2327 	wpa_driver_test_close_test_socket(drv);
2328 
2329 #ifdef DRIVER_TEST_UNIX
2330 	pos = os_strstr(param, "test_socket=");
2331 	if (pos) {
2332 		const char *pos2;
2333 		size_t len;
2334 
2335 		pos += 12;
2336 		pos2 = os_strchr(pos, ' ');
2337 		if (pos2)
2338 			len = pos2 - pos;
2339 		else
2340 			len = os_strlen(pos);
2341 		if (len > sizeof(drv->hostapd_addr.sun_path))
2342 			return -1;
2343 		os_memset(&drv->hostapd_addr, 0, sizeof(drv->hostapd_addr));
2344 		drv->hostapd_addr.sun_family = AF_UNIX;
2345 		os_memcpy(drv->hostapd_addr.sun_path, pos, len);
2346 		drv->hostapd_addr_set = 1;
2347 	}
2348 #endif /* DRIVER_TEST_UNIX */
2349 
2350 	pos = os_strstr(param, "test_dir=");
2351 	if (pos) {
2352 		char *end;
2353 		os_free(drv->test_dir);
2354 		drv->test_dir = os_strdup(pos + 9);
2355 		if (drv->test_dir == NULL)
2356 			return -1;
2357 		end = os_strchr(drv->test_dir, ' ');
2358 		if (end)
2359 			*end = '\0';
2360 		if (wpa_driver_test_attach(drv, drv->test_dir, 0))
2361 			return -1;
2362 	} else {
2363 		pos = os_strstr(param, "test_udp=");
2364 		if (pos) {
2365 			char *dst, *epos;
2366 			dst = os_strdup(pos + 9);
2367 			if (dst == NULL)
2368 				return -1;
2369 			epos = os_strchr(dst, ' ');
2370 			if (epos)
2371 				*epos = '\0';
2372 			if (wpa_driver_test_attach_udp(drv, dst))
2373 				return -1;
2374 			os_free(dst);
2375 		} else if (wpa_driver_test_attach(drv, NULL, 0))
2376 			return -1;
2377 	}
2378 
2379 	if (os_strstr(param, "use_associnfo=1")) {
2380 		wpa_printf(MSG_DEBUG, "test_driver: Use AssocInfo events");
2381 		drv->use_associnfo = 1;
2382 	}
2383 
2384 	if (os_strstr(param, "p2p_mgmt=1")) {
2385 		wpa_printf(MSG_DEBUG, "test_driver: Use internal P2P "
2386 			   "management");
2387 		if (wpa_driver_test_init_p2p(drv) < 0)
2388 			return -1;
2389 	}
2390 
2391 	return 0;
2392 }
2393 
2394 
wpa_driver_test_get_mac_addr(void * priv)2395 static const u8 * wpa_driver_test_get_mac_addr(void *priv)
2396 {
2397 	struct test_driver_bss *dbss = priv;
2398 	struct wpa_driver_test_data *drv = dbss->drv;
2399 	wpa_printf(MSG_DEBUG, "%s", __func__);
2400 	return drv->own_addr;
2401 }
2402 
2403 
wpa_driver_test_send_eapol(void * priv,const u8 * dest,u16 proto,const u8 * data,size_t data_len)2404 static int wpa_driver_test_send_eapol(void *priv, const u8 *dest, u16 proto,
2405 				      const u8 *data, size_t data_len)
2406 {
2407 	struct test_driver_bss *dbss = priv;
2408 	struct wpa_driver_test_data *drv = dbss->drv;
2409 	char *msg;
2410 	size_t msg_len;
2411 	struct l2_ethhdr eth;
2412 	struct sockaddr *addr;
2413 	socklen_t alen;
2414 #ifdef DRIVER_TEST_UNIX
2415 	struct sockaddr_un addr_un;
2416 #endif /* DRIVER_TEST_UNIX */
2417 
2418 	wpa_hexdump(MSG_MSGDUMP, "test_send_eapol TX frame", data, data_len);
2419 
2420 	os_memset(&eth, 0, sizeof(eth));
2421 	os_memcpy(eth.h_dest, dest, ETH_ALEN);
2422 	os_memcpy(eth.h_source, drv->own_addr, ETH_ALEN);
2423 	eth.h_proto = host_to_be16(proto);
2424 
2425 	msg_len = 6 + sizeof(eth) + data_len;
2426 	msg = os_malloc(msg_len);
2427 	if (msg == NULL)
2428 		return -1;
2429 	os_memcpy(msg, "EAPOL ", 6);
2430 	os_memcpy(msg + 6, &eth, sizeof(eth));
2431 	os_memcpy(msg + 6 + sizeof(eth), data, data_len);
2432 
2433 	if (os_memcmp(dest, dbss->bssid, ETH_ALEN) == 0 ||
2434 	    drv->test_dir == NULL) {
2435 		if (drv->hostapd_addr_udp_set) {
2436 			addr = (struct sockaddr *) &drv->hostapd_addr_udp;
2437 			alen = sizeof(drv->hostapd_addr_udp);
2438 		} else {
2439 #ifdef DRIVER_TEST_UNIX
2440 			addr = (struct sockaddr *) &drv->hostapd_addr;
2441 			alen = sizeof(drv->hostapd_addr);
2442 #else /* DRIVER_TEST_UNIX */
2443 			os_free(msg);
2444 			return -1;
2445 #endif /* DRIVER_TEST_UNIX */
2446 		}
2447 	} else {
2448 #ifdef DRIVER_TEST_UNIX
2449 		struct stat st;
2450 		os_memset(&addr_un, 0, sizeof(addr_un));
2451 		addr_un.sun_family = AF_UNIX;
2452 		os_snprintf(addr_un.sun_path, sizeof(addr_un.sun_path),
2453 			    "%s/STA-" MACSTR, drv->test_dir, MAC2STR(dest));
2454 		if (stat(addr_un.sun_path, &st) < 0) {
2455 			os_snprintf(addr_un.sun_path, sizeof(addr_un.sun_path),
2456 				    "%s/AP-" MACSTR,
2457 				    drv->test_dir, MAC2STR(dest));
2458 		}
2459 		addr = (struct sockaddr *) &addr_un;
2460 		alen = sizeof(addr_un);
2461 #else /* DRIVER_TEST_UNIX */
2462 		os_free(msg);
2463 		return -1;
2464 #endif /* DRIVER_TEST_UNIX */
2465 	}
2466 
2467 	if (sendto(drv->test_socket, msg, msg_len, 0, addr, alen) < 0) {
2468 		perror("sendmsg(test_socket)");
2469 		os_free(msg);
2470 		return -1;
2471 	}
2472 
2473 	os_free(msg);
2474 	return 0;
2475 }
2476 
2477 
wpa_driver_test_get_capa(void * priv,struct wpa_driver_capa * capa)2478 static int wpa_driver_test_get_capa(void *priv, struct wpa_driver_capa *capa)
2479 {
2480 	struct test_driver_bss *dbss = priv;
2481 	struct wpa_driver_test_data *drv = dbss->drv;
2482 	os_memset(capa, 0, sizeof(*capa));
2483 	capa->key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA |
2484 		WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
2485 		WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
2486 		WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK |
2487 		WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE |
2488 		WPA_DRIVER_CAPA_KEY_MGMT_FT |
2489 		WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK;
2490 	capa->enc = WPA_DRIVER_CAPA_ENC_WEP40 |
2491 		WPA_DRIVER_CAPA_ENC_WEP104 |
2492 		WPA_DRIVER_CAPA_ENC_TKIP |
2493 		WPA_DRIVER_CAPA_ENC_CCMP;
2494 	capa->auth = WPA_DRIVER_AUTH_OPEN |
2495 		WPA_DRIVER_AUTH_SHARED |
2496 		WPA_DRIVER_AUTH_LEAP;
2497 	if (drv->p2p)
2498 		capa->flags |= WPA_DRIVER_FLAGS_P2P_MGMT;
2499 	capa->flags |= WPA_DRIVER_FLAGS_AP;
2500 	capa->flags |= WPA_DRIVER_FLAGS_P2P_CONCURRENT;
2501 	capa->flags |= WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE;
2502 	capa->flags |= WPA_DRIVER_FLAGS_P2P_CAPABLE;
2503 	capa->max_scan_ssids = 2;
2504 	capa->max_remain_on_chan = 60000;
2505 
2506 	return 0;
2507 }
2508 
2509 
wpa_driver_test_mlme_setprotection(void * priv,const u8 * addr,int protect_type,int key_type)2510 static int wpa_driver_test_mlme_setprotection(void *priv, const u8 *addr,
2511 					      int protect_type,
2512 					      int key_type)
2513 {
2514 	wpa_printf(MSG_DEBUG, "%s: protect_type=%d key_type=%d",
2515 		   __func__, protect_type, key_type);
2516 
2517 	if (addr) {
2518 		wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR,
2519 			   __func__, MAC2STR(addr));
2520 	}
2521 
2522 	return 0;
2523 }
2524 
2525 
wpa_driver_test_global_init(void)2526 static void * wpa_driver_test_global_init(void)
2527 {
2528 	struct wpa_driver_test_global *global;
2529 
2530 	global = os_zalloc(sizeof(*global));
2531 	return global;
2532 }
2533 
2534 
wpa_driver_test_global_deinit(void * priv)2535 static void wpa_driver_test_global_deinit(void *priv)
2536 {
2537 	struct wpa_driver_test_global *global = priv;
2538 	os_free(global);
2539 }
2540 
2541 
2542 static struct wpa_interface_info *
wpa_driver_test_get_interfaces(void * global_priv)2543 wpa_driver_test_get_interfaces(void *global_priv)
2544 {
2545 	/* struct wpa_driver_test_global *global = priv; */
2546 	struct wpa_interface_info *iface;
2547 
2548 	iface = os_zalloc(sizeof(*iface));
2549 	if (iface == NULL)
2550 		return iface;
2551 	iface->ifname = os_strdup("sta0");
2552 	iface->desc = os_strdup("test interface 0");
2553 	iface->drv_name = "test";
2554 	iface->next = os_zalloc(sizeof(*iface));
2555 	if (iface->next) {
2556 		iface->next->ifname = os_strdup("sta1");
2557 		iface->next->desc = os_strdup("test interface 1");
2558 		iface->next->drv_name = "test";
2559 	}
2560 
2561 	return iface;
2562 }
2563 
2564 
2565 static struct hostapd_hw_modes *
wpa_driver_test_get_hw_feature_data(void * priv,u16 * num_modes,u16 * flags)2566 wpa_driver_test_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags)
2567 {
2568 	struct hostapd_hw_modes *modes;
2569 	size_t i;
2570 
2571 	*num_modes = 3;
2572 	*flags = 0;
2573 	modes = os_zalloc(*num_modes * sizeof(struct hostapd_hw_modes));
2574 	if (modes == NULL)
2575 		return NULL;
2576 	modes[0].mode = HOSTAPD_MODE_IEEE80211G;
2577 	modes[0].num_channels = 11;
2578 	modes[0].num_rates = 12;
2579 	modes[0].channels =
2580 		os_zalloc(11 * sizeof(struct hostapd_channel_data));
2581 	modes[0].rates = os_zalloc(modes[0].num_rates * sizeof(int));
2582 	if (modes[0].channels == NULL || modes[0].rates == NULL)
2583 		goto fail;
2584 	for (i = 0; i < 11; i++) {
2585 		modes[0].channels[i].chan = i + 1;
2586 		modes[0].channels[i].freq = 2412 + 5 * i;
2587 		modes[0].channels[i].flag = 0;
2588 	}
2589 	modes[0].rates[0] = 10;
2590 	modes[0].rates[1] = 20;
2591 	modes[0].rates[2] = 55;
2592 	modes[0].rates[3] = 110;
2593 	modes[0].rates[4] = 60;
2594 	modes[0].rates[5] = 90;
2595 	modes[0].rates[6] = 120;
2596 	modes[0].rates[7] = 180;
2597 	modes[0].rates[8] = 240;
2598 	modes[0].rates[9] = 360;
2599 	modes[0].rates[10] = 480;
2600 	modes[0].rates[11] = 540;
2601 
2602 	modes[1].mode = HOSTAPD_MODE_IEEE80211B;
2603 	modes[1].num_channels = 11;
2604 	modes[1].num_rates = 4;
2605 	modes[1].channels =
2606 		os_zalloc(11 * sizeof(struct hostapd_channel_data));
2607 	modes[1].rates = os_zalloc(modes[1].num_rates * sizeof(int));
2608 	if (modes[1].channels == NULL || modes[1].rates == NULL)
2609 		goto fail;
2610 	for (i = 0; i < 11; i++) {
2611 		modes[1].channels[i].chan = i + 1;
2612 		modes[1].channels[i].freq = 2412 + 5 * i;
2613 		modes[1].channels[i].flag = 0;
2614 	}
2615 	modes[1].rates[0] = 10;
2616 	modes[1].rates[1] = 20;
2617 	modes[1].rates[2] = 55;
2618 	modes[1].rates[3] = 110;
2619 
2620 	modes[2].mode = HOSTAPD_MODE_IEEE80211A;
2621 	modes[2].num_channels = 1;
2622 	modes[2].num_rates = 8;
2623 	modes[2].channels = os_zalloc(sizeof(struct hostapd_channel_data));
2624 	modes[2].rates = os_zalloc(modes[2].num_rates * sizeof(int));
2625 	if (modes[2].channels == NULL || modes[2].rates == NULL)
2626 		goto fail;
2627 	modes[2].channels[0].chan = 60;
2628 	modes[2].channels[0].freq = 5300;
2629 	modes[2].channels[0].flag = 0;
2630 	modes[2].rates[0] = 60;
2631 	modes[2].rates[1] = 90;
2632 	modes[2].rates[2] = 120;
2633 	modes[2].rates[3] = 180;
2634 	modes[2].rates[4] = 240;
2635 	modes[2].rates[5] = 360;
2636 	modes[2].rates[6] = 480;
2637 	modes[2].rates[7] = 540;
2638 
2639 	return modes;
2640 
2641 fail:
2642 	if (modes) {
2643 		for (i = 0; i < *num_modes; i++) {
2644 			os_free(modes[i].channels);
2645 			os_free(modes[i].rates);
2646 		}
2647 		os_free(modes);
2648 	}
2649 	return NULL;
2650 }
2651 
2652 
wpa_driver_test_set_freq(void * priv,struct hostapd_freq_params * freq)2653 static int wpa_driver_test_set_freq(void *priv,
2654 				    struct hostapd_freq_params *freq)
2655 {
2656 	struct test_driver_bss *dbss = priv;
2657 	struct wpa_driver_test_data *drv = dbss->drv;
2658 	wpa_printf(MSG_DEBUG, "test: set_freq %u MHz", freq->freq);
2659 	drv->current_freq = freq->freq;
2660 	return 0;
2661 }
2662 
2663 
wpa_driver_test_send_action(void * priv,unsigned int freq,unsigned int wait,const u8 * dst,const u8 * src,const u8 * bssid,const u8 * data,size_t data_len,int no_cck)2664 static int wpa_driver_test_send_action(void *priv, unsigned int freq,
2665 				       unsigned int wait,
2666 				       const u8 *dst, const u8 *src,
2667 				       const u8 *bssid,
2668 				       const u8 *data, size_t data_len,
2669 				       int no_cck)
2670 {
2671 	struct test_driver_bss *dbss = priv;
2672 	struct wpa_driver_test_data *drv = dbss->drv;
2673 	int ret = -1;
2674 	u8 *buf;
2675 	struct ieee80211_hdr *hdr;
2676 
2677 	wpa_printf(MSG_DEBUG, "test: Send Action frame");
2678 
2679 	if ((drv->remain_on_channel_freq &&
2680 	     freq != drv->remain_on_channel_freq) ||
2681 	    (drv->remain_on_channel_freq == 0 &&
2682 	     freq != (unsigned int) drv->current_freq)) {
2683 		wpa_printf(MSG_DEBUG, "test: Reject Action frame TX on "
2684 			   "unexpected channel: freq=%u MHz (current_freq=%u "
2685 			   "MHz, remain-on-channel freq=%u MHz)",
2686 			   freq, drv->current_freq,
2687 			   drv->remain_on_channel_freq);
2688 		return -1;
2689 	}
2690 
2691 	buf = os_zalloc(24 + data_len);
2692 	if (buf == NULL)
2693 		return ret;
2694 	os_memcpy(buf + 24, data, data_len);
2695 	hdr = (struct ieee80211_hdr *) buf;
2696 	hdr->frame_control =
2697 		IEEE80211_FC(WLAN_FC_TYPE_MGMT, WLAN_FC_STYPE_ACTION);
2698 	os_memcpy(hdr->addr1, dst, ETH_ALEN);
2699 	os_memcpy(hdr->addr2, src, ETH_ALEN);
2700 	os_memcpy(hdr->addr3, bssid, ETH_ALEN);
2701 
2702 	ret = wpa_driver_test_send_mlme(priv, buf, 24 + data_len, 0);
2703 	os_free(buf);
2704 	return ret;
2705 }
2706 
2707 
2708 #ifdef CONFIG_P2P
test_send_action_cb(void * eloop_ctx,void * timeout_ctx)2709 static void test_send_action_cb(void *eloop_ctx, void *timeout_ctx)
2710 {
2711 	struct wpa_driver_test_data *drv = eloop_ctx;
2712 
2713 	if (drv->pending_action_tx == NULL)
2714 		return;
2715 
2716 	if (drv->off_channel_freq != drv->pending_action_freq) {
2717 		wpa_printf(MSG_DEBUG, "P2P: Pending Action frame TX "
2718 			   "waiting for another freq=%u",
2719 			   drv->pending_action_freq);
2720 		return;
2721 	}
2722 	wpa_printf(MSG_DEBUG, "P2P: Sending pending Action frame to "
2723 		   MACSTR, MAC2STR(drv->pending_action_dst));
2724 	wpa_driver_test_send_action(drv, drv->pending_action_freq, 0,
2725 				    drv->pending_action_dst,
2726 				    drv->pending_action_src,
2727 				    drv->pending_action_bssid,
2728 				    wpabuf_head(drv->pending_action_tx),
2729 				    wpabuf_len(drv->pending_action_tx),
2730 				    drv->pending_action_no_cck);
2731 }
2732 #endif /* CONFIG_P2P */
2733 
2734 
test_remain_on_channel_timeout(void * eloop_ctx,void * timeout_ctx)2735 static void test_remain_on_channel_timeout(void *eloop_ctx, void *timeout_ctx)
2736 {
2737 	struct wpa_driver_test_data *drv = eloop_ctx;
2738 	union wpa_event_data data;
2739 
2740 	wpa_printf(MSG_DEBUG, "test: Remain-on-channel timeout");
2741 
2742 	os_memset(&data, 0, sizeof(data));
2743 	data.remain_on_channel.freq = drv->remain_on_channel_freq;
2744 	data.remain_on_channel.duration = drv->remain_on_channel_duration;
2745 
2746 	if (drv->p2p)
2747 		drv->off_channel_freq = 0;
2748 
2749 	drv->remain_on_channel_freq = 0;
2750 
2751 	wpa_supplicant_event(drv->ctx, EVENT_CANCEL_REMAIN_ON_CHANNEL, &data);
2752 }
2753 
2754 
wpa_driver_test_remain_on_channel(void * priv,unsigned int freq,unsigned int duration)2755 static int wpa_driver_test_remain_on_channel(void *priv, unsigned int freq,
2756 					     unsigned int duration)
2757 {
2758 	struct test_driver_bss *dbss = priv;
2759 	struct wpa_driver_test_data *drv = dbss->drv;
2760 	union wpa_event_data data;
2761 
2762 	wpa_printf(MSG_DEBUG, "%s(freq=%u, duration=%u)",
2763 		   __func__, freq, duration);
2764 	if (drv->remain_on_channel_freq &&
2765 	    drv->remain_on_channel_freq != freq) {
2766 		wpa_printf(MSG_DEBUG, "test: Refuse concurrent "
2767 			   "remain_on_channel request");
2768 		return -1;
2769 	}
2770 
2771 	drv->remain_on_channel_freq = freq;
2772 	drv->remain_on_channel_duration = duration;
2773 	eloop_cancel_timeout(test_remain_on_channel_timeout, drv, NULL);
2774 	eloop_register_timeout(duration / 1000, (duration % 1000) * 1000,
2775 			       test_remain_on_channel_timeout, drv, NULL);
2776 
2777 	os_memset(&data, 0, sizeof(data));
2778 	data.remain_on_channel.freq = freq;
2779 	data.remain_on_channel.duration = duration;
2780 	wpa_supplicant_event(drv->ctx, EVENT_REMAIN_ON_CHANNEL, &data);
2781 
2782 #ifdef CONFIG_P2P
2783 	if (drv->p2p) {
2784 		drv->off_channel_freq = drv->remain_on_channel_freq;
2785 		test_send_action_cb(drv, NULL);
2786 		if (drv->off_channel_freq == drv->pending_listen_freq) {
2787 			p2p_listen_cb(drv->p2p, drv->pending_listen_freq,
2788 				      drv->pending_listen_duration);
2789 			drv->pending_listen_freq = 0;
2790 		}
2791 	}
2792 #endif /* CONFIG_P2P */
2793 
2794 	return 0;
2795 }
2796 
2797 
wpa_driver_test_cancel_remain_on_channel(void * priv)2798 static int wpa_driver_test_cancel_remain_on_channel(void *priv)
2799 {
2800 	struct test_driver_bss *dbss = priv;
2801 	struct wpa_driver_test_data *drv = dbss->drv;
2802 	wpa_printf(MSG_DEBUG, "%s", __func__);
2803 	if (!drv->remain_on_channel_freq)
2804 		return -1;
2805 	drv->remain_on_channel_freq = 0;
2806 	eloop_cancel_timeout(test_remain_on_channel_timeout, drv, NULL);
2807 	return 0;
2808 }
2809 
2810 
wpa_driver_test_probe_req_report(void * priv,int report)2811 static int wpa_driver_test_probe_req_report(void *priv, int report)
2812 {
2813 	struct test_driver_bss *dbss = priv;
2814 	struct wpa_driver_test_data *drv = dbss->drv;
2815 	wpa_printf(MSG_DEBUG, "%s(report=%d)", __func__, report);
2816 	drv->probe_req_report = report;
2817 	return 0;
2818 }
2819 
2820 
2821 #ifdef CONFIG_P2P
2822 
wpa_driver_test_p2p_find(void * priv,unsigned int timeout,int type)2823 static int wpa_driver_test_p2p_find(void *priv, unsigned int timeout, int type)
2824 {
2825 	struct wpa_driver_test_data *drv = priv;
2826 	wpa_printf(MSG_DEBUG, "%s(timeout=%u)", __func__, timeout);
2827 	if (!drv->p2p)
2828 		return -1;
2829 	return p2p_find(drv->p2p, timeout, type, 0, NULL, NULL);
2830 }
2831 
2832 
wpa_driver_test_p2p_stop_find(void * priv)2833 static int wpa_driver_test_p2p_stop_find(void *priv)
2834 {
2835 	struct wpa_driver_test_data *drv = priv;
2836 	wpa_printf(MSG_DEBUG, "%s", __func__);
2837 	if (!drv->p2p)
2838 		return -1;
2839 	p2p_stop_find(drv->p2p);
2840 	return 0;
2841 }
2842 
2843 
wpa_driver_test_p2p_listen(void * priv,unsigned int timeout)2844 static int wpa_driver_test_p2p_listen(void *priv, unsigned int timeout)
2845 {
2846 	struct wpa_driver_test_data *drv = priv;
2847 	wpa_printf(MSG_DEBUG, "%s(timeout=%u)", __func__, timeout);
2848 	if (!drv->p2p)
2849 		return -1;
2850 	return p2p_listen(drv->p2p, timeout);
2851 }
2852 
2853 
wpa_driver_test_p2p_connect(void * priv,const u8 * peer_addr,int wps_method,int go_intent,const u8 * own_interface_addr,unsigned int force_freq,int persistent_group)2854 static int wpa_driver_test_p2p_connect(void *priv, const u8 *peer_addr,
2855 				       int wps_method, int go_intent,
2856 				       const u8 *own_interface_addr,
2857 				       unsigned int force_freq,
2858 				       int persistent_group)
2859 {
2860 	struct wpa_driver_test_data *drv = priv;
2861 	wpa_printf(MSG_DEBUG, "%s(peer_addr=" MACSTR " wps_method=%d "
2862 		   "go_intent=%d "
2863 		   "own_interface_addr=" MACSTR " force_freq=%u "
2864 		   "persistent_group=%d)",
2865 		   __func__, MAC2STR(peer_addr), wps_method, go_intent,
2866 		   MAC2STR(own_interface_addr), force_freq, persistent_group);
2867 	if (!drv->p2p)
2868 		return -1;
2869 	return p2p_connect(drv->p2p, peer_addr, wps_method, go_intent,
2870 			   own_interface_addr, force_freq, persistent_group);
2871 }
2872 
2873 
wpa_driver_test_wps_success_cb(void * priv,const u8 * peer_addr)2874 static int wpa_driver_test_wps_success_cb(void *priv, const u8 *peer_addr)
2875 {
2876 	struct wpa_driver_test_data *drv = priv;
2877 	wpa_printf(MSG_DEBUG, "%s(peer_addr=" MACSTR ")",
2878 		   __func__, MAC2STR(peer_addr));
2879 	if (!drv->p2p)
2880 		return -1;
2881 	p2p_wps_success_cb(drv->p2p, peer_addr);
2882 	return 0;
2883 }
2884 
2885 
wpa_driver_test_p2p_group_formation_failed(void * priv)2886 static int wpa_driver_test_p2p_group_formation_failed(void *priv)
2887 {
2888 	struct wpa_driver_test_data *drv = priv;
2889 	wpa_printf(MSG_DEBUG, "%s", __func__);
2890 	if (!drv->p2p)
2891 		return -1;
2892 	p2p_group_formation_failed(drv->p2p);
2893 	return 0;
2894 }
2895 
2896 
wpa_driver_test_p2p_set_params(void * priv,const struct p2p_params * params)2897 static int wpa_driver_test_p2p_set_params(void *priv,
2898 					  const struct p2p_params *params)
2899 {
2900 	struct wpa_driver_test_data *drv = priv;
2901 	wpa_printf(MSG_DEBUG, "%s", __func__);
2902 	if (!drv->p2p)
2903 		return -1;
2904 	if (p2p_set_dev_name(drv->p2p, params->dev_name) < 0 ||
2905 	    p2p_set_pri_dev_type(drv->p2p, params->pri_dev_type) < 0 ||
2906 	    p2p_set_sec_dev_types(drv->p2p, params->sec_dev_type,
2907 				  params->num_sec_dev_types) < 0)
2908 		return -1;
2909 	return 0;
2910 }
2911 
2912 
test_p2p_scan(void * ctx,enum p2p_scan_type type,int freq,unsigned int num_req_dev_types,const u8 * req_dev_types,const u8 * dev_id)2913 static int test_p2p_scan(void *ctx, enum p2p_scan_type type, int freq,
2914 			 unsigned int num_req_dev_types,
2915 			 const u8 *req_dev_types, const u8 *dev_id)
2916 {
2917 	struct wpa_driver_test_data *drv = ctx;
2918 	struct wpa_driver_scan_params params;
2919 	int ret;
2920 	struct wpabuf *wps_ie, *ies;
2921 	int social_channels[] = { 2412, 2437, 2462, 0, 0 };
2922 	size_t ielen;
2923 
2924 	wpa_printf(MSG_DEBUG, "%s(type=%d freq=%d)",
2925 		   __func__, type, freq);
2926 
2927 	os_memset(&params, 0, sizeof(params));
2928 
2929 	/* P2P Wildcard SSID */
2930 	params.num_ssids = 1;
2931 	params.ssids[0].ssid = (u8 *) P2P_WILDCARD_SSID;
2932 	params.ssids[0].ssid_len = P2P_WILDCARD_SSID_LEN;
2933 
2934 #if 0 /* TODO: WPS IE */
2935 	wpa_s->wps->dev.p2p = 1;
2936 	wps_ie = wps_build_probe_req_ie(0, &wpa_s->wps->dev, wpa_s->wps->uuid,
2937 					WPS_REQ_ENROLLEE);
2938 #else
2939 	wps_ie = wpabuf_alloc(1);
2940 #endif
2941 	if (wps_ie == NULL)
2942 		return -1;
2943 
2944 	ielen = p2p_scan_ie_buf_len(drv->p2p);
2945 	ies = wpabuf_alloc(wpabuf_len(wps_ie) + ielen);
2946 	if (ies == NULL) {
2947 		wpabuf_free(wps_ie);
2948 		return -1;
2949 	}
2950 	wpabuf_put_buf(ies, wps_ie);
2951 	wpabuf_free(wps_ie);
2952 
2953 	p2p_scan_ie(drv->p2p, ies, dev_id);
2954 
2955 	params.extra_ies = wpabuf_head(ies);
2956 	params.extra_ies_len = wpabuf_len(ies);
2957 
2958 	switch (type) {
2959 	case P2P_SCAN_SOCIAL:
2960 		params.freqs = social_channels;
2961 		break;
2962 	case P2P_SCAN_FULL:
2963 		break;
2964 	case P2P_SCAN_SPECIFIC:
2965 		social_channels[0] = freq;
2966 		social_channels[1] = 0;
2967 		params.freqs = social_channels;
2968 		break;
2969 	case P2P_SCAN_SOCIAL_PLUS_ONE:
2970 		social_channels[3] = freq;
2971 		params.freqs = social_channels;
2972 		break;
2973 	}
2974 
2975 	drv->pending_p2p_scan = 1;
2976 	ret = wpa_driver_test_scan(drv, &params);
2977 
2978 	wpabuf_free(ies);
2979 
2980 	return ret;
2981 }
2982 
2983 
test_send_action(void * ctx,unsigned int freq,const u8 * dst,const u8 * src,const u8 * bssid,const u8 * buf,size_t len,unsigned int wait_time)2984 static int test_send_action(void *ctx, unsigned int freq, const u8 *dst,
2985 			    const u8 *src, const u8 *bssid, const u8 *buf,
2986 			    size_t len, unsigned int wait_time)
2987 {
2988 	struct wpa_driver_test_data *drv = ctx;
2989 
2990 	wpa_printf(MSG_DEBUG, "%s(freq=%u dst=" MACSTR " src=" MACSTR
2991 		   " bssid=" MACSTR " len=%d",
2992 		   __func__, freq, MAC2STR(dst), MAC2STR(src), MAC2STR(bssid),
2993 		   (int) len);
2994 	if (freq <= 0) {
2995 		wpa_printf(MSG_WARNING, "P2P: No frequency specified for "
2996 			   "action frame TX");
2997 		return -1;
2998 	}
2999 
3000 	if (drv->pending_action_tx) {
3001 		wpa_printf(MSG_DEBUG, "P2P: Dropped pending Action frame TX "
3002 			   "to " MACSTR, MAC2STR(drv->pending_action_dst));
3003 		wpabuf_free(drv->pending_action_tx);
3004 	}
3005 	drv->pending_action_tx = wpabuf_alloc(len);
3006 	if (drv->pending_action_tx == NULL)
3007 		return -1;
3008 	wpabuf_put_data(drv->pending_action_tx, buf, len);
3009 	os_memcpy(drv->pending_action_src, src, ETH_ALEN);
3010 	os_memcpy(drv->pending_action_dst, dst, ETH_ALEN);
3011 	os_memcpy(drv->pending_action_bssid, bssid, ETH_ALEN);
3012 	drv->pending_action_freq = freq;
3013 	drv->pending_action_no_cck = 1;
3014 
3015 	if (drv->off_channel_freq == freq) {
3016 		/* Already on requested channel; send immediately */
3017 		/* TODO: Would there ever be need to extend the current
3018 		 * duration on the channel? */
3019 		eloop_cancel_timeout(test_send_action_cb, drv, NULL);
3020 		eloop_register_timeout(0, 0, test_send_action_cb, drv, NULL);
3021 		return 0;
3022 	}
3023 
3024 	wpa_printf(MSG_DEBUG, "P2P: Schedule Action frame to be transmitted "
3025 		   "once the driver gets to the requested channel");
3026 	if (wpa_driver_test_remain_on_channel(drv, freq, wait_time) < 0) {
3027 		wpa_printf(MSG_DEBUG, "P2P: Failed to request driver "
3028 			   "to remain on channel (%u MHz) for Action "
3029 			   "Frame TX", freq);
3030 		return -1;
3031 	}
3032 
3033 	return 0;
3034 }
3035 
3036 
test_send_action_done(void * ctx)3037 static void test_send_action_done(void *ctx)
3038 {
3039 	wpa_printf(MSG_DEBUG, "%s", __func__);
3040 	/* TODO */
3041 }
3042 
3043 
test_go_neg_completed(void * ctx,struct p2p_go_neg_results * res)3044 static void test_go_neg_completed(void *ctx, struct p2p_go_neg_results *res)
3045 {
3046 	struct wpa_driver_test_data *drv = ctx;
3047 	union wpa_event_data event;
3048 	wpa_printf(MSG_DEBUG, "%s", __func__);
3049 	os_memset(&event, 0, sizeof(event));
3050 	event.p2p_go_neg_completed.res = res;
3051 	wpa_supplicant_event(drv->ctx, EVENT_P2P_GO_NEG_COMPLETED, &event);
3052 }
3053 
3054 
test_go_neg_req_rx(void * ctx,const u8 * src,u16 dev_passwd_id)3055 static void test_go_neg_req_rx(void *ctx, const u8 *src, u16 dev_passwd_id)
3056 {
3057 	struct wpa_driver_test_data *drv = ctx;
3058 	union wpa_event_data event;
3059 	wpa_printf(MSG_DEBUG, "%s(src=" MACSTR ")", __func__, MAC2STR(src));
3060 	os_memset(&event, 0, sizeof(event));
3061 	event.p2p_go_neg_req_rx.src = src;
3062 	event.p2p_go_neg_req_rx.dev_passwd_id = dev_passwd_id;
3063 	wpa_supplicant_event(drv->ctx, EVENT_P2P_GO_NEG_REQ_RX, &event);
3064 }
3065 
3066 
test_dev_found(void * ctx,const u8 * addr,const struct p2p_peer_info * info,int new_device)3067 static void test_dev_found(void *ctx, const u8 *addr,
3068 			   const struct p2p_peer_info *info, int new_device)
3069 {
3070 	struct wpa_driver_test_data *drv = ctx;
3071 	union wpa_event_data event;
3072 	char devtype[WPS_DEV_TYPE_BUFSIZE];
3073 	wpa_printf(MSG_DEBUG, "%s(" MACSTR " p2p_dev_addr=" MACSTR
3074 		   " pri_dev_type=%s name='%s' config_methods=0x%x "
3075 		   "dev_capab=0x%x group_capab=0x%x)",
3076 		   __func__, MAC2STR(addr), MAC2STR(info->p2p_device_addr),
3077 		   wps_dev_type_bin2str(info->pri_dev_type, devtype,
3078 					sizeof(devtype)),
3079 		   info->device_name, info->config_methods, info->dev_capab,
3080 		   info->group_capab);
3081 
3082 	os_memset(&event, 0, sizeof(event));
3083 	event.p2p_dev_found.addr = addr;
3084 	event.p2p_dev_found.dev_addr = info->p2p_device_addr;
3085 	event.p2p_dev_found.pri_dev_type = info->pri_dev_type;
3086 	event.p2p_dev_found.dev_name = info->device_name;
3087 	event.p2p_dev_found.config_methods = info->config_methods;
3088 	event.p2p_dev_found.dev_capab = info->dev_capab;
3089 	event.p2p_dev_found.group_capab = info->group_capab;
3090 	wpa_supplicant_event(drv->ctx, EVENT_P2P_DEV_FOUND, &event);
3091 }
3092 
3093 
test_start_listen(void * ctx,unsigned int freq,unsigned int duration,const struct wpabuf * probe_resp_ie)3094 static int test_start_listen(void *ctx, unsigned int freq,
3095 			     unsigned int duration,
3096 			     const struct wpabuf *probe_resp_ie)
3097 {
3098 	struct wpa_driver_test_data *drv = ctx;
3099 
3100 	wpa_printf(MSG_DEBUG, "%s(freq=%u duration=%u)",
3101 		   __func__, freq, duration);
3102 
3103 	if (wpa_driver_test_probe_req_report(drv, 1) < 0)
3104 		return -1;
3105 
3106 	drv->pending_listen_freq = freq;
3107 	drv->pending_listen_duration = duration;
3108 
3109 	if (wpa_driver_test_remain_on_channel(drv, freq, duration) < 0) {
3110 		drv->pending_listen_freq = 0;
3111 		return -1;
3112 	}
3113 
3114 	return 0;
3115 }
3116 
3117 
test_stop_listen(void * ctx)3118 static void test_stop_listen(void *ctx)
3119 {
3120 	wpa_printf(MSG_DEBUG, "%s", __func__);
3121 	/* TODO */
3122 }
3123 
3124 
test_send_probe_resp(void * ctx,const struct wpabuf * buf)3125 static int test_send_probe_resp(void *ctx, const struct wpabuf *buf)
3126 {
3127 	struct wpa_driver_test_data *drv = ctx;
3128 	char resp[512], *pos, *end;
3129 	int ret;
3130 	const struct ieee80211_mgmt *mgmt;
3131 	const u8 *ie, *ie_end;
3132 
3133 	wpa_printf(MSG_DEBUG, "%s", __func__);
3134 	wpa_hexdump_buf(MSG_MSGDUMP, "Probe Response", buf);
3135 	if (wpabuf_len(buf) < 24)
3136 		return -1;
3137 	if (!drv->probe_from) {
3138 		wpa_printf(MSG_DEBUG, "%s: probe_from not set", __func__);
3139 		return -1;
3140 	}
3141 
3142 	pos = resp;
3143 	end = resp + sizeof(resp);
3144 
3145 	mgmt = wpabuf_head(buf);
3146 
3147 	/* reply: SCANRESP BSSID SSID IEs */
3148 	ret = os_snprintf(pos, end - pos, "SCANRESP " MACSTR " ",
3149 			  MAC2STR(mgmt->bssid));
3150 	if (ret < 0 || ret >= end - pos)
3151 		return -1;
3152 	pos += ret;
3153 
3154 	ie = mgmt->u.probe_resp.variable;
3155 	ie_end = wpabuf_head_u8(buf) + wpabuf_len(buf);
3156 	if (ie_end - ie < 2 || ie[0] != WLAN_EID_SSID ||
3157 	    ie + 2 + ie[1] > ie_end)
3158 		return -1;
3159 	pos += wpa_snprintf_hex(pos, end - pos, ie + 2, ie[1]);
3160 
3161 	ret = os_snprintf(pos, end - pos, " ");
3162 	if (ret < 0 || ret >= end - pos)
3163 		return -1;
3164 	pos += ret;
3165 	pos += wpa_snprintf_hex(pos, end - pos, ie, ie_end - ie);
3166 
3167 	sendto(drv->test_socket, resp, pos - resp, 0,
3168 	       drv->probe_from, drv->probe_from_len);
3169 
3170 	return 0;
3171 }
3172 
3173 
test_sd_request(void * ctx,int freq,const u8 * sa,u8 dialog_token,u16 update_indic,const u8 * tlvs,size_t tlvs_len)3174 static void test_sd_request(void *ctx, int freq, const u8 *sa, u8 dialog_token,
3175 			    u16 update_indic, const u8 *tlvs, size_t tlvs_len)
3176 {
3177 	wpa_printf(MSG_DEBUG, "%s", __func__);
3178 	/* TODO */
3179 }
3180 
3181 
test_sd_response(void * ctx,const u8 * sa,u16 update_indic,const u8 * tlvs,size_t tlvs_len)3182 static void test_sd_response(void *ctx, const u8 *sa, u16 update_indic,
3183 			     const u8 *tlvs, size_t tlvs_len)
3184 {
3185 	wpa_printf(MSG_DEBUG, "%s", __func__);
3186 	/* TODO */
3187 }
3188 
3189 
test_prov_disc_req(void * ctx,const u8 * peer,u16 config_methods,const u8 * dev_addr,const u8 * pri_dev_type,const char * dev_name,u16 supp_config_methods,u8 dev_capab,u8 group_capab,const u8 * group_id,size_t group_id_len)3190 static void test_prov_disc_req(void *ctx, const u8 *peer, u16 config_methods,
3191 			       const u8 *dev_addr, const u8 *pri_dev_type,
3192 			       const char *dev_name, u16 supp_config_methods,
3193 			       u8 dev_capab, u8 group_capab,
3194 			       const u8 *group_id, size_t group_id_len)
3195 {
3196 	wpa_printf(MSG_DEBUG, "%s(peer=" MACSTR " config_methods=0x%x)",
3197 		   __func__, MAC2STR(peer), config_methods);
3198 	/* TODO */
3199 }
3200 
3201 
test_prov_disc_resp(void * ctx,const u8 * peer,u16 config_methods)3202 static void test_prov_disc_resp(void *ctx, const u8 *peer, u16 config_methods)
3203 {
3204 	wpa_printf(MSG_DEBUG, "%s(peer=" MACSTR " config_methods=0x%x)",
3205 		   __func__, MAC2STR(peer), config_methods);
3206 	/* TODO */
3207 }
3208 
3209 #endif /* CONFIG_P2P */
3210 
3211 
wpa_driver_test_init_p2p(struct wpa_driver_test_data * drv)3212 static int wpa_driver_test_init_p2p(struct wpa_driver_test_data *drv)
3213 {
3214 #ifdef CONFIG_P2P
3215 	struct p2p_config p2p;
3216 	unsigned int r;
3217 	int i;
3218 
3219 	os_memset(&p2p, 0, sizeof(p2p));
3220 	p2p.msg_ctx = drv->ctx;
3221 	p2p.cb_ctx = drv;
3222 	p2p.p2p_scan = test_p2p_scan;
3223 	p2p.send_action = test_send_action;
3224 	p2p.send_action_done = test_send_action_done;
3225 	p2p.go_neg_completed = test_go_neg_completed;
3226 	p2p.go_neg_req_rx = test_go_neg_req_rx;
3227 	p2p.dev_found = test_dev_found;
3228 	p2p.start_listen = test_start_listen;
3229 	p2p.stop_listen = test_stop_listen;
3230 	p2p.send_probe_resp = test_send_probe_resp;
3231 	p2p.sd_request = test_sd_request;
3232 	p2p.sd_response = test_sd_response;
3233 	p2p.prov_disc_req = test_prov_disc_req;
3234 	p2p.prov_disc_resp = test_prov_disc_resp;
3235 
3236 	os_memcpy(p2p.dev_addr, drv->own_addr, ETH_ALEN);
3237 
3238 	p2p.reg_class = 12; /* TODO: change depending on location */
3239 	/*
3240 	 * Pick one of the social channels randomly as the listen
3241 	 * channel.
3242 	 */
3243 	os_get_random((u8 *) &r, sizeof(r));
3244 	p2p.channel = 1 + (r % 3) * 5;
3245 
3246 	/* TODO: change depending on location */
3247 	p2p.op_reg_class = 12;
3248 	/*
3249 	 * For initial tests, pick the operation channel randomly.
3250 	 * TODO: Use scan results (etc.) to select the best channel.
3251 	 */
3252 	p2p.op_channel = 1 + r % 11;
3253 
3254 	os_memcpy(p2p.country, "US ", 3);
3255 
3256 	/* FIX: fetch available channels from the driver */
3257 	p2p.channels.reg_classes = 1;
3258 	p2p.channels.reg_class[0].reg_class = 12; /* US/12 = 2.4 GHz band */
3259 	p2p.channels.reg_class[0].channels = 11;
3260 	for (i = 0; i < 11; i++)
3261 		p2p.channels.reg_class[0].channel[i] = i + 1;
3262 
3263 	p2p.max_peers = 100;
3264 
3265 	drv->p2p = p2p_init(&p2p);
3266 	if (drv->p2p == NULL)
3267 		return -1;
3268 	return 0;
3269 #else /* CONFIG_P2P */
3270 	wpa_printf(MSG_INFO, "driver_test: P2P support not included");
3271 	return -1;
3272 #endif /* CONFIG_P2P */
3273 }
3274 
3275 
3276 const struct wpa_driver_ops wpa_driver_test_ops = {
3277 	"test",
3278 	"wpa_supplicant test driver",
3279 	.hapd_init = test_driver_init,
3280 	.hapd_deinit = wpa_driver_test_deinit,
3281 	.hapd_send_eapol = test_driver_send_eapol,
3282 	.send_mlme = wpa_driver_test_send_mlme,
3283 	.set_generic_elem = test_driver_set_generic_elem,
3284 	.sta_deauth = test_driver_sta_deauth,
3285 	.sta_disassoc = test_driver_sta_disassoc,
3286 	.get_hw_feature_data = wpa_driver_test_get_hw_feature_data,
3287 	.if_add = test_driver_if_add,
3288 	.if_remove = test_driver_if_remove,
3289 	.hapd_set_ssid = test_driver_set_ssid,
3290 	.set_privacy = test_driver_set_privacy,
3291 	.set_sta_vlan = test_driver_set_sta_vlan,
3292 	.sta_add = test_driver_sta_add,
3293 	.send_ether = test_driver_send_ether,
3294 	.set_ap_wps_ie = test_driver_set_ap_wps_ie,
3295 	.get_bssid = wpa_driver_test_get_bssid,
3296 	.get_ssid = wpa_driver_test_get_ssid,
3297 	.set_key = wpa_driver_test_set_key,
3298 	.deinit = wpa_driver_test_deinit,
3299 	.set_param = wpa_driver_test_set_param,
3300 	.deauthenticate = wpa_driver_test_deauthenticate,
3301 	.disassociate = wpa_driver_test_disassociate,
3302 	.associate = wpa_driver_test_associate,
3303 	.get_capa = wpa_driver_test_get_capa,
3304 	.get_mac_addr = wpa_driver_test_get_mac_addr,
3305 	.send_eapol = wpa_driver_test_send_eapol,
3306 	.mlme_setprotection = wpa_driver_test_mlme_setprotection,
3307 	.get_scan_results2 = wpa_driver_test_get_scan_results2,
3308 	.global_init = wpa_driver_test_global_init,
3309 	.global_deinit = wpa_driver_test_global_deinit,
3310 	.init2 = wpa_driver_test_init2,
3311 	.get_interfaces = wpa_driver_test_get_interfaces,
3312 	.scan2 = wpa_driver_test_scan,
3313 	.set_freq = wpa_driver_test_set_freq,
3314 	.send_action = wpa_driver_test_send_action,
3315 	.remain_on_channel = wpa_driver_test_remain_on_channel,
3316 	.cancel_remain_on_channel = wpa_driver_test_cancel_remain_on_channel,
3317 	.probe_req_report = wpa_driver_test_probe_req_report,
3318 #ifdef CONFIG_P2P
3319 	.p2p_find = wpa_driver_test_p2p_find,
3320 	.p2p_stop_find = wpa_driver_test_p2p_stop_find,
3321 	.p2p_listen = wpa_driver_test_p2p_listen,
3322 	.p2p_connect = wpa_driver_test_p2p_connect,
3323 	.wps_success_cb = wpa_driver_test_wps_success_cb,
3324 	.p2p_group_formation_failed =
3325 	wpa_driver_test_p2p_group_formation_failed,
3326 	.p2p_set_params = wpa_driver_test_p2p_set_params,
3327 #endif /* CONFIG_P2P */
3328 };
3329