remote: close file on usteer_init_local_id fread fail
[project/usteer.git] / policy.c
index 1a96cfa09e01a2bf99a366104438d3c479273848..8c5d244b35d8735f0918dfd8514d0abea9c5cd11 100644 (file)
--- a/policy.c
+++ b/policy.c
@@ -264,14 +264,15 @@ static void
 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;
@@ -378,17 +379,12 @@ usteer_roam_trigger_sm(struct usteer_local_node *ln, struct sta_info *si)
        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;
@@ -400,10 +396,27 @@ usteer_local_node_roam_sm_active(struct sta_info *si, int min_signal)
        /* 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)
 {
@@ -465,8 +478,6 @@ usteer_local_node_snr_kick(struct usteer_local_node *ln)
                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;