From: Ben Greear <greearb@xxxxxxxxxxxxxxx> This lets one configure a station to drop a percentage (including 0 and 100%) of the RX management frames to aid testing applications. The value is moved to the config section so that it can be defined in a supplicant config file. There is a functional change in that before you could reset a station through wpa_cli and it would clear the ignore_auth_resp value, and now you would have to explicitly clear it since it is a configuration. To enable the feature, you must compile with CONFIG_TESTING_OPTIONS enabled. Signed-off-by: Ben Greear <greearb@xxxxxxxxxxxxxxx> --- tests/hwsim/test_ap_roam.py | 4 ++-- wpa_supplicant/config.c | 6 ++++++ wpa_supplicant/config.h | 8 ++++++++ wpa_supplicant/ctrl_iface.c | 3 +-- wpa_supplicant/defconfig | 4 ++++ wpa_supplicant/events.c | 23 +++++++++++++++++------ wpa_supplicant/wpa_supplicant.c | 5 +++-- wpa_supplicant/wpa_supplicant.conf | 7 +++++++ wpa_supplicant/wpa_supplicant_i.h | 5 ++++- 9 files changed, 52 insertions(+), 13 deletions(-) diff --git a/tests/hwsim/test_ap_roam.py b/tests/hwsim/test_ap_roam.py index 6f8b8d9..e98642b 100644 --- a/tests/hwsim/test_ap_roam.py +++ b/tests/hwsim/test_ap_roam.py @@ -85,7 +85,7 @@ def test_ap_reconnect_auth_timeout(dev, apdev, params): wpas.scan_for_bss(bssid1, freq=2412) wpas.request("DISCONNECT") - if "OK" not in wpas.request("SET ignore_auth_resp 1"): + if "OK" not in wpas.request("SET ignore_auth_resp 65535"): raise Exception("SET ignore_auth_resp failed") if "OK" not in wpas.request("ENABLE_NETWORK " + str(id)): raise Exception("ENABLE_NETWORK failed") @@ -123,7 +123,7 @@ def test_ap_roam_with_reassoc_auth_timeout(dev, apdev, params): if "OK" not in wpas.request("SET_NETWORK " + str(id) + " bssid " + bssid1): raise Exception("SET_NETWORK failed") - if "OK" not in wpas.request("SET ignore_auth_resp 1"): + if "OK" not in wpas.request("SET ignore_auth_resp 65535"): raise Exception("SET ignore_auth_resp failed") if "OK" not in wpas.request("REASSOCIATE"): raise Exception("REASSOCIATE failed") diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c index 31f0d16..9a1cc36 100644 --- a/wpa_supplicant/config.c +++ b/wpa_supplicant/config.c @@ -3831,6 +3831,9 @@ struct wpa_config * wpa_config_alloc_empty(const char *ctrl_interface, #endif config->concurrent_assoc_ok = DEFAULT_CONCURRENT_ASSOC_OK; config->accept_external_scan_results = DEFAULT_ACCEPT_EXTERNAL_SCAN_RESULTS; +#if CONFIG_TESTING_OPTIONS + config->ignore_auth_resp = DEFAULT_IGNORE_AUTH_RESP; +#endif return config; } @@ -4548,6 +4551,9 @@ static const struct global_parse_data global_fields[] = { { INT(disable_ess_roaming), 0 }, #endif { INT(concurrent_assoc_ok), 0 }, +#if CONFIG_TESTING_OPTIONS + { INT(ignore_auth_resp), 0 }, +#endif { INT(accept_external_scan_results), 0 }, { STR(wowlan_triggers), 0 }, { INT(p2p_search_delay), 0}, diff --git a/wpa_supplicant/config.h b/wpa_supplicant/config.h index d160458..3600f1f 100644 --- a/wpa_supplicant/config.h +++ b/wpa_supplicant/config.h @@ -47,6 +47,7 @@ #define DEFAULT_WPA_RSC_RELAXATION 1 #define DEFAULT_MBO_CELL_CAPA MBO_CELL_CAPA_NOT_SUPPORTED #define DEFAULT_CHAN_WIDTH 0 +#define DEFAULT_IGNORE_AUTH_RESP 0 #include "config_ssid.h" #include "wps/wps.h" @@ -880,6 +881,13 @@ struct wpa_config { */ int accept_external_scan_results; +#if CONFIG_TESTING_OPTIONS + /* Allow users to configure supplicant to drop a percentage of management frames. + * 0 == never, 65535 == always + */ + unsigned short ignore_auth_resp; +#endif + /** * disassoc_low_ack - Disassocicate stations with massive packet loss */ diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index a49fdd0..45ba550 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -512,7 +512,7 @@ static int wpa_supplicant_ctrl_iface_set(struct wpa_supplicant *wpa_s, } else if (os_strcasecmp(cmd, "p2p_go_csa_on_inv") == 0) { wpa_s->p2p_go_csa_on_inv = !!atoi(value); } else if (os_strcasecmp(cmd, "ignore_auth_resp") == 0) { - wpa_s->ignore_auth_resp = !!atoi(value); + wpa_s->conf->ignore_auth_resp = atoi(value); } else if (os_strcasecmp(cmd, "ignore_assoc_disallow") == 0) { wpa_s->ignore_assoc_disallow = !!atoi(value); } else if (os_strcasecmp(cmd, "reject_btm_req_reason") == 0) { @@ -7438,7 +7438,6 @@ static void wpa_supplicant_ctrl_iface_flush(struct wpa_supplicant *wpa_s) wpa_s->extra_roc_dur = 0; wpa_s->test_failure = WPAS_TEST_FAILURE_NONE; wpa_s->p2p_go_csa_on_inv = 0; - wpa_s->ignore_auth_resp = 0; wpa_s->ignore_assoc_disallow = 0; wpa_s->reject_btm_req_reason = 0; wpa_sm_set_test_assoc_ie(wpa_s->wpa, NULL); diff --git a/wpa_supplicant/defconfig b/wpa_supplicant/defconfig index 3540a62..450f3a4 100644 --- a/wpa_supplicant/defconfig +++ b/wpa_supplicant/defconfig @@ -575,3 +575,7 @@ CONFIG_PEERKEY=y # Mesh Networking (IEEE 802.11s) #CONFIG_MESH=y + + +# Enable some testing options code? Not intended for production code. +#CONFIG_TESTING_OPTIONS=y diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index f93c085..828019f 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -1223,6 +1223,15 @@ struct wpa_ssid * wpa_scan_res_match(struct wpa_supplicant *wpa_s, return NULL; } +#ifdef CONFIG_TESTING_OPTIONS +/** Return value that is 0 to (65535-1). */ +unsigned short os_random_16() +{ + int rnd = os_random(); + unsigned short rv = rnd % 65535; + return rv; +} +#endif static struct wpa_bss * wpa_supplicant_select_bss(struct wpa_supplicant *wpa_s, @@ -3716,9 +3725,10 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, break; case EVENT_ASSOC: #ifdef CONFIG_TESTING_OPTIONS - if (wpa_s->ignore_auth_resp) { - wpa_printf(MSG_INFO, - "EVENT_ASSOC - ignore_auth_resp active!"); + if (wpa_s->conf->ignore_auth_resp && + (os_random_16() < wpa_s->conf->ignore_auth_resp)) { + wpa_dbg(wpa_s, MSG_INFO, + "EVENT_ASSOC - ignore_auth_resp active!"); break; } #endif /* CONFIG_TESTING_OPTIONS */ @@ -3737,9 +3747,10 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, break; case EVENT_DEAUTH: #ifdef CONFIG_TESTING_OPTIONS - if (wpa_s->ignore_auth_resp) { - wpa_printf(MSG_INFO, - "EVENT_DEAUTH - ignore_auth_resp active!"); + if (wpa_s->conf->ignore_auth_resp && + (os_random_16() < wpa_s->conf->ignore_auth_resp)) { + wpa_dbg(wpa_s, MSG_INFO, + "EVENT_DEAUTH - ignore_auth_resp active!"); break; } #endif /* CONFIG_TESTING_OPTIONS */ diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index d8e23c9..19a2710 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -3507,8 +3507,9 @@ void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr, wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len); #ifdef CONFIG_TESTING_OPTIONS - if (wpa_s->ignore_auth_resp) { - wpa_printf(MSG_INFO, "RX EAPOL - ignore_auth_resp active!"); + if (wpa_s->conf->ignore_auth_resp && + (os_random_16() < wpa_s->conf->ignore_auth_resp)) { + wpa_dbg(wpa_s, MSG_INFO, "RX EAPOL - ignore_auth_resp active!"); return; } #endif /* CONFIG_TESTING_OPTIONS */ diff --git a/wpa_supplicant/wpa_supplicant.conf b/wpa_supplicant/wpa_supplicant.conf index f0e0a9e..fbe9b25 100644 --- a/wpa_supplicant/wpa_supplicant.conf +++ b/wpa_supplicant/wpa_supplicant.conf @@ -1364,6 +1364,13 @@ fast_reauth=1 # Transitioning between states). #fst_llt=100 +# Testing logic, not for use in production systems. +# Value is 0-65535, where 0 means never ignore, 65535 means always +# ignore, and the range between is a percentage chance. +# You must enable CONFIG_TESTING_OPTIONS when compiling to enable this. +#ignore_auth_resp=1000 + + # Example blocks: # Simple case: WPA-PSK, PSK as an ASCII passphrase, allow all valid ciphers diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index fa61f92..b41626a 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -1050,7 +1050,6 @@ struct wpa_supplicant { enum wpa_supplicant_test_failure test_failure; unsigned int reject_btm_req_reason; unsigned int p2p_go_csa_on_inv:1; - unsigned int ignore_auth_resp:1; unsigned int ignore_assoc_disallow:1; #endif /* CONFIG_TESTING_OPTIONS */ @@ -1117,6 +1116,10 @@ struct wpa_supplicant { struct os_reltime beacon_rep_scan; }; +#ifdef CONFIG_TESTING_OPTIONS +/** Return value that is 0 to (65535-1). */ +unsigned short os_random_16(); +#endif /* wpa_supplicant.c */ void wpa_supplicant_apply_ht_overrides( -- 1.9.3 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap