summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJukka Rissanen <jukka.rissanen@nokia.com>2011-02-17 09:59:30 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2011-02-17 23:56:35 +0100
commit3373593f63cb4ff52d04952517f69710867fd849 (patch)
tree7022e3fce102108ebd5fcd28dc37b9f5a30801f6
parent5b918998019ed669f58bee83b39ef98e370534ee (diff)
downloadconnman-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.c61
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)
{