From 8f0d68139e97003cfe582531bc93dea9d034c47a Mon Sep 17 00:00:00 2001 From: Andrew Zaborowski Date: Fri, 24 Jun 2016 05:09:04 +0200 Subject: [PATCH] device: Reset connected_network when disconnect operation starts It is probably rare that a disconnect should fail but if it happens the device->state is not returned to CONNECTED and I'm not sure if it should be, so the ConnectedNetwork property and other bits should probably be reset at the start of the disconnection instead of at the end. Also check if state is CONNECTED before calling network_disconnected because network_connected may have not been called yet. --- src/device.c | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/src/device.c b/src/device.c index 7b0f4873..b398dd05 100644 --- a/src/device.c +++ b/src/device.c @@ -500,20 +500,21 @@ void device_disassociated(struct device *device) struct network *network = device->connected_network; struct l_dbus *dbus = dbus_get_bus(); - if (!network) - return; + if (network) { + if (device->state == DEVICE_STATE_CONNECTED) + network_disconnected(network); - network_disconnected(network); + device->connected_bss = NULL; + device->connected_network = NULL; - device->connected_bss = NULL; - device->connected_network = NULL; + l_dbus_property_changed(dbus, device_get_path(device), + IWD_DEVICE_INTERFACE, + "ConnectedNetwork"); + l_dbus_property_changed(dbus, network_get_path(network), + IWD_NETWORK_INTERFACE, "Connected"); + } device_enter_state(device, DEVICE_STATE_AUTOCONNECT); - - l_dbus_property_changed(dbus, device_get_path(device), - IWD_DEVICE_INTERFACE, "ConnectedNetwork"); - l_dbus_property_changed(dbus, network_get_path(network), - IWD_NETWORK_INTERFACE, "Connected"); } static void device_lost_beacon(struct device *device) @@ -742,8 +743,7 @@ static struct l_dbus_message *device_disconnect(struct l_dbus *dbus, void *user_data) { struct device *device = user_data; - - l_debug(""); + struct network *network; if (device->state == DEVICE_STATE_CONNECTING || device->state == DEVICE_STATE_DISCONNECTING) @@ -755,6 +755,24 @@ static struct l_dbus_message *device_disconnect(struct l_dbus *dbus, if (netdev_disconnect(device->netdev, device_disconnect_cb, device) < 0) return dbus_error_failed(message); + network = device->connected_network; + + /* + * If the disconnect somehow fails we won't know if we're still + * connected so we may as well indicate now that we're no longer + * connected. + */ + if (device->state == DEVICE_STATE_CONNECTED) + network_disconnected(network); + + device->connected_bss = NULL; + device->connected_network = NULL; + + l_dbus_property_changed(dbus, device_get_path(device), + IWD_DEVICE_INTERFACE, "ConnectedNetwork"); + l_dbus_property_changed(dbus, network_get_path(network), + IWD_NETWORK_INTERFACE, "Connected"); + device_enter_state(device, DEVICE_STATE_DISCONNECTING); device->disconnect_pending = l_dbus_message_ref(message);