From: Jukka Rissanen Date: Thu, 17 Feb 2011 07:59:30 +0000 (+0200) Subject: ipconfig: Toggle interface IPv6 status properly X-Git-Tag: 2.0_alpha~1716 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3373593f63cb4ff52d04952517f69710867fd849;p=framework%2Fconnectivity%2Fconnman.git ipconfig: Toggle interface IPv6 status properly 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. --- diff --git a/src/ipconfig.c b/src/ipconfig.c index 14edb3d..62d3766 100644 --- a/src/ipconfig.c +++ b/src/ipconfig.c @@ -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) {