ipconfig: Toggle interface IPv6 status properly
authorJukka Rissanen <jukka.rissanen@nokia.com>
Thu, 17 Feb 2011 07:59:30 +0000 (09:59 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Thu, 17 Feb 2011 22:56:35 +0000 (23:56 +0100)
This is done so that if service is disconnected, the kernel
created autoconf routes need to be cleared also.
That can be done easily by disabling IPv6 for that interface.
The disabling of IPv6 is only done for autoconfigured interfaces.
When service is connected, the IPv6 is enabled for the used
interface.

src/ipconfig.c

index 14edb3d..62d3766 100644 (file)
@@ -1351,6 +1351,34 @@ const char *__connman_ipconfig_get_proxy_autoconfig(struct connman_ipconfig *ipc
        return ipdevice->pac;
 }
 
+static void disable_ipv6(struct connman_ipconfig *ipconfig)
+{
+       struct connman_ipdevice *ipdevice;
+
+       DBG("");
+
+       ipdevice = g_hash_table_lookup(ipdevice_hash,
+                                       GINT_TO_POINTER(ipconfig->index));
+       if (ipdevice == NULL)
+               return;
+
+       set_ipv6_state(ipdevice->ifname, FALSE);
+}
+
+static void enable_ipv6(struct connman_ipconfig *ipconfig)
+{
+       struct connman_ipdevice *ipdevice;
+
+       DBG("");
+
+       ipdevice = g_hash_table_lookup(ipdevice_hash,
+                                       GINT_TO_POINTER(ipconfig->index));
+       if (ipdevice == NULL)
+               return;
+
+       set_ipv6_state(ipdevice->ifname, TRUE);
+}
+
 int __connman_ipconfig_enable(struct connman_ipconfig *ipconfig)
 {
        struct connman_ipdevice *ipdevice;
@@ -1376,6 +1404,7 @@ int __connman_ipconfig_enable(struct connman_ipconfig *ipconfig)
                if (ipdevice->config_ipv6 == ipconfig)
                        return -EALREADY;
                type = CONNMAN_IPCONFIG_TYPE_IPV6;
+               enable_ipv6(ipconfig);
        } else
                return -EINVAL;
 
@@ -1459,6 +1488,10 @@ int __connman_ipconfig_disable(struct connman_ipconfig *ipconfig)
        if (ipdevice->config_ipv6 == ipconfig) {
                ipconfig_list = g_list_remove(ipconfig_list, ipconfig);
 
+               if (ipdevice->config_ipv6->method ==
+                                               CONNMAN_IPCONFIG_METHOD_AUTO)
+                       disable_ipv6(ipdevice->config_ipv6);
+
                connman_ipaddress_clear(ipdevice->config_ipv6->system);
                connman_ipconfig_unref(ipdevice->config_ipv6);
                ipdevice->config_ipv6 = NULL;
@@ -1662,34 +1695,6 @@ void __connman_ipconfig_append_ipv4config(struct connman_ipconfig *ipconfig,
                                DBUS_TYPE_STRING, &ipconfig->address->gateway);
 }
 
-static void disable_ipv6(struct connman_ipconfig *ipconfig)
-{
-       struct connman_ipdevice *ipdevice;
-
-       DBG("");
-
-       ipdevice = g_hash_table_lookup(ipdevice_hash,
-                                       GINT_TO_POINTER(ipconfig->index));
-       if (ipdevice == NULL)
-               return;
-
-       set_ipv6_state(ipdevice->ifname, FALSE);
-}
-
-static void enable_ipv6(struct connman_ipconfig *ipconfig)
-{
-       struct connman_ipdevice *ipdevice;
-
-       DBG("");
-
-       ipdevice = g_hash_table_lookup(ipdevice_hash,
-                                       GINT_TO_POINTER(ipconfig->index));
-       if (ipdevice == NULL)
-               return;
-
-       set_ipv6_state(ipdevice->ifname, TRUE);
-}
-
 int __connman_ipconfig_set_config(struct connman_ipconfig *ipconfig,
                                                        DBusMessageIter *array)
 {