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; }