usteer_roam_set_state(struct sta_info *si, enum roam_trigger_state state,
struct uevent *ev)
{
+ /* NOP in case we remain idle */
+ if (si->roam_state == state && si->roam_state == ROAM_TRIGGER_IDLE) {
+ si->roam_tries = 0;
+ return;
+ }
+
si->roam_event = current_time;
if (si->roam_state == state) {
- if (si->roam_state == ROAM_TRIGGER_IDLE) {
- si->roam_tries = 0;
- return;
- }
-
si->roam_tries++;
} else {
si->roam_tries = 0;
return false;
}
-static bool
-usteer_local_node_roam_sm_active(struct sta_info *si, int min_signal)
+bool usteer_policy_can_perform_roam(struct sta_info *si)
{
/* Only trigger for connected STAs */
if (si->connected != STA_CONNECTED)
return false;
- /* Signal has to be below scan / roam threshold */
- if (si->signal >= min_signal)
- return false;
-
/* Skip on pending kick */
if (si->kick_time)
return false;
/* Skip on previous kick attempt */
if (current_time - si->roam_kick < config.roam_trigger_interval)
return false;
+
+ /* Skip if connection is established shorter than the trigger-interval */
+ if (current_time - si->connected_since < config.roam_trigger_interval)
+ return false;
return true;
}
+static bool
+usteer_local_node_roam_sm_active(struct sta_info *si, int min_signal)
+{
+ if (!usteer_policy_can_perform_roam(si))
+ return false;
+
+ /* Signal has to be below scan / roam threshold */
+ if (si->signal >= min_signal)
+ return false;
+
+ return true;
+}
+
static void
usteer_local_node_roam_check(struct usteer_local_node *ln, struct uevent *ev)
{
if (si->below_min_snr <= min_count)
continue;
- si->kick_count++;
-
ev.type = UEV_SIGNAL_KICK;
ev.threshold.cur = si->signal;
ev.count = si->kick_count;