Merge branch 'moonshot' of ssh://moonshot.suchdamage.org:822/srv/git/libeap into...
[libeap.git] / wpa_supplicant / bgscan_learn.c
index 32305a4..ee79511 100644 (file)
@@ -428,6 +428,15 @@ static void * bgscan_learn_init(struct wpa_supplicant *wpa_s,
        data->scan_interval = data->short_interval;
        eloop_register_timeout(data->scan_interval, 0, bgscan_learn_timeout,
                               data, NULL);
+
+       /*
+        * This function is called immediately after an association, so it is
+        * reasonable to assume that a scan was completed recently. This makes
+        * us skip an immediate new scan in cases where the current signal
+        * level is below the bgscan threshold.
+        */
+       os_get_time(&data->last_bgscan);
+
        return data;
 }
 
@@ -546,23 +555,30 @@ static void bgscan_learn_notify_beacon_loss(void *priv)
 }
 
 
-static void bgscan_learn_notify_signal_change(void *priv, int above)
+static void bgscan_learn_notify_signal_change(void *priv, int above,
+                                             int current_signal,
+                                             int current_noise,
+                                             int current_txrate)
 {
        struct bgscan_learn_data *data = priv;
+       int scan = 0;
+       struct os_time now;
 
        if (data->short_interval == data->long_interval ||
            data->signal_threshold == 0)
                return;
 
        wpa_printf(MSG_DEBUG, "bgscan learn: signal level changed "
-                  "(above=%d)", above);
+                  "(above=%d current_signal=%d current_noise=%d "
+                  "current_txrate=%d)", above, current_signal,
+                  current_noise, current_txrate);
        if (data->scan_interval == data->long_interval && !above) {
-               wpa_printf(MSG_DEBUG, "bgscan learn: Trigger immediate scan "
-                          "and start using short bgscan interval");
+               wpa_printf(MSG_DEBUG, "bgscan learn: Start using short bgscan "
+                          "interval");
                data->scan_interval = data->short_interval;
-               eloop_cancel_timeout(bgscan_learn_timeout, data, NULL);
-               eloop_register_timeout(0, 0, bgscan_learn_timeout, data,
-                                      NULL);
+               os_get_time(&now);
+               if (now.sec > data->last_bgscan.sec + 1)
+                       scan = 1;
        } else if (data->scan_interval == data->short_interval && above) {
                wpa_printf(MSG_DEBUG, "bgscan learn: Start using long bgscan "
                           "interval");
@@ -571,20 +587,19 @@ static void bgscan_learn_notify_signal_change(void *priv, int above)
                eloop_register_timeout(data->scan_interval, 0,
                                       bgscan_learn_timeout, data, NULL);
        } else if (!above) {
-               struct os_time now;
                /*
                 * Signal dropped further 4 dB. Request a new scan if we have
                 * not yet scanned in a while.
                 */
                os_get_time(&now);
-               if (now.sec > data->last_bgscan.sec + 10) {
-                       wpa_printf(MSG_DEBUG, "bgscan learn: Trigger "
-                                  "immediate scan");
-                       eloop_cancel_timeout(bgscan_learn_timeout, data,
-                                            NULL);
-                       eloop_register_timeout(0, 0, bgscan_learn_timeout,
-                                              data, NULL);
-               }
+               if (now.sec > data->last_bgscan.sec + 10)
+                       scan = 1;
+       }
+
+       if (scan) {
+               wpa_printf(MSG_DEBUG, "bgscan learn: Trigger immediate scan");
+               eloop_cancel_timeout(bgscan_learn_timeout, data, NULL);
+               eloop_register_timeout(0, 0, bgscan_learn_timeout, data, NULL);
        }
 }