From e4b625c06b4ed004f23968b4ddfc2e724f998fd9 Mon Sep 17 00:00:00 2001 From: Ben Greear Date: Wed, 2 Feb 2011 22:42:54 -0800 Subject: [PATCH 15/16] wpa_supplicant: Support minimum interval between scan attempts. When running lots of vifs, they can all end up wanting to scan right after the other. This leaves too little time for useful work to happen. Allow users to configure a minimum timer interval (in seconds) between scans. Default is zero, which is current behaviour. Signed-off-by: Ben Greear --- :100644 100644 a6cd09b... babc76f... M wpa_supplicant/config.c :100644 100644 e0cfe38... df943f3... M wpa_supplicant/config.h :100644 100644 fedf0cb... 3297b32... M wpa_supplicant/events.c :100644 100644 5b8c985... f9981a4... M wpa_supplicant/scan.c :100644 100644 056ffa0... fa40faf... M wpa_supplicant/wpa_supplicant_i.h wpa_supplicant/config.c | 2 ++ wpa_supplicant/config.h | 4 ++++ wpa_supplicant/events.c | 1 + wpa_supplicant/scan.c | 19 +++++++++++++++++++ wpa_supplicant/wpa_supplicant_i.h | 1 + 5 files changed, 27 insertions(+), 0 deletions(-) diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c index a6cd09b..babc76f 100644 --- a/wpa_supplicant/config.c +++ b/wpa_supplicant/config.c @@ -2147,6 +2147,7 @@ struct wpa_config * wpa_config_alloc_empty(const char *ctrl_interface, config->p2p_intra_bss = DEFAULT_P2P_INTRA_BSS; config->bss_max_count = DEFAULT_BSS_MAX_COUNT; config->max_num_sta = DEFAULT_MAX_NUM_STA; + config->min_scan_gap = DEFAULT_MIN_SCAN_GAP; if (ctrl_interface) config->ctrl_interface = os_strdup(ctrl_interface); @@ -2386,6 +2387,7 @@ static const struct global_parse_data global_fields[] = { { INT(dot11RSNAConfigPMKLifetime), 0 }, { INT(dot11RSNAConfigPMKReauthThreshold), 0 }, { INT(dot11RSNAConfigSATimeout), 0 }, + { INT(min_scan_gap), 0 }, #ifndef CONFIG_NO_CONFIG_WRITE { INT(update_config), 0 }, #endif /* CONFIG_NO_CONFIG_WRITE */ diff --git a/wpa_supplicant/config.h b/wpa_supplicant/config.h index e0cfe38..df943f3 100644 --- a/wpa_supplicant/config.h +++ b/wpa_supplicant/config.h @@ -27,6 +27,7 @@ #define DEFAULT_P2P_INTRA_BSS 1 #define DEFAULT_BSS_MAX_COUNT 200 #define DEFAULT_MAX_NUM_STA 128 +#define DEFAULT_MIN_SCAN_GAP 0 #include "config_ssid.h" #include "wps/wps.h" @@ -403,6 +404,9 @@ struct wpa_config { * disassoc_low_ack - disassocenticate stations with massive packet loss */ int disassoc_low_ack; + + /* Minimum interval between scan requests, in seconds */ + int min_scan_gap; }; diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index fedf0cb..3297b32 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -907,6 +907,7 @@ static int _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s, return 0; } + wpa_s->last_scan_rx_sec = time(NULL); wpa_dbg(wpa_s, MSG_DEBUG, "New scan results available"); wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_SCAN_RESULTS); wpas_notify_scan_results(wpa_s); diff --git a/wpa_supplicant/scan.c b/wpa_supplicant/scan.c index 5b8c985..f9981a4 100644 --- a/wpa_supplicant/scan.c +++ b/wpa_supplicant/scan.c @@ -490,6 +490,8 @@ static void wpa_supplicant_scan(void *eloop_ctx, void *timeout_ctx) */ void wpa_supplicant_req_scan(struct wpa_supplicant *wpa_s, int sec, int usec) { + int n; + /* If there's at least one network that should be specifically scanned * then don't cancel the scan and reschedule. Some drivers do * background scanning which generates frequent scan results, and that @@ -512,6 +514,23 @@ void wpa_supplicant_req_scan(struct wpa_supplicant *wpa_s, int sec, int usec) } } + /* With lots of VIFS, we can end up trying to scan very often. + * This can cause us to not be able to associate due to missing + * EAPOL key messages and such. So, allow a minimum time between + * scans. + */ + if (wpa_s->conf->min_scan_gap) { + int mingap; + n = time(NULL); + if (n >= wpa_s->last_scan_rx_sec) + wpa_s->last_scan_rx_sec = n; + + mingap = wpa_s->conf->min_scan_gap + - (n - wpa_s->last_scan_rx_sec); + if (sec < mingap) + sec = mingap; + } + wpa_dbg(wpa_s, MSG_DEBUG, "Setting scan request: %d sec %d usec", sec, usec); eloop_cancel_timeout(wpa_supplicant_scan, wpa_s, NULL); diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index 056ffa0..fa40faf 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -357,6 +357,7 @@ struct wpa_supplicant { int group_cipher; int key_mgmt; int mgmt_group_cipher; + int last_scan_rx_sec; void *drv_priv; /* private data used by driver_ops */ void *global_drv_priv; -- 1.6.2.5