When determining a new node within the roam state machine, require the
destination node to have a better reported signal from the client.
Otherwise, the roam state machine might trigger a roam action for a
unsuitable destination node.
Signed-off-by: David Bauer <mail@david-bauer.net>
Don't request measurements from STAs which do not support the specific
measurement mode. Otherwise, hostapd complains in the syslog about
unsupported measurement modes.
Signed-off-by: David Bauer <mail@david-bauer.net>
Save the RRM capabilities of STAs when updating clients from hostapd.
This is required to determine which measurement modes a STA supports.
Signed-off-by: David Bauer <mail@david-bauer.net>
Currently, the neighbor report list is sorted based on the total amount
of roam actions to and from the specific foreign nodes.
This does not take into account that nodes might not be created at the
same time. When a popular neighbor node reboots, it's roam actions are
reset and it's ranking might not recover for a long amount of time
depending on how long the local node is already running.
Change this shotcoming to take into account the timestamp at which a
node was created. This way, the ranking depends on the amount of roam
actions relative to the nodes uptime / seen-time.
Signed-off-by: David Bauer <mail@david-bauer.net>
Save the timestamp of the node creation. This is required to optimize
the selection of most-roamed to neighbors relative to their creation
time.
Signed-off-by: David Bauer <mail@david-bauer.net>
Apply the same logic for selecting the most relevant neighbors also when
sending transition requests to STAs.
Signed-off-by: David Bauer <mail@david-bauer.net>
Prioritize neighbor candidates installed to hostapd. Add a new config
option to set a limit for neighbor reports installed to hostapd. This is
due to the fact, most devices will only evaluate a certain amount of
neighbor reports. Furthermore, the number of neighbor reports possible
is limited by the maximum frame size.
Signed-off-by: David Bauer <mail@david-bauer.net>
Keep track of STA journeys between multiple nodes. When a new STA is
reported from a foreign node, check whether this STA was previously
associated with a local node.
Vice versa, check upon association whether or not the STA was previously
associated with a foreign node.
Keep track of these roaming transactions using two new (local) fields of
the node struct.
Signed-off-by: David Bauer <mail@david-bauer.net>
Add a last_connected field to the sta_info struct. This field can be
used to determine, if and when a client was last connected to a given
node. This way, other nodes can determine where a client roamed to or
from.
Signed-off-by: David Bauer <mail@david-bauer.net>
This commit fixes updates not triggering due to a race-condition in
usteer.
When usteer does not yet have local-nodes when loading config, the
scheduled remote-update is not re-scheduled, leading to usteer only
exchanging node-messages on STA-events, leading to expiring remotes on
other remote nodes in low-event scenarios.
Signed-off-by: David Bauer <mail@david-bauer.net>
The codes looks to have a race-condition, where disconnected sta_infos
are created without scheduling a timeout.
As sta_infos are not connected by default, schedule the timeout upon
sta_info creation.
Fixes spurious spamming of "Refuse to add an already expired station
entry" on remote nodes.
Signed-off-by: David Bauer <mail@david-bauer.net>
The IEEE802.11-2016 specification says:
[...] a Channel Number field value of 255 indicates a request
to make iterative measurements for all supported channels in the
current operating class listed in the latest AP Channel Report
received from the serving AP.
The problem with this is, no AP Channel report is sent to the STA with
the measurement request.
To scan the whole Operating class, a channel number of 0 is desired:
[...] Channel Number field value of 0 indicates a request to make
iterative measurements for all supported channels in the operating
class [...]
Signed-off-by: David Bauer <mail@david-bauer.net>
When checking whether a client is allowed to associate to a node, the
lower ceiling for kicking clients was not taken into account when
assoc-steering is disabled.
The problem behind this is, that a configured lower barrier for
disassociating clients (kicking) would kick the client immediatly after
association. In the worst scenario the client immediatly associates
again to the station and ends up in a kick loop.
Don't allow associating when a min_snr is configured and the client
signal is below this value.
Signed-off-by: David Bauer <mail@david-bauer.net>
Make the connection state of a sta-info more readable by introducing an
enum for the STA connection state.
Also switch come comparison cases to use the explicit enum values to
make the code more readable.
Signed-off-by: David Bauer <mail@david-bauer.net>
Add the node BSSID to messages exchanged between usteer hosts. This way,
a foreign node can determine the node reported by a STA using beacon
reports.
Signed-off-by: David Bauer <mail@david-bauer.net>
Add the node BSSID to the usteer_node struct. This will be helpful in
the future when evaluating beacon reports from STAs.
Signed-off-by: David Bauer <mail@david-bauer.net>
The host address is allocated on the heap, hence it has to be freed when
freeing the containing struct.
Signed-off-by: David Bauer <mail@david-bauer.net>
When checking if the hostaddresses match up, the result returned from
strcmp was incorrectly evaluated. strcmp returns 0 in case both strings
match.
Signed-off-by: David Bauer <mail@david-bauer.net>
Add a build dependency for libpcap, as it is required for the monitor
utility but not usteer itself. Use a build-dependency, as the monitor
utility executable is not packaged.
Signed-off-by: David Bauer <mail@david-bauer.net>
The name pointer provided by ubus get's cleared after the first call to
ubus_register_subscriber in usteer_get_node. The leads to an incorrect
ifindex returned by if_nametoindex due to the 0 characters long string.
Work around this issue by reusing the interface name already stored in
the local node struct.
Fixes querying the wrong interface with netlink, resulting in incorrect
SSIDs used for the nodes.
Signed-off-by: David Bauer <mail@david-bauer.net>
This adds optional support for message exchange using IPv6 multicast
messaging. This has the ability for routers and switches between nodes
to route traffic between usteer nodes multicast-aware.
By default, IPv4 is used. IPv6 can be enabled by configuring the ipv6
option to 1.
Signed-off-by: Jan Braun <keksgesicht23@gmail.com>
[squash commits - adapt usock usage]
Signed-off-by: David Bauer <mail@david-bauer.net>
- make logging events more structured
- add fine grained control over log events
- make it possible to receive more detailed events via ubus
Signed-off-by: Felix Fietkau <nbd@nbd.name>