---
Hi,

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

Regards,
Jukka


 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);
 
-- 
1.7.0.4

_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to