From e11862e9419c75bb44a18f2bf5752f94e6dbeb5b Mon Sep 17 00:00:00 2001 From: Jukka Rissanen Date: Fri, 18 Feb 2011 13:43:00 +0200 Subject: [PATCH] ipconfig: Enable and disable IPv6 properly this sets the IPv6 status correctly by - enabling IPv6 when service config is loaded and method is AUTO or MANUAL - and disabling IPv6 when service is connected and method is OFF --- include/ipconfig.h | 1 + src/ipconfig.c | 25 ++++++++++--------------- src/service.c | 7 +++++++ 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/include/ipconfig.h b/include/ipconfig.h index 9bc97d5..7d62330 100644 --- a/include/ipconfig.h +++ b/include/ipconfig.h @@ -95,6 +95,7 @@ int connman_ipconfig_set_method(struct connman_ipconfig *ipconfig, enum connman_ipconfig_method method); void connman_ipconfig_bind(struct connman_ipconfig *ipconfig, struct connman_ipaddress *ipaddress); +void __connman_ipconfig_disable_ipv6(struct connman_ipconfig *ipconfig); #ifdef __cplusplus } diff --git a/src/ipconfig.c b/src/ipconfig.c index 62d3766..6511370 100644 --- a/src/ipconfig.c +++ b/src/ipconfig.c @@ -1379,6 +1379,14 @@ static void enable_ipv6(struct connman_ipconfig *ipconfig) set_ipv6_state(ipdevice->ifname, TRUE); } +void __connman_ipconfig_disable_ipv6(struct connman_ipconfig *ipconfig) +{ + if (ipconfig == NULL || ipconfig->type != CONNMAN_IPCONFIG_TYPE_IPV6) + return; + + disable_ipv6(ipconfig); +} + int __connman_ipconfig_enable(struct connman_ipconfig *ipconfig) { struct connman_ipdevice *ipdevice; @@ -1861,23 +1869,10 @@ int __connman_ipconfig_load(struct connman_ipconfig *ipconfig, ipconfig->method = CONNMAN_IPCONFIG_METHOD_OFF; if (ipconfig->type == CONNMAN_IPCONFIG_TYPE_IPV6) { - if (ipconfig->method == CONNMAN_IPCONFIG_METHOD_OFF) - disable_ipv6(ipconfig); - else if (ipconfig->method == CONNMAN_IPCONFIG_METHOD_AUTO || + if (ipconfig->method == CONNMAN_IPCONFIG_METHOD_AUTO || ipconfig->method == CONNMAN_IPCONFIG_METHOD_MANUAL) { - enable_ipv6(ipconfig); __connman_ipconfig_enable(ipconfig); - - if (ipconfig->ops_data) { - struct connman_service *service = - ipconfig->ops_data; - struct connman_network *network; - network = __connman_service_get_network( - service); - if (network) - __connman_network_set_ipconfig(network, - NULL, ipconfig); - } + enable_ipv6(ipconfig); } } diff --git a/src/service.c b/src/service.c index 9a0d499..1696e5a 100644 --- a/src/service.c +++ b/src/service.c @@ -3319,6 +3319,7 @@ int __connman_service_indicate_state(struct connman_service *service, if (state == CONNMAN_SERVICE_STATE_READY) { enum connman_service_proxy_method proxy_config; + enum connman_ipconfig_method method; set_reconnect_state(service, TRUE); @@ -3371,6 +3372,12 @@ int __connman_service_indicate_state(struct connman_service *service, } default_changed(); + + method = __connman_ipconfig_get_method(service->ipconfig_ipv6); + if (method == CONNMAN_IPCONFIG_METHOD_OFF) + __connman_ipconfig_disable_ipv6( + service->ipconfig_ipv6); + } else if (state == CONNMAN_SERVICE_STATE_DISCONNECT) { __connman_location_finish(service); -- 2.7.4