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:
2
main.c
2
main.c
@@ -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;
|
||||||
|
@@ -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
|
||||||
|
@@ -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 \
|
||||||
|
10
policy.c
10
policy.c
@@ -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
1
ubus.c
@@ -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), \
|
||||||
|
3
usteer.h
3
usteer.h
@@ -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;
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user