Avoid ping-pong between bands by adding a dynamic signal threshold.
If 5Ghz band is below roaming threshold (e.g. -70) and 2,4Ghz over
band-steering threshold (e.g. -50) this adds a dynamic threshold
depends on the signal level when station has connected. It adapts to
worser signal slowly.

- band_steering: added dynamic signal threshold
- main: added config option

Signed-off-by: Nils Hendrik Rottgardt <n.rottga...@gmail.com>
---
 band_steering.c                        | 19 ++++++++++++++++++-
 main.c                                 |  1 +
 openwrt/usteer/files/etc/config/usteer |  4 ++++
 openwrt/usteer/files/etc/init.d/usteer |  6 +++---
 usteer.h                               |  2 ++
 5 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/band_steering.c b/band_steering.c
index 7fce1df..8577caf 100644
--- a/band_steering.c
+++ b/band_steering.c
@@ -20,7 +20,24 @@
 
 void usteer_band_steering_sta_update(struct sta_info *si)
 {
-       if (si->signal < usteer_snr_to_signal(si->node, 
config.band_steering_min_snr))
+       if (si->connected == STA_NOT_CONNECTED) {
+               if (si->band_steering.signal_threshold != NO_SIGNAL) {
+                       si->band_steering.signal_threshold = NO_SIGNAL;
+               }
+               return;
+       }
+       if (si->connected != STA_NOT_CONNECTED && 
si->band_steering.signal_threshold == NO_SIGNAL) {
+               si->band_steering.signal_threshold = si->signal;
+               MSG(DEBUG, "band steering station " MAC_ADDR_FMT " (%s) set 
threshold (signal threshold %u)\n", MAC_ADDR_DATA(si->sta->addr), 
usteer_node_name(si->node), si->band_steering.signal_threshold);
+               return;
+       }
+
+       /* Adapt signal threshold to actual signal quality */
+       if (si->signal < si->band_steering.signal_threshold) {
+               si->band_steering.signal_threshold--;
+               MSG(DEBUG, "band steering station " MAC_ADDR_FMT " (%s) reduce 
threshold (signal: %d, signal threshold: %u)\n", MAC_ADDR_DATA(si->sta->addr), 
usteer_node_name(si->node), si->signal, si->band_steering.signal_threshold);
+       }
+       if (si->signal < usteer_snr_to_signal(si->node, 
config.band_steering_min_snr) || si->signal < 
si->band_steering.signal_threshold + config.band_steering_signal_threshold)
                si->band_steering.below_snr = true;
 }
 
diff --git a/main.c b/main.c
index 99aa6ad..4a9253c 100644
--- a/main.c
+++ b/main.c
@@ -101,6 +101,7 @@ void usteer_init_defaults(void)
 
        config.band_steering_interval = 120000;
        config.band_steering_min_snr = -60;
+       config.band_steering_signal_threshold = 5;
 
        config.link_measurement_interval = 30000;
 
diff --git a/openwrt/usteer/files/etc/config/usteer 
b/openwrt/usteer/files/etc/config/usteer
index f53c338..58d1f44 100644
--- a/openwrt/usteer/files/etc/config/usteer
+++ b/openwrt/usteer/files/etc/config/usteer
@@ -128,6 +128,10 @@ config usteer
        # steered to a higher frequency band
        #option band_steering_min_snr -60
 
+       # Difference that the signal must be better compared to signal was on 
connection to node.
+       # Avoids conflicts between roaming and band-steering policies.
+       # option band_steering_signal_threshold 5
+
        # Interval (ms) the device is sent a link-measurement request to help 
assess
        # the bi-directional link quality. Setting the interval to 0 disables 
link-measurements.
        #option link_measurement_interval 30000
diff --git a/openwrt/usteer/files/etc/init.d/usteer 
b/openwrt/usteer/files/etc/init.d/usteer
index 07fd99e..965aa0a 100755
--- a/openwrt/usteer/files/etc/init.d/usteer
+++ b/openwrt/usteer/files/etc/init.d/usteer
@@ -83,9 +83,9 @@ uci_usteer() {
                min_connect_snr min_snr min_snr_kick_delay 
signal_diff_threshold \
                initial_connect_delay steer_reject_timeout roam_process_timeout\
                roam_kick_delay roam_scan_tries roam_scan_timeout \
-               roam_scan_snr roam_scan_interval \
-               roam_trigger_snr roam_trigger_interval \
-               band_steering_interval band_steering_min_snr 
link_measurement_interval \
+               roam_scan_snr roam_scan_interval roam_trigger_snr 
roam_trigger_interval \
+               link_measurement_interval \
+               band_steering_interval band_steering_min_snr 
band_steering_signal_threshold \
                load_kick_threshold load_kick_delay load_kick_min_clients \
                load_kick_reason_code
        do
diff --git a/usteer.h b/usteer.h
index f692fb8..f354282 100644
--- a/usteer.h
+++ b/usteer.h
@@ -191,6 +191,7 @@ struct usteer_config {
 
        uint32_t band_steering_interval;
        int32_t band_steering_min_snr; 
+       uint32_t band_steering_signal_threshold;
 
        uint32_t link_measurement_interval;
 
@@ -265,6 +266,7 @@ struct sta_info {
 
        struct {
                bool below_snr;
+               int signal_threshold;
        } band_steering;
 
        uint64_t kick_time;
-- 
2.39.5


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to