policy: add min_snr_kick_delay

Currently the min_snr option will result in kicking clients the first
time their SNR dips below.

This might not be desirable, as drivers (notably ath10k) sometimes
report a much lower RSSI for a short timeframe after returning to
sensible values. Also, a device might be in the process of roaming just
to be kicked before.

Add the min_snr_kick_delay option. A client will be kicked after this
timeframe when it's SNR is below the min_snr threshold value over the
complete timeframe.

Signed-off-by: David Bauer <mail@david-bauer.net>
This commit is contained in:
David Bauer
2022-01-23 14:15:53 +01:00
parent e36967f219
commit c7830b5319
6 changed files with 19 additions and 2 deletions

2
main.c
View File

@@ -103,6 +103,8 @@ void usteer_init_defaults(void)
config.roam_scan_interval = 10 * 1000; config.roam_scan_interval = 10 * 1000;
config.roam_trigger_interval = 60 * 1000; config.roam_trigger_interval = 60 * 1000;
config.min_snr_kick_delay = 5 * 1000;
config.load_kick_enabled = false; config.load_kick_enabled = false;
config.load_kick_threshold = 75; config.load_kick_threshold = 75;
config.load_kick_delay = 10 * 1000; config.load_kick_delay = 10 * 1000;

View File

@@ -56,6 +56,9 @@ config usteer
# Minimum signal-to-noise ratio or signal level (dBm) to remain connected # Minimum signal-to-noise ratio or signal level (dBm) to remain connected
#option min_snr 0 #option min_snr 0
# Timeout after which a station with snr < min_snr will be kicked
#option min_snr_kick_delay 5000
# Timeout (in ms) after which a association following a disassociation is not seen # Timeout (in ms) after which a association following a disassociation is not seen
# as a roam # as a roam
#option roam_process_timeout 5000 #option roam_process_timeout 5000

View File

@@ -78,7 +78,7 @@ uci_usteer() {
max_neighbor_reports max_retry_band seen_policy_timeout \ max_neighbor_reports max_retry_band seen_policy_timeout \
load_balancing_threshold band_steering_threshold \ load_balancing_threshold band_steering_threshold \
remote_update_interval remote_node_timeout\ remote_update_interval remote_node_timeout\
min_connect_snr min_snr signal_diff_threshold \ min_connect_snr min_snr min_snr_kick_delay signal_diff_threshold \
initial_connect_delay roam_process_timeout\ initial_connect_delay roam_process_timeout\
roam_kick_delay roam_scan_tries roam_scan_timeout \ roam_kick_delay roam_scan_tries roam_scan_timeout \
roam_scan_snr roam_scan_interval \ roam_scan_snr roam_scan_interval \

View File

@@ -422,6 +422,7 @@ usteer_local_node_roam_check(struct usteer_local_node *ln, struct uevent *ev)
static void static void
usteer_local_node_snr_kick(struct usteer_local_node *ln) usteer_local_node_snr_kick(struct usteer_local_node *ln)
{ {
unsigned int min_count = DIV_ROUND_UP(config.min_snr_kick_delay, config.local_sta_update);
struct uevent ev = { struct uevent ev = {
.node_local = &ln->node, .node_local = &ln->node,
}; };
@@ -438,7 +439,14 @@ usteer_local_node_snr_kick(struct usteer_local_node *ln)
if (si->connected != STA_CONNECTED) if (si->connected != STA_CONNECTED)
continue; continue;
if (si->signal >= min_signal) if (si->signal >= min_signal) {
si->below_min_snr = 0;
continue;
} else {
si->below_min_snr++;
}
if (si->below_min_snr <= min_count)
continue; continue;
si->kick_count++; si->kick_count++;

1
ubus.c
View File

@@ -156,6 +156,7 @@ struct cfg_item {
_cfg(BOOL, assoc_steering), \ _cfg(BOOL, assoc_steering), \
_cfg(I32, min_connect_snr), \ _cfg(I32, min_connect_snr), \
_cfg(I32, min_snr), \ _cfg(I32, min_snr), \
_cfg(U32, min_snr_kick_delay), \
_cfg(U32, roam_process_timeout), \ _cfg(U32, roam_process_timeout), \
_cfg(I32, roam_scan_snr), \ _cfg(I32, roam_scan_snr), \
_cfg(U32, roam_scan_tries), \ _cfg(U32, roam_scan_tries), \

View File

@@ -165,6 +165,7 @@ struct usteer_config {
uint32_t remote_node_timeout; uint32_t remote_node_timeout;
int32_t min_snr; int32_t min_snr;
uint32_t min_snr_kick_delay;
int32_t min_connect_snr; int32_t min_connect_snr;
uint32_t signal_diff_threshold; uint32_t signal_diff_threshold;
@@ -242,6 +243,8 @@ struct sta_info {
int kick_count; int kick_count;
uint32_t below_min_snr;
uint8_t scan_band : 1; uint8_t scan_band : 1;
uint8_t connected : 2; uint8_t connected : 2;
}; };