Lets talk about usteer

Who has tried it? What tips do you have to share with the community?
I've started a wiki page with all of the information i've gathered by playing with it so far, but i'm stabbing pretty blindly.
I haven't got band steering working properly yet, but sharing connected client information across the network is seamless and works with minimal effort.

Looking forward to the community contributing.

@tmomas I think i've created the page in the wrong space, i intended for it to be in the wiki. If it's in the wrong space can you please assist me in relocating it? Thank you


@bobafetthotmail Can you please take a look?

1 Like

How well does it work? I remember seeing a post somewhere about the fact that it doesn't work at all, at least when it comes to the actual steering part.

Not yet, but i'm not sure i've got a good setup for it. I'm in a scenario where the overlap of my APs is too high in some places and not enough coverage in others. So i end up with devices that can't decide between two equally terrible options.
I think i need to play with tx powers, then try steering



I have two Belkin RT3200's (They show up as Linksys E8450 (UBI)).

I'm trying to configure usteer based on the wiki referenced above but when I put the https://openwrt.org/usteer#configure_80211k_and_80211v_on_all_ap-nodes settings in for the ssid's then when I restart the network those wifi radios don't come up. They are disabled..

Any suggestions on how I would debug that?

I'm running OpenWrt SNAPSHOT r19175-ffa1088f63 / LuCI Master git-22.058.70382-d29400e

Check the logs after restarting the wifi and look for hostapd complaining about something

1 Like

Add in the section "Install and configure required packages" that you should remove/uninstall the wpad-basic-wolfssl (or wpad-basic) package and install the full version of wpad:

  • wpad-wolfssl
  • wpad-openssl

Tip from @daniel to solve your problem

1 Like

I found the following two options were causing a problem.

option bss_transition '1'
option wnm_sleep_mode '1'

Neither of those options were recognized by hostapd. I replace bss_transition with ieee80211v and I just removed the wnm_sleep_mode entry.

This is a snapshot release that will eventually become 22

Any other thoughts? I think it's working..

root@OpenWrt:~# grep rrm /var/run/hostapd*

That doesn't sound right on the snapshot?
That commit removes ieee80211v option.

Not to thread necromancy but I have 2 e8450's configured identically with "basically" default settings from 'first-boot' but on one AP only, my syslog gets spammed with:

usteer: Received packet from unconfigured interface 16

I'm comparing configuration differences (if any) but I don't see any differences. I'm just curious how to determine what interface 16 is. I'm guessing some ubus magic will help me but I'm stumped.

Anyone know why it would do this?

Try this cat /sys/class/net/*/ifindex
If you see a 16 in that list, then you'll need to dig through the actual interfaces in /sys/class/net to find 16.

The error message looks pretty self explanatory, but depends which interface your search turns up as to whether it makes sense or not.
git.openwrt.org Git - project/usteer.git/blob - remote.c

Ah, this make complete sense and I forgot one aspect I had going on when the spamming was happening as a temporary situation.

I had it setup as a route/AP but it uses radio0 (aka interface 16 on this device) in STA mode to connect to the other AP for easy SSHing into it from the one with the error.

Tear down that connection, it goes away - I'll check the code/config file and see if there is an easy way to tell it to ignore that interface.

Thanks for the help.

1 Like

Followup question as I'm not sure the proper format of this parameter:


is that the proper way to populate that setting? Separated by spaces?

No, with list options you want to do

list ssid_list ‘ssid1’
list ssid_list ‘ssid2’
1 Like

Hi how is this different from DAWN?

They both tackle similar problems using different methods.
I prefer the usteer code base (I understand it better), and it seems to work ok.

It’s incredibly under documented (hence this topic).

I'm trying to figure out how to do band steering on a single Linksys E8450 so that clients tend to prefer 5GHz where possible. I've bounced around a few forum threads on the subject but can't seem to get my usteer config quite right such that I can actually perceive it is working at all. Clients initially connected to 5GHz tend to switch to 2.4GHz when distance causes 5 to become weak, but then they never go back to 5 when they come back within close range.

Here is my current usteer config:

config usteer
	# The network interface for inter-AP communication
	option 'network' 'lan'

	# Log messages to syslog (0/1)
	option 'syslog' '1'

	# Disable network communication (0/1)
	#option local_mode '0'
	option local_mode '1'

	# Use IPv6 for remote exchange
	option 'ipv6' '0'

	# Minimum level of logged messages
	# 0 = fatal
	# 1 = info
	# 2 = verbose
	# 3 = some debug messages
	# 4 = network packet information
	# 5 = all debug messages
	option 'debug_level' '2'

	# Maximum number of neighbor reports set for a node
	#option max_neighbor_reports 8

	# Maximum amount of time (ms) a station may be blocked due to policy decisions
	#option sta_block_timeout 30000

	# Maximum amount of time (ms) a local unconnected station is tracked
	#option local_sta_timeout 120000

	# Maximum amount of time (ms) a measurement report is stored
	#option measurement_report_timeout 120000

	# Local station information update interval (ms)
	#option local_sta_update 1000

	# Maximum number of consecutive times a station may be blocked by policy
	#option max_retry_band 5
	option max_retry_band 3

	# Maximum idle time of a station entry (ms) to be considered for policy decisions
	#option seen_policy_timeout 30000

	# Minimum number of stations delta between APs before load balancing policy is active
	#option load_balancing_threshold 0

	# Minimum number of stations delta between bands before band steering policy is active
	#option band_steering_threshold 5
	option band_steering_threshold 0

	# Interval (ms) between sending state updates to other APs
	#option remote_update_interval 1000

	# Number of remote update intervals after which a remote-node is deleted
	#option remote_node_timeout 10

	# Allow rejecting assoc requests for steering purposes (0/1)
	#option assoc_steering 0
	option assoc_steering 1

	# Allow ignoring probe requests for steering purposes (0/1)
	#option probe_steering 0

	# Minimum signal-to-noise ratio or signal level (dBm) to allow connections
	#option min_connect_snr 0
	option min_connect_snr -100

	# Minimum signal-to-noise ratio or signal level (dBm) to remain connected
	#option min_snr 0
	option min_snr -100

	# Timeout after which a station with snr < min_snr will be kicked
	#option min_snr_kick_delay 5000

	# Timeout (ms) for which a client will not be steered after rejecting a BSS-transition-request
	#option steer_reject_timeout 60000

	# Timeout (in ms) after which a association following a disassociation is not seen
	# as a roam
	#option roam_process_timeout 5000

	# Minimum signal-to-noise ratio or signal level (dBm) before attempting to trigger
	# client scans for roaming
	#option roam_scan_snr 0

	# Maximum number of client roaming scan trigger attempts
	#option roam_scan_tries 3

	# Retry scanning when roam_scan_tries is exceeded after this timeout (in ms)
	# In case this option is set to 0, the client is kicked instead
	#option roam_scan_timeout 0

	# Minimum time (ms) between client roaming scan trigger attempts
	#option roam_scan_interval 10000

	# Minimum signal-to-noise ratio or signal level (dBm) before attempting to trigger
	# forced client roaming
	#option roam_trigger_snr 0

	# Minimum time (ms) between client roaming trigger attempts
	#option roam_trigger_interval 60000

	# Timeout (ms) for client roam requests. usteer will kick the client after this times out.
	#option roam_kick_delay 10000

	# Minimum signal strength difference until AP steering policy is active
	#option signal_diff_threshold 0

	# Initial delay (ms) before responding to probe requests (to allow other APs to see packets as well)
	#option initial_connect_delay 0

	# Enable kicking client on excessive channel load (0/1)
	#option load_kick_enabled 0

	# Minimum channel load (%) before kicking clients
	#option load_kick_threshold 75

	# Minimum amount of time (ms) that channel load is above threshold before starting to kick clients
	#option load_kick_delay 10000

	# Minimum number of connected clients before kicking based on channel load
	#option load_kick_min_clients 10

	# Reason code on client kick based on channel load (default: WLAN_REASON_DISASSOC_AP_BUSY)
	#option load_kick_reason_code 5

	# Attempting to steer clients to a higher frequency-band every n ms.
	# A value of 0 disabled band-steering.
	#option band_steering_interval 120000
	option band_steering_interval 6000

	# Minimal SNR or absolute signal a device has to maintain over band_steering_interval to be
	# steered to a higher frequency band
	#option band_steering_min_snr -60
	option band_steering_min_snr -100

	# Interval (ms) the device is sent a link-measurement request to help assess
	# the bi-directional link quality. Setting the interval to 0 disables link-measurements.
	#option link_measurement_interval 30000
	option link_measurement_interval 3000

	# Script to run after bringing up a node
	#option node_up_script ''

	# Message types to include in log
	# Available types:
	# - probe_req_accept
	# - probe_req_deny
	# - auth_req_accept
	# - auth_req_deny
	# - assoc_req_accept
	# - assoc_req_deny
	# - load_kick_trigger
	# - load_kick_reset
	# - load_kick_min_clients
	# - load_kick_no_client
	# - load_kick_client
	# - signal_kick
	#list event_log_types ''

	# List of SSIDs to enable steering on
	#list ssid_list ''

Here is my current wireless config:

config wifi-iface 'wifinet2'
	option device 'radio0'
	option mode 'ap'
	option ssid 'REDACTED'
	option encryption 'psk2'
	option key 'REDACTED'
	option network 'lan'
	option ieee80211r '1'
	option ft_over_ds '0'
	option ft_psk_generate_local '1'
	option ieee80211v '1'
	option ieee80211k '1'
	option bss_transition '1'
	option wnm_sleep_mode '1'
	option time_advertisement '2'
	option time_zone 'GMT0'
	option rrm_neighbor_report '1'
	option rrm_beacon_report '1'

config wifi-iface 'wifinet3'
	option device 'radio1'
	option mode 'ap'
	option ssid 'REDACTED'
	option encryption 'psk2'
	option key 'REDACTED'
	option network 'lan'
	option ieee80211r '1'
	option ft_over_ds '0'
	option ft_psk_generate_local '1'
	option ieee80211v '1'
	option ieee80211k '1'
	option bss_transition '1'
	option wnm_sleep_mode '1'
	option time_advertisement '2'
	option time_zone 'GMT0'
	option rrm_neighbor_report '1'
	option rrm_beacon_report '1'

And in syslog I typically just see a lot of this type of message:

Tue Sep 13 13:18:48 2022 daemon.notice hostapd: wlan0: BSS-TM-RESP REDACTED-MAC-ADDRESS status_code=7 bss_termination_delay=0
Tue Sep 13 13:18:48 2022 daemon.notice hostapd: wlan0: BSS-TM-RESP REDACTED-MAC-ADDRESS status_code=1 bss_termination_delay=0

Has anyone figured out how to do this properly with usteer?

1 Like

It looks fine, but you’ve not listed your steering APs (the final config item).
Did you redact them or not configure it?

1 Like

I had not previously configured the ssid_list config item. I guess I assumed it would default to "all" or something since I never really saw anyone else point it out and it's not listed as a required item in the usteer wiki page. Is it required?

1 Like
list ‘ssid_list’ ‘ssid 2.4ghz’
list ‘ssid_list’ ‘ssid 5ghz’

Insert your proper SSIDs
It’s not listed as required because it isn’t, but it is if you want to do steering.

The wiki could do with some more hints, examples and gotchas like this, but so far no one seems very keen to help, or not many people are trying usteer.

1 Like