3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2024-12-01 15:49:49 +01:00

scan: Fix tracking external scans in sc->state

sc->state would get set when the TRIGGERED event arrived or when the
triggered callback for our own SCAN_TRIGGER command is received.
However it would not get reset to NOT_RUNNING when the NEW_SCAN_RESULTS
event is received, instead we'd first request the results with GET_SCAN
and only reset sc->state when that returns.  If during that command a
new scan gets triggered, the GET_SCAN callback would still reset
sc->state and clobber the value set by the new scan.

To fix that repurpose sc->state to only track that period from the
TRIGGERED signal to the NEW_SCAN_RESULTS signal.  sc->triggered can be
used to check if we're still waiting for the GET_SCAN command and
sc->start_cmd_id to check if we're waiting for the scan to get
triggered, so one of these three variables will now always indicate if
a scan is in progress.
This commit is contained in:
Andrew Zaborowski 2019-03-11 15:43:14 +01:00 committed by Denis Kenzior
parent e295b73c4c
commit d0ccb8496a

View File

@ -133,7 +133,6 @@ static void scan_request_failed(struct scan_context *sc,
sc->current_sr = NULL; sc->current_sr = NULL;
sc->triggered = false; sc->triggered = false;
sc->start_cmd_id = 0; sc->start_cmd_id = 0;
sc->state = SCAN_STATE_NOT_RUNNING;
l_queue_remove(sc->requests, sr); l_queue_remove(sc->requests, sr);
if (sr->trigger) if (sr->trigger)
@ -470,7 +469,8 @@ static uint32_t scan_common(uint32_t ifindex, bool passive,
if (l_queue_length(sc->requests) > 0) if (l_queue_length(sc->requests) > 0)
goto done; goto done;
if (sc->state != SCAN_STATE_NOT_RUNNING || sc->start_cmd_id) if (sc->state != SCAN_STATE_NOT_RUNNING ||
sc->start_cmd_id || sc->triggered)
goto done; goto done;
if (!scan_request_send_trigger(sc, sr)) if (!scan_request_send_trigger(sc, sr))
@ -748,7 +748,8 @@ static bool start_next_scan_request(struct scan_context *sc)
{ {
struct scan_request *sr; struct scan_request *sr;
if (sc->state != SCAN_STATE_NOT_RUNNING || sc->start_cmd_id) if (sc->state != SCAN_STATE_NOT_RUNNING ||
sc->start_cmd_id || sc->triggered)
return true; return true;
while (!l_queue_isempty(sc->requests)) { while (!l_queue_isempty(sc->requests)) {
@ -1199,7 +1200,6 @@ static void scan_finished(struct scan_context *sc, uint32_t wiphy,
scan_request_free(sr); scan_request_free(sr);
sc->triggered = false; sc->triggered = false;
sc->state = SCAN_STATE_NOT_RUNNING;
if (!start_next_scan_request(sc) && sc->sp.rearm) if (!start_next_scan_request(sc) && sc->sp.rearm)
scan_periodic_rearm(sc); scan_periodic_rearm(sc);
@ -1370,6 +1370,8 @@ static void scan_notify(struct l_genl_msg *msg, void *user_data)
struct l_genl_msg *scan_msg; struct l_genl_msg *scan_msg;
struct scan_results *results; struct scan_results *results;
sc->state = SCAN_STATE_NOT_RUNNING;
if (scan_send_next_cmd(sc)) if (scan_send_next_cmd(sc))
return; return;
@ -1397,6 +1399,8 @@ static void scan_notify(struct l_genl_msg *msg, void *user_data)
break; break;
case NL80211_CMD_SCAN_ABORTED: case NL80211_CMD_SCAN_ABORTED:
sc->state = SCAN_STATE_NOT_RUNNING;
scan_finished(sc, attr_wiphy, -ECANCELED, NULL); scan_finished(sc, attr_wiphy, -ECANCELED, NULL);
break; break;