[PATCH usteer v2 2/3] New aggressive roaming - optimizations
Nils Hendrik Rottgardt
n.rottgardt at gmail.com
Tue Oct 29 13:08:09 PDT 2024
Optimized handling of aggressive roaming
- Take care of correct disassociation_timer corresponding to kick_time
- Added some messages (verbose and debug)
- Corrected assisted roaming as disassociation_imminent has to be false as no kick is planned
Signed-off-by: Nils Hendrik Rottgardt <n.rottgardt at gmail.com>
---
band_steering.c | 16 ++++++++++++----
local_node.c | 3 ++-
main.c | 1 -
openwrt/usteer/files/etc/config/usteer | 9 ++++-----
openwrt/usteer/files/etc/init.d/usteer | 2 +-
policy.c | 21 +++++++++++----------
ubus.c | 8 ++++----
usteer.h | 1 -
8 files changed, 34 insertions(+), 27 deletions(-)
diff --git a/band_steering.c b/band_steering.c
index d7ff8cf..d680d02 100644
--- a/band_steering.c
+++ b/band_steering.c
@@ -60,6 +60,8 @@ void usteer_band_steering_perform_steer(struct usteer_local_node *ln)
{
unsigned int min_count = DIV_ROUND_UP(config.band_steering_interval, config.local_sta_update);
struct sta_info *si;
+ uint32_t disassoc_timer;
+ uint32_t validity_period;
if (!config.band_steering_interval)
return;
@@ -94,10 +96,16 @@ void usteer_band_steering_perform_steer(struct usteer_local_node *ln)
}
if (si->bss_transition) {
- if (si->sta->aggressive)
- usteer_ubus_band_steering_request(si, 0, true, config.aggressive_disassoc_timer, true, config.aggressive_disassoc_timer);
- else
- usteer_ubus_band_steering_request(si, 0, false, 0, true, 100);
+ if (!si->kick_time && si->sta->aggressive) {
+ si->kick_time = current_time + config.roam_kick_delay;
+ validity_period = 10000 / usteer_local_node_get_beacon_interval(ln); /* ~ 10 seconds */
+ disassoc_timer = (si->kick_time - current_time) / usteer_local_node_get_beacon_interval(ln);
+
+ if (si->sta->aggressive)
+ usteer_ubus_band_steering_request(si, 0, true, disassoc_timer, true, validity_period);
+ else
+ usteer_ubus_band_steering_request(si, 0, false, 0, true, validity_period);
+ }
}
si->band_steering.below_snr = false;
diff --git a/local_node.c b/local_node.c
index 6aa7008..89490d7 100644
--- a/local_node.c
+++ b/local_node.c
@@ -183,6 +183,7 @@ usteer_handle_bss_tm_response(struct usteer_local_node *ln, struct blob_attr *ms
if (si->bss_transition_response.status_code) {
/* Cancel imminent kick in case BSS transition was rejected */
si->kick_time = 0;
+ MSG(VERBOSE, "Kick canceled because transition was rejected by sta=" MAC_ADDR_FMT "\n", MAC_ADDR_DATA(si->sta->addr));
}
return 0;
@@ -748,7 +749,7 @@ usteer_local_node_process_bss_tm_queries(struct uloop_timeout *timeout)
if (!si)
continue;
- usteer_ubus_bss_transition_request(si, query->dialog_token, config.aggressive_all, validity_period, true, validity_period, NULL);
+ usteer_ubus_bss_transition_request(si, query->dialog_token, false, 0, true, validity_period, NULL);
}
/* Free pending queries we can not handle */
diff --git a/main.c b/main.c
index b07b624..c796c3c 100644
--- a/main.c
+++ b/main.c
@@ -97,7 +97,6 @@ void usteer_init_defaults(void)
config.initial_connect_delay = 0;
config.remote_node_timeout = 10;
config.aggressive_all = false;
- config.aggressive_disassoc_timer = 100;
config.steer_reject_timeout = 60000;
diff --git a/openwrt/usteer/files/etc/config/usteer b/openwrt/usteer/files/etc/config/usteer
index 2fe47f3..7ef365c 100644
--- a/openwrt/usteer/files/etc/config/usteer
+++ b/openwrt/usteer/files/etc/config/usteer
@@ -1,4 +1,6 @@
config usteer
+ # OpenWRT guide: https://openwrt.org/docs/guide-user/network/wifi/usteer
+
# The network interface for inter-AP communication
option 'network' 'lan'
@@ -71,15 +73,12 @@ config usteer
# Timeout (ms) for which a client will not be steered after rejecting a BSS-transition-request
#option steer_reject_timeout 60000
- # Use aggressvice roaming to push clients to another AP
+ # Use aggressive roaming to push clients to another AP for all stations (0/1)
#option aggressive_all 0
- # List of MACs to enable aggressive roaming on. If not set all macs will handled aggressive
+ # List of MACs (lower case) to enable aggressive roaming on. If not set all stations will handled aggressive
#list aggressive_mac_list ''
- # Disassociation imminent tuner - in aggresive mode the time a client has to roam away before disconnected hardly
- #option aggressive_disassoc_timer 100
-
# Timeout (in ms) after which a association following a disassociation is not seen
# as a roam
#option roam_process_timeout 5000
diff --git a/openwrt/usteer/files/etc/init.d/usteer b/openwrt/usteer/files/etc/init.d/usteer
index fdc8211..d517f93 100755
--- a/openwrt/usteer/files/etc/init.d/usteer
+++ b/openwrt/usteer/files/etc/init.d/usteer
@@ -86,7 +86,7 @@ uci_usteer() {
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 aggressive_disassoc_timer\
+ roam_trigger_snr roam_trigger_interval\
band_steering_interval band_steering_min_snr link_measurement_interval \
load_kick_threshold load_kick_delay load_kick_min_clients \
load_kick_reason_code
diff --git a/policy.c b/policy.c
index e66f2d4..b3af22b 100644
--- a/policy.c
+++ b/policy.c
@@ -48,6 +48,7 @@ better_signal_strength(int signal_cur, int signal_new)
const bool is_better = signal_new - signal_cur
> (int) config.signal_diff_threshold;
+ //hier das Band noch berücksichtigen wegen höherer Bandbreite bei 5Ghz
if (!config.signal_diff_threshold)
return false;
@@ -322,6 +323,8 @@ static bool
usteer_roam_trigger_sm(struct usteer_local_node *ln, struct sta_info *si)
{
struct sta_info *candidate;
+ uint32_t disassoc_timer;
+ uint32_t validity_period;
struct uevent ev = {
.si_cur = si,
};
@@ -370,13 +373,15 @@ usteer_roam_trigger_sm(struct usteer_local_node *ln, struct sta_info *si)
break;
}
+ if (!si->kick_time && si->sta->aggressive)
+ si->kick_time = current_time + config.roam_kick_delay;
+
+ validity_period = 10000 / usteer_local_node_get_beacon_interval(ln); /* ~ 10 seconds */
if (si->sta->aggressive) {
- // TODO: Disaccociation Timer noch konfigurierbar machen
- usteer_ubus_bss_transition_request(si, 1, true, config.aggressive_disassoc_timer, true, config.aggressive_disassoc_timer, candidate->node);
- si->roam_disassoc_time = current_time + (100 * 100);
+ disassoc_timer = (si->kick_time - current_time) / usteer_local_node_get_beacon_interval(ln);
+ usteer_ubus_bss_transition_request(si, 1, true, disassoc_timer, true, validity_period, candidate->node);
} else {
- usteer_ubus_bss_transition_request(si, 1, false, 0, true, 100, candidate->node);
- si->kick_time = current_time + config.roam_kick_delay;
+ usteer_ubus_bss_transition_request(si, 1, false, 0, true, validity_period, candidate->node);
}
usteer_roam_set_state(si, ROAM_TRIGGER_IDLE, &ev);
@@ -393,7 +398,7 @@ bool usteer_policy_can_perform_roam(struct sta_info *si)
return false;
/* Skip on pending kick */
- if (si->kick_time)
+ if (si->kick_time && si->kick_time <= current_time)
return false;
/* Skip on rejected transition */
@@ -408,10 +413,6 @@ bool usteer_policy_can_perform_roam(struct sta_info *si)
if (current_time - si->connected_since < config.roam_trigger_interval)
return false;
- /* Skip on aggressive roaming in progress - wait 10s after disassociation event*/
- if (current_time - si->roam_disassoc_time < 10000)
- return false;
-
return true;
}
diff --git a/ubus.c b/ubus.c
index fd6e224..57b7d29 100644
--- a/ubus.c
+++ b/ubus.c
@@ -691,10 +691,10 @@ int usteer_ubus_bss_transition_request(struct sta_info *si,
blobmsg_add_u32(&b, "validity_period", validity_period);
if (!target_node) {
// Add all known neighbors if no specific target set
- MSG(DEBUG, "ROAMING requested for sta=" MAC_ADDR_FMT " without target\n", MAC_ADDR_DATA(si->sta->addr));
+ MSG(VERBOSE, "ROAMING requested for sta=" MAC_ADDR_FMT " without target\n", MAC_ADDR_DATA(si->sta->addr));
usteer_ubus_disassoc_add_neighbors(si);
} else {
- MSG(DEBUG, "ROAMING requested for sta=" MAC_ADDR_FMT " to %s with disassociation timer %i\n", MAC_ADDR_DATA(si->sta->addr), usteer_node_name(target_node), disassoc_timer);
+ MSG(VERBOSE, "ROAMING requested for sta=" MAC_ADDR_FMT " to %s with disassociation timer %i\n", MAC_ADDR_DATA(si->sta->addr), usteer_node_name(target_node), disassoc_timer);
usteer_ubus_disassoc_add_neighbor(si, target_node);
}
return ubus_invoke(ubus_ctx, ln->obj_id, "bss_transition_request", b.head, NULL, 0, 100);
@@ -730,10 +730,10 @@ int usteer_ubus_band_steering_request(struct sta_info *si,
}
blobmsg_close_array(&b, c);
if (sizeof(si->node) > 0) {
- MSG(DEBUG, "BAND STEERING requested for sta=" MAC_ADDR_FMT " with disassociation timer %i\n", MAC_ADDR_DATA(si->sta->addr), disassoc_timer);
+ MSG(VERBOSE, "BAND STEERING requested for sta=" MAC_ADDR_FMT " with disassociation timer %i\n", MAC_ADDR_DATA(si->sta->addr), disassoc_timer);
return ubus_invoke(ubus_ctx, ln->obj_id, "bss_transition_request", b.head, NULL, 0, 100);
} else
- MSG(DEBUG, "BAND STEERING no targets found for sta=" MAC_ADDR_FMT "\n", MAC_ADDR_DATA(si->sta->addr));
+ MSG(VERBOSE, "BAND STEERING no targets found for sta=" MAC_ADDR_FMT "\n", MAC_ADDR_DATA(si->sta->addr));
}
int usteer_ubus_trigger_link_measurement(struct sta_info *si)
diff --git a/usteer.h b/usteer.h
index f771c37..7a399db 100644
--- a/usteer.h
+++ b/usteer.h
@@ -259,7 +259,6 @@ struct sta_info {
uint8_t roam_tries;
uint64_t roam_event;
uint64_t roam_kick;
- uint64_t roam_disassoc_time;
uint64_t roam_scan_start;
uint64_t roam_scan_timeout_start;
--
2.39.5
More information about the openwrt-devel
mailing list