When the AP goes below the configured threshold value bgcsan starts at short scan interval on the STA. If no better AP is found, the STA continues scanning frequently, causing increased power consumption. To resolve this, introduce an incremental scanning interval strategy: after each unsuccessful scan attempt, increment the short scan interval by (scan_count * short_scan_interval). This approach significantly reduces unnecessary power consumption during extended periods without a suitable alternative AP. Signed-off-by: Ria Polly Thomas <ria.thomas@xxxxxxxxxxxxxx> --- wpa_supplicant/bgscan_simple.c | 23 +++++++++++++++++++++-- wpa_supplicant/wpa_supplicant.conf | 6 +++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/wpa_supplicant/bgscan_simple.c b/wpa_supplicant/bgscan_simple.c index d9aaa634f..9596ecdea 100644 --- a/wpa_supplicant/bgscan_simple.c +++ b/wpa_supplicant/bgscan_simple.c @@ -31,6 +31,7 @@ struct bgscan_simple_data { int max_short_scans; /* maximum times we short-scan before back-off */ int short_interval; /* use if signal < threshold */ int long_interval; /* use if signal > threshold */ + bool use_incremental_scan; struct os_reltime last_bgscan; }; @@ -106,8 +107,11 @@ static void bgscan_simple_timeout(void *eloop_ctx, void *timeout_ctx) bgscan_simple_timeout, data, NULL); } else { scan_ok: - if (data->scan_interval == data->short_interval) { + if (data->scan_interval == data->short_interval || + data->scan_interval < data->long_interval) { data->short_scan_count++; + if (data->use_incremental_scan && data->short_scan_count > 1) + data->scan_interval = data->short_interval * data->short_scan_count; if (data->short_scan_count >= data->max_short_scans) { data->scan_interval = data->long_interval; wpa_printf(MSG_DEBUG, "bgscan simple: Backing " @@ -133,6 +137,7 @@ static int bgscan_simple_get_params(struct bgscan_simple_data *data, const char *pos; data->use_btm_query = 0; + data->use_incremental_scan = 0; data->short_interval = atoi(params); @@ -151,8 +156,22 @@ static int bgscan_simple_get_params(struct bgscan_simple_data *data, data->long_interval = atoi(pos); pos = os_strchr(pos, ':'); if (pos) { + const char *pos_tmp; pos++; - data->use_btm_query = atoi(pos); + pos_tmp = pos; + pos = os_strchr(pos, 'i'); + + if (pos) + data->use_incremental_scan = 1; + if (!pos || pos_tmp != pos) { + data->use_btm_query = atoi(pos_tmp); + } else { + pos = os_strchr(pos_tmp, ':'); + if (pos) { + pos++; + data->use_btm_query = atoi(pos); + } + } } return 0; diff --git a/wpa_supplicant/wpa_supplicant.conf b/wpa_supplicant/wpa_supplicant.conf index 121ad3879..dca992df1 100644 --- a/wpa_supplicant/wpa_supplicant.conf +++ b/wpa_supplicant/wpa_supplicant.conf @@ -1066,10 +1066,14 @@ fast_reauth=1 # Following bgscan modules are available: # simple - Periodic background scans based on signal strength # send_btm_query > 0 means do this many BTM queries before attempting a scan. +# incremental_short_scan - i means do incremental short scan if no valid AP is +# found when RSSI falls below threshold. # bgscan="simple:<short bgscan interval in seconds>:<signal strength threshold>: -# <long interval>[:<send_btm_query>]" +# <long interval>[:<send_btm_query>][:<incremental_short_scan>]" # bgscan="simple:30:-45:300" # bgscan="simple:30:-45:300:3" +# bgscan="simple:30:-45:300:i" +# bgscan="simple:30:-45:300:3:i" # learn - Learn channels used by the network and try to avoid bgscans on other # channels (experimental) # bgscan="learn:<short bgscan interval in seconds>:<signal strength threshold>: -- 2.25.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap