From 1af88784f90fe4216b9173664c5c55351f89a639 Mon Sep 17 00:00:00 2001 From: Emmanuel VAUTRIN Date: Mon, 27 Feb 2023 09:48:35 +0100 Subject: [PATCH] network: Keep failure state after disconnection set_disconnected() function shall not prevent the service to process errors by replacing failure state by idle. For example, when a connection fails with a wrong passphrase, the user still needs to be informed, via the agent. However, in this case, the associated service is automatically disconnected, canceling the pending agent requests. The invalid key error shall be reported, instead of a cancel error. --- src/network.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/network.c b/src/network.c index 2090e7fe944e..06df023b076e 100644 --- a/src/network.c +++ b/src/network.c @@ -940,7 +940,7 @@ static void set_disconnected(struct connman_network *network) { struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6; enum connman_ipconfig_method ipv4_method, ipv6_method; - enum connman_service_state state; + enum connman_service_state state_ipv4, state_ipv6; struct connman_service *service; service = connman_service_lookup_from_network(network); @@ -1006,18 +1006,18 @@ static void set_disconnected(struct connman_network *network) * or in failure. It does not make sense to go to disconnect * state if we were not connected. */ - state = __connman_service_ipconfig_get_state(service, + state_ipv4 = __connman_service_ipconfig_get_state(service, CONNMAN_IPCONFIG_TYPE_IPV4); - if (state != CONNMAN_SERVICE_STATE_IDLE && - state != CONNMAN_SERVICE_STATE_FAILURE) + if (state_ipv4 != CONNMAN_SERVICE_STATE_IDLE && + state_ipv4 != CONNMAN_SERVICE_STATE_FAILURE) __connman_service_ipconfig_indicate_state(service, CONNMAN_SERVICE_STATE_DISCONNECT, CONNMAN_IPCONFIG_TYPE_IPV4); - state = __connman_service_ipconfig_get_state(service, + state_ipv6 = __connman_service_ipconfig_get_state(service, CONNMAN_IPCONFIG_TYPE_IPV6); - if (state != CONNMAN_SERVICE_STATE_IDLE && - state != CONNMAN_SERVICE_STATE_FAILURE) + if (state_ipv6 != CONNMAN_SERVICE_STATE_IDLE && + state_ipv6 != CONNMAN_SERVICE_STATE_FAILURE) __connman_service_ipconfig_indicate_state(service, CONNMAN_SERVICE_STATE_DISCONNECT, CONNMAN_IPCONFIG_TYPE_IPV6); @@ -1041,10 +1041,14 @@ static void set_disconnected(struct connman_network *network) } } - __connman_service_ipconfig_indicate_state(service, + if (state_ipv4 != CONNMAN_SERVICE_STATE_IDLE && + state_ipv4 != CONNMAN_SERVICE_STATE_FAILURE) + __connman_service_ipconfig_indicate_state(service, CONNMAN_SERVICE_STATE_IDLE, CONNMAN_IPCONFIG_TYPE_IPV4); + if (state_ipv6 != CONNMAN_SERVICE_STATE_IDLE && + state_ipv6 != CONNMAN_SERVICE_STATE_FAILURE) __connman_service_ipconfig_indicate_state(service, CONNMAN_SERVICE_STATE_IDLE, CONNMAN_IPCONFIG_TYPE_IPV6); -- 2.25.1