summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuel VAUTRIN <Emmanuel.VAUTRIN@cpexterne.org>2023-02-27 09:48:35 +0100
committerDaniel Wagner <wagi@monom.org>2023-04-11 09:19:09 +0200
commitaf175c50654bc925a797c282885a13d838fa082f (patch)
tree2188ba82d098b998ee501c668067821ffa702708
parent9cf2cc3844e486a81c5c118de4bcbde3489e097a (diff)
downloadconnman-af175c50654bc925a797c282885a13d838fa082f.tar.gz
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.
-rw-r--r--src/network.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/network.c b/src/network.c
index 2090e7fe..e3e02d16 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,11 +1041,15 @@ 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);
- __connman_service_ipconfig_indicate_state(service,
+ 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);