scan: Refactor start_next_scan_request use

Always call start_next_scan_request when a scan request has finished,
with a success or a failure, including a periodic scan attempt.  Inside
that function check if there's any work to be done, either for one-off
scan requests or periodic scan, instead of having this check only inside
get_scan_done.  Call start_next_scan_request in scan_periodic_start and
scan_periodic_timeout.
This commit is contained in:
Andrew Zaborowski 2017-02-08 01:38:41 +01:00 committed by Denis Kenzior
parent 9f19a48433
commit cc6d0cf2db
1 changed files with 44 additions and 48 deletions

View File

@ -84,7 +84,7 @@ struct scan_results {
struct scan_freq_set *freqs; struct scan_freq_set *freqs;
}; };
static void scan_done(struct l_genl_msg *msg, void *userdata); static void start_next_scan_request(struct scan_context *sc);
static bool scan_context_match(const void *a, const void *b) static bool scan_context_match(const void *a, const void *b)
{ {
@ -184,38 +184,6 @@ static unsigned int scan_send_start(struct l_genl_msg **msg,
return id; return id;
} }
static void start_next_scan_request(void *userdata)
{
uint32_t ifindex = L_PTR_TO_UINT(userdata);
struct scan_context *sc;
struct scan_request *sr;
sc = l_queue_find(scan_contexts, scan_context_match,
L_UINT_TO_PTR(ifindex));
if (!sc)
return;
sr = l_queue_peek_head(sc->requests);
sc->start_cmd_id = scan_send_start(&sr->start_cmd, scan_done, sc);
if (!sc->start_cmd_id) {
if (sr->trigger)
sr->trigger(-EIO, sr->userdata);
if (sr->destroy)
sr->destroy(sr->userdata);
sr = l_queue_pop_head(sc->requests);
scan_request_free(sr);
if (!l_queue_isempty(sc->requests))
l_idle_oneshot(start_next_scan_request,
L_UINT_TO_PTR(sc->ifindex), NULL);
}
}
static void scan_done(struct l_genl_msg *msg, void *userdata) static void scan_done(struct l_genl_msg *msg, void *userdata)
{ {
struct scan_context *sc = userdata; struct scan_context *sc = userdata;
@ -241,11 +209,10 @@ static void scan_done(struct l_genl_msg *msg, void *userdata)
l_queue_pop_head(sc->requests); l_queue_pop_head(sc->requests);
scan_request_free(sr); scan_request_free(sr);
l_error("Received an error during CMD_TRIGGER_SCAN"); l_error("Received error during CMD_TRIGGER_SCAN: %s (%d)",
strerror(-err), -err);
if (!l_queue_isempty(sc->requests)) start_next_scan_request(sc);
l_idle_oneshot(start_next_scan_request,
L_UINT_TO_PTR(sc->ifindex), NULL);
return; return;
} }
@ -479,6 +446,8 @@ static void scan_periodic_done(struct l_genl_msg *msg, void *user_data)
sc->sp.retry = true; sc->sp.retry = true;
start_next_scan_request(sc);
return; return;
} }
@ -529,10 +498,10 @@ void scan_periodic_start(uint32_t ifindex, scan_trigger_func_t trigger,
sc->sp.trigger = trigger; sc->sp.trigger = trigger;
sc->sp.callback = func; sc->sp.callback = func;
sc->sp.userdata = userdata; sc->sp.userdata = userdata;
sc->sp.retry = false; sc->sp.retry = true;
sc->sp.rearm = false; sc->sp.rearm = false;
scan_periodic_send_start(sc); start_next_scan_request(sc);
} }
bool scan_periodic_stop(uint32_t ifindex) bool scan_periodic_stop(uint32_t ifindex)
@ -573,7 +542,8 @@ static void scan_periodic_timeout(struct l_timeout *timeout, void *user_data)
sc->sp.interval *= 2; sc->sp.interval *= 2;
scan_periodic_send_start(sc); sc->sp.retry = true;
start_next_scan_request(sc);
} }
static void scan_periodic_rearm(struct scan_context *sc) static void scan_periodic_rearm(struct scan_context *sc)
@ -589,6 +559,37 @@ static void scan_periodic_rearm(struct scan_context *sc)
sc->sp.rearm = false; sc->sp.rearm = false;
} }
static void start_next_scan_request(struct scan_context *sc)
{
struct scan_request *sr;
if (sc->state != SCAN_STATE_NOT_RUNNING || sc->start_cmd_id)
return;
while (!l_queue_isempty(sc->requests)) {
sr = l_queue_peek_head(sc->requests);
sc->start_cmd_id = scan_send_start(&sr->start_cmd,
scan_done, sc);
if (sc->start_cmd_id)
return;
if (sr->trigger)
sr->trigger(-EIO, sr->userdata);
if (sr->destroy)
sr->destroy(sr->userdata);
sr = l_queue_pop_head(sc->requests);
scan_request_free(sr);
}
if (sc->sp.retry)
if (scan_periodic_send_start(sc))
sc->sp.retry = false;
}
enum security scan_get_security(enum ie_bss_capability bss_capability, enum security scan_get_security(enum ie_bss_capability bss_capability,
const struct ie_rsn_info *info) const struct ie_rsn_info *info)
{ {
@ -993,15 +994,10 @@ static void get_scan_done(void *user)
sc->state = SCAN_STATE_NOT_RUNNING; sc->state = SCAN_STATE_NOT_RUNNING;
if (!l_queue_isempty(sc->requests)) { start_next_scan_request(sc);
l_idle_oneshot(start_next_scan_request,
L_UINT_TO_PTR(sc->ifindex), NULL); if (sc->sp.rearm)
} else if (sc->sp.retry) {
if (scan_periodic_send_start(sc))
sc->sp.retry = false;
} else if (sc->sp.rearm) {
scan_periodic_rearm(sc); scan_periodic_rearm(sc);
}
done: done:
if (!new_owner) if (!new_owner)