diff options
author | Jukka Rissanen <jukka.rissanen@nokia.com> | 2011-02-17 09:59:30 +0200 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2011-02-17 23:56:35 +0100 |
commit | 3373593f63cb4ff52d04952517f69710867fd849 (patch) | |
tree | 7022e3fce102108ebd5fcd28dc37b9f5a30801f6 | |
parent | 5b918998019ed669f58bee83b39ef98e370534ee (diff) | |
download | connman-3373593f63cb4ff52d04952517f69710867fd849.tar.gz connman-3373593f63cb4ff52d04952517f69710867fd849.tar.bz2 connman-3373593f63cb4ff52d04952517f69710867fd849.zip |
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.
-rw-r--r-- | src/ipconfig.c | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/src/ipconfig.c b/src/ipconfig.c index 14edb3d7..62d37664 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) { |