[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