>From 4e4a7f4bde92f3ef358615b7ab52b0449cd8a95b Mon Sep 17 00:00:00 2001 From: Mikael Kanstrup Date: Wed, 29 Jun 2016 15:36:36 +0200 Subject: [PATCH 3/5] Implement IGNORE_AUTH_RESP control interface debug command Implement IGNORE_AUTH_RESP command to simulate auth/assoc response loss and eapol rx packet loss by ignoring corresponding incoming events. --- wpa_supplicant/ctrl_iface.c | 15 +++++++++++++++ wpa_supplicant/events.c | 10 ++++++++++ wpa_supplicant/wpa_cli.c | 7 +++++++ wpa_supplicant/wpa_supplicant.c | 5 +++++ wpa_supplicant/wpa_supplicant_i.h | 2 ++ 5 files changed, 39 insertions(+) diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index e75323d..f8c76c7 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -2102,6 +2102,18 @@ static int wpa_supplicant_ctrl_iface_status(struct wpa_supplicant *wpa_s, } +static int wpa_supplicant_ctrl_iface_ignore_auth_resp(struct wpa_supplicant *wpa_s, + const char *params, + char *buf, size_t buflen) +{ + int enable = atoi(params); + wpa_printf(MSG_DEBUG, "CTRL_IFACE: ignore_auth_resp enable=%d", enable); + wpa_s->ignore_auth_resp = enable; + os_memcpy(buf, "OK\n", 3); + return 3; +} + + static int wpa_supplicant_ctrl_iface_bssid(struct wpa_supplicant *wpa_s, char *cmd) { @@ -8689,6 +8701,9 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s, } else if (os_strncmp(buf, "STATUS", 6) == 0) { reply_len = wpa_supplicant_ctrl_iface_status( wpa_s, buf + 6, reply, reply_size); + } else if (os_strncmp(buf, "IGNORE_AUTH_RESP", 16) == 0) { + reply_len = wpa_supplicant_ctrl_iface_ignore_auth_resp( + wpa_s, buf + 16, reply, reply_size); } else if (os_strcmp(buf, "PMKSA") == 0) { reply_len = wpas_ctrl_iface_pmksa(wpa_s, reply, reply_size); } else if (os_strcmp(buf, "PMKSA_FLUSH") == 0) { diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index b7a3bc0..d5dc1a7 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -3431,6 +3431,11 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, sme_event_auth(wpa_s, data); break; case EVENT_ASSOC: + if (wpa_s->ignore_auth_resp) { + wpa_printf(MSG_INFO, + "EVENT_ASSOC - ignore_auth_resp active!"); + break; + } wpa_supplicant_event_assoc(wpa_s, data); if (data && data->assoc_info.authorized) wpa_supplicant_event_assoc_auth(wpa_s, data); @@ -3445,6 +3450,11 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, data ? &data->disassoc_info : NULL); break; case EVENT_DEAUTH: + if (wpa_s->ignore_auth_resp) { + wpa_printf(MSG_INFO, + "EVENT_DEAUTH - ignore_auth_resp active!"); + break; + } wpas_event_deauth(wpa_s, data ? &data->deauth_info : NULL); break; diff --git a/wpa_supplicant/wpa_cli.c b/wpa_supplicant/wpa_cli.c index 53036ae..82c8e44 100644 --- a/wpa_supplicant/wpa_cli.c +++ b/wpa_supplicant/wpa_cli.c @@ -525,6 +525,10 @@ static int wpa_cli_cmd_status(struct wpa_ctrl *ctrl, int argc, char *argv[]) return wpa_ctrl_command(ctrl, "STATUS"); } +static int wpa_cli_cmd_ignore_auth_resp(struct wpa_ctrl *ctrl, int argc, char *argv[]) +{ + return wpa_cli_cmd(ctrl, "IGNORE_AUTH_RESP", 1, argc, argv); +} static int wpa_cli_cmd_ping(struct wpa_ctrl *ctrl, int argc, char *argv[]) { @@ -3477,6 +3481,9 @@ static const struct wpa_cli_cmd wpa_cli_commands[] = { { "get_pref_freq_list", wpa_cli_cmd_get_pref_freq_list, NULL, cli_cmd_flag_none, " = retrieve preferred freq list for the specified interface type" }, + { "ignore_auth_resp", wpa_cli_cmd_ignore_auth_resp, NULL, + cli_cmd_flag_none, + "<0|1> ignore received auth/assoc response and rx eapol packets" }, { NULL, NULL, NULL, cli_cmd_flag_none, NULL } }; diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index 70dc07b..57881e8 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -3266,6 +3266,11 @@ void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr, wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr)); wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len); + if (wpa_s->ignore_auth_resp) { + wpa_printf(MSG_INFO, "RX EAPOL - ignore_auth_resp active!"); + return; + } + #ifdef CONFIG_PEERKEY if (wpa_s->wpa_state > WPA_ASSOCIATED && wpa_s->current_ssid && wpa_s->current_ssid->peerkey && diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index e45f662..0a4c6e9 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -1065,6 +1065,8 @@ struct wpa_supplicant { */ struct wpabuf *lci; struct os_reltime lci_time; + + int ignore_auth_resp; }; -- 2.4.2