From a9c32d85ea6a6fb8382340bb670c37ffe7fda7b7 Mon Sep 17 00:00:00 2001 From: James Prestwood Date: Tue, 26 Jan 2021 11:57:35 -0800 Subject: [PATCH] station: cancel quick scans on Connect() At some point the non-interactive client tests began failing. This was due to a bug in station where it would transition from 'connected' to 'autoconnect' due to a failed scan request. This happened because a quick scan got scheduled during an ongoing scan, then a Connect() gets issued. The work queue treats the Connect as a priority so it delays the quick scan until after the connection succeeds. This results in a failed quick scan which IWD does not expect to happen when in a 'connected' state. This failed scan actually triggers a state transition which then gets IWD into a strange state where its connected from the kernel point of view but does not think it is: src/station.c:station_connect_cb() 13, result: 0 src/station.c:station_enter_state() Old State: connecting, new state: connected src/wiphy.c:wiphy_radio_work_done() Work item 6 done src/wiphy.c:wiphy_radio_work_next() Starting work item 5 src/station.c:station_quick_scan_triggered() Quick scan trigger failed: -95 src/station.c:station_enter_state() Old State: connected, new state: autoconnect_full To fix this IWD should simply cancel any pending quick scans if/when a Connect() call comes in. --- src/station.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/station.c b/src/station.c index b600f37e..55368472 100644 --- a/src/station.c +++ b/src/station.c @@ -2539,6 +2539,12 @@ void station_connect_network(struct station *station, struct network *network, dbus_error_failed(station->hidden_pending)); } + if (station->quick_scan_id) { + scan_cancel(netdev_get_wdev_id(station->netdev), + station->quick_scan_id); + station->quick_scan_id = 0; + } + if (station_is_busy(station)) { station_disconnect_onconnect(station, network, bss, message);