Make sure we process the result of a connect attempt both in a D-Bus triggered connection and during autoconnect. Until now we'd only call station_connect_cb() on NETDEV_EVENT_DISCONNECT_BY_{AP,SME} if station->connect_pending was non-NULL, i.e. only in the D-Bus method. As a result we were never blacklisting BSSes and never calling network_connect_failed() (to set ask_passphrase) during autoconnect. Use station->netdev_connected to keep track of whether the event actually happens in the handshake (as opposed to netconfig for example) to avoid calling network_connect_failed() with the "in_handshake" parameter set to true. Arguably we might want to call netdev_connect_failed() or at least temporarily blacklist/downrank the bss if the connection breaks during netconfig but I kept the current logic in this commit. We might also want to call station_reassociate_cb() if we're in a reassociation but this wouldn't currently make much difference (and we don't seem to have any flag to know that we're in a reassociation right now.) --- src/station.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/station.c b/src/station.c index 479f81f5..e503f636 100644 --- a/src/station.c +++ b/src/station.c @@ -113,6 +113,7 @@ struct station { bool ap_directed_roaming : 1; bool scanning : 1; bool autoconnect : 1; + bool netdev_connected : 1; }; struct anqp_entry { @@ -1339,6 +1340,7 @@ static void station_reset_connection_state(struct station *station) l_queue_insert(station->networks_sorted, station->connected_network, network_rank_compare, NULL); + station->netdev_connected = false; station->connected_bss = NULL; station->connected_network = NULL; @@ -1370,7 +1372,9 @@ static void station_disconnect_event(struct station *station, void *event_data) { l_debug("%u", netdev_get_ifindex(station->netdev)); - if (station->connect_pending) + if (station->connect_pending || + (station->state == STATION_STATE_CONNECTING && + !station->netdev_connected)) station_connect_cb(station->netdev, NETDEV_RESULT_HANDSHAKE_FAILED, event_data, station); @@ -2554,6 +2558,7 @@ static void station_connect_cb(struct netdev *netdev, enum netdev_result result, l_warn("Could not request neighbor report"); } + station->netdev_connected = true; network_connected(station->connected_network); if (station->netconfig) -- 2.27.0