Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions local_node.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
3 changes: 3 additions & 0 deletions openwrt/usteer/files/etc/config/usteer
Original file line number Diff line number Diff line change
Expand Up @@ -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 ''
1 change: 1 addition & 0 deletions openwrt/usteer/files/etc/init.d/usteer
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
24 changes: 24 additions & 0 deletions policy.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
#include "node.h"
#include "event.h"

#include <string.h>

static bool
below_assoc_threshold(struct usteer_node *node_cur, struct usteer_node *node_new)
{
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand Down
1 change: 1 addition & 0 deletions ubus.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
5 changes: 5 additions & 0 deletions usteer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};

Expand Down Expand Up @@ -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);
Expand Down