bgscan: Use monotonic time

The bgscan simple and learn algorithms should run regardless
of wall clock time jumps, so make them use monotonic time.

Signed-hostap: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Johannes Berg 2013-12-16 21:08:32 +01:00 committed by Jouni Malinen
parent e05f0605bf
commit e72a001b0f
2 changed files with 12 additions and 12 deletions

View file

@ -34,7 +34,7 @@ struct bgscan_learn_data {
int signal_threshold; int signal_threshold;
int short_interval; /* use if signal < threshold */ int short_interval; /* use if signal < threshold */
int long_interval; /* use if signal > threshold */ int long_interval; /* use if signal > threshold */
struct os_time last_bgscan; struct os_reltime last_bgscan;
char *fname; char *fname;
struct dl_list bss; struct dl_list bss;
int *supp_freqs; int *supp_freqs;
@ -310,7 +310,7 @@ static void bgscan_learn_timeout(void *eloop_ctx, void *timeout_ctx)
eloop_register_timeout(data->scan_interval, 0, eloop_register_timeout(data->scan_interval, 0,
bgscan_learn_timeout, data, NULL); bgscan_learn_timeout, data, NULL);
} else } else
os_get_time(&data->last_bgscan); os_get_reltime(&data->last_bgscan);
os_free(freqs); os_free(freqs);
} }
@ -438,7 +438,7 @@ static void * bgscan_learn_init(struct wpa_supplicant *wpa_s,
* us skip an immediate new scan in cases where the current signal * us skip an immediate new scan in cases where the current signal
* level is below the bgscan threshold. * level is below the bgscan threshold.
*/ */
os_get_time(&data->last_bgscan); os_get_reltime(&data->last_bgscan);
return data; return data;
} }
@ -565,7 +565,7 @@ static void bgscan_learn_notify_signal_change(void *priv, int above,
{ {
struct bgscan_learn_data *data = priv; struct bgscan_learn_data *data = priv;
int scan = 0; int scan = 0;
struct os_time now; struct os_reltime now;
if (data->short_interval == data->long_interval || if (data->short_interval == data->long_interval ||
data->signal_threshold == 0) data->signal_threshold == 0)
@ -579,7 +579,7 @@ static void bgscan_learn_notify_signal_change(void *priv, int above,
wpa_printf(MSG_DEBUG, "bgscan learn: Start using short bgscan " wpa_printf(MSG_DEBUG, "bgscan learn: Start using short bgscan "
"interval"); "interval");
data->scan_interval = data->short_interval; data->scan_interval = data->short_interval;
os_get_time(&now); os_get_reltime(&now);
if (now.sec > data->last_bgscan.sec + 1) if (now.sec > data->last_bgscan.sec + 1)
scan = 1; scan = 1;
} else if (data->scan_interval == data->short_interval && above) { } else if (data->scan_interval == data->short_interval && above) {
@ -594,7 +594,7 @@ static void bgscan_learn_notify_signal_change(void *priv, int above,
* Signal dropped further 4 dB. Request a new scan if we have * Signal dropped further 4 dB. Request a new scan if we have
* not yet scanned in a while. * not yet scanned in a while.
*/ */
os_get_time(&now); os_get_reltime(&now);
if (now.sec > data->last_bgscan.sec + 10) if (now.sec > data->last_bgscan.sec + 10)
scan = 1; scan = 1;
} }

View file

@ -26,7 +26,7 @@ struct bgscan_simple_data {
int max_short_scans; /* maximum times we short-scan before back-off */ int max_short_scans; /* maximum times we short-scan before back-off */
int short_interval; /* use if signal < threshold */ int short_interval; /* use if signal < threshold */
int long_interval; /* use if signal > threshold */ int long_interval; /* use if signal > threshold */
struct os_time last_bgscan; struct os_reltime last_bgscan;
}; };
@ -75,7 +75,7 @@ static void bgscan_simple_timeout(void *eloop_ctx, void *timeout_ctx)
*/ */
data->short_scan_count--; data->short_scan_count--;
} }
os_get_time(&data->last_bgscan); os_get_reltime(&data->last_bgscan);
} }
} }
@ -159,7 +159,7 @@ static void * bgscan_simple_init(struct wpa_supplicant *wpa_s,
* us skip an immediate new scan in cases where the current signal * us skip an immediate new scan in cases where the current signal
* level is below the bgscan threshold. * level is below the bgscan threshold.
*/ */
os_get_time(&data->last_bgscan); os_get_reltime(&data->last_bgscan);
return data; return data;
} }
@ -211,7 +211,7 @@ static void bgscan_simple_notify_signal_change(void *priv, int above,
{ {
struct bgscan_simple_data *data = priv; struct bgscan_simple_data *data = priv;
int scan = 0; int scan = 0;
struct os_time now; struct os_reltime now;
if (data->short_interval == data->long_interval || if (data->short_interval == data->long_interval ||
data->signal_threshold == 0) data->signal_threshold == 0)
@ -225,7 +225,7 @@ static void bgscan_simple_notify_signal_change(void *priv, int above,
wpa_printf(MSG_DEBUG, "bgscan simple: Start using short " wpa_printf(MSG_DEBUG, "bgscan simple: Start using short "
"bgscan interval"); "bgscan interval");
data->scan_interval = data->short_interval; data->scan_interval = data->short_interval;
os_get_time(&now); os_get_reltime(&now);
if (now.sec > data->last_bgscan.sec + 1 && if (now.sec > data->last_bgscan.sec + 1 &&
data->short_scan_count <= data->max_short_scans) data->short_scan_count <= data->max_short_scans)
/* /*
@ -259,7 +259,7 @@ static void bgscan_simple_notify_signal_change(void *priv, int above,
* Signal dropped further 4 dB. Request a new scan if we have * Signal dropped further 4 dB. Request a new scan if we have
* not yet scanned in a while. * not yet scanned in a while.
*/ */
os_get_time(&now); os_get_reltime(&now);
if (now.sec > data->last_bgscan.sec + 10) if (now.sec > data->last_bgscan.sec + 10)
scan = 1; scan = 1;
} }