Factor out ipconfig disconnection so that the functionality will be
in one place only and one ipconfig can be disconnected independent of
the other one in a service.
---
 src/network.c |  106 +++++++++++++++++++++++++++++----------------------------
 1 file changed, 54 insertions(+), 52 deletions(-)

diff --git a/src/network.c b/src/network.c
index 6a926cb..3fd34c7 100644
--- a/src/network.c
+++ b/src/network.c
@@ -639,60 +639,47 @@ static void set_connected(struct connman_network *network)
        connman_network_set_associating(network, FALSE);
 }
 
-static void set_disconnected(struct connman_network *network)
+static int set_ipconfig_disconnected(struct connman_network *network,
+               struct connman_ipconfig *ipconfig)
 {
-       struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
-       enum connman_ipconfig_method ipv4_method, ipv6_method;
-       enum connman_service_state state;
        struct connman_service *service;
-
-       if (network->connected == FALSE)
-               return;
-
-       network->connected = FALSE;
+       enum connman_service_state state;
+       enum connman_ipconfig_type type;
+       enum connman_ipconfig_method method;
 
        service = connman_service_lookup_from_network(network);
+       type = __connman_ipconfig_get_config_type(ipconfig);
+       method = __connman_ipconfig_get_method(ipconfig);
 
-       ipconfig_ipv4 = __connman_service_get_ip4config(service);
-       ipconfig_ipv6 = __connman_service_get_ip6config(service);
-
-       DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
-               ipconfig_ipv6);
+       DBG("service %p ipconfig %p method %d", service, ipconfig, method);
 
-       ipv4_method = __connman_ipconfig_get_method(ipconfig_ipv4);
-       ipv6_method = __connman_ipconfig_get_method(ipconfig_ipv6);
-
-       DBG("method ipv4 %d ipv6 %d", ipv4_method, ipv6_method);
+       if (service == NULL)
+               return -EINVAL;
 
        /*
         * Resetting solicit count here will prevent the RS resend loop
         * from sending packets in check_dhcpv6()
         */
-       network->router_solicit_count = 0;
-
-       __connman_device_set_network(network->device, NULL);
+       if (type == CONNMAN_IPCONFIG_TYPE_IPV6)
+               network->router_solicit_count = 0;
 
-       switch (ipv6_method) {
+       switch (method) {
        case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
        case CONNMAN_IPCONFIG_METHOD_OFF:
        case CONNMAN_IPCONFIG_METHOD_FIXED:
        case CONNMAN_IPCONFIG_METHOD_MANUAL:
                break;
+
        case CONNMAN_IPCONFIG_METHOD_DHCP:
-       case CONNMAN_IPCONFIG_METHOD_AUTO:
-               release_dhcpv6(network);
+               if (type != CONNMAN_IPCONFIG_TYPE_IPV4)
+                       return -EINVAL;
+               __connman_dhcp_stop(network);
                break;
-       }
 
-       switch (ipv4_method) {
-       case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
-       case CONNMAN_IPCONFIG_METHOD_OFF:
        case CONNMAN_IPCONFIG_METHOD_AUTO:
-       case CONNMAN_IPCONFIG_METHOD_FIXED:
-       case CONNMAN_IPCONFIG_METHOD_MANUAL:
-               break;
-       case CONNMAN_IPCONFIG_METHOD_DHCP:
-               __connman_dhcp_stop(network);
+               if (type != CONNMAN_IPCONFIG_TYPE_IPV6)
+                       return -EINVAL;
+               release_dhcpv6(network);
                break;
        }
 
@@ -701,27 +688,16 @@ 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,
-                                               CONNMAN_IPCONFIG_TYPE_IPV4);
-       if (state != CONNMAN_SERVICE_STATE_IDLE &&
-                       state != 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, type);
 
-       state = __connman_service_ipconfig_get_state(service,
-                                               CONNMAN_IPCONFIG_TYPE_IPV6);
        if (state != CONNMAN_SERVICE_STATE_IDLE &&
-                               state != CONNMAN_SERVICE_STATE_FAILURE)
+                       state != CONNMAN_SERVICE_STATE_FAILURE)
                __connman_service_ipconfig_indicate_state(service,
                                        CONNMAN_SERVICE_STATE_DISCONNECT,
-                                       CONNMAN_IPCONFIG_TYPE_IPV6);
-
-       __connman_connection_gateway_remove(service,
-                                       CONNMAN_IPCONFIG_TYPE_ALL);
+                                       type);
 
-       __connman_ipconfig_address_unset(ipconfig_ipv4);
-       __connman_ipconfig_address_unset(ipconfig_ipv6);
+       __connman_connection_gateway_remove(service, type);
+       __connman_ipconfig_address_unset(ipconfig);
 
        /*
         * Special handling for IPv6 autoconfigured address.
@@ -729,11 +705,37 @@ static void set_disconnected(struct connman_network 
*network)
         * disable IPv6 temporarily so that kernel will do the cleanup
         * automagically.
         */
-       if (ipv6_method == CONNMAN_IPCONFIG_METHOD_AUTO) {
-               __connman_ipconfig_disable_ipv6(ipconfig_ipv6);
-               __connman_ipconfig_enable_ipv6(ipconfig_ipv6);
+       if (method == CONNMAN_IPCONFIG_METHOD_AUTO) {
+               __connman_ipconfig_disable_ipv6(ipconfig);
+               __connman_ipconfig_enable_ipv6(ipconfig);
        }
 
+       return 0;
+}
+
+static void set_disconnected(struct connman_network *network)
+{
+       struct connman_ipconfig *ipconfig_ipv4, *ipconfig_ipv6;
+       struct connman_service *service;
+
+       if (network->connected == FALSE)
+               return;
+
+       network->connected = FALSE;
+
+       service = connman_service_lookup_from_network(network);
+
+       ipconfig_ipv4 = __connman_service_get_ip4config(service);
+       ipconfig_ipv6 = __connman_service_get_ip6config(service);
+
+       DBG("service %p ipv4 %p ipv6 %p", service, ipconfig_ipv4,
+               ipconfig_ipv6);
+
+       __connman_device_set_network(network->device, NULL);
+
+       set_ipconfig_disconnected(network, ipconfig_ipv4);
+       set_ipconfig_disconnected(network, ipconfig_ipv6);
+
        __connman_service_ipconfig_indicate_state(service,
                                                CONNMAN_SERVICE_STATE_IDLE,
                                                CONNMAN_IPCONFIG_TYPE_IPV4);
-- 
1.7.10.4

_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman

Reply via email to