Subject: [PATCH] Bgscan simple: Add Support for incremental short scan.
Ria Polly Thomas
ria.thomas at morsemicro.com
Thu Apr 3 23:29:55 PDT 2025
>From 24daa4f12b5d7669392b3748e4a9d19259d195f3 Mon Sep 17 00:00:00 2001
From: Ria Thomas <ria.thomas at morsemicro.com>
Date: Fri, 4 Apr 2025 11:35:25 +0530
Subject: [PATCH] Bgscan simple: Add Support for incremental short scan.
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 at morsemicro.com>
---
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
More information about the Hostap
mailing list