From f2b948e6f377923e9ce365ac8e53e9c08ded60d7 Mon Sep 17 00:00:00 2001 From: Marco Luchetta Date: Wed, 27 Aug 2025 11:33:28 +0200 Subject: [PATCH] Added possibility to avoid roaming, band stearing and kick out for specific station (via MAC Addres) --- local_node.c | 40 ++++++++++++++++++++++++++ openwrt/usteer/files/etc/config/usteer | 3 ++ openwrt/usteer/files/etc/init.d/usteer | 1 + policy.c | 24 ++++++++++++++++ ubus.c | 1 + usteer.h | 5 ++++ 6 files changed, 74 insertions(+) diff --git a/local_node.c b/local_node.c index e74d945..5b8ca01 100644 --- a/local_node.c +++ b/local_node.c @@ -977,6 +977,46 @@ void config_get_ssid_list(struct blob_buf *buf) blobmsg_add_blob(buf, config.ssid_list); } +void config_set_ignored_stations(struct blob_attr *data) +{ + int i = 0; + const char *val; + + if (!data) + return; + + val = blobmsg_get_string(data); + + if (config.ignored_stations) + free(config.ignored_stations); + + if (!strlen(val)) { + config.ignored_stations = NULL; + return; + } + + config.ignored_stations = malloc(strlen(val)); + for (i = 0; i < strlen(val); i++) + { + if ((val[i] >= 'a') && (val[i] <= 'z')) + config.ignored_stations[i] = val[i] + 'A' - 'a'; + else + config.ignored_stations[i] = val[i]; + } + + config.ignored_stations[i] = 0; + + debug_msg(MSG_DEBUG, "config_set_ignored_stations", 1009, "Station to be ignored: %s", config.ignored_stations); +} + +void config_get_ignored_stations(struct blob_buf *buf) +{ + if (!config.ignored_stations) + return; + + blobmsg_add_string(buf, "ignored_stations", config.ignored_stations); +} + void usteer_local_nodes_init(struct ubus_context *ctx) { diff --git a/openwrt/usteer/files/etc/config/usteer b/openwrt/usteer/files/etc/config/usteer index f53c338..639ad03 100644 --- a/openwrt/usteer/files/etc/config/usteer +++ b/openwrt/usteer/files/etc/config/usteer @@ -151,5 +151,8 @@ config usteer # - signal_kick #list event_log_types '' + # MAC Address to ignore + #option ignored_stations '' + # List of SSIDs to enable steering on #list ssid_list '' diff --git a/openwrt/usteer/files/etc/init.d/usteer b/openwrt/usteer/files/etc/init.d/usteer index 07fd99e..cd25890 100755 --- a/openwrt/usteer/files/etc/init.d/usteer +++ b/openwrt/usteer/files/etc/init.d/usteer @@ -70,6 +70,7 @@ uci_usteer() { uci_option_to_json_bool "$cfg" load_kick_enabled uci_option_to_json_bool "$cfg" assoc_steering uci_option_to_json_string "$cfg" node_up_script + uci_option_to_json_string "$cfg" ignored_stations uci_option_to_json_string_array "$cfg" ssid_list uci_option_to_json_string_array "$cfg" event_log_types diff --git a/policy.c b/policy.c index 8c5d244..a41cbdd 100644 --- a/policy.c +++ b/policy.c @@ -21,6 +21,8 @@ #include "node.h" #include "event.h" +#include + static bool below_assoc_threshold(struct usteer_node *node_cur, struct usteer_node *node_new) { @@ -114,6 +116,18 @@ is_better_candidate(struct sta_info *si_cur, struct sta_info *si_new) return reasons; } +static bool +uster_policy_sta_to_ignore(struct sta_info *si_cur) +{ + char macAddr[24]; + int i = 0; + for (i = 0; i < 6; i++) + sprintf(&(macAddr[3 * i]), "%02X:", si_cur->sta->addr[i]); + macAddr[17] = 0; + + return (strstr(config.ignored_stations, macAddr) != NULL); +} + static struct sta_info * find_better_candidate(struct sta_info *si_ref, struct uevent *ev, uint32_t required_criteria, uint64_t max_age) { @@ -385,6 +399,10 @@ bool usteer_policy_can_perform_roam(struct sta_info *si) if (si->connected != STA_CONNECTED) return false; + /* Skip if station should be ignored */ + if (uster_policy_sta_to_ignore(si)) + return false; + /* Skip on pending kick */ if (si->kick_time) return false; @@ -468,6 +486,9 @@ usteer_local_node_snr_kick(struct usteer_local_node *ln) if (si->connected != STA_CONNECTED) continue; + if (uster_policy_sta_to_ignore(si)) + continue; + if (si->signal >= min_signal) { si->below_min_snr = 0; continue; @@ -539,6 +560,9 @@ usteer_local_node_load_kick(struct usteer_local_node *ln) if (si->connected != STA_CONNECTED) continue; + if (uster_policy_sta_to_ignore(si)) + continue; + if (is_more_kickable(kick1, si)) kick1 = si; diff --git a/ubus.c b/ubus.c index 40daf74..f340542 100644 --- a/ubus.c +++ b/ubus.c @@ -187,6 +187,7 @@ struct cfg_item { _cfg(ARRAY_CB, interfaces), \ _cfg(STRING_CB, node_up_script), \ _cfg(ARRAY_CB, event_log_types), \ + _cfg(STRING_CB, ignored_stations), \ _cfg(ARRAY_CB, ssid_list) enum cfg_items { diff --git a/usteer.h b/usteer.h index f692fb8..837e0ea 100644 --- a/usteer.h +++ b/usteer.h @@ -205,6 +205,8 @@ struct usteer_config { const char *node_up_script; uint32_t event_log_mask; + char *ignored_stations; + struct blob_attr *ssid_list; }; @@ -376,6 +378,9 @@ void config_get_node_up_script(struct blob_buf *buf); void config_set_ssid_list(struct blob_attr *data); void config_get_ssid_list(struct blob_buf *buf); +void config_set_ignored_stations(struct blob_attr *data); +void config_get_ignored_stations(struct blob_buf *buf); + int usteer_interface_init(void); void usteer_interface_add(const char *name); void usteer_sta_node_cleanup(struct usteer_node *node);