ipconfig: Enable and disable IPv6 properly
authorJukka Rissanen <jukka.rissanen@nokia.com>
Fri, 18 Feb 2011 11:43:00 +0000 (13:43 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Fri, 18 Feb 2011 19:23:39 +0000 (20:23 +0100)
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
src/ipconfig.c
src/service.c

index 9bc97d5..7d62330 100644 (file)
@@ -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
 }
index 62d3766..6511370 100644 (file)
@@ -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);
                }
        }
 
index 9a0d499..1696e5a 100644 (file)
@@ -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);