};
-#ifdef HOSTAPD
-
static void test_driver_free_bss(struct test_driver_bss *bss)
{
free(bss->ie);
}
-static int wpa_driver_test_send_mlme(void *priv, const u8 *buf, size_t len)
+static int wpa_driver_test_send_mlme(void *priv, const u8 *data,
+ size_t data_len)
{
+#ifdef HOSTAPD
struct wpa_driver_test_data *drv = priv;
struct msghdr msg;
struct iovec io[2];
struct ieee80211_hdr *hdr;
u16 fc;
- if (drv->test_socket < 0 || len < 10 || drv->socket_dir == NULL) {
+ if (drv->test_socket < 0 || data_len < 10 || drv->socket_dir == NULL) {
wpa_printf(MSG_DEBUG, "%s: invalid parameters (sock=%d len=%lu"
" socket_dir=%p)",
- __func__, drv->test_socket, (unsigned long) len,
+ __func__, drv->test_socket,
+ (unsigned long) data_len,
drv->socket_dir);
return -1;
}
- dest = buf;
+ dest = data;
dest += 4;
broadcast = memcmp(dest, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0;
snprintf(desttxt, sizeof(desttxt), MACSTR, MAC2STR(dest));
io[0].iov_base = "MLME ";
io[0].iov_len = 5;
- io[1].iov_base = (void *) buf;
- io[1].iov_len = len;
+ io[1].iov_base = (void *) data;
+ io[1].iov_len = data_len;
memset(&msg, 0, sizeof(msg));
msg.msg_iov = io;
}
closedir(dir);
- hdr = (struct ieee80211_hdr *) buf;
+ hdr = (struct ieee80211_hdr *) data;
fc = le_to_host16(hdr->frame_control);
- hostapd_mgmt_tx_cb(drv->hapd, (u8 *) buf, len, WLAN_FC_GET_STYPE(fc),
- ret >= 0);
+ hostapd_mgmt_tx_cb(drv->hapd, (u8 *) data, data_len,
+ WLAN_FC_GET_STYPE(fc), ret >= 0);
return ret;
+#else /* HOSTAPD */
+ struct wpa_driver_test_data *drv = priv;
+ struct msghdr msg;
+ struct iovec io[2];
+ struct sockaddr_un addr;
+ const u8 *dest;
+ struct dirent *dent;
+ DIR *dir;
+
+ wpa_hexdump(MSG_MSGDUMP, "test_send_mlme", data, data_len);
+ if (data_len < 10)
+ return -1;
+ dest = data + 4;
+
+ io[0].iov_base = "MLME ";
+ io[0].iov_len = 5;
+ io[1].iov_base = (u8 *) data;
+ io[1].iov_len = data_len;
+
+ os_memset(&msg, 0, sizeof(msg));
+ msg.msg_iov = io;
+ msg.msg_iovlen = 2;
+ if (os_memcmp(dest, drv->bssid, ETH_ALEN) == 0 ||
+ drv->test_dir == NULL) {
+ if (drv->hostapd_addr_udp_set) {
+ msg.msg_name = &drv->hostapd_addr_udp;
+ msg.msg_namelen = sizeof(drv->hostapd_addr_udp);
+ } else {
+#ifdef DRIVER_TEST_UNIX
+ msg.msg_name = &drv->hostapd_addr;
+ msg.msg_namelen = sizeof(drv->hostapd_addr);
+#endif /* DRIVER_TEST_UNIX */
+ }
+ } else if (os_memcmp(dest, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0)
+ {
+ dir = opendir(drv->test_dir);
+ if (dir == NULL)
+ return -1;
+ while ((dent = readdir(dir))) {
+#ifdef _DIRENT_HAVE_D_TYPE
+ /* Skip the file if it is not a socket.
+ * Also accept DT_UNKNOWN (0) in case
+ * the C library or underlying file
+ * system does not support d_type. */
+ if (dent->d_type != DT_SOCK &&
+ dent->d_type != DT_UNKNOWN)
+ continue;
+#endif /* _DIRENT_HAVE_D_TYPE */
+ if (os_strcmp(dent->d_name, ".") == 0 ||
+ os_strcmp(dent->d_name, "..") == 0)
+ continue;
+ wpa_printf(MSG_DEBUG, "%s: Send broadcast MLME to %s",
+ __func__, dent->d_name);
+ os_memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+ os_snprintf(addr.sun_path, sizeof(addr.sun_path),
+ "%s/%s", drv->test_dir, dent->d_name);
+
+ msg.msg_name = &addr;
+ msg.msg_namelen = sizeof(addr);
+
+ if (sendmsg(drv->test_socket, &msg, 0) < 0)
+ perror("sendmsg(test_socket)");
+ }
+ closedir(dir);
+ return 0;
+ } else {
+ struct stat st;
+ os_memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+ os_snprintf(addr.sun_path, sizeof(addr.sun_path),
+ "%s/AP-" MACSTR, drv->test_dir, MAC2STR(dest));
+ if (stat(addr.sun_path, &st) < 0) {
+ os_snprintf(addr.sun_path, sizeof(addr.sun_path),
+ "%s/STA-" MACSTR,
+ drv->test_dir, MAC2STR(dest));
+ }
+ msg.msg_name = &addr;
+ msg.msg_namelen = sizeof(addr);
+ }
+
+ if (sendmsg(drv->test_socket, &msg, 0) < 0) {
+ perror("sendmsg(test_socket)");
+ return -1;
+ }
+
+ return 0;
+#endif /* HOSTAPD */
}
MAC2STR(sa));
wpa_hexdump(MSG_MSGDUMP, "test_driver: scan IEs", ie, ielen);
+#ifdef HOSTAPD
hostapd_probe_req_rx(drv->hapd, sa, ie, ielen);
+#endif /* HOSTAPD */
}
for (bss = drv->bss; bss; bss = bss->next) {
if (hapd == NULL)
return -1;
+#ifdef HOSTAPD
return hostapd_notif_assoc(hapd, addr, ie, ielen);
+#else /* HOSTAPD */
+ return -1;
+#endif /* HOSTAPD */
}
if (!cli)
return;
+#ifdef HOSTAPD
hostapd_notif_disassoc(drv->hapd, cli->addr);
+#endif /* HOSTAPD */
}
hapd = test_driver_get_hapd(drv, cli->bss);
if (hapd == NULL)
return;
+#ifdef HOSTAPD
hostapd_eapol_receive(hapd, cli->addr, data, datalen);
+#endif /* HOSTAPD */
} else {
wpa_printf(MSG_DEBUG, "test_socket: EAPOL from unknown "
"client");
#ifdef CONFIG_IEEE80211R
if (be_to_host16(eth->h_proto) == ETH_P_RRB) {
+#ifdef HOSTAPD
wpa_ft_rrb_rx(drv->hapd->wpa_auth, eth->h_source,
data + sizeof(*eth), datalen - sizeof(*eth));
+#endif /* HOSTAPD */
}
#endif /* CONFIG_IEEE80211R */
}
__func__);
return;
}
+#ifdef HOSTAPD
hostapd_mgmt_rx(drv->hapd, data, datalen, WLAN_FC_GET_STYPE(fc), NULL);
+#endif /* HOSTAPD */
}
test_driver_free_priv(drv);
}
-#else /* HOSTAPD */
static void wpa_driver_test_poll(void *eloop_ctx, void *timeout_ctx)
{
data += 14;
data_len -= 14;
}
+#ifndef HOSTAPD
wpa_supplicant_rx_eapol(drv->ctx, src, data, data_len);
+#endif /* HOSTAPD */
}
}
-#ifdef CONFIG_CLIENT_MLME
static int wpa_driver_test_set_channel(void *priv, hostapd_hw_mode phymode,
int chan, int freq)
{
}
-static int wpa_driver_test_send_mlme(void *priv, const u8 *data,
- size_t data_len)
-{
- struct wpa_driver_test_data *drv = priv;
- struct msghdr msg;
- struct iovec io[2];
- struct sockaddr_un addr;
- const u8 *dest;
- struct dirent *dent;
- DIR *dir;
-
- wpa_hexdump(MSG_MSGDUMP, "test_send_mlme", data, data_len);
- if (data_len < 10)
- return -1;
- dest = data + 4;
-
- io[0].iov_base = "MLME ";
- io[0].iov_len = 5;
- io[1].iov_base = (u8 *) data;
- io[1].iov_len = data_len;
-
- os_memset(&msg, 0, sizeof(msg));
- msg.msg_iov = io;
- msg.msg_iovlen = 2;
- if (os_memcmp(dest, drv->bssid, ETH_ALEN) == 0 ||
- drv->test_dir == NULL) {
- if (drv->hostapd_addr_udp_set) {
- msg.msg_name = &drv->hostapd_addr_udp;
- msg.msg_namelen = sizeof(drv->hostapd_addr_udp);
- } else {
-#ifdef DRIVER_TEST_UNIX
- msg.msg_name = &drv->hostapd_addr;
- msg.msg_namelen = sizeof(drv->hostapd_addr);
-#endif /* DRIVER_TEST_UNIX */
- }
- } else if (os_memcmp(dest, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0)
- {
- dir = opendir(drv->test_dir);
- if (dir == NULL)
- return -1;
- while ((dent = readdir(dir))) {
-#ifdef _DIRENT_HAVE_D_TYPE
- /* Skip the file if it is not a socket.
- * Also accept DT_UNKNOWN (0) in case
- * the C library or underlying file
- * system does not support d_type. */
- if (dent->d_type != DT_SOCK &&
- dent->d_type != DT_UNKNOWN)
- continue;
-#endif /* _DIRENT_HAVE_D_TYPE */
- if (os_strcmp(dent->d_name, ".") == 0 ||
- os_strcmp(dent->d_name, "..") == 0)
- continue;
- wpa_printf(MSG_DEBUG, "%s: Send broadcast MLME to %s",
- __func__, dent->d_name);
- os_memset(&addr, 0, sizeof(addr));
- addr.sun_family = AF_UNIX;
- os_snprintf(addr.sun_path, sizeof(addr.sun_path),
- "%s/%s", drv->test_dir, dent->d_name);
-
- msg.msg_name = &addr;
- msg.msg_namelen = sizeof(addr);
-
- if (sendmsg(drv->test_socket, &msg, 0) < 0)
- perror("sendmsg(test_socket)");
- }
- closedir(dir);
- return 0;
- } else {
- struct stat st;
- os_memset(&addr, 0, sizeof(addr));
- addr.sun_family = AF_UNIX;
- os_snprintf(addr.sun_path, sizeof(addr.sun_path),
- "%s/AP-" MACSTR, drv->test_dir, MAC2STR(dest));
- if (stat(addr.sun_path, &st) < 0) {
- os_snprintf(addr.sun_path, sizeof(addr.sun_path),
- "%s/STA-" MACSTR,
- drv->test_dir, MAC2STR(dest));
- }
- msg.msg_name = &addr;
- msg.msg_namelen = sizeof(addr);
- }
-
- if (sendmsg(drv->test_socket, &msg, 0) < 0) {
- perror("sendmsg(test_socket)");
- return -1;
- }
-
- return 0;
-}
-
-
static int wpa_driver_test_mlme_add_sta(void *priv, const u8 *addr,
const u8 *supp_rates,
size_t supp_rates_len)
wpa_printf(MSG_DEBUG, "%s: bssid=" MACSTR, __func__, MAC2STR(bssid));
return 0;
}
-#endif /* CONFIG_CLIENT_MLME */
static int wpa_driver_test_set_probe_req_ie(void *priv, const u8 *ies,
return iface;
}
-#endif /* HOSTAPD */
-
-#if defined(HOSTAPD) || defined(CONFIG_CLIENT_MLME)
static struct hostapd_hw_modes *
wpa_driver_test_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags)
{
}
return NULL;
}
-#endif /* HOSTAPD || CONFIG_CLIENT_MLME */
const struct wpa_driver_ops wpa_driver_test_ops = {
"test",
"wpa_supplicant test driver",
-#ifdef HOSTAPD
.hapd_init = test_driver_init,
.hapd_deinit = test_driver_deinit,
.hapd_send_eapol = test_driver_send_eapol,
.send_ether = test_driver_send_ether,
.set_wps_beacon_ie = test_driver_set_wps_beacon_ie,
.set_wps_probe_resp_ie = test_driver_set_wps_probe_resp_ie,
-#else /* HOSTAPD */
.get_bssid = wpa_driver_test_get_bssid,
.get_ssid = wpa_driver_test_get_ssid,
.set_wpa = wpa_driver_test_set_wpa,
.get_mac_addr = wpa_driver_test_get_mac_addr,
.send_eapol = wpa_driver_test_send_eapol,
.mlme_setprotection = wpa_driver_test_mlme_setprotection,
-#ifdef CONFIG_CLIENT_MLME
- .get_hw_feature_data = wpa_driver_test_get_hw_feature_data,
.set_channel = wpa_driver_test_set_channel,
.set_ssid = wpa_driver_test_set_ssid,
.set_bssid = wpa_driver_test_set_bssid,
- .send_mlme = wpa_driver_test_send_mlme,
.mlme_add_sta = wpa_driver_test_mlme_add_sta,
.mlme_remove_sta = wpa_driver_test_mlme_remove_sta,
-#endif /* CONFIG_CLIENT_MLME */
.get_scan_results2 = wpa_driver_test_get_scan_results2,
.set_probe_req_ie = wpa_driver_test_set_probe_req_ie,
.global_init = wpa_driver_test_global_init,
.init2 = wpa_driver_test_init2,
.get_interfaces = wpa_driver_test_get_interfaces,
.scan2 = wpa_driver_test_scan,
-#endif /* HOSTAPD */
};