With the right attachment (wording deconnection -> disconnection).

B.R.

Emmanuel

De : VAUTRIN Emmanuel (Canal Plus Prestataire) <Emmanuel.VAUTRIN@cpexterne.org>
Envoyé : lundi 27 février 2023 18:00
À : connman@lists.linux.dev <connman@lists.linux.dev>
Objet : [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

Hello,

Please find the right formatted patch in attachment.


Emmanuel