Deplete scan request if new time is less than remaining
This avoids pushing out previous scheduled scan requests based on new events. Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
This commit is contained in:
parent
a572f0b960
commit
e2f5a9889a
4 changed files with 85 additions and 0 deletions
|
@ -599,6 +599,37 @@ int eloop_is_timeout_registered(eloop_timeout_handler handler,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int eloop_deplete_timeout(unsigned int req_secs, unsigned int req_usecs,
|
||||||
|
eloop_timeout_handler handler, void *eloop_data,
|
||||||
|
void *user_data)
|
||||||
|
{
|
||||||
|
struct os_time now, requested, remaining;
|
||||||
|
struct eloop_timeout *tmp;
|
||||||
|
|
||||||
|
dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) {
|
||||||
|
if (tmp->handler == handler &&
|
||||||
|
tmp->eloop_data == eloop_data &&
|
||||||
|
tmp->user_data == user_data) {
|
||||||
|
requested.sec = req_secs;
|
||||||
|
requested.usec = req_usecs;
|
||||||
|
os_get_time(&now);
|
||||||
|
os_time_sub(&tmp->time, &now, &remaining);
|
||||||
|
if (os_time_before(&requested, &remaining)) {
|
||||||
|
eloop_cancel_timeout(handler, eloop_data,
|
||||||
|
user_data);
|
||||||
|
eloop_register_timeout(requested.sec,
|
||||||
|
requested.usec,
|
||||||
|
handler, eloop_data,
|
||||||
|
user_data);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int eloop_replenish_timeout(unsigned int req_secs, unsigned int req_usecs,
|
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)
|
||||||
|
|
|
@ -222,6 +222,22 @@ int eloop_cancel_timeout_one(eloop_timeout_handler handler,
|
||||||
int eloop_is_timeout_registered(eloop_timeout_handler handler,
|
int eloop_is_timeout_registered(eloop_timeout_handler handler,
|
||||||
void *eloop_data, void *user_data);
|
void *eloop_data, void *user_data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* eloop_deplete_timeout - Deplete a timeout that is already registered
|
||||||
|
* @req_secs: Requested number of seconds to the timeout
|
||||||
|
* @req_usecs: Requested number of microseconds to the timeout
|
||||||
|
* @handler: Matching callback function
|
||||||
|
* @eloop_data: Matching eloop_data
|
||||||
|
* @user_data: Matching user_data
|
||||||
|
* Returns: 1 if the timeout is depleted, 0 if no change is made
|
||||||
|
*
|
||||||
|
* Find a registered matching <handler,eloop_data,user_data> timeout. If found,
|
||||||
|
* deplete the timeout if remaining time is more than the requested time.
|
||||||
|
*/
|
||||||
|
int eloop_deplete_timeout(unsigned int req_secs, unsigned int req_usecs,
|
||||||
|
eloop_timeout_handler handler, void *eloop_data,
|
||||||
|
void *user_data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* eloop_replenish_timeout - Replenish a timeout that is already registered
|
* eloop_replenish_timeout - Replenish a timeout that is already registered
|
||||||
* @req_secs: Requested number of seconds to the timeout
|
* @req_secs: Requested number of seconds to the timeout
|
||||||
|
|
|
@ -354,6 +354,37 @@ int eloop_is_timeout_registered(eloop_timeout_handler handler,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int eloop_deplete_timeout(unsigned int req_secs, unsigned int req_usecs,
|
||||||
|
eloop_timeout_handler handler, void *eloop_data,
|
||||||
|
void *user_data)
|
||||||
|
{
|
||||||
|
struct os_time now, requested, remaining;
|
||||||
|
struct eloop_timeout *tmp;
|
||||||
|
|
||||||
|
dl_list_for_each(tmp, &eloop.timeout, struct eloop_timeout, list) {
|
||||||
|
if (tmp->handler == handler &&
|
||||||
|
tmp->eloop_data == eloop_data &&
|
||||||
|
tmp->user_data == user_data) {
|
||||||
|
requested.sec = req_secs;
|
||||||
|
requested.usec = req_usecs;
|
||||||
|
os_get_time(&now);
|
||||||
|
os_time_sub(&tmp->time, &now, &remaining);
|
||||||
|
if (os_time_before(&requested, &remaining)) {
|
||||||
|
eloop_cancel_timeout(handler, eloop_data,
|
||||||
|
user_data);
|
||||||
|
eloop_register_timeout(requested.sec,
|
||||||
|
requested.usec,
|
||||||
|
handler, eloop_data,
|
||||||
|
user_data);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int eloop_replenish_timeout(unsigned int req_secs, unsigned int req_usecs,
|
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)
|
||||||
|
|
|
@ -907,6 +907,13 @@ void wpa_supplicant_update_scan_int(struct wpa_supplicant *wpa_s, int sec)
|
||||||
*/
|
*/
|
||||||
void wpa_supplicant_req_scan(struct wpa_supplicant *wpa_s, int sec, int usec)
|
void wpa_supplicant_req_scan(struct wpa_supplicant *wpa_s, int sec, int usec)
|
||||||
{
|
{
|
||||||
|
if (eloop_deplete_timeout(sec, usec, wpa_supplicant_scan, wpa_s, NULL))
|
||||||
|
{
|
||||||
|
wpa_dbg(wpa_s, MSG_DEBUG, "Rescheduling scan request: %d sec %d usec",
|
||||||
|
sec, usec);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* If there's at least one network that should be specifically scanned
|
/* If there's at least one network that should be specifically scanned
|
||||||
* then don't cancel the scan and reschedule. Some drivers do
|
* then don't cancel the scan and reschedule. Some drivers do
|
||||||
* background scanning which generates frequent scan results, and that
|
* background scanning which generates frequent scan results, and that
|
||||||
|
|
Loading…
Reference in a new issue