Use monotonic clock for relative time for eloop if available
Relative time shouldn't be calculated based on gettimeofday because that clock can jump (e.g., when the time is adjusted by the system administrator.) On systems where that is available, use CLOCK_BOOTTIME (on fairly recent Linux systems, this clock takes into account the time spend suspended) or CLOCK_MONOTONIC (on Linux and some POSIX systems, this clock is just freely running with no adjustments.) Reported-by: Holger Schurig <holgerschurig@gmail.com> Signed-hostap: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
461e3ebe43
commit
594516b4c2
12 changed files with 184 additions and 62 deletions
|
@ -84,6 +84,14 @@ CONFIG_ELOOP=eloop
|
||||||
endif
|
endif
|
||||||
OBJS += ../src/utils/$(CONFIG_ELOOP).o
|
OBJS += ../src/utils/$(CONFIG_ELOOP).o
|
||||||
OBJS_c += ../src/utils/$(CONFIG_ELOOP).o
|
OBJS_c += ../src/utils/$(CONFIG_ELOOP).o
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_ELOOP), eloop)
|
||||||
|
# Using glibc < 2.17 requires -lrt for clock_gettime()
|
||||||
|
LIBS += -lrt
|
||||||
|
LIBS_c += -lrt
|
||||||
|
LIBS_h += -lrt
|
||||||
|
endif
|
||||||
|
|
||||||
OBJS += ../src/utils/common.o
|
OBJS += ../src/utils/common.o
|
||||||
OBJS += ../src/utils/wpa_debug.o
|
OBJS += ../src/utils/wpa_debug.o
|
||||||
OBJS_c += ../src/utils/wpa_debug.o
|
OBJS_c += ../src/utils/wpa_debug.o
|
||||||
|
|
|
@ -31,7 +31,7 @@ struct eloop_sock {
|
||||||
|
|
||||||
struct eloop_timeout {
|
struct eloop_timeout {
|
||||||
struct dl_list list;
|
struct dl_list list;
|
||||||
struct os_time time;
|
struct os_reltime time;
|
||||||
void *eloop_data;
|
void *eloop_data;
|
||||||
void *user_data;
|
void *user_data;
|
||||||
eloop_timeout_handler handler;
|
eloop_timeout_handler handler;
|
||||||
|
@ -484,7 +484,7 @@ int eloop_register_timeout(unsigned int secs, unsigned int usecs,
|
||||||
timeout = os_zalloc(sizeof(*timeout));
|
timeout = os_zalloc(sizeof(*timeout));
|
||||||
if (timeout == NULL)
|
if (timeout == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
if (os_get_time(&timeout->time) < 0) {
|
if (os_get_reltime(&timeout->time) < 0) {
|
||||||
os_free(timeout);
|
os_free(timeout);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -514,7 +514,7 @@ int eloop_register_timeout(unsigned int secs, unsigned int usecs,
|
||||||
|
|
||||||
/* Maintain timeouts in order of increasing time */
|
/* Maintain timeouts in order of increasing time */
|
||||||
dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) {
|
dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) {
|
||||||
if (os_time_before(&timeout->time, &tmp->time)) {
|
if (os_reltime_before(&timeout->time, &tmp->time)) {
|
||||||
dl_list_add(tmp->list.prev, &timeout->list);
|
dl_list_add(tmp->list.prev, &timeout->list);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -558,13 +558,13 @@ int eloop_cancel_timeout(eloop_timeout_handler handler,
|
||||||
|
|
||||||
int eloop_cancel_timeout_one(eloop_timeout_handler handler,
|
int eloop_cancel_timeout_one(eloop_timeout_handler handler,
|
||||||
void *eloop_data, void *user_data,
|
void *eloop_data, void *user_data,
|
||||||
struct os_time *remaining)
|
struct os_reltime *remaining)
|
||||||
{
|
{
|
||||||
struct eloop_timeout *timeout, *prev;
|
struct eloop_timeout *timeout, *prev;
|
||||||
int removed = 0;
|
int removed = 0;
|
||||||
struct os_time now;
|
struct os_reltime now;
|
||||||
|
|
||||||
os_get_time(&now);
|
os_get_reltime(&now);
|
||||||
remaining->sec = remaining->usec = 0;
|
remaining->sec = remaining->usec = 0;
|
||||||
|
|
||||||
dl_list_for_each_safe(timeout, prev, &eloop.timeout,
|
dl_list_for_each_safe(timeout, prev, &eloop.timeout,
|
||||||
|
@ -573,8 +573,8 @@ int eloop_cancel_timeout_one(eloop_timeout_handler handler,
|
||||||
(timeout->eloop_data == eloop_data) &&
|
(timeout->eloop_data == eloop_data) &&
|
||||||
(timeout->user_data == user_data)) {
|
(timeout->user_data == user_data)) {
|
||||||
removed = 1;
|
removed = 1;
|
||||||
if (os_time_before(&now, &timeout->time))
|
if (os_reltime_before(&now, &timeout->time))
|
||||||
os_time_sub(&timeout->time, &now, remaining);
|
os_reltime_sub(&timeout->time, &now, remaining);
|
||||||
eloop_remove_timeout(timeout);
|
eloop_remove_timeout(timeout);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -603,7 +603,7 @@ int eloop_deplete_timeout(unsigned int req_secs, unsigned int req_usecs,
|
||||||
eloop_timeout_handler handler, void *eloop_data,
|
eloop_timeout_handler handler, void *eloop_data,
|
||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
struct os_time now, requested, remaining;
|
struct os_reltime now, requested, remaining;
|
||||||
struct eloop_timeout *tmp;
|
struct eloop_timeout *tmp;
|
||||||
|
|
||||||
dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) {
|
dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) {
|
||||||
|
@ -612,9 +612,9 @@ int eloop_deplete_timeout(unsigned int req_secs, unsigned int req_usecs,
|
||||||
tmp->user_data == user_data) {
|
tmp->user_data == user_data) {
|
||||||
requested.sec = req_secs;
|
requested.sec = req_secs;
|
||||||
requested.usec = req_usecs;
|
requested.usec = req_usecs;
|
||||||
os_get_time(&now);
|
os_get_reltime(&now);
|
||||||
os_time_sub(&tmp->time, &now, &remaining);
|
os_reltime_sub(&tmp->time, &now, &remaining);
|
||||||
if (os_time_before(&requested, &remaining)) {
|
if (os_reltime_before(&requested, &remaining)) {
|
||||||
eloop_cancel_timeout(handler, eloop_data,
|
eloop_cancel_timeout(handler, eloop_data,
|
||||||
user_data);
|
user_data);
|
||||||
eloop_register_timeout(requested.sec,
|
eloop_register_timeout(requested.sec,
|
||||||
|
@ -634,7 +634,7 @@ int eloop_replenish_timeout(unsigned int req_secs, unsigned int req_usecs,
|
||||||
eloop_timeout_handler handler, void *eloop_data,
|
eloop_timeout_handler handler, void *eloop_data,
|
||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
struct os_time now, requested, remaining;
|
struct os_reltime now, requested, remaining;
|
||||||
struct eloop_timeout *tmp;
|
struct eloop_timeout *tmp;
|
||||||
|
|
||||||
dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) {
|
dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) {
|
||||||
|
@ -643,9 +643,9 @@ int eloop_replenish_timeout(unsigned int req_secs, unsigned int req_usecs,
|
||||||
tmp->user_data == user_data) {
|
tmp->user_data == user_data) {
|
||||||
requested.sec = req_secs;
|
requested.sec = req_secs;
|
||||||
requested.usec = req_usecs;
|
requested.usec = req_usecs;
|
||||||
os_get_time(&now);
|
os_get_reltime(&now);
|
||||||
os_time_sub(&tmp->time, &now, &remaining);
|
os_reltime_sub(&tmp->time, &now, &remaining);
|
||||||
if (os_time_before(&remaining, &requested)) {
|
if (os_reltime_before(&remaining, &requested)) {
|
||||||
eloop_cancel_timeout(handler, eloop_data,
|
eloop_cancel_timeout(handler, eloop_data,
|
||||||
user_data);
|
user_data);
|
||||||
eloop_register_timeout(requested.sec,
|
eloop_register_timeout(requested.sec,
|
||||||
|
@ -776,7 +776,7 @@ void eloop_run(void)
|
||||||
struct timeval _tv;
|
struct timeval _tv;
|
||||||
#endif /* CONFIG_ELOOP_POLL */
|
#endif /* CONFIG_ELOOP_POLL */
|
||||||
int res;
|
int res;
|
||||||
struct os_time tv, now;
|
struct os_reltime tv, now;
|
||||||
|
|
||||||
#ifndef CONFIG_ELOOP_POLL
|
#ifndef CONFIG_ELOOP_POLL
|
||||||
rfds = os_malloc(sizeof(*rfds));
|
rfds = os_malloc(sizeof(*rfds));
|
||||||
|
@ -793,9 +793,9 @@ void eloop_run(void)
|
||||||
timeout = dl_list_first(&eloop.timeout, struct eloop_timeout,
|
timeout = dl_list_first(&eloop.timeout, struct eloop_timeout,
|
||||||
list);
|
list);
|
||||||
if (timeout) {
|
if (timeout) {
|
||||||
os_get_time(&now);
|
os_get_reltime(&now);
|
||||||
if (os_time_before(&now, &timeout->time))
|
if (os_reltime_before(&now, &timeout->time))
|
||||||
os_time_sub(&timeout->time, &now, &tv);
|
os_reltime_sub(&timeout->time, &now, &tv);
|
||||||
else
|
else
|
||||||
tv.sec = tv.usec = 0;
|
tv.sec = tv.usec = 0;
|
||||||
#ifdef CONFIG_ELOOP_POLL
|
#ifdef CONFIG_ELOOP_POLL
|
||||||
|
@ -837,8 +837,8 @@ void eloop_run(void)
|
||||||
timeout = dl_list_first(&eloop.timeout, struct eloop_timeout,
|
timeout = dl_list_first(&eloop.timeout, struct eloop_timeout,
|
||||||
list);
|
list);
|
||||||
if (timeout) {
|
if (timeout) {
|
||||||
os_get_time(&now);
|
os_get_reltime(&now);
|
||||||
if (!os_time_before(&now, &timeout->time)) {
|
if (!os_reltime_before(&now, &timeout->time)) {
|
||||||
void *eloop_data = timeout->eloop_data;
|
void *eloop_data = timeout->eloop_data;
|
||||||
void *user_data = timeout->user_data;
|
void *user_data = timeout->user_data;
|
||||||
eloop_timeout_handler handler =
|
eloop_timeout_handler handler =
|
||||||
|
@ -883,9 +883,9 @@ void eloop_terminate(void)
|
||||||
void eloop_destroy(void)
|
void eloop_destroy(void)
|
||||||
{
|
{
|
||||||
struct eloop_timeout *timeout, *prev;
|
struct eloop_timeout *timeout, *prev;
|
||||||
struct os_time now;
|
struct os_reltime now;
|
||||||
|
|
||||||
os_get_time(&now);
|
os_get_reltime(&now);
|
||||||
dl_list_for_each_safe(timeout, prev, &eloop.timeout,
|
dl_list_for_each_safe(timeout, prev, &eloop.timeout,
|
||||||
struct eloop_timeout, list) {
|
struct eloop_timeout, list) {
|
||||||
int sec, usec;
|
int sec, usec;
|
||||||
|
|
|
@ -207,7 +207,7 @@ int eloop_cancel_timeout(eloop_timeout_handler handler,
|
||||||
*/
|
*/
|
||||||
int eloop_cancel_timeout_one(eloop_timeout_handler handler,
|
int eloop_cancel_timeout_one(eloop_timeout_handler handler,
|
||||||
void *eloop_data, void *user_data,
|
void *eloop_data, void *user_data,
|
||||||
struct os_time *remaining);
|
struct os_reltime *remaining);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* eloop_is_timeout_registered - Check if a timeout is already registered
|
* eloop_is_timeout_registered - Check if a timeout is already registered
|
||||||
|
|
|
@ -31,7 +31,7 @@ struct eloop_event {
|
||||||
|
|
||||||
struct eloop_timeout {
|
struct eloop_timeout {
|
||||||
struct dl_list list;
|
struct dl_list list;
|
||||||
struct os_time time;
|
struct os_reltime time;
|
||||||
void *eloop_data;
|
void *eloop_data;
|
||||||
void *user_data;
|
void *user_data;
|
||||||
eloop_timeout_handler handler;
|
eloop_timeout_handler handler;
|
||||||
|
@ -244,7 +244,7 @@ int eloop_register_timeout(unsigned int secs, unsigned int usecs,
|
||||||
timeout = os_zalloc(sizeof(*timeout));
|
timeout = os_zalloc(sizeof(*timeout));
|
||||||
if (timeout == NULL)
|
if (timeout == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
if (os_get_time(&timeout->time) < 0) {
|
if (os_get_reltime(&timeout->time) < 0) {
|
||||||
os_free(timeout);
|
os_free(timeout);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -271,7 +271,7 @@ int eloop_register_timeout(unsigned int secs, unsigned int usecs,
|
||||||
|
|
||||||
/* Maintain timeouts in order of increasing time */
|
/* Maintain timeouts in order of increasing time */
|
||||||
dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) {
|
dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) {
|
||||||
if (os_time_before(&timeout->time, &tmp->time)) {
|
if (os_reltime_before(&timeout->time, &tmp->time)) {
|
||||||
dl_list_add(tmp->list.prev, &timeout->list);
|
dl_list_add(tmp->list.prev, &timeout->list);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -313,13 +313,13 @@ int eloop_cancel_timeout(eloop_timeout_handler handler,
|
||||||
|
|
||||||
int eloop_cancel_timeout_one(eloop_timeout_handler handler,
|
int eloop_cancel_timeout_one(eloop_timeout_handler handler,
|
||||||
void *eloop_data, void *user_data,
|
void *eloop_data, void *user_data,
|
||||||
struct os_time *remaining)
|
struct os_reltime *remaining)
|
||||||
{
|
{
|
||||||
struct eloop_timeout *timeout, *prev;
|
struct eloop_timeout *timeout, *prev;
|
||||||
int removed = 0;
|
int removed = 0;
|
||||||
struct os_time now;
|
struct os_reltime now;
|
||||||
|
|
||||||
os_get_time(&now);
|
os_get_reltime(&now);
|
||||||
remaining->sec = remaining->usec = 0;
|
remaining->sec = remaining->usec = 0;
|
||||||
|
|
||||||
dl_list_for_each_safe(timeout, prev, &eloop.timeout,
|
dl_list_for_each_safe(timeout, prev, &eloop.timeout,
|
||||||
|
@ -328,8 +328,8 @@ int eloop_cancel_timeout_one(eloop_timeout_handler handler,
|
||||||
(timeout->eloop_data == eloop_data) &&
|
(timeout->eloop_data == eloop_data) &&
|
||||||
(timeout->user_data == user_data)) {
|
(timeout->user_data == user_data)) {
|
||||||
removed = 1;
|
removed = 1;
|
||||||
if (os_time_before(&now, &timeout->time))
|
if (os_reltime_before(&now, &timeout->time))
|
||||||
os_time_sub(&timeout->time, &now, remaining);
|
os_reltime_sub(&timeout->time, &now, remaining);
|
||||||
eloop_remove_timeout(timeout);
|
eloop_remove_timeout(timeout);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -358,7 +358,7 @@ int eloop_deplete_timeout(unsigned int req_secs, unsigned int req_usecs,
|
||||||
eloop_timeout_handler handler, void *eloop_data,
|
eloop_timeout_handler handler, void *eloop_data,
|
||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
struct os_time now, requested, remaining;
|
struct os_reltime now, requested, remaining;
|
||||||
struct eloop_timeout *tmp;
|
struct eloop_timeout *tmp;
|
||||||
|
|
||||||
dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) {
|
dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) {
|
||||||
|
@ -367,9 +367,9 @@ int eloop_deplete_timeout(unsigned int req_secs, unsigned int req_usecs,
|
||||||
tmp->user_data == user_data) {
|
tmp->user_data == user_data) {
|
||||||
requested.sec = req_secs;
|
requested.sec = req_secs;
|
||||||
requested.usec = req_usecs;
|
requested.usec = req_usecs;
|
||||||
os_get_time(&now);
|
os_get_reltime(&now);
|
||||||
os_time_sub(&tmp->time, &now, &remaining);
|
os_reltime_sub(&tmp->time, &now, &remaining);
|
||||||
if (os_time_before(&requested, &remaining)) {
|
if (os_reltime_before(&requested, &remaining)) {
|
||||||
eloop_cancel_timeout(handler, eloop_data,
|
eloop_cancel_timeout(handler, eloop_data,
|
||||||
user_data);
|
user_data);
|
||||||
eloop_register_timeout(requested.sec,
|
eloop_register_timeout(requested.sec,
|
||||||
|
@ -389,7 +389,7 @@ int eloop_replenish_timeout(unsigned int req_secs, unsigned int req_usecs,
|
||||||
eloop_timeout_handler handler, void *eloop_data,
|
eloop_timeout_handler handler, void *eloop_data,
|
||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
struct os_time now, requested, remaining;
|
struct os_reltime now, requested, remaining;
|
||||||
struct eloop_timeout *tmp;
|
struct eloop_timeout *tmp;
|
||||||
|
|
||||||
dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) {
|
dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) {
|
||||||
|
@ -398,9 +398,9 @@ int eloop_replenish_timeout(unsigned int req_secs, unsigned int req_usecs,
|
||||||
tmp->user_data == user_data) {
|
tmp->user_data == user_data) {
|
||||||
requested.sec = req_secs;
|
requested.sec = req_secs;
|
||||||
requested.usec = req_usecs;
|
requested.usec = req_usecs;
|
||||||
os_get_time(&now);
|
os_get_reltime(&now);
|
||||||
os_time_sub(&tmp->time, &now, &remaining);
|
os_reltime_sub(&tmp->time, &now, &remaining);
|
||||||
if (os_time_before(&remaining, &requested)) {
|
if (os_reltime_before(&remaining, &requested)) {
|
||||||
eloop_cancel_timeout(handler, eloop_data,
|
eloop_cancel_timeout(handler, eloop_data,
|
||||||
user_data);
|
user_data);
|
||||||
eloop_register_timeout(requested.sec,
|
eloop_register_timeout(requested.sec,
|
||||||
|
@ -530,7 +530,7 @@ int eloop_register_signal_reconfig(eloop_signal_handler handler,
|
||||||
|
|
||||||
void eloop_run(void)
|
void eloop_run(void)
|
||||||
{
|
{
|
||||||
struct os_time tv, now;
|
struct os_reltime tv, now;
|
||||||
DWORD count, ret, timeout_val, err;
|
DWORD count, ret, timeout_val, err;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
|
@ -542,9 +542,9 @@ void eloop_run(void)
|
||||||
timeout = dl_list_first(&eloop.timeout, struct eloop_timeout,
|
timeout = dl_list_first(&eloop.timeout, struct eloop_timeout,
|
||||||
list);
|
list);
|
||||||
if (timeout) {
|
if (timeout) {
|
||||||
os_get_time(&now);
|
os_get_reltime(&now);
|
||||||
if (os_time_before(&now, &timeout->time))
|
if (os_reltime_before(&now, &timeout->time))
|
||||||
os_time_sub(&timeout->time, &now, &tv);
|
os_reltime_sub(&timeout->time, &now, &tv);
|
||||||
}
|
}
|
||||||
|
|
||||||
count = 0;
|
count = 0;
|
||||||
|
@ -583,8 +583,8 @@ void eloop_run(void)
|
||||||
timeout = dl_list_first(&eloop.timeout, struct eloop_timeout,
|
timeout = dl_list_first(&eloop.timeout, struct eloop_timeout,
|
||||||
list);
|
list);
|
||||||
if (timeout) {
|
if (timeout) {
|
||||||
os_get_time(&now);
|
os_get_reltime(&now);
|
||||||
if (!os_time_before(&now, &timeout->time)) {
|
if (!os_reltime_before(&now, &timeout->time)) {
|
||||||
void *eloop_data = timeout->eloop_data;
|
void *eloop_data = timeout->eloop_data;
|
||||||
void *user_data = timeout->user_data;
|
void *user_data = timeout->user_data;
|
||||||
eloop_timeout_handler handler =
|
eloop_timeout_handler handler =
|
||||||
|
|
|
@ -23,6 +23,11 @@ struct os_time {
|
||||||
os_time_t usec;
|
os_time_t usec;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct os_reltime {
|
||||||
|
os_time_t sec;
|
||||||
|
os_time_t usec;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* os_get_time - Get current time (sec, usec)
|
* os_get_time - Get current time (sec, usec)
|
||||||
* @t: Pointer to buffer for the time
|
* @t: Pointer to buffer for the time
|
||||||
|
@ -30,21 +35,56 @@ struct os_time {
|
||||||
*/
|
*/
|
||||||
int os_get_time(struct os_time *t);
|
int os_get_time(struct os_time *t);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* os_get_reltime - Get relative time (sec, usec)
|
||||||
|
* @t: Pointer to buffer for the time
|
||||||
|
* Returns: 0 on success, -1 on failure
|
||||||
|
*/
|
||||||
|
int os_get_reltime(struct os_reltime *t);
|
||||||
|
|
||||||
/* Helper macros for handling struct os_time */
|
|
||||||
|
|
||||||
#define os_time_before(a, b) \
|
/* Helpers for handling struct os_time */
|
||||||
((a)->sec < (b)->sec || \
|
|
||||||
((a)->sec == (b)->sec && (a)->usec < (b)->usec))
|
static inline int os_time_before(struct os_time *a, struct os_time *b)
|
||||||
|
{
|
||||||
|
return (a->sec < b->sec) ||
|
||||||
|
(a->sec == b->sec && a->usec < b->usec);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void os_time_sub(struct os_time *a, struct os_time *b,
|
||||||
|
struct os_time *res)
|
||||||
|
{
|
||||||
|
res->sec = a->sec - b->sec;
|
||||||
|
res->usec = a->usec - b->usec;
|
||||||
|
if (res->usec < 0) {
|
||||||
|
res->sec--;
|
||||||
|
res->usec += 1000000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Helpers for handling struct os_reltime */
|
||||||
|
|
||||||
|
static inline int os_reltime_before(struct os_reltime *a,
|
||||||
|
struct os_reltime *b)
|
||||||
|
{
|
||||||
|
return (a->sec < b->sec) ||
|
||||||
|
(a->sec == b->sec && a->usec < b->usec);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void os_reltime_sub(struct os_reltime *a, struct os_reltime *b,
|
||||||
|
struct os_reltime *res)
|
||||||
|
{
|
||||||
|
res->sec = a->sec - b->sec;
|
||||||
|
res->usec = a->usec - b->usec;
|
||||||
|
if (res->usec < 0) {
|
||||||
|
res->sec--;
|
||||||
|
res->usec += 1000000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#define os_time_sub(a, b, res) do { \
|
|
||||||
(res)->sec = (a)->sec - (b)->sec; \
|
|
||||||
(res)->usec = (a)->usec - (b)->usec; \
|
|
||||||
if ((res)->usec < 0) { \
|
|
||||||
(res)->sec--; \
|
|
||||||
(res)->usec += 1000000; \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* os_mktime - Convert broken-down time into seconds since 1970-01-01
|
* os_mktime - Convert broken-down time into seconds since 1970-01-01
|
||||||
|
|
|
@ -41,6 +41,17 @@ int os_get_time(struct os_time *t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int os_get_reltime(struct os_reltime *t)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
struct timeval tv;
|
||||||
|
res = gettimeofday(&tv, NULL);
|
||||||
|
t->sec = tv.tv_sec;
|
||||||
|
t->usec = tv.tv_usec;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int os_mktime(int year, int month, int day, int hour, int min, int sec,
|
int os_mktime(int year, int month, int day, int hour, int min, int sec,
|
||||||
os_time_t *t)
|
os_time_t *t)
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,6 +26,12 @@ int os_get_time(struct os_time *t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int os_get_reltime(struct os_reltime *t)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int os_mktime(int year, int month, int day, int hour, int min, int sec,
|
int os_mktime(int year, int month, int day, int hour, int min, int sec,
|
||||||
os_time_t *t)
|
os_time_t *t)
|
||||||
{
|
{
|
||||||
|
|
|
@ -60,6 +60,43 @@ int os_get_time(struct os_time *t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int os_get_reltime(struct os_reltime *t)
|
||||||
|
{
|
||||||
|
#if defined(CLOCK_BOOTTIME)
|
||||||
|
static clockid_t clock_id = CLOCK_BOOTTIME;
|
||||||
|
#elif defined(CLOCK_MONOTONIC)
|
||||||
|
static clockid_t clock_id = CLOCK_MONOTONIC;
|
||||||
|
#else
|
||||||
|
static clockid_t clock_id = CLOCK_REALTIME;
|
||||||
|
#endif
|
||||||
|
struct timespec ts;
|
||||||
|
int res;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
res = clock_gettime(clock_id, &ts);
|
||||||
|
if (res == 0) {
|
||||||
|
t->sec = ts.tv_sec;
|
||||||
|
t->usec = ts.tv_nsec / 1000;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
switch (clock_id) {
|
||||||
|
#ifdef CLOCK_BOOTTIME
|
||||||
|
case CLOCK_BOOTTIME:
|
||||||
|
clock_id = CLOCK_MONOTONIC;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CLOCK_MONOTONIC
|
||||||
|
case CLOCK_MONOTONIC:
|
||||||
|
clock_id = CLOCK_REALTIME;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case CLOCK_REALTIME:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int os_mktime(int year, int month, int day, int hour, int min, int sec,
|
int os_mktime(int year, int month, int day, int hour, int min, int sec,
|
||||||
os_time_t *t)
|
os_time_t *t)
|
||||||
{
|
{
|
||||||
|
|
|
@ -47,6 +47,17 @@ int os_get_time(struct os_time *t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int os_get_reltime(struct os_reltime *t)
|
||||||
|
{
|
||||||
|
/* consider using performance counters or so instead */
|
||||||
|
struct os_time now;
|
||||||
|
int res = os_get_time(&now);
|
||||||
|
t->sec = now.sec;
|
||||||
|
t->usec = now.usec;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int os_mktime(int year, int month, int day, int hour, int min, int sec,
|
int os_mktime(int year, int month, int day, int hour, int min, int sec,
|
||||||
os_time_t *t)
|
os_time_t *t)
|
||||||
{
|
{
|
||||||
|
|
|
@ -19,6 +19,8 @@ CFLAGS += -I.
|
||||||
CFLAGS += -I../src
|
CFLAGS += -I../src
|
||||||
CFLAGS += -I../src/utils
|
CFLAGS += -I../src/utils
|
||||||
|
|
||||||
|
# glibc < 2.17 needs -lrt for clock_gettime()
|
||||||
|
LIBS += -lrt
|
||||||
|
|
||||||
ifndef LDO
|
ifndef LDO
|
||||||
LDO=$(CC)
|
LDO=$(CC)
|
||||||
|
@ -112,7 +114,7 @@ wlantest: $(OBJS) $(LIBWLANTEST)
|
||||||
$(LDO) $(LDFLAGS) -o wlantest $(OBJS) -L. -lwlantest $(LIBS)
|
$(LDO) $(LDFLAGS) -o wlantest $(OBJS) -L. -lwlantest $(LIBS)
|
||||||
|
|
||||||
wlantest_cli: $(OBJS_cli) $(LIBWLANTEST)
|
wlantest_cli: $(OBJS_cli) $(LIBWLANTEST)
|
||||||
$(LDO) $(LDFLAGS) -o wlantest_cli $(OBJS_cli) -L. -lwlantest
|
$(LDO) $(LDFLAGS) -o wlantest_cli $(OBJS_cli) -L. -lwlantest $(LIBS)
|
||||||
|
|
||||||
test_vectors: $(TOBJS) $(LIBWLANTEST)
|
test_vectors: $(TOBJS) $(LIBWLANTEST)
|
||||||
$(LDO) $(LDFLAGS) -o test_vectors $(TOBJS) -L. -lwlantest $(LIBS)
|
$(LDO) $(LDFLAGS) -o test_vectors $(TOBJS) -L. -lwlantest $(LIBS)
|
||||||
|
|
|
@ -113,6 +113,13 @@ endif
|
||||||
OBJS += ../src/utils/$(CONFIG_ELOOP).o
|
OBJS += ../src/utils/$(CONFIG_ELOOP).o
|
||||||
OBJS_c += ../src/utils/$(CONFIG_ELOOP).o
|
OBJS_c += ../src/utils/$(CONFIG_ELOOP).o
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_ELOOP), eloop)
|
||||||
|
# Using glibc < 2.17 requires -lrt for clock_gettime()
|
||||||
|
LIBS += -lrt
|
||||||
|
LIBS_c += -lrt
|
||||||
|
LIBS_p += -lrt
|
||||||
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_ELOOP_POLL
|
ifdef CONFIG_ELOOP_POLL
|
||||||
CFLAGS += -DCONFIG_ELOOP_POLL
|
CFLAGS += -DCONFIG_ELOOP_POLL
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -884,7 +884,7 @@ scan:
|
||||||
|
|
||||||
void wpa_supplicant_update_scan_int(struct wpa_supplicant *wpa_s, int sec)
|
void wpa_supplicant_update_scan_int(struct wpa_supplicant *wpa_s, int sec)
|
||||||
{
|
{
|
||||||
struct os_time remaining, new_int;
|
struct os_reltime remaining, new_int;
|
||||||
int cancelled;
|
int cancelled;
|
||||||
|
|
||||||
cancelled = eloop_cancel_timeout_one(wpa_supplicant_scan, wpa_s, NULL,
|
cancelled = eloop_cancel_timeout_one(wpa_supplicant_scan, wpa_s, NULL,
|
||||||
|
@ -892,7 +892,7 @@ void wpa_supplicant_update_scan_int(struct wpa_supplicant *wpa_s, int sec)
|
||||||
|
|
||||||
new_int.sec = sec;
|
new_int.sec = sec;
|
||||||
new_int.usec = 0;
|
new_int.usec = 0;
|
||||||
if (cancelled && os_time_before(&remaining, &new_int)) {
|
if (cancelled && os_reltime_before(&remaining, &new_int)) {
|
||||||
new_int.sec = remaining.sec;
|
new_int.sec = remaining.sec;
|
||||||
new_int.usec = remaining.usec;
|
new_int.usec = remaining.usec;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue