driver_test.c revision 1f69aa52ea2e0a73ac502565df8c666ee49cab6a
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Testing driver interface for a simulated network driver 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2004-2010, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This program is free software; you can redistribute it and/or modify 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * it under the terms of the GNU General Public License version 2 as 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * published by the Free Software Foundation. 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * license. 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * See README and COPYING for more details. 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Make sure we get winsock2.h for Windows build to get sockaddr_storage */ 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "build_config.h" 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_NATIVE_WINDOWS 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <winsock2.h> 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */ 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/includes.h" 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_NATIVE_WINDOWS 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <sys/un.h> 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <dirent.h> 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <sys/stat.h> 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define DRIVER_TEST_UNIX 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS */ 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/common.h" 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/eloop.h" 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/list.h" 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/trace.h" 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/ieee802_11_defs.h" 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "crypto/sha1.h" 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "l2_packet/l2_packet.h" 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "p2p/p2p.h" 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wps/wps.h" 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "driver.h" 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct test_client_socket { 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_client_socket *next; 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 addr[ETH_ALEN]; 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un un; 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt socklen_t unlen; 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss; 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct test_driver_bss { 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv; 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct dl_list list; 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *bss_ctx; 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char ifname[IFNAMSIZ]; 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 bssid[ETH_ALEN]; 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ie; 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t ielen; 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *wps_beacon_ie; 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t wps_beacon_ie_len; 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *wps_probe_resp_ie; 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t wps_probe_resp_ie_len; 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 ssid[32]; 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t ssid_len; 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int privacy; 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpa_driver_test_global { 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int bss_add_used; 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 req_addr[ETH_ALEN]; 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpa_driver_test_data { 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_global *global; 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *ctx; 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_TRACE_REF(ctx); 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 own_addr[ETH_ALEN]; 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int test_socket; 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef DRIVER_TEST_UNIX 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un hostapd_addr; 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_TEST_UNIX */ 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int hostapd_addr_set; 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_in hostapd_addr_udp; 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int hostapd_addr_udp_set; 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *own_socket_path; 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *test_dir; 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define MAX_SCAN_RESULTS 30 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_scan_res *scanres[MAX_SCAN_RESULTS]; 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t num_scanres; 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int use_associnfo; 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 assoc_wpa_ie[80]; 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t assoc_wpa_ie_len; 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int associated; 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *probe_req_ie; 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t probe_req_ie_len; 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 probe_req_ssid[32]; 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t probe_req_ssid_len; 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ibss; 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ap; 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_client_socket *cli; 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct dl_list bss; 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int udp_port; 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int alloc_iface_idx; 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int probe_req_report; 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int remain_on_channel_freq; 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int remain_on_channel_duration; 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int current_freq; 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct p2p_data *p2p; 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int off_channel_freq; 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpabuf *pending_action_tx; 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 pending_action_src[ETH_ALEN]; 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 pending_action_dst[ETH_ALEN]; 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 pending_action_bssid[ETH_ALEN]; 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int pending_action_freq; 1191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt unsigned int pending_action_no_cck; 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int pending_listen_freq; 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int pending_listen_duration; 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int pending_p2p_scan; 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr *probe_from; 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt socklen_t probe_from_len; 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_driver_test_deinit(void *priv); 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_attach(struct wpa_driver_test_data *drv, 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *dir, int ap); 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_driver_test_close_test_socket( 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv); 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_remain_on_channel_timeout(void *eloop_ctx, void *timeout_ctx); 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_init_p2p(struct wpa_driver_test_data *drv); 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_driver_free_bss(struct test_driver_bss *bss) 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->ie); 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->wps_beacon_ie); 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->wps_probe_resp_ie); 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss); 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_driver_free_bsses(struct wpa_driver_test_data *drv) 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss, *tmp; 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_for_each_safe(bss, tmp, &drv->bss, struct test_driver_bss, 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt list) { 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_del(&bss->list); 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt test_driver_free_bss(bss); 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct test_client_socket * 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttest_driver_get_cli(struct wpa_driver_test_data *drv, struct sockaddr_un *from, 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt socklen_t fromlen) 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_client_socket *cli = drv->cli; 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (cli) { 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cli->unlen == fromlen && 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt strncmp(cli->un.sun_path, from->sun_path, 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fromlen - sizeof(cli->un.sun_family)) == 0) 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return cli; 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli = cli->next; 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_driver_send_eapol(void *priv, const u8 *addr, const u8 *data, 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t data_len, int encrypt, 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *own_addr, u32 flags) 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_client_socket *cli; 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct msghdr msg; 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct iovec io[3]; 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct l2_ethhdr eth; 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_socket < 0) 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli = drv->cli; 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (cli) { 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (memcmp(cli->addr, addr, ETH_ALEN) == 0) 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli = cli->next; 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!cli) { 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: no destination client entry", 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__); 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt memcpy(eth.h_dest, addr, ETH_ALEN); 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt memcpy(eth.h_source, own_addr, ETH_ALEN); 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eth.h_proto = host_to_be16(ETH_P_EAPOL); 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[0].iov_base = "EAPOL "; 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[0].iov_len = 6; 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[1].iov_base = ð 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[1].iov_len = sizeof(eth); 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[2].iov_base = (u8 *) data; 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[2].iov_len = data_len; 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt memset(&msg, 0, sizeof(msg)); 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_iov = io; 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_iovlen = 3; 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_name = &cli->un; 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_namelen = cli->unlen; 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return sendmsg(drv->test_socket, &msg, 0); 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_driver_send_ether(void *priv, const u8 *dst, const u8 *src, 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u16 proto, const u8 *data, size_t data_len) 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct msghdr msg; 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct iovec io[3]; 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct l2_ethhdr eth; 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char desttxt[30]; 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un addr; 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct dirent *dent; 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DIR *dir; 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret = 0, broadcast = 0, count = 0; 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_socket < 0 || drv->test_dir == NULL) { 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: invalid parameters (sock=%d " 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "test_dir=%p)", 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, drv->test_socket, drv->test_dir); 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt broadcast = memcmp(dst, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0; 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt snprintf(desttxt, sizeof(desttxt), MACSTR, MAC2STR(dst)); 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt memcpy(eth.h_dest, dst, ETH_ALEN); 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt memcpy(eth.h_source, src, ETH_ALEN); 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eth.h_proto = host_to_be16(proto); 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[0].iov_base = "ETHER "; 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[0].iov_len = 6; 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[1].iov_base = ð 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[1].iov_len = sizeof(eth); 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[2].iov_base = (u8 *) data; 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[2].iov_len = data_len; 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt memset(&msg, 0, sizeof(msg)); 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_iov = io; 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_iovlen = 3; 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dir = opendir(drv->test_dir); 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dir == NULL) { 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("test_driver: opendir"); 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while ((dent = readdir(dir))) { 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _DIRENT_HAVE_D_TYPE 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Skip the file if it is not a socket. Also accept 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * DT_UNKNOWN (0) in case the C library or underlying file 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * system does not support d_type. */ 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN) 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _DIRENT_HAVE_D_TYPE */ 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (strcmp(dent->d_name, ".") == 0 || 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt strcmp(dent->d_name, "..") == 0) 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt memset(&addr, 0, sizeof(addr)); 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr.sun_family = AF_UNIX; 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s", 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_dir, dent->d_name); 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (strcmp(addr.sun_path, drv->own_socket_path) == 0) 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!broadcast && strstr(dent->d_name, desttxt) == NULL) 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: Send ether frame to %s", 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, dent->d_name); 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_name = &addr; 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_namelen = sizeof(addr); 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = sendmsg(drv->test_socket, &msg, 0); 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0) 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("driver_test: sendmsg"); 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt count++; 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt closedir(dir); 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!broadcast && count == 0) { 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: Destination " MACSTR " not found", 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, MAC2STR(dst)); 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_send_mlme(void *priv, const u8 *data, 3121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t data_len, int noack) 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct msghdr msg; 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct iovec io[2]; 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *dest; 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un addr; 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct dirent *dent; 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DIR *dir; 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int broadcast; 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret = 0; 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct ieee80211_hdr *hdr; 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u16 fc; 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[50]; 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freq; 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef HOSTAPD 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char desttxt[30]; 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* HOSTAPD */ 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union wpa_event_data event; 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump(MSG_MSGDUMP, "test_send_mlme", data, data_len); 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_socket < 0 || data_len < 10) { 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: invalid parameters (sock=%d len=%lu" 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " test_dir=%p)", 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, drv->test_socket, 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (unsigned long) data_len, 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_dir); 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dest = data + 4; 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt broadcast = os_memcmp(dest, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0; 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef HOSTAPD 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt snprintf(desttxt, sizeof(desttxt), MACSTR, MAC2STR(dest)); 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* HOSTAPD */ 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->remain_on_channel_freq) 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freq = drv->remain_on_channel_freq; 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freq = drv->current_freq; 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver(%s): MLME TX on freq %d MHz", 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbss->ifname, freq); 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(cmd, sizeof(cmd), "MLME freq=%d ", freq); 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[0].iov_base = cmd; 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[0].iov_len = os_strlen(cmd); 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[1].iov_base = (void *) data; 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt io[1].iov_len = data_len; 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&msg, 0, sizeof(msg)); 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_iov = io; 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_iovlen = 2; 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef HOSTAPD 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_dir == NULL) { 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: test_dir == NULL", __func__); 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dir = opendir(drv->test_dir); 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dir == NULL) { 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("test_driver: opendir"); 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while ((dent = readdir(dir))) { 3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _DIRENT_HAVE_D_TYPE 3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Skip the file if it is not a socket. Also accept 3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * DT_UNKNOWN (0) in case the C library or underlying file 3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * system does not support d_type. */ 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN) 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _DIRENT_HAVE_D_TYPE */ 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(dent->d_name, ".") == 0 || 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strcmp(dent->d_name, "..") == 0) 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&addr, 0, sizeof(addr)); 3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr.sun_family = AF_UNIX; 3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s", 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_dir, dent->d_name); 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(addr.sun_path, drv->own_socket_path) == 0) 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!broadcast && os_strstr(dent->d_name, desttxt) == NULL) 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: Send management frame to %s", 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, dent->d_name); 4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_name = &addr; 4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_namelen = sizeof(addr); 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = sendmsg(drv->test_socket, &msg, 0); 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0) 4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("driver_test: sendmsg(test_socket)"); 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt closedir(dir); 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* HOSTAPD */ 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_memcmp(dest, dbss->bssid, ETH_ALEN) == 0 || 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_dir == NULL) { 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->hostapd_addr_udp_set) { 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_name = &drv->hostapd_addr_udp; 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_namelen = sizeof(drv->hostapd_addr_udp); 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef DRIVER_TEST_UNIX 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_name = &drv->hostapd_addr; 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_namelen = sizeof(drv->hostapd_addr); 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_TEST_UNIX */ 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (broadcast) { 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dir = opendir(drv->test_dir); 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dir == NULL) 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while ((dent = readdir(dir))) { 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _DIRENT_HAVE_D_TYPE 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Skip the file if it is not a socket. 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Also accept DT_UNKNOWN (0) in case 4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * the C library or underlying file 4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * system does not support d_type. */ 4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dent->d_type != DT_SOCK && 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dent->d_type != DT_UNKNOWN) 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _DIRENT_HAVE_D_TYPE */ 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(dent->d_name, ".") == 0 || 4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strcmp(dent->d_name, "..") == 0) 4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: Send broadcast MLME to %s", 4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, dent->d_name); 4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&addr, 0, sizeof(addr)); 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr.sun_family = AF_UNIX; 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(addr.sun_path, sizeof(addr.sun_path), 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/%s", drv->test_dir, dent->d_name); 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_name = &addr; 4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_namelen = sizeof(addr); 4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = sendmsg(drv->test_socket, &msg, 0); 4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0) 4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("driver_test: sendmsg(test_socket)"); 4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt closedir(dir); 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct stat st; 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&addr, 0, sizeof(addr)); 4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr.sun_family = AF_UNIX; 4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(addr.sun_path, sizeof(addr.sun_path), 4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/AP-" MACSTR, drv->test_dir, MAC2STR(dest)); 4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (stat(addr.sun_path, &st) < 0) { 4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(addr.sun_path, sizeof(addr.sun_path), 4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/STA-" MACSTR, 4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_dir, MAC2STR(dest)); 4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_name = &addr; 4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg.msg_namelen = sizeof(addr); 4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sendmsg(drv->test_socket, &msg, 0) < 0) { 4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("sendmsg(test_socket)"); 4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* HOSTAPD */ 4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hdr = (struct ieee80211_hdr *) data; 4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fc = le_to_host16(hdr->frame_control); 4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&event, 0, sizeof(event)); 4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.tx_status.type = WLAN_FC_GET_TYPE(fc); 4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.tx_status.stype = WLAN_FC_GET_STYPE(fc); 4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.tx_status.dst = hdr->addr1; 4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.tx_status.data = data; 4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.tx_status.data_len = data_len; 4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.tx_status.ack = ret >= 0; 4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_TX_STATUS, &event); 4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->p2p && 4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT && 4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_ACTION) { 4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->pending_action_tx == NULL) { 4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: Ignore Action TX status - " 4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "no pending operation"); 4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_memcmp(hdr->addr1, drv->pending_action_dst, ETH_ALEN) != 4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 0) { 5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: Ignore Action TX status - " 5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "unknown destination address"); 5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_free(drv->pending_action_tx); 5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->pending_action_tx = NULL; 5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p_send_action_cb(drv->p2p, drv->pending_action_freq, 5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->pending_action_dst, 5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->pending_action_src, 5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->pending_action_bssid, 5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret >= 0); 5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_driver_scan(struct wpa_driver_test_data *drv, 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un *from, socklen_t fromlen, 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *data) 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[512], *pos, *end; 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss; 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 sa[ETH_ALEN]; 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 ie[512]; 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t ielen; 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union wpa_event_data event; 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* data: optional [ ' ' | STA-addr | ' ' | IEs(hex) ] */ 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: SCAN"); 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*data) { 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*data != ' ' || 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hwaddr_aton(data + 1, sa)) { 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: Unexpected SCAN " 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "command format"); 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data += 18; 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*data == ' ') 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data++; 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ielen = os_strlen(data) / 2; 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ielen > sizeof(ie)) 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ielen = sizeof(ie); 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(data, ie, ielen) < 0) 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ielen = 0; 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: Scan from " MACSTR, 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(sa)); 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump(MSG_MSGDUMP, "test_driver: scan IEs", ie, ielen); 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&event, 0, sizeof(event)); 5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.rx_probe_req.sa = sa; 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.rx_probe_req.ie = ie; 5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.rx_probe_req.ie_len = ielen; 5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_RX_PROBE_REQ, &event); 5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->p2p) 5641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt p2p_probe_req_rx(drv->p2p, sa, NULL, NULL, ie, ielen); 5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_for_each(bss, &drv->bss, struct test_driver_bss, list) { 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = buf + sizeof(buf); 5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* reply: SCANRESP BSSID SSID IEs */ 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = snprintf(pos, end - pos, "SCANRESP " MACSTR " ", 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(bss->bssid)); 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) 5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += wpa_snprintf_hex(pos, end - pos, 5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid, bss->ssid_len); 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = snprintf(pos, end - pos, " "); 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += wpa_snprintf_hex(pos, end - pos, bss->ie, bss->ielen); 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += wpa_snprintf_hex(pos, end - pos, bss->wps_probe_resp_ie, 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_probe_resp_ie_len); 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->privacy) { 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = snprintf(pos, end - pos, " PRIVACY"); 5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) 5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sendto(drv->test_socket, buf, pos - buf, 0, 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (struct sockaddr *) from, fromlen); 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_driver_assoc(struct wpa_driver_test_data *drv, 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un *from, socklen_t fromlen, 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *data) 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_client_socket *cli; 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 ie[256], ssid[32]; 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t ielen, ssid_len = 0; 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos, *pos2, cmd[50]; 6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss, *tmp; 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* data: STA-addr SSID(hex) IEs(hex) */ 6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli = os_zalloc(sizeof(*cli)); 6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cli == NULL) 6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hwaddr_aton(data, cli->addr)) { 6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("test_socket: Invalid MAC address '%s' in ASSOC\n", 6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data); 6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(cli); 6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = data + 17; 6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ') 6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = strchr(pos, ' '); 6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ielen = 0; 6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos2) { 6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid_len = (pos2 - pos) / 2; 6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(pos, ssid, ssid_len) < 0) { 6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: Invalid SSID", __func__); 6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(cli); 6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump_ascii(MSG_DEBUG, "test_driver_assoc: SSID", 6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid, ssid_len); 6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = pos2 + 1; 6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ielen = strlen(pos) / 2; 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ielen > sizeof(ie)) 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ielen = sizeof(ie); 6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(pos, ie, ielen) < 0) 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ielen = 0; 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss = NULL; 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_for_each(tmp, &drv->bss, struct test_driver_bss, list) { 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (tmp->ssid_len == ssid_len && 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcmp(tmp->ssid, ssid, ssid_len) == 0) { 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss = tmp; 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss == NULL) { 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: No matching SSID found from " 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "configured BSSes", __func__); 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(cli); 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli->bss = bss; 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt memcpy(&cli->un, from, sizeof(cli->un)); 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli->unlen = fromlen; 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli->next = drv->cli; 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->cli = cli; 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump_ascii(MSG_DEBUG, "test_socket: ASSOC sun_path", 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (const u8 *) cli->un.sun_path, 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli->unlen - sizeof(cli->un.sun_family)); 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt snprintf(cmd, sizeof(cmd), "ASSOCRESP " MACSTR " 0", 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(bss->bssid)); 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sendto(drv->test_socket, cmd, strlen(cmd), 0, 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (struct sockaddr *) from, fromlen); 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv_event_assoc(bss->bss_ctx, cli->addr, ie, ielen, 0); 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_driver_disassoc(struct wpa_driver_test_data *drv, 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un *from, socklen_t fromlen) 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_client_socket *cli; 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli = test_driver_get_cli(drv, from, fromlen); 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!cli) 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv_event_disassoc(drv->ctx, cli->addr); 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_driver_eapol(struct wpa_driver_test_data *drv, 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un *from, socklen_t fromlen, 6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *data, size_t datalen) 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef HOSTAPD 6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_client_socket *cli; 6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* HOSTAPD */ 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *src = NULL; 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (datalen > 14) { 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Skip Ethernet header */ 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt src = data + ETH_ALEN; 7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: dst=" MACSTR " src=" 7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MACSTR " proto=%04x", 7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(data), MAC2STR(src), 7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_GET_BE16(data + 2 * ETH_ALEN)); 7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data += 14; 7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt datalen -= 14; 7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef HOSTAPD 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli = test_driver_get_cli(drv, from, fromlen); 7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cli) { 7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv_event_eapol_rx(cli->bss->bss_ctx, cli->addr, data, 7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt datalen); 7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_socket: EAPOL from unknown " 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "client"); 7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* HOSTAPD */ 7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (src) 7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv_event_eapol_rx(drv->ctx, src, data, datalen); 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* HOSTAPD */ 7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_driver_ether(struct wpa_driver_test_data *drv, 7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un *from, socklen_t fromlen, 7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *data, size_t datalen) 7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct l2_ethhdr *eth; 7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (datalen < sizeof(*eth)) 7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eth = (struct l2_ethhdr *) data; 7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: RX ETHER dst=" MACSTR " src=" 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MACSTR " proto=%04x", 7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(eth->h_dest), MAC2STR(eth->h_source), 7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt be_to_host16(eth->h_proto)); 7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_IEEE80211R 7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (be_to_host16(eth->h_proto) == ETH_P_RRB) { 7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union wpa_event_data ev; 7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&ev, 0, sizeof(ev)); 7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ev.ft_rrb_rx.src = eth->h_source; 7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ev.ft_rrb_rx.data = data + sizeof(*eth); 7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ev.ft_rrb_rx.data_len = datalen - sizeof(*eth); 7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_IEEE80211R */ 7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_driver_mlme(struct wpa_driver_test_data *drv, 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un *from, socklen_t fromlen, 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *data, size_t datalen) 7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct ieee80211_hdr *hdr; 7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u16 fc; 7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union wpa_event_data event; 7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freq = 0, own_freq; 7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss; 7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss = dl_list_first(&drv->bss, struct test_driver_bss, list); 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (datalen > 6 && os_memcmp(data, "freq=", 5) == 0) { 7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t pos; 7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (pos = 5; pos < datalen; pos++) { 7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (data[pos] == ' ') 7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos < datalen) { 7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freq = atoi((const char *) &data[5]); 7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver(%s): MLME RX on " 7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "freq %d MHz", bss->ifname, freq); 7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data += pos; 7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt datalen -= pos; 7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->remain_on_channel_freq) 7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt own_freq = drv->remain_on_channel_freq; 7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt own_freq = drv->current_freq; 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freq && own_freq && freq != own_freq) { 7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver(%s): Ignore MLME RX on " 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "another frequency %d MHz (own %d MHz)", 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ifname, freq, own_freq); 7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hdr = (struct ieee80211_hdr *) data; 7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (test_driver_get_cli(drv, from, fromlen) == NULL && datalen >= 16) { 7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_client_socket *cli; 7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli = os_zalloc(sizeof(*cli)); 8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cli == NULL) 8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Adding client entry for " MACSTR, 8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(hdr->addr2)); 8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt memcpy(cli->addr, hdr->addr2, ETH_ALEN); 8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt memcpy(&cli->un, from, sizeof(cli->un)); 8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli->unlen = fromlen; 8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli->next = drv->cli; 8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->cli = cli; 8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump(MSG_MSGDUMP, "test_driver_mlme: received frame", 8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data, datalen); 8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fc = le_to_host16(hdr->frame_control); 8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (WLAN_FC_GET_TYPE(fc) != WLAN_FC_TYPE_MGMT) { 8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "%s: received non-mgmt frame", 8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__); 8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&event, 0, sizeof(event)); 8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.rx_mgmt.frame = data; 8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.rx_mgmt.frame_len = datalen; 8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_RX_MGMT, &event); 8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_driver_receive_unix(int sock, void *eloop_ctx, void *sock_ctx) 8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = eloop_ctx; 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[2000]; 8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un from; 8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt socklen_t fromlen = sizeof(from); 8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = recvfrom(sock, buf, sizeof(buf) - 1, 0, 8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (struct sockaddr *) &from, &fromlen); 8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("recvfrom(test_socket)"); 8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[res] = '\0'; 8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: received %u bytes", res); 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (strncmp(buf, "SCAN", 4) == 0) { 8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt test_driver_scan(drv, &from, fromlen, buf + 4); 8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (strncmp(buf, "ASSOC ", 6) == 0) { 8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt test_driver_assoc(drv, &from, fromlen, buf + 6); 8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (strcmp(buf, "DISASSOC") == 0) { 8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt test_driver_disassoc(drv, &from, fromlen); 8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (strncmp(buf, "EAPOL ", 6) == 0) { 8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt test_driver_eapol(drv, &from, fromlen, (u8 *) buf + 6, 8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res - 6); 8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (strncmp(buf, "ETHER ", 6) == 0) { 8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt test_driver_ether(drv, &from, fromlen, (u8 *) buf + 6, 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res - 6); 8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (strncmp(buf, "MLME ", 5) == 0) { 8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt test_driver_mlme(drv, &from, fromlen, (u8 *) buf + 5, res - 5); 8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump_ascii(MSG_DEBUG, "Unknown test_socket command", 8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (u8 *) buf, res); 8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_driver_set_generic_elem(void *priv, 8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *elem, size_t elem_len) 8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss = priv; 8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->ie); 8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (elem == NULL) { 8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ie = NULL; 8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ielen = 0; 8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ie = os_malloc(elem_len); 8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->ie == NULL) { 8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ielen = 0; 8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt memcpy(bss->ie, elem, elem_len); 8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ielen = elem_len; 8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_driver_set_ap_wps_ie(void *priv, const struct wpabuf *beacon, 8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpabuf *proberesp, 8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpabuf *assocresp) 8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss = priv; 8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (beacon == NULL) 8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: Clear Beacon WPS IE"); 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump_buf(MSG_DEBUG, "test_driver: Beacon WPS IE", 9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt beacon); 9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->wps_beacon_ie); 9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (beacon == NULL) { 9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_beacon_ie = NULL; 9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_beacon_ie_len = 0; 9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_beacon_ie = os_malloc(wpabuf_len(beacon)); 9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->wps_beacon_ie == NULL) { 9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_beacon_ie_len = 0; 9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->wps_beacon_ie, wpabuf_head(beacon), 9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_len(beacon)); 9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_beacon_ie_len = wpabuf_len(beacon); 9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (proberesp == NULL) 9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: Clear Probe Response WPS " 9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "IE"); 9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump_buf(MSG_DEBUG, "test_driver: Probe Response WPS " 9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "IE", proberesp); 9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(bss->wps_probe_resp_ie); 9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (proberesp == NULL) { 9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_probe_resp_ie = NULL; 9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_probe_resp_ie_len = 0; 9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_probe_resp_ie = os_malloc(wpabuf_len(proberesp)); 9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->wps_probe_resp_ie == NULL) { 9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_probe_resp_ie_len = 0; 9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->wps_probe_resp_ie, wpabuf_head(proberesp), 9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_len(proberesp)); 9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->wps_probe_resp_ie_len = wpabuf_len(proberesp); 9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_driver_sta_deauth(void *priv, const u8 *own_addr, 9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *addr, int reason) 9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_client_socket *cli; 9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_socket < 0) 9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli = drv->cli; 9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (cli) { 9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (memcmp(cli->addr, addr, ETH_ALEN) == 0) 9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli = cli->next; 9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!cli) 9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return sendto(drv->test_socket, "DEAUTH", 6, 0, 9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (struct sockaddr *) &cli->un, cli->unlen); 9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_driver_sta_disassoc(void *priv, const u8 *own_addr, 9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *addr, int reason) 9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_client_socket *cli; 9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_socket < 0) 9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli = drv->cli; 9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (cli) { 9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (memcmp(cli->addr, addr, ETH_ALEN) == 0) 9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli = cli->next; 9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!cli) 9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return sendto(drv->test_socket, "DISASSOC", 8, 0, 9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (struct sockaddr *) &cli->un, cli->unlen); 9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_driver_bss_add(void *priv, const char *ifname, const u8 *bssid, 9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *bss_ctx, void **drv_priv) 10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss; 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(ifname=%s bssid=" MACSTR ")", 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, ifname, MAC2STR(bssid)); 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss = os_zalloc(sizeof(*bss)); 10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss == NULL) 10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->bss_ctx = bss_ctx; 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->drv = drv; 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(bss->ifname, ifname, IFNAMSIZ); 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->bssid, bssid, ETH_ALEN); 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_add(&drv->bss, &bss->list); 10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->global) { 10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->global->bss_add_used = 1; 10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(drv->global->req_addr, bssid, ETH_ALEN); 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv_priv) 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *drv_priv = bss; 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_driver_bss_remove(void *priv, const char *ifname) 10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss; 10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_client_socket *cli, *prev_c; 10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(ifname=%s)", __func__, ifname); 10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_for_each(bss, &drv->bss, struct test_driver_bss, list) { 10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (strcmp(bss->ifname, ifname) != 0) 10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (prev_c = NULL, cli = drv->cli; cli; 10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt prev_c = cli, cli = cli->next) { 10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cli->bss != bss) 10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (prev_c) 10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt prev_c->next = cli->next; 10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->cli = cli->next; 10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(cli); 10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_del(&bss->list); 10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt test_driver_free_bss(bss); 10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_driver_if_add(void *priv, enum wpa_driver_if_type type, 10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname, const u8 *addr, 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *bss_ctx, void **drv_priv, 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *force_ifname, u8 *if_addr, 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *bridge) 10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(type=%d ifname=%s bss_ctx=%p)", 10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, type, ifname, bss_ctx); 10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (addr) 10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(if_addr, addr, ETH_ALEN); 10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else { 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->alloc_iface_idx++; 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if_addr[0] = 0x02; /* locally administered */ 10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sha1_prf(drv->own_addr, ETH_ALEN, 10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "hostapd test addr generation", 10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (const u8 *) &drv->alloc_iface_idx, 10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(drv->alloc_iface_idx), 10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if_addr + 1, ETH_ALEN - 1); 10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (type == WPA_IF_AP_BSS || type == WPA_IF_P2P_GO || 10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt type == WPA_IF_P2P_CLIENT || type == WPA_IF_P2P_GROUP) 10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return test_driver_bss_add(priv, ifname, if_addr, bss_ctx, 10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv_priv); 10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_driver_if_remove(void *priv, enum wpa_driver_if_type type, 10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname) 10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(type=%d ifname=%s)", __func__, type, ifname); 10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (type == WPA_IF_AP_BSS || type == WPA_IF_P2P_GO || 10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt type == WPA_IF_P2P_CLIENT || type == WPA_IF_P2P_GROUP) 11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return test_driver_bss_remove(priv, ifname); 11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_driver_set_ssid(void *priv, const u8 *buf, int len) 11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss = priv; 11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(ifname=%s)", __func__, bss->ifname); 11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len < 0) 11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump_ascii(MSG_DEBUG, "test_driver_set_ssid: SSID", buf, len); 11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((size_t) len > sizeof(bss->ssid)) 11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->ssid, buf, len); 11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid_len = len; 11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_driver_set_privacy(void *priv, int enabled) 11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(enabled=%d)", __func__, enabled); 11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbss->privacy = enabled; 11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_driver_set_sta_vlan(void *priv, const u8 *addr, 11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname, int vlan_id) 11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(addr=" MACSTR " ifname=%s vlan_id=%d)", 11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, MAC2STR(addr), ifname, vlan_id); 11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_driver_sta_add(void *priv, 11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_sta_add_params *params) 11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss = priv; 11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = bss->drv; 11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_client_socket *cli; 11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(ifname=%s addr=" MACSTR " aid=%d " 11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "capability=0x%x listen_interval=%d)", 11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, bss->ifname, MAC2STR(params->addr), params->aid, 11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->capability, params->listen_interval); 11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump(MSG_DEBUG, "test_driver_sta_add - supp_rates", 11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->supp_rates, params->supp_rates_len); 11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli = drv->cli; 11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (cli) { 11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_memcmp(cli->addr, params->addr, ETH_ALEN) == 0) 11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli = cli->next; 11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!cli) { 11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: no matching client entry", 11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__); 11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli->bss = bss; 11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_driver_test_data * test_alloc_data(void *ctx, 11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *ifname) 11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv; 11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss; 11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv = os_zalloc(sizeof(struct wpa_driver_test_data)); 11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv == NULL) { 11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "Could not allocate memory for test " 11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "driver data"); 11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss = os_zalloc(sizeof(struct test_driver_bss)); 11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss == NULL) { 11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(drv); 11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->ctx = ctx; 11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_trace_add_ref(drv, ctx, ctx); 11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_init(&drv->bss); 11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dl_list_add(&drv->bss, &bss->list); 11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(bss->ifname, ifname, IFNAMSIZ); 12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->bss_ctx = ctx; 12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->drv = drv; 12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Generate a MAC address to help testing with multiple STAs */ 12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->own_addr[0] = 0x02; /* locally administered */ 12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sha1_prf((const u8 *) ifname, os_strlen(ifname), 12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "test mac addr generation", 12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NULL, 0, drv->own_addr + 1, ETH_ALEN - 1); 12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return drv; 12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void * test_driver_init(struct hostapd_data *hapd, 12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_init_params *params) 12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv; 12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un addr_un; 12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_in addr_in; 12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr *addr; 12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt socklen_t alen; 12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss; 12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv = test_alloc_data(hapd, params->ifname); 12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv == NULL) 12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->ap = 1; 12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss = dl_list_first(&drv->bss, struct test_driver_bss, list); 12281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt drv->global = params->global_priv; 12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->bss_ctx = hapd; 12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->bssid, drv->own_addr, ETH_ALEN); 12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(params->own_addr, drv->own_addr, ETH_ALEN); 12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params->test_socket) { 12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strlen(params->test_socket) >= 12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(addr_un.sun_path)) { 12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long test_socket path\n"); 12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_deinit(bss); 12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (strncmp(params->test_socket, "DIR:", 4) == 0) { 12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len = strlen(params->test_socket) + 30; 12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_dir = os_strdup(params->test_socket + 4); 12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->own_socket_path = os_malloc(len); 12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->own_socket_path) { 12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt snprintf(drv->own_socket_path, len, 12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/AP-" MACSTR, 12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->test_socket + 4, 12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(params->own_addr)); 12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (strncmp(params->test_socket, "UDP:", 4) == 0) { 12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->udp_port = atoi(params->test_socket + 4); 12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->own_socket_path = os_strdup(params->test_socket); 12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->own_socket_path == NULL && drv->udp_port == 0) { 12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_deinit(bss); 12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_socket = socket(drv->udp_port ? PF_INET : PF_UNIX, 12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SOCK_DGRAM, 0); 12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_socket < 0) { 12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("socket"); 12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_deinit(bss); 12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->udp_port) { 12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&addr_in, 0, sizeof(addr_in)); 12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr_in.sin_family = AF_INET; 12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr_in.sin_port = htons(drv->udp_port); 12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr = (struct sockaddr *) &addr_in; 12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt alen = sizeof(addr_in); 12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&addr_un, 0, sizeof(addr_un)); 12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr_un.sun_family = AF_UNIX; 12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(addr_un.sun_path, drv->own_socket_path, 12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(addr_un.sun_path)); 12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr = (struct sockaddr *) &addr_un; 12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt alen = sizeof(addr_un); 12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bind(drv->test_socket, addr, alen) < 0) { 12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("bind(PF_UNIX)"); 12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt close(drv->test_socket); 12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->own_socket_path) 12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unlink(drv->own_socket_path); 12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_deinit(bss); 12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_read_sock(drv->test_socket, 12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt test_driver_receive_unix, drv, NULL); 12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_socket = -1; 12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return bss; 12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_driver_test_poll(void *eloop_ctx, void *timeout_ctx) 13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = eloop_ctx; 13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef DRIVER_TEST_UNIX 13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->associated && drv->hostapd_addr_set) { 13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct stat st; 13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (stat(drv->hostapd_addr.sun_path, &st) < 0) { 13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: lost connection to AP: %s", 13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, strerror(errno)); 13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->associated = 0; 13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL); 13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_TEST_UNIX */ 13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_timeout(1, 0, wpa_driver_test_poll, drv, NULL); 13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_driver_test_scan_timeout(void *eloop_ctx, void *timeout_ctx) 13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = eloop_ctx; 13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "Scan timeout - try to get results"); 13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->pending_p2p_scan && drv->p2p) { 13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < drv->num_scanres; i++) { 13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_scan_res *bss = drv->scanres[i]; 13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (p2p_scan_res_handler(drv->p2p, bss->bssid, 13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->freq, bss->level, 13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (const u8 *) (bss + 1), 13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ie_len) > 0) 13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p_scan_res_handled(drv->p2p); 13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL); 13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef DRIVER_TEST_UNIX 13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_driver_scan_dir(struct wpa_driver_test_data *drv, 13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *path) 13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct dirent *dent; 13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DIR *dir; 13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un addr; 13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[512], *pos, *end; 13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dir = opendir(path); 13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dir == NULL) 13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = cmd + sizeof(cmd); 13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, "SCAN " MACSTR, 13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(drv->own_addr)); 13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret >= 0 && ret < end - pos) 13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->probe_req_ie) { 13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " "); 13658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret >= 0 && ret < end - pos) 13668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += wpa_snprintf_hex(pos, end - pos, drv->probe_req_ie, 13688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->probe_req_ie_len); 13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->probe_req_ssid_len) { 13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Add SSID IE */ 13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, "%02x%02x", 13738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_EID_SSID, 13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (unsigned int) drv->probe_req_ssid_len); 13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret >= 0 && ret < end - pos) 13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += wpa_snprintf_hex(pos, end - pos, drv->probe_req_ssid, 13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->probe_req_ssid_len); 13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end[-1] = '\0'; 13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while ((dent = readdir(dir))) { 13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncmp(dent->d_name, "AP-", 3) != 0 && 13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strncmp(dent->d_name, "STA-", 4) != 0) 13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->own_socket_path) { 13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t olen, dlen; 13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt olen = os_strlen(drv->own_socket_path); 13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dlen = os_strlen(dent->d_name); 13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (olen >= dlen && 13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strcmp(dent->d_name, 13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->own_socket_path + olen - dlen) == 0) 13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: SCAN %s", __func__, dent->d_name); 13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&addr, 0, sizeof(addr)); 13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr.sun_family = AF_UNIX; 13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s", 14008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt path, dent->d_name); 14018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sendto(drv->test_socket, cmd, os_strlen(cmd), 0, 14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (struct sockaddr *) &addr, sizeof(addr)) < 0) { 14048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("sendto(test_socket)"); 14058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt closedir(dir); 14088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_TEST_UNIX */ 14108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_scan(void *priv, 14138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params *params) 14148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 14168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 14178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 14188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: priv=%p", __func__, priv); 14208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(drv->probe_req_ie); 14228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params->extra_ies) { 14238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->probe_req_ie = os_malloc(params->extra_ies_len); 14248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->probe_req_ie == NULL) { 14258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->probe_req_ie_len = 0; 14268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 14278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(drv->probe_req_ie, params->extra_ies, 14298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies_len); 14308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->probe_req_ie_len = params->extra_ies_len; 14318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 14328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->probe_req_ie = NULL; 14338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->probe_req_ie_len = 0; 14348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < params->num_ssids; i++) 14378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump(MSG_DEBUG, "Scan SSID", 14388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->ssids[i].ssid, params->ssids[i].ssid_len); 14398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->probe_req_ssid_len = 0; 14408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params->num_ssids) { 14418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(drv->probe_req_ssid, params->ssids[0].ssid, 14428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->ssids[0].ssid_len); 14438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->probe_req_ssid_len = params->ssids[0].ssid_len; 14448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump(MSG_DEBUG, "Scan extra IE(s)", 14468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->extra_ies, params->extra_ies_len); 14478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->num_scanres = 0; 14498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef DRIVER_TEST_UNIX 14518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_socket >= 0 && drv->test_dir) 14528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_scan_dir(drv, drv->test_dir); 14538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_socket >= 0 && drv->hostapd_addr_set && 14558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sendto(drv->test_socket, "SCAN", 4, 0, 14568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (struct sockaddr *) &drv->hostapd_addr, 14578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(drv->hostapd_addr)) < 0) { 14588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("sendto(test_socket)"); 14598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_TEST_UNIX */ 14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_socket >= 0 && drv->hostapd_addr_udp_set && 14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sendto(drv->test_socket, "SCAN", 4, 0, 14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (struct sockaddr *) &drv->hostapd_addr_udp, 14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(drv->hostapd_addr_udp)) < 0) { 14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("sendto(test_socket)"); 14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_cancel_timeout(wpa_driver_test_scan_timeout, drv, drv->ctx); 14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_timeout(1, 0, wpa_driver_test_scan_timeout, drv, 14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->ctx); 14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_scan_results * wpa_driver_test_get_scan_results2(void *priv) 14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_scan_results *res; 14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_zalloc(sizeof(*res)); 14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res == NULL) 14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res->res = os_zalloc(drv->num_scanres * sizeof(struct wpa_scan_res *)); 14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res->res == NULL) { 14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(res); 14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < drv->num_scanres; i++) { 14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_scan_res *r; 14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->scanres[i] == NULL) 14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt r = os_malloc(sizeof(*r) + drv->scanres[i]->ie_len); 14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (r == NULL) 14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(r, drv->scanres[i], 15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(*r) + drv->scanres[i]->ie_len); 15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res->res[res->num++] = r; 15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return res; 15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_set_key(const char *ifname, void *priv, 15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enum wpa_alg alg, const u8 *addr, 15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int key_idx, int set_tx, 15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *seq, size_t seq_len, 15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *key, size_t key_len) 15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: ifname=%s priv=%p alg=%d key_idx=%d " 15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "set_tx=%d", 15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, ifname, priv, alg, key_idx, set_tx); 15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (addr) 15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, " addr=" MACSTR, MAC2STR(addr)); 15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (seq) 15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump(MSG_DEBUG, " seq", seq, seq_len); 15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (key) 15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump_key(MSG_DEBUG, " key", key, key_len); 15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_update_mode(struct wpa_driver_test_data *drv, int ap) 15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ap && !drv->ap) { 15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_close_test_socket(drv); 15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_attach(drv, drv->test_dir, 1); 15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->ap = 1; 15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (!ap && drv->ap) { 15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_close_test_socket(drv); 15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_attach(drv, drv->test_dir, 0); 15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->ap = 0; 15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_associate( 15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *priv, struct wpa_driver_associate_params *params) 15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: priv=%p freq=%d pairwise_suite=%d " 15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "group_suite=%d key_mgmt_suite=%d auth_alg=%d mode=%d", 15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, priv, params->freq, params->pairwise_suite, 15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->group_suite, params->key_mgmt_suite, 15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->auth_alg, params->mode); 15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_update_mode(drv, params->mode == IEEE80211_MODE_AP); 15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params->bssid) { 15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, " bssid=" MACSTR, 15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(params->bssid)); 15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params->ssid) { 15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump_ascii(MSG_DEBUG, " ssid", 15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->ssid, params->ssid_len); 15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params->wpa_ie) { 15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump(MSG_DEBUG, " wpa_ie", 15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->wpa_ie, params->wpa_ie_len); 15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->assoc_wpa_ie_len = params->wpa_ie_len; 15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->assoc_wpa_ie_len > sizeof(drv->assoc_wpa_ie)) 15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->assoc_wpa_ie_len = sizeof(drv->assoc_wpa_ie); 15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(drv->assoc_wpa_ie, params->wpa_ie, 15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->assoc_wpa_ie_len); 15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 15728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->assoc_wpa_ie_len = 0; 15738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_update_mode(drv, params->mode == IEEE80211_MODE_AP); 15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->ibss = params->mode == IEEE80211_MODE_IBSS; 15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbss->privacy = params->key_mgmt_suite & 15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (WPA_KEY_MGMT_IEEE8021X | 15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_KEY_MGMT_PSK | 15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_KEY_MGMT_WPA_NONE | 15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_KEY_MGMT_FT_IEEE8021X | 15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_KEY_MGMT_FT_PSK | 15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_KEY_MGMT_IEEE8021X_SHA256 | 15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_KEY_MGMT_PSK_SHA256); 15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params->wep_key_len[params->wep_tx_keyidx]) 15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbss->privacy = 1; 15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef DRIVER_TEST_UNIX 15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_dir && params->bssid && 15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->mode != IEEE80211_MODE_IBSS) { 15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&drv->hostapd_addr, 0, sizeof(drv->hostapd_addr)); 15928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->hostapd_addr.sun_family = AF_UNIX; 15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(drv->hostapd_addr.sun_path, 15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(drv->hostapd_addr.sun_path), 15958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/AP-" MACSTR, 15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_dir, MAC2STR(params->bssid)); 15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->hostapd_addr_set = 1; 15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_TEST_UNIX */ 16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params->mode == IEEE80211_MODE_AP) { 16028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(dbss->ssid, params->ssid, params->ssid_len); 16038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbss->ssid_len = params->ssid_len; 16048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(dbss->bssid, drv->own_addr, ETH_ALEN); 16058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params->wpa_ie && params->wpa_ie_len) { 16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbss->ie = os_malloc(params->wpa_ie_len); 16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dbss->ie) { 16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(dbss->ie, params->wpa_ie, 16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->wpa_ie_len); 16108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbss->ielen = params->wpa_ie_len; 16118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (drv->test_socket >= 0 && 16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (drv->hostapd_addr_set || drv->hostapd_addr_udp_set)) { 16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[200], *pos, *end; 16168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = cmd + sizeof(cmd); 16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 16198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, "ASSOC " MACSTR " ", 16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(drv->own_addr)); 16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret >= 0 && ret < end - pos) 16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += wpa_snprintf_hex(pos, end - pos, params->ssid, 16248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->ssid_len); 16258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " "); 16268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret >= 0 && ret < end - pos) 16278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += wpa_snprintf_hex(pos, end - pos, params->wpa_ie, 16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->wpa_ie_len); 16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end[-1] = '\0'; 16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef DRIVER_TEST_UNIX 16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->hostapd_addr_set && 16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sendto(drv->test_socket, cmd, os_strlen(cmd), 0, 16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (struct sockaddr *) &drv->hostapd_addr, 16358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(drv->hostapd_addr)) < 0) { 16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("sendto(test_socket)"); 16378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_TEST_UNIX */ 16408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->hostapd_addr_udp_set && 16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sendto(drv->test_socket, cmd, os_strlen(cmd), 0, 16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (struct sockaddr *) &drv->hostapd_addr_udp, 16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(drv->hostapd_addr_udp)) < 0) { 16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("sendto(test_socket)"); 16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(dbss->ssid, params->ssid, params->ssid_len); 16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbss->ssid_len = params->ssid_len; 16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->associated = 1; 16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params->mode == IEEE80211_MODE_IBSS) { 16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(dbss->ssid, params->ssid, params->ssid_len); 16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbss->ssid_len = params->ssid_len; 16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (params->bssid) 16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(dbss->bssid, params->bssid, 16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ETH_ALEN); 16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else { 16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_get_random(dbss->bssid, ETH_ALEN); 16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbss->bssid[0] &= ~0x01; 16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dbss->bssid[0] |= 0x02; 16628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL); 16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_get_bssid(void *priv, u8 *bssid) 16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bssid, dbss->bssid, ETH_ALEN); 16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_get_ssid(void *priv, u8 *ssid) 16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ssid, dbss->ssid, 32); 16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dbss->ssid_len; 16848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_send_disassoc(struct wpa_driver_test_data *drv) 16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef DRIVER_TEST_UNIX 16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_socket >= 0 && 16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sendto(drv->test_socket, "DISASSOC", 8, 0, 16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (struct sockaddr *) &drv->hostapd_addr, 16938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(drv->hostapd_addr)) < 0) { 16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("sendto(test_socket)"); 16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_TEST_UNIX */ 16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_socket >= 0 && drv->hostapd_addr_udp_set && 16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sendto(drv->test_socket, "DISASSOC", 8, 0, 17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (struct sockaddr *) &drv->hostapd_addr_udp, 17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(drv->hostapd_addr_udp)) < 0) { 17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("sendto(test_socket)"); 17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_deauthenticate(void *priv, const u8 *addr, 17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int reason_code) 17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d", 17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, MAC2STR(addr), reason_code); 17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(dbss->bssid, 0, ETH_ALEN); 17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->associated = 0; 17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL); 17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_driver_test_send_disassoc(drv); 17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_disassociate(void *priv, const u8 *addr, 17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int reason_code) 17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d", 17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, MAC2STR(addr), reason_code); 17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(dbss->bssid, 0, ETH_ALEN); 17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->associated = 0; 17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL); 17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_driver_test_send_disassoc(drv); 17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 * wpa_scan_get_ie(const struct wpa_scan_res *res, u8 ie) 17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *end, *pos; 17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = (const u8 *) (res + 1); 17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = pos + res->ie_len; 17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (pos + 1 < end) { 17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos + 2 + pos[1] > end) 17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos[0] == ie) 17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return pos; 17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += 2 + pos[1]; 17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_driver_test_scanresp(struct wpa_driver_test_data *drv, 17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr *from, 17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt socklen_t fromlen, 17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *data) 17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_scan_res *res; 17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *pos, *pos2; 17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *ie_pos, *ie_start, *ie_end; 17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define MAX_IE_LEN 1000 17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ds_params; 17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: SCANRESP %s", data); 17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->num_scanres >= MAX_SCAN_RESULTS) { 17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: No room for the new scan " 17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "result"); 17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* SCANRESP BSSID SSID IEs */ 17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_zalloc(sizeof(*res) + MAX_IE_LEN); 17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res == NULL) 17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie_start = ie_pos = (u8 *) (res + 1); 17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie_end = ie_pos + MAX_IE_LEN; 17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hwaddr_aton(data, res->bssid)) { 17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: invalid BSSID in scanres"); 17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(res); 17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = data + 17; 17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ') 17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = os_strchr(pos, ' '); 17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos2 == NULL) { 17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: invalid SSID termination " 17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "in scanres"); 17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(res); 17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = (pos2 - pos) / 2; 18008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len > 32) 18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = 32; 18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Generate SSID IE from the SSID field since this IE is not included 18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * in the main IE field. 18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *ie_pos++ = WLAN_EID_SSID; 18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *ie_pos++ = len; 18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(pos, ie_pos, len) < 0) { 18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: invalid SSID in scanres"); 18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(res); 18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie_pos += len; 18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = pos2 + 1; 18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = os_strchr(pos, ' '); 18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos2 == NULL) 18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = os_strlen(pos) / 2; 18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = (pos2 - pos) / 2; 18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((int) len > ie_end - ie_pos) 18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = ie_end - ie_pos; 18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(pos, ie_pos, len) < 0) { 18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: invalid IEs in scanres"); 18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(res); 18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie_pos += len; 18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res->ie_len = ie_pos - ie_start; 18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos2) { 18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = pos2 + 1; 18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ') 18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(pos, "PRIVACY")) 18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res->caps |= IEEE80211_CAP_PRIVACY; 18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(pos, "IBSS")) 18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res->caps |= IEEE80211_CAP_IBSS; 18398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ds_params = wpa_scan_get_ie(res, WLAN_EID_DS_PARAMS); 18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ds_params && ds_params[1] > 0) { 18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ds_params[2] >= 1 && ds_params[2] <= 13) 18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res->freq = 2407 + ds_params[2] * 5; 18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(drv->scanres[drv->num_scanres]); 18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->scanres[drv->num_scanres++] = res; 18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_driver_test_assocresp(struct wpa_driver_test_data *drv, 18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr *from, 18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt socklen_t fromlen, 18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *data) 18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss; 18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss = dl_list_first(&drv->bss, struct test_driver_bss, list); 18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* ASSOCRESP BSSID <res> */ 18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hwaddr_aton(data, bss->bssid)) { 18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: invalid BSSID in " 18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "assocresp"); 18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->use_associnfo) { 18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union wpa_event_data event; 18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&event, 0, sizeof(event)); 18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.assoc_info.req_ies = drv->assoc_wpa_ie; 18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.assoc_info.req_ies_len = drv->assoc_wpa_ie_len; 18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_ASSOCINFO, &event); 18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->associated = 1; 18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL); 18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_driver_test_disassoc(struct wpa_driver_test_data *drv, 18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr *from, 18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt socklen_t fromlen) 18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->associated = 0; 18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL); 18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_driver_test_eapol(struct wpa_driver_test_data *drv, 18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr *from, 18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt socklen_t fromlen, 18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *data, size_t data_len) 18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *src; 18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss; 18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss = dl_list_first(&drv->bss, struct test_driver_bss, list); 18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (data_len > 14) { 18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Skip Ethernet header */ 18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt src = data + ETH_ALEN; 19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data += 14; 19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data_len -= 14; 19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else 19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt src = bss->bssid; 19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv_event_eapol_rx(drv->ctx, src, data, data_len); 19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_driver_test_mlme(struct wpa_driver_test_data *drv, 19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr *from, 19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt socklen_t fromlen, 19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *data, size_t data_len) 19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int freq = 0, own_freq; 19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union wpa_event_data event; 19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct ieee80211_mgmt *mgmt; 19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u16 fc; 19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss; 19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss = dl_list_first(&drv->bss, struct test_driver_bss, list); 19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (data_len > 6 && os_memcmp(data, "freq=", 5) == 0) { 19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t pos; 19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (pos = 5; pos < data_len; pos++) { 19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (data[pos] == ' ') 19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos < data_len) { 19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freq = atoi((const char *) &data[5]); 19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver(%s): MLME RX on " 19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "freq %d MHz", bss->ifname, freq); 19318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data += pos; 19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data_len -= pos; 19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->remain_on_channel_freq) 19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt own_freq = drv->remain_on_channel_freq; 19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt own_freq = drv->current_freq; 19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freq && own_freq && freq != own_freq) { 19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver(%s): Ignore MLME RX on " 19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "another frequency %d MHz (own %d MHz)", 19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ifname, freq, own_freq); 19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&event, 0, sizeof(event)); 19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.mlme_rx.buf = data; 19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.mlme_rx.len = data_len; 19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.mlme_rx.freq = freq; 19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_MLME_RX, &event); 19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mgmt = (const struct ieee80211_mgmt *) data; 19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fc = le_to_host16(mgmt->frame_control); 19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->probe_req_report && data_len >= 24) { 19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT && 19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_PROBE_REQ) { 19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&event, 0, sizeof(event)); 19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.rx_probe_req.sa = mgmt->sa; 19631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt event.rx_probe_req.da = mgmt->da; 19641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt event.rx_probe_req.bssid = mgmt->bssid; 19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.rx_probe_req.ie = mgmt->u.probe_req.variable; 19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.rx_probe_req.ie_len = 19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data_len - (mgmt->u.probe_req.variable - data); 19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_RX_PROBE_REQ, 19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &event); 19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->p2p) 19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p_probe_req_rx(drv->p2p, mgmt->sa, 19731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt mgmt->da, mgmt->bssid, 19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.rx_probe_req.ie, 19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.rx_probe_req.ie_len); 19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->p2p && 19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT && 19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_ACTION) { 19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t hdr_len; 19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hdr_len = (const u8 *) 19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &mgmt->u.action.u.vs_public_action.action - data; 19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p_rx_action(drv->p2p, mgmt->da, mgmt->sa, mgmt->bssid, 19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mgmt->u.action.category, 19898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt &mgmt->u.action.u.vs_public_action.action, 19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data_len - hdr_len, freq); 19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_driver_test_scan_cmd(struct wpa_driver_test_data *drv, 19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr *from, 19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt socklen_t fromlen, 20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *data, size_t data_len) 20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[512], *pos, *end; 20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss; 20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss = dl_list_first(&drv->bss, struct test_driver_bss, list); 20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* data: optional [ STA-addr | ' ' | IEs(hex) ] */ 20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->probe_req_report && drv->p2p && data_len) { 20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *d = (const char *) data; 20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 sa[ETH_ALEN]; 20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 ie[512]; 20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t ielen; 20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hwaddr_aton(d, sa)) 20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt d += 18; 20198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*d == ' ') 20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt d++; 20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ielen = os_strlen(d) / 2; 20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ielen > sizeof(ie)) 20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ielen = sizeof(ie); 20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hexstr2bin(d, ie, ielen) < 0) 20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ielen = 0; 20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->probe_from = from; 20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->probe_from_len = fromlen; 20281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt p2p_probe_req_rx(drv->p2p, sa, NULL, NULL, ie, ielen); 20298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->probe_from = NULL; 20308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 20328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!drv->ibss) 20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = buf + sizeof(buf); 20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* reply: SCANRESP BSSID SSID IEs */ 20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = snprintf(pos, end - pos, "SCANRESP " MACSTR " ", 20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(bss->bssid)); 20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) 20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 20458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += wpa_snprintf_hex(pos, end - pos, 20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid, bss->ssid_len); 20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = snprintf(pos, end - pos, " "); 20488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) 20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 20518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += wpa_snprintf_hex(pos, end - pos, drv->assoc_wpa_ie, 20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->assoc_wpa_ie_len); 20538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bss->privacy) { 20558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = snprintf(pos, end - pos, " PRIVACY"); 20568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) 20578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 20588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 20598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = snprintf(pos, end - pos, " IBSS"); 20628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) 20638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 20648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 20658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sendto(drv->test_socket, buf, pos - buf, 0, 20678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (struct sockaddr *) from, fromlen); 20688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_driver_test_receive_unix(int sock, void *eloop_ctx, 20728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *sock_ctx) 20738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = eloop_ctx; 20758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf; 20768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 20778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_storage from; 20788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt socklen_t fromlen = sizeof(from); 20798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const size_t buflen = 2000; 20808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->ap) { 20828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt test_driver_receive_unix(sock, eloop_ctx, sock_ctx); 20838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 20848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf = os_malloc(buflen); 20878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) 20888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 20898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = recvfrom(sock, buf, buflen - 1, 0, 20908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (struct sockaddr *) &from, &fromlen); 20918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0) { 20928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("recvfrom(test_socket)"); 20938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(buf); 20948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 20958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[res] = '\0'; 20978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: received %u bytes", res); 20998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncmp(buf, "SCANRESP ", 9) == 0) { 21018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_scanresp(drv, (struct sockaddr *) &from, 21028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fromlen, buf + 9); 21038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strncmp(buf, "ASSOCRESP ", 10) == 0) { 21048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_assocresp(drv, (struct sockaddr *) &from, 21058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fromlen, buf + 10); 21068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "DISASSOC") == 0) { 21078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_disassoc(drv, (struct sockaddr *) &from, 21088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fromlen); 21098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strcmp(buf, "DEAUTH") == 0) { 21108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_disassoc(drv, (struct sockaddr *) &from, 21118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fromlen); 21128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strncmp(buf, "EAPOL ", 6) == 0) { 21138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_eapol(drv, (struct sockaddr *) &from, fromlen, 21148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (const u8 *) buf + 6, res - 6); 21158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strncmp(buf, "MLME ", 5) == 0) { 21168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_mlme(drv, (struct sockaddr *) &from, fromlen, 21178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (const u8 *) buf + 5, res - 5); 21188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (os_strncmp(buf, "SCAN ", 5) == 0) { 21198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_scan_cmd(drv, (struct sockaddr *) &from, 21208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fromlen, 21218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (const u8 *) buf + 5, res - 5); 21228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 21238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump_ascii(MSG_DEBUG, "Unknown test_socket command", 21248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (u8 *) buf, res); 21258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(buf); 21278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void * wpa_driver_test_init2(void *ctx, const char *ifname, 21318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *global_priv) 21328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv; 21348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_global *global = global_priv; 21358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *bss; 21368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv = test_alloc_data(ctx, ifname); 21388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv == NULL) 21398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 21408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss = dl_list_first(&drv->bss, struct test_driver_bss, list); 21418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->global = global_priv; 21428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_socket = -1; 21438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Set dummy BSSID and SSID for testing. */ 21458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->bssid[0] = 0x02; 21468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->bssid[1] = 0x00; 21478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->bssid[2] = 0x00; 21488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->bssid[3] = 0x00; 21498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->bssid[4] = 0x00; 21508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->bssid[5] = 0x01; 21518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(bss->ssid, "test", 5); 21528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bss->ssid_len = 4; 21538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (global->bss_add_used) { 21558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(drv->own_addr, global->req_addr, ETH_ALEN); 21568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global->bss_add_used = 0; 21578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_timeout(1, 0, wpa_driver_test_poll, drv, NULL); 21608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return bss; 21628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_driver_test_close_test_socket(struct wpa_driver_test_data *drv) 21668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_socket >= 0) { 21688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_unregister_read_sock(drv->test_socket); 21698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt close(drv->test_socket); 21708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_socket = -1; 21718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->own_socket_path) { 21748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unlink(drv->own_socket_path); 21758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(drv->own_socket_path); 21768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->own_socket_path = NULL; 21778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_driver_test_deinit(void *priv) 21828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 21848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 21858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_client_socket *cli, *prev; 21868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i; 21878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 21898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->p2p) 21908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p_deinit(drv->p2p); 21918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_free(drv->pending_action_tx); 21928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 21938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli = drv->cli; 21958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (cli) { 21968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt prev = cli; 21978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli = cli->next; 21988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(prev); 21998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef HOSTAPD 22028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* There should be only one BSS remaining at this point. */ 22038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dl_list_len(&drv->bss) != 1) 22048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_ERROR, "%s: %u remaining BSS entries", 22058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, dl_list_len(&drv->bss)); 22068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* HOSTAPD */ 22078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt test_driver_free_bsses(drv); 22098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_close_test_socket(drv); 22118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_cancel_timeout(wpa_driver_test_scan_timeout, drv, drv->ctx); 22128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_cancel_timeout(wpa_driver_test_poll, drv, NULL); 22138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_cancel_timeout(test_remain_on_channel_timeout, drv, NULL); 22148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(drv->test_dir); 22158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < MAX_SCAN_RESULTS; i++) 22168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(drv->scanres[i]); 22178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(drv->probe_req_ie); 22188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_trace_remove_ref(drv, ctx, drv->ctx); 22198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(drv); 22208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_attach(struct wpa_driver_test_data *drv, 22248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *dir, int ap) 22258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef DRIVER_TEST_UNIX 22278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static unsigned int counter = 0; 22288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un addr; 22298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 22308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(drv->own_socket_path); 22328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dir) { 22338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = os_strlen(dir) + 30; 22348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->own_socket_path = os_malloc(len); 22358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->own_socket_path == NULL) 22368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(drv->own_socket_path, len, "%s/%s-" MACSTR, 22388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dir, ap ? "AP" : "STA", MAC2STR(drv->own_addr)); 22398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 22408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->own_socket_path = os_malloc(100); 22418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->own_socket_path == NULL) 22428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(drv->own_socket_path, 100, 22448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "/tmp/wpa_supplicant_test-%d-%d", 22458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt getpid(), counter++); 22468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_socket = socket(PF_UNIX, SOCK_DGRAM, 0); 22498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_socket < 0) { 22508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("socket(PF_UNIX)"); 22518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(drv->own_socket_path); 22528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->own_socket_path = NULL; 22538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&addr, 0, sizeof(addr)); 22578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr.sun_family = AF_UNIX; 22588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(addr.sun_path, drv->own_socket_path, sizeof(addr.sun_path)); 22598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (bind(drv->test_socket, (struct sockaddr *) &addr, 22608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(addr)) < 0) { 22618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("bind(PF_UNIX)"); 22628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt close(drv->test_socket); 22638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unlink(drv->own_socket_path); 22648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(drv->own_socket_path); 22658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->own_socket_path = NULL; 22668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_read_sock(drv->test_socket, 22708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_receive_unix, drv, NULL); 22718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 22738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* DRIVER_TEST_UNIX */ 22748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_TEST_UNIX */ 22768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_attach_udp(struct wpa_driver_test_data *drv, 22808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *dst) 22818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos; 22838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = os_strchr(dst, ':'); 22858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos == NULL) 22868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = '\0'; 22888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: addr=%s port=%s", __func__, dst, pos); 22898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_socket = socket(PF_INET, SOCK_DGRAM, 0); 22918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_socket < 0) { 22928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("socket(PF_INET)"); 22938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&drv->hostapd_addr_udp, 0, sizeof(drv->hostapd_addr_udp)); 22978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->hostapd_addr_udp.sin_family = AF_INET; 22988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#if defined(CONFIG_NATIVE_WINDOWS) || defined(CONFIG_ANSI_C_EXTRA) 22998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 23008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int a[4]; 23018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *pos; 23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sscanf(dst, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]); 23038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = (u8 *) &drv->hostapd_addr_udp.sin_addr; 23048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = a[0]; 23058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = a[1]; 23068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = a[2]; 23078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = a[3]; 23088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */ 23108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt inet_aton(dst, &drv->hostapd_addr_udp.sin_addr); 23118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */ 23128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->hostapd_addr_udp.sin_port = htons(atoi(pos)); 23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->hostapd_addr_udp_set = 1; 23158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_read_sock(drv->test_socket, 23178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_receive_unix, drv, NULL); 23188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 23208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_set_param(void *priv, const char *param) 23248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 23268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 23278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *pos; 23288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: param='%s'", __func__, param); 23308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (param == NULL) 23318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 23328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_close_test_socket(drv); 23348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef DRIVER_TEST_UNIX 23368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = os_strstr(param, "test_socket="); 23378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos) { 23388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *pos2; 23398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 23408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += 12; 23428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = os_strchr(pos, ' '); 23438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos2) 23448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = pos2 - pos; 23458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 23468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = os_strlen(pos); 23478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (len > sizeof(drv->hostapd_addr.sun_path)) 23488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&drv->hostapd_addr, 0, sizeof(drv->hostapd_addr)); 23508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->hostapd_addr.sun_family = AF_UNIX; 23518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(drv->hostapd_addr.sun_path, pos, len); 23528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->hostapd_addr_set = 1; 23538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_TEST_UNIX */ 23558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = os_strstr(param, "test_dir="); 23578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos) { 23588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *end; 23598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(drv->test_dir); 23608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_dir = os_strdup(pos + 9); 23618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->test_dir == NULL) 23628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = os_strchr(drv->test_dir, ' '); 23648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (end) 23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *end = '\0'; 23668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_driver_test_attach(drv, drv->test_dir, 0)) 23678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 23698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = os_strstr(param, "test_udp="); 23708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos) { 23718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *dst, *epos; 23728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dst = os_strdup(pos + 9); 23738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dst == NULL) 23748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt epos = os_strchr(dst, ' '); 23768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (epos) 23778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *epos = '\0'; 23788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_driver_test_attach_udp(drv, dst)) 23798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(dst); 23818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (wpa_driver_test_attach(drv, NULL, 0)) 23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(param, "use_associnfo=1")) { 23868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: Use AssocInfo events"); 23878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->use_associnfo = 1; 23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strstr(param, "p2p_mgmt=1")) { 23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test_driver: Use internal P2P " 23928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "management"); 23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_driver_test_init_p2p(drv) < 0) 23948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 23988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const u8 * wpa_driver_test_get_mac_addr(void *priv) 24028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 24048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 24058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __func__); 24068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return drv->own_addr; 24078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_send_eapol(void *priv, const u8 *dest, u16 proto, 24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *data, size_t data_len) 24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 24148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 24158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *msg; 24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t msg_len; 24178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct l2_ethhdr eth; 24188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr *addr; 24198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt socklen_t alen; 24208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef DRIVER_TEST_UNIX 24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct sockaddr_un addr_un; 24228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_TEST_UNIX */ 24238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump(MSG_MSGDUMP, "test_send_eapol TX frame", data, data_len); 24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(ð, 0, sizeof(eth)); 24278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(eth.h_dest, dest, ETH_ALEN); 24288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(eth.h_source, drv->own_addr, ETH_ALEN); 24298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eth.h_proto = host_to_be16(proto); 24308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg_len = 6 + sizeof(eth) + data_len; 24328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt msg = os_malloc(msg_len); 24338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (msg == NULL) 24348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 24358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(msg, "EAPOL ", 6); 24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(msg + 6, ð, sizeof(eth)); 24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(msg + 6 + sizeof(eth), data, data_len); 24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_memcmp(dest, dbss->bssid, ETH_ALEN) == 0 || 24408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_dir == NULL) { 24418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->hostapd_addr_udp_set) { 24428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr = (struct sockaddr *) &drv->hostapd_addr_udp; 24438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt alen = sizeof(drv->hostapd_addr_udp); 24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef DRIVER_TEST_UNIX 24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr = (struct sockaddr *) &drv->hostapd_addr; 24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt alen = sizeof(drv->hostapd_addr); 24488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* DRIVER_TEST_UNIX */ 24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(msg); 24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 24518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_TEST_UNIX */ 24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef DRIVER_TEST_UNIX 24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct stat st; 24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&addr_un, 0, sizeof(addr_un)); 24578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr_un.sun_family = AF_UNIX; 24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(addr_un.sun_path, sizeof(addr_un.sun_path), 24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/STA-" MACSTR, drv->test_dir, MAC2STR(dest)); 24608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (stat(addr_un.sun_path, &st) < 0) { 24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(addr_un.sun_path, sizeof(addr_un.sun_path), 24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "%s/AP-" MACSTR, 24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->test_dir, MAC2STR(dest)); 24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr = (struct sockaddr *) &addr_un; 24668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt alen = sizeof(addr_un); 24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* DRIVER_TEST_UNIX */ 24688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(msg); 24698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 24708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_TEST_UNIX */ 24718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sendto(drv->test_socket, msg, msg_len, 0, addr, alen) < 0) { 24748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("sendmsg(test_socket)"); 24758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(msg); 24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(msg); 24808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 24818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_get_capa(void *priv, struct wpa_driver_capa *capa) 24858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(capa, 0, sizeof(*capa)); 24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt capa->key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA | 24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2 | 24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK | 24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK | 24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE | 24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_FT | 24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK; 24968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt capa->enc = WPA_DRIVER_CAPA_ENC_WEP40 | 24978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_ENC_WEP104 | 24988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_ENC_TKIP | 24998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_CAPA_ENC_CCMP; 25008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt capa->auth = WPA_DRIVER_AUTH_OPEN | 25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_AUTH_SHARED | 25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPA_DRIVER_AUTH_LEAP; 25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->p2p) 25048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt capa->flags |= WPA_DRIVER_FLAGS_P2P_MGMT; 25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt capa->flags |= WPA_DRIVER_FLAGS_AP; 25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt capa->flags |= WPA_DRIVER_FLAGS_P2P_CONCURRENT; 25078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt capa->flags |= WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE; 25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt capa->flags |= WPA_DRIVER_FLAGS_P2P_CAPABLE; 25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt capa->max_scan_ssids = 2; 25108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt capa->max_remain_on_chan = 60000; 25118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 25138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_mlme_setprotection(void *priv, const u8 *addr, 25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int protect_type, 25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int key_type) 25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: protect_type=%d key_type=%d", 25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, protect_type, key_type); 25228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (addr) { 25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR, 25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, MAC2STR(addr)); 25268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void * wpa_driver_test_global_init(void) 25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_global *global; 25358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global = os_zalloc(sizeof(*global)); 25378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return global; 25388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_driver_test_global_deinit(void *priv) 25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_global *global = priv; 25448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(global); 25458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_interface_info * 25498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtwpa_driver_test_get_interfaces(void *global_priv) 25508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* struct wpa_driver_test_global *global = priv; */ 25528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_interface_info *iface; 25538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface = os_zalloc(sizeof(*iface)); 25558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (iface == NULL) 25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return iface; 25578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface->ifname = os_strdup("sta0"); 25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface->desc = os_strdup("test interface 0"); 25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface->drv_name = "test"; 25608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface->next = os_zalloc(sizeof(*iface)); 25618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (iface->next) { 25628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface->next->ifname = os_strdup("sta1"); 25638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface->next->desc = os_strdup("test interface 1"); 25648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt iface->next->drv_name = "test"; 25658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return iface; 25688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct hostapd_hw_modes * 25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtwpa_driver_test_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags) 25738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_hw_modes *modes; 25758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 25768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *num_modes = 3; 25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *flags = 0; 25798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes = os_zalloc(*num_modes * sizeof(struct hostapd_hw_modes)); 25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (modes == NULL) 25818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 25828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].mode = HOSTAPD_MODE_IEEE80211G; 25838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].num_channels = 11; 25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].num_rates = 12; 25858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].channels = 25868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_zalloc(11 * sizeof(struct hostapd_channel_data)); 25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].rates = os_zalloc(modes[0].num_rates * sizeof(int)); 25888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (modes[0].channels == NULL || modes[0].rates == NULL) 25898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto fail; 25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < 11; i++) { 25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].channels[i].chan = i + 1; 25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].channels[i].freq = 2412 + 5 * i; 25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].channels[i].flag = 0; 25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].rates[0] = 10; 25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].rates[1] = 20; 25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].rates[2] = 55; 25988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].rates[3] = 110; 25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].rates[4] = 60; 26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].rates[5] = 90; 26018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].rates[6] = 120; 26028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].rates[7] = 180; 26038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].rates[8] = 240; 26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].rates[9] = 360; 26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].rates[10] = 480; 26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[0].rates[11] = 540; 26078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[1].mode = HOSTAPD_MODE_IEEE80211B; 26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[1].num_channels = 11; 26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[1].num_rates = 4; 26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[1].channels = 26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_zalloc(11 * sizeof(struct hostapd_channel_data)); 26138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[1].rates = os_zalloc(modes[1].num_rates * sizeof(int)); 26148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (modes[1].channels == NULL || modes[1].rates == NULL) 26158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto fail; 26168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < 11; i++) { 26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[1].channels[i].chan = i + 1; 26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[1].channels[i].freq = 2412 + 5 * i; 26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[1].channels[i].flag = 0; 26208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[1].rates[0] = 10; 26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[1].rates[1] = 20; 26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[1].rates[2] = 55; 26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[1].rates[3] = 110; 26258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].mode = HOSTAPD_MODE_IEEE80211A; 26278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].num_channels = 1; 26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].num_rates = 8; 26298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].channels = os_zalloc(sizeof(struct hostapd_channel_data)); 26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].rates = os_zalloc(modes[2].num_rates * sizeof(int)); 26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (modes[2].channels == NULL || modes[2].rates == NULL) 26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt goto fail; 26338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].channels[0].chan = 60; 26348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].channels[0].freq = 5300; 26358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].channels[0].flag = 0; 26368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].rates[0] = 60; 26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].rates[1] = 90; 26388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].rates[2] = 120; 26398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].rates[3] = 180; 26408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].rates[4] = 240; 26418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].rates[5] = 360; 26428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].rates[6] = 480; 26438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt modes[2].rates[7] = 540; 26448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return modes; 26468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtfail: 26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (modes) { 26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < *num_modes; i++) { 26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(modes[i].channels); 26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(modes[i].rates); 26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(modes); 26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_set_freq(void *priv, 26608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct hostapd_freq_params *freq) 26618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 26638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test: set_freq %u MHz", freq->freq); 26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->current_freq = freq->freq; 26668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 26678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_send_action(void *priv, unsigned int freq, 26718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int wait, 26728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *dst, const u8 *src, 26738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *bssid, 26741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const u8 *data, size_t data_len, 26751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int no_cck) 26768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 26788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 26798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret = -1; 26808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 *buf; 26818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct ieee80211_hdr *hdr; 26828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test: Send Action frame"); 26848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((drv->remain_on_channel_freq && 26868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freq != drv->remain_on_channel_freq) || 26878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (drv->remain_on_channel_freq == 0 && 26888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freq != (unsigned int) drv->current_freq)) { 26898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test: Reject Action frame TX on " 26908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "unexpected channel: freq=%u MHz (current_freq=%u " 26918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "MHz, remain-on-channel freq=%u MHz)", 26928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt freq, drv->current_freq, 26938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->remain_on_channel_freq); 26948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 26958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf = os_zalloc(24 + data_len); 26988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) 26998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 27008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(buf + 24, data, data_len); 27018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hdr = (struct ieee80211_hdr *) buf; 27028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hdr->frame_control = 27038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt IEEE80211_FC(WLAN_FC_TYPE_MGMT, WLAN_FC_STYPE_ACTION); 27048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(hdr->addr1, dst, ETH_ALEN); 27058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(hdr->addr2, src, ETH_ALEN); 27068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(hdr->addr3, bssid, ETH_ALEN); 27078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ret = wpa_driver_test_send_mlme(priv, buf, 24 + data_len, 0); 27098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(buf); 27108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 27118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 27158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_send_action_cb(void *eloop_ctx, void *timeout_ctx) 27168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = eloop_ctx; 27188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->pending_action_tx == NULL) 27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 27218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->off_channel_freq != drv->pending_action_freq) { 27238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: Pending Action frame TX " 27248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "waiting for another freq=%u", 27258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->pending_action_freq); 27268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 27278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: Sending pending Action frame to " 27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MACSTR, MAC2STR(drv->pending_action_dst)); 27301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_driver_test_send_action(drv, drv->pending_action_freq, 0, 27311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt drv->pending_action_dst, 27321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt drv->pending_action_src, 27331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt drv->pending_action_bssid, 27341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpabuf_head(drv->pending_action_tx), 27351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpabuf_len(drv->pending_action_tx), 27361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt drv->pending_action_no_cck); 27378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 27398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_remain_on_channel_timeout(void *eloop_ctx, void *timeout_ctx) 27428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = eloop_ctx; 27448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union wpa_event_data data; 27458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test: Remain-on-channel timeout"); 27478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&data, 0, sizeof(data)); 27498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data.remain_on_channel.freq = drv->remain_on_channel_freq; 27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data.remain_on_channel.duration = drv->remain_on_channel_duration; 27518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->p2p) 27538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->off_channel_freq = 0; 27548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->remain_on_channel_freq = 0; 27568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_CANCEL_REMAIN_ON_CHANNEL, &data); 27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_remain_on_channel(void *priv, unsigned int freq, 27628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int duration) 27638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 27658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 27668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union wpa_event_data data; 27678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(freq=%u, duration=%u)", 27698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, freq, duration); 27708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->remain_on_channel_freq && 27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->remain_on_channel_freq != freq) { 27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "test: Refuse concurrent " 27738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "remain_on_channel request"); 27748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 27758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->remain_on_channel_freq = freq; 27788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->remain_on_channel_duration = duration; 27798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_cancel_timeout(test_remain_on_channel_timeout, drv, NULL); 27808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_timeout(duration / 1000, (duration % 1000) * 1000, 27818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt test_remain_on_channel_timeout, drv, NULL); 27828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&data, 0, sizeof(data)); 27848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data.remain_on_channel.freq = freq; 27858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt data.remain_on_channel.duration = duration; 27868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_REMAIN_ON_CHANNEL, &data); 27878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 27898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->p2p) { 27908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->off_channel_freq = drv->remain_on_channel_freq; 27918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt test_send_action_cb(drv, NULL); 27928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->off_channel_freq == drv->pending_listen_freq) { 27938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p_listen_cb(drv->p2p, drv->pending_listen_freq, 27948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->pending_listen_duration); 27958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->pending_listen_freq = 0; 27968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 27988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 27998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 28018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_cancel_remain_on_channel(void *priv) 28058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 28078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 28088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __func__); 28098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!drv->remain_on_channel_freq) 28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 28118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->remain_on_channel_freq = 0; 28128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_cancel_timeout(test_remain_on_channel_timeout, drv, NULL); 28138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 28148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_probe_req_report(void *priv, int report) 28188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct test_driver_bss *dbss = priv; 28208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = dbss->drv; 28218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(report=%d)", __func__, report); 28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->probe_req_report = report; 28238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 28248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 28288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_p2p_find(void *priv, unsigned int timeout, int type) 28308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = priv; 28328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(timeout=%u)", __func__, timeout); 28338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!drv->p2p) 28348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 28358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return p2p_find(drv->p2p, timeout, type, 0, NULL); 28368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_p2p_stop_find(void *priv) 28408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = priv; 28428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __func__); 28438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!drv->p2p) 28448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 28458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p_stop_find(drv->p2p); 28468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 28478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_p2p_listen(void *priv, unsigned int timeout) 28518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = priv; 28538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(timeout=%u)", __func__, timeout); 28548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!drv->p2p) 28558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 28568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return p2p_listen(drv->p2p, timeout); 28578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_p2p_connect(void *priv, const u8 *peer_addr, 28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int wps_method, int go_intent, 28628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *own_interface_addr, 28638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int force_freq, 28648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int persistent_group) 28658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = priv; 28678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(peer_addr=" MACSTR " wps_method=%d " 28688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "go_intent=%d " 28698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "own_interface_addr=" MACSTR " force_freq=%u " 28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "persistent_group=%d)", 28718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, MAC2STR(peer_addr), wps_method, go_intent, 28728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(own_interface_addr), force_freq, persistent_group); 28738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!drv->p2p) 28748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 28758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return p2p_connect(drv->p2p, peer_addr, wps_method, go_intent, 28768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt own_interface_addr, force_freq, persistent_group); 28778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_wps_success_cb(void *priv, const u8 *peer_addr) 28818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = priv; 28838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(peer_addr=" MACSTR ")", 28848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, MAC2STR(peer_addr)); 28858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!drv->p2p) 28868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 28878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p_wps_success_cb(drv->p2p, peer_addr); 28888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 28898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 28908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_p2p_group_formation_failed(void *priv) 28938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 28948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = priv; 28958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __func__); 28968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!drv->p2p) 28978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p_group_formation_failed(drv->p2p); 28998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_p2p_set_params(void *priv, 29048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct p2p_params *params) 29058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = priv; 29078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __func__); 29088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!drv->p2p) 29098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 29108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (p2p_set_dev_name(drv->p2p, params->dev_name) < 0 || 29118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p_set_pri_dev_type(drv->p2p, params->pri_dev_type) < 0 || 29128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p_set_sec_dev_types(drv->p2p, params->sec_dev_type, 29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params->num_sec_dev_types) < 0) 29148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 29158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_p2p_scan(void *ctx, enum p2p_scan_type type, int freq, 29208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int num_req_dev_types, 29218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *req_dev_types) 29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = ctx; 29248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_scan_params params; 29258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 29268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpabuf *wps_ie, *ies; 29278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int social_channels[] = { 2412, 2437, 2462, 0, 0 }; 29281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt size_t ielen; 29298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(type=%d freq=%d)", 29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, type, freq); 29328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(¶ms, 0, sizeof(params)); 29348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* P2P Wildcard SSID */ 29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.num_ssids = 1; 29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.ssids[0].ssid = (u8 *) P2P_WILDCARD_SSID; 29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.ssids[0].ssid_len = P2P_WILDCARD_SSID_LEN; 29398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#if 0 /* TODO: WPS IE */ 29418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_s->wps->dev.p2p = 1; 29428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wps_ie = wps_build_probe_req_ie(0, &wpa_s->wps->dev, wpa_s->wps->uuid, 29438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WPS_REQ_ENROLLEE); 29448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else 29458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wps_ie = wpabuf_alloc(1); 29468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif 29478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wps_ie == NULL) 29488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 29498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ielen = p2p_scan_ie_buf_len(drv->p2p); 29511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ies = wpabuf_alloc(wpabuf_len(wps_ie) + ielen); 29528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ies == NULL) { 29538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_free(wps_ie); 29548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 29558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_buf(ies, wps_ie); 29578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_free(wps_ie); 29588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p_scan_ie(drv->p2p, ies); 29608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.extra_ies = wpabuf_head(ies); 29628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.extra_ies_len = wpabuf_len(ies); 29638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (type) { 29658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case P2P_SCAN_SOCIAL: 29668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.freqs = social_channels; 29678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case P2P_SCAN_FULL: 29698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 29708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case P2P_SCAN_SPECIFIC: 29718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt social_channels[0] = freq; 29728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt social_channels[1] = 0; 29738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.freqs = social_channels; 29748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 29758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case P2P_SCAN_SOCIAL_PLUS_ONE: 29768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt social_channels[3] = freq; 29778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt params.freqs = social_channels; 29788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->pending_p2p_scan = 1; 29828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_driver_test_scan(drv, ¶ms); 29838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_free(ies); 29858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 29878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 29888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_send_action(void *ctx, unsigned int freq, const u8 *dst, 29918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *src, const u8 *bssid, const u8 *buf, 29928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len, unsigned int wait_time) 29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = ctx; 29958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(freq=%u dst=" MACSTR " src=" MACSTR 29978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " bssid=" MACSTR " len=%d", 29988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, freq, MAC2STR(dst), MAC2STR(src), MAC2STR(bssid), 29998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (int) len); 30008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (freq <= 0) { 30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_WARNING, "P2P: No frequency specified for " 30028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "action frame TX"); 30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 30048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->pending_action_tx) { 30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: Dropped pending Action frame TX " 30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "to " MACSTR, MAC2STR(drv->pending_action_dst)); 30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_free(drv->pending_action_tx); 30108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->pending_action_tx = wpabuf_alloc(len); 30128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->pending_action_tx == NULL) 30138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 30148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpabuf_put_data(drv->pending_action_tx, buf, len); 30158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(drv->pending_action_src, src, ETH_ALEN); 30168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(drv->pending_action_dst, dst, ETH_ALEN); 30178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(drv->pending_action_bssid, bssid, ETH_ALEN); 30188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->pending_action_freq = freq; 30191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt drv->pending_action_no_cck = 1; 30208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->off_channel_freq == freq) { 30228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Already on requested channel; send immediately */ 30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO: Would there ever be need to extend the current 30248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * duration on the channel? */ 30258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_cancel_timeout(test_send_action_cb, drv, NULL); 30268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_timeout(0, 0, test_send_action_cb, drv, NULL); 30278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 30288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: Schedule Action frame to be transmitted " 30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "once the driver gets to the requested channel"); 30328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_driver_test_remain_on_channel(drv, freq, wait_time) < 0) { 30338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "P2P: Failed to request driver " 30348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "to remain on channel (%u MHz) for Action " 30358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Frame TX", freq); 30368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 30378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 30408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_send_action_done(void *ctx) 30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __func__); 30468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO */ 30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_go_neg_completed(void *ctx, struct p2p_go_neg_results *res) 30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = ctx; 30538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union wpa_event_data event; 30548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __func__); 30558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&event, 0, sizeof(event)); 30568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.p2p_go_neg_completed.res = res; 30578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_P2P_GO_NEG_COMPLETED, &event); 30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_go_neg_req_rx(void *ctx, const u8 *src, u16 dev_passwd_id) 30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = ctx; 30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union wpa_event_data event; 30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(src=" MACSTR ")", __func__, MAC2STR(src)); 30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&event, 0, sizeof(event)); 30678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.p2p_go_neg_req_rx.src = src; 30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.p2p_go_neg_req_rx.dev_passwd_id = dev_passwd_id; 30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_P2P_GO_NEG_REQ_RX, &event); 30708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_dev_found(void *ctx, const u8 *addr, 30748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct p2p_peer_info *info, int new_device) 30758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = ctx; 30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union wpa_event_data event; 30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char devtype[WPS_DEV_TYPE_BUFSIZE]; 30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(" MACSTR " p2p_dev_addr=" MACSTR 30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " pri_dev_type=%s name='%s' config_methods=0x%x " 30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "dev_capab=0x%x group_capab=0x%x)", 30828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, MAC2STR(addr), MAC2STR(info->p2p_device_addr), 30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wps_dev_type_bin2str(info->pri_dev_type, devtype, 30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(devtype)), 30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt info->device_name, info->config_methods, info->dev_capab, 30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt info->group_capab); 30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&event, 0, sizeof(event)); 30898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.p2p_dev_found.addr = addr; 30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.p2p_dev_found.dev_addr = info->p2p_device_addr; 30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.p2p_dev_found.pri_dev_type = info->pri_dev_type; 30928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.p2p_dev_found.dev_name = info->device_name; 30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.p2p_dev_found.config_methods = info->config_methods; 30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.p2p_dev_found.dev_capab = info->dev_capab; 30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt event.p2p_dev_found.group_capab = info->group_capab; 30968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_supplicant_event(drv->ctx, EVENT_P2P_DEV_FOUND, &event); 30978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_start_listen(void *ctx, unsigned int freq, 31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int duration, 31028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct wpabuf *probe_resp_ie) 31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = ctx; 31058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(freq=%u duration=%u)", 31078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, freq, duration); 31088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_driver_test_probe_req_report(drv, 1) < 0) 31108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->pending_listen_freq = freq; 31138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->pending_listen_duration = duration; 31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_driver_test_remain_on_channel(drv, freq, duration) < 0) { 31168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->pending_listen_freq = 0; 31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_stop_listen(void *ctx) 31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __func__); 31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO */ 31288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int test_send_probe_resp(void *ctx, const struct wpabuf *buf) 31328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_driver_test_data *drv = ctx; 31348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char resp[512], *pos, *end; 31358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 31368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const struct ieee80211_mgmt *mgmt; 31378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *ie, *ie_end; 31388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __func__); 31408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_hexdump_buf(MSG_MSGDUMP, "Probe Response", buf); 31418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpabuf_len(buf) < 24) 31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 31438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!drv->probe_from) { 31448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s: probe_from not set", __func__); 31458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 31468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = resp; 31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = resp + sizeof(resp); 31508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mgmt = wpabuf_head(buf); 31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* reply: SCANRESP BSSID SSID IEs */ 31548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, "SCANRESP " MACSTR " ", 31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MAC2STR(mgmt->bssid)); 31568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) 31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie = mgmt->u.probe_resp.variable; 31618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie_end = wpabuf_head_u8(buf) + wpabuf_len(buf); 31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ie_end - ie < 2 || ie[0] != WLAN_EID_SSID || 31638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ie + 2 + ie[1] > ie_end) 31648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 31658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += wpa_snprintf_hex(pos, end - pos, ie + 2, ie[1]); 31668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " "); 31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) 31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 31708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += wpa_snprintf_hex(pos, end - pos, ie, ie_end - ie); 31728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sendto(drv->test_socket, resp, pos - resp, 0, 31748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->probe_from, drv->probe_from_len); 31758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_sd_request(void *ctx, int freq, const u8 *sa, u8 dialog_token, 31818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u16 update_indic, const u8 *tlvs, size_t tlvs_len) 31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __func__); 31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO */ 31858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_sd_response(void *ctx, const u8 *sa, u16 update_indic, 31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *tlvs, size_t tlvs_len) 31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __func__); 31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO */ 31938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_prov_disc_req(void *ctx, const u8 *peer, u16 config_methods, 31978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const u8 *dev_addr, const u8 *pri_dev_type, 31988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *dev_name, u16 supp_config_methods, 31991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 dev_capab, u8 group_capab, 32001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const u8 *group_id, size_t group_id_len) 32018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(peer=" MACSTR " config_methods=0x%x)", 32038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, MAC2STR(peer), config_methods); 32048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO */ 32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void test_prov_disc_resp(void *ctx, const u8 *peer, u16 config_methods) 32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_DEBUG, "%s(peer=" MACSTR " config_methods=0x%x)", 32118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt __func__, MAC2STR(peer), config_methods); 32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO */ 32138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_driver_test_init_p2p(struct wpa_driver_test_data *drv) 32198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 32218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct p2p_config p2p; 32228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned int r; 32238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i; 32248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&p2p, 0, sizeof(p2p)); 32268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.msg_ctx = drv->ctx; 32278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.cb_ctx = drv; 32288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.p2p_scan = test_p2p_scan; 32298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.send_action = test_send_action; 32308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.send_action_done = test_send_action_done; 32318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.go_neg_completed = test_go_neg_completed; 32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.go_neg_req_rx = test_go_neg_req_rx; 32338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.dev_found = test_dev_found; 32348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.start_listen = test_start_listen; 32358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.stop_listen = test_stop_listen; 32368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.send_probe_resp = test_send_probe_resp; 32378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.sd_request = test_sd_request; 32388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.sd_response = test_sd_response; 32398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.prov_disc_req = test_prov_disc_req; 32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.prov_disc_resp = test_prov_disc_resp; 32418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(p2p.dev_addr, drv->own_addr, ETH_ALEN); 32438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.reg_class = 12; /* TODO: change depending on location */ 32458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 32468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Pick one of the social channels randomly as the listen 32478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * channel. 32488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 32498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_get_random((u8 *) &r, sizeof(r)); 32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.channel = 1 + (r % 3) * 5; 32518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO: change depending on location */ 32538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.op_reg_class = 12; 32548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 32558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * For initial tests, pick the operation channel randomly. 32568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * TODO: Use scan results (etc.) to select the best channel. 32578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 32588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.op_channel = 1 + r % 11; 32598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(p2p.country, "US ", 3); 32618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* FIX: fetch available channels from the driver */ 32638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.channels.reg_classes = 1; 32648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.channels.reg_class[0].reg_class = 12; /* US/12 = 2.4 GHz band */ 32658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.channels.reg_class[0].channels = 11; 32668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < 11; i++) 32678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.channels.reg_class[0].channel[i] = i + 1; 32688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2p.max_peers = 100; 32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt drv->p2p = p2p_init(&p2p); 32728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (drv->p2p == NULL) 32738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 32748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 32758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_P2P */ 32768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_printf(MSG_INFO, "driver_test: P2P support not included"); 32778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 32788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 32798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst struct wpa_driver_ops wpa_driver_test_ops = { 32838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "test", 32848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant test driver", 32858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .hapd_init = test_driver_init, 32868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .hapd_deinit = wpa_driver_test_deinit, 32878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .hapd_send_eapol = test_driver_send_eapol, 32888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .send_mlme = wpa_driver_test_send_mlme, 32898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .set_generic_elem = test_driver_set_generic_elem, 32908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .sta_deauth = test_driver_sta_deauth, 32918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .sta_disassoc = test_driver_sta_disassoc, 32928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .get_hw_feature_data = wpa_driver_test_get_hw_feature_data, 32938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .if_add = test_driver_if_add, 32948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .if_remove = test_driver_if_remove, 32958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .hapd_set_ssid = test_driver_set_ssid, 32968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .set_privacy = test_driver_set_privacy, 32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .set_sta_vlan = test_driver_set_sta_vlan, 32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .sta_add = test_driver_sta_add, 32998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .send_ether = test_driver_send_ether, 33008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .set_ap_wps_ie = test_driver_set_ap_wps_ie, 33018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .get_bssid = wpa_driver_test_get_bssid, 33028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .get_ssid = wpa_driver_test_get_ssid, 33038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .set_key = wpa_driver_test_set_key, 33048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .deinit = wpa_driver_test_deinit, 33058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .set_param = wpa_driver_test_set_param, 33068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .deauthenticate = wpa_driver_test_deauthenticate, 33078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .disassociate = wpa_driver_test_disassociate, 33088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .associate = wpa_driver_test_associate, 33098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .get_capa = wpa_driver_test_get_capa, 33108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .get_mac_addr = wpa_driver_test_get_mac_addr, 33118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .send_eapol = wpa_driver_test_send_eapol, 33128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .mlme_setprotection = wpa_driver_test_mlme_setprotection, 33138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .get_scan_results2 = wpa_driver_test_get_scan_results2, 33148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .global_init = wpa_driver_test_global_init, 33158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .global_deinit = wpa_driver_test_global_deinit, 33168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .init2 = wpa_driver_test_init2, 33178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .get_interfaces = wpa_driver_test_get_interfaces, 33188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .scan2 = wpa_driver_test_scan, 33198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .set_freq = wpa_driver_test_set_freq, 33208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .send_action = wpa_driver_test_send_action, 33218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .remain_on_channel = wpa_driver_test_remain_on_channel, 33228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .cancel_remain_on_channel = wpa_driver_test_cancel_remain_on_channel, 33238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .probe_req_report = wpa_driver_test_probe_req_report, 33248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 33258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .p2p_find = wpa_driver_test_p2p_find, 33268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .p2p_stop_find = wpa_driver_test_p2p_stop_find, 33278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .p2p_listen = wpa_driver_test_p2p_listen, 33288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .p2p_connect = wpa_driver_test_p2p_connect, 33298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .wps_success_cb = wpa_driver_test_wps_success_cb, 33308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .p2p_group_formation_failed = 33318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_driver_test_p2p_group_formation_failed, 33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt .p2p_set_params = wpa_driver_test_p2p_set_params, 33338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 33348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 3335