From fe6485147c51d1e3c517454853548a25fdbbf40e Mon Sep 17 00:00:00 2001 From: Andrew Zaborowski Date: Sat, 2 Jul 2016 16:42:33 +0200 Subject: [PATCH] network: Disconnect from known network in Forget() Note that the autoconnect_list may still contain the network. Currently only the top entry from the list is ever used and only on new_scan_results(), i.e. at the same time the list is being created. If at some point it becomes part of actual device state it needs to also be reset when a network is being forgotten. --- src/knownnetworks.c | 5 ----- src/network.c | 30 +++++++++++++++++++++++------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/knownnetworks.c b/src/knownnetworks.c index ce649176..d9700d3c 100644 --- a/src/knownnetworks.c +++ b/src/knownnetworks.c @@ -115,11 +115,6 @@ static struct l_dbus_message *forget_network(struct l_dbus *dbus, if (!security_from_str(strtype, &security)) return dbus_error_invalid_args(message); - /* - * TODO: Disconnect from the network if currently connected or - * connecting. - */ - if (!network_info_forget_known(ssid, security)) return dbus_error_failed(message); diff --git a/src/network.c b/src/network.c index 0954a552..a28e7b69 100644 --- a/src/network.c +++ b/src/network.c @@ -778,6 +778,17 @@ bool network_info_add_known(const char *ssid, enum security security) return true; } +static void network_info_check_device(struct device *device, void *user_data) +{ + struct network_info *info = user_data; + struct network *network; + + network = device_get_connected_network(device); + + if (network && network->info == info) + device_disconnect(device); +} + bool network_info_forget_known(const char *ssid, enum security security) { struct network_info *network, search; @@ -789,15 +800,20 @@ bool network_info_forget_known(const char *ssid, enum security security) if (!network) return false; - if (network->seen_count) { - memset(&network->connected_time, 0, sizeof(struct timespec)); - - network->is_known = false; - - l_queue_push_tail(networks, network); - } else + if (!network->seen_count) { network_info_free(network); + return true; + } + + memset(&network->connected_time, 0, sizeof(struct timespec)); + + network->is_known = false; + + l_queue_push_tail(networks, network); + + __iwd_device_foreach(network_info_check_device, network); + return true; }