From f8b703efed3841c87041885c873f279ce98ef554 Mon Sep 17 00:00:00 2001 From: James Prestwood Date: Wed, 15 Sep 2021 10:36:21 -0700 Subject: [PATCH] network: support connect during OWE hidden scan Similar to ANQP a connect call could come in while station is scanning for OWE hidden networks. This is supported in the same manor by saving away the dbus message and resuming the connection after the hidden OWE scan. --- src/network.c | 48 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/src/network.c b/src/network.c index d985f811..48314a05 100644 --- a/src/network.c +++ b/src/network.c @@ -83,11 +83,13 @@ struct network { bool ask_passphrase:1; /* Whether we should force-ask agent */ bool is_hs20:1; bool anqp_pending:1; /* Set if there is a pending ANQP request */ + bool owe_hidden_pending:1; uint8_t transition_disable; /* Temporary cache until info is set */ bool have_transition_disable:1; int rank; /* Holds DBus Connect() message if it comes in before ANQP finishes */ struct l_dbus_message *connect_after_anqp; + struct l_dbus_message *connect_after_owe_hidden; }; static bool network_settings_load(struct network *network) @@ -1506,6 +1508,17 @@ struct l_dbus_message *__network_connect(struct network *network, case SECURITY_PSK: return network_connect_psk(network, bss, message); case SECURITY_NONE: + if (network->connect_after_owe_hidden) + return dbus_error_busy(message); + + /* Save message and connect after OWE hidden scan is done */ + if (network->owe_hidden_pending) { + network->connect_after_owe_hidden = + l_dbus_message_ref(message); + l_debug("Pending OWE hidden scan, delaying connect"); + return NULL; + } + station_connect_network(station, network, bss, message); return NULL; case SECURITY_8021X: @@ -1901,11 +1914,17 @@ static void known_networks_changed(enum known_networks_event event, static void event_watch_changed(enum station_event state, struct network *network, void *user_data) { - network->anqp_pending = state == STATION_EVENT_ANQP_STARTED; + struct l_dbus_message *reply; - if (state == STATION_EVENT_ANQP_FINISHED && - network->connect_after_anqp) { - struct l_dbus_message *reply; + switch (state) { + case STATION_EVENT_ANQP_STARTED: + network->anqp_pending = true; + break; + case STATION_EVENT_ANQP_FINISHED: + network->anqp_pending = false; + + if (!network->connect_after_anqp) + return; l_debug("ANQP complete, resuming connect to %s", network->ssid); @@ -1925,6 +1944,27 @@ static void event_watch_changed(enum station_event state, l_dbus_message_unref(network->connect_after_anqp); network->connect_after_anqp = NULL; + + break; + case STATION_EVENT_OWE_HIDDEN_STARTED: + network->owe_hidden_pending = true; + break; + case STATION_EVENT_OWE_HIDDEN_FINISHED: + network->owe_hidden_pending = false; + + if (!network->connect_after_owe_hidden) + return; + + reply = __network_connect(network, + network_bss_select(network, true), + network->connect_after_owe_hidden); + if (reply) + l_dbus_send(dbus_get_bus(), reply); + + l_dbus_message_unref(network->connect_after_owe_hidden); + network->connect_after_owe_hidden = NULL; + + break; } }