---
 src/connman.h |    1 +
 src/ipv4.c    |    5 +++++
 src/service.c |   56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 62 insertions(+), 0 deletions(-)

diff --git a/src/connman.h b/src/connman.h
index a8ef170..0d90b6b 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -481,6 +481,7 @@ struct connman_ipconfig *__connman_service_get_ip4config(
                                struct connman_service *service);
 struct connman_ipconfig *__connman_service_get_ip6config(
                                struct connman_service *service);
+connman_bool_t __connman_service_6to4_enabled(struct connman_service *service);
 const char *__connman_service_get_ident(struct connman_service *service);
 const char *__connman_service_get_path(struct connman_service *service);
 unsigned int __connman_service_get_order(struct connman_service *service);
diff --git a/src/ipv4.c b/src/ipv4.c
index e77b8ee..1ab0338 100644
--- a/src/ipv4.c
+++ b/src/ipv4.c
@@ -103,6 +103,9 @@ static int ipv4_probe(struct connman_element *element)
        if (err < 0)
                return err;
 
+       if (__connman_service_6to4_enabled(service) == TRUE)
+               __connman_6to4_probe(address);
+
        return 0;
 }
 
@@ -152,6 +155,8 @@ static void ipv4_remove(struct connman_element *element)
                        AF_INET, address, peer, prefixlen, broadcast) < 0))
                DBG("address removal failed");
 
+       __connman_6to4_remove();
+
        connman_element_unref(element);
 }
 
diff --git a/src/service.c b/src/service.c
index 9a0d499..7293354 100644
--- a/src/service.c
+++ b/src/service.c
@@ -103,6 +103,7 @@ struct connman_service {
        char **excludes;
        char *pac;
        connman_bool_t wps;
+       connman_bool_t enabled_6to4;
 };
 
 static void append_path(gpointer value, gpointer user_data)
@@ -1649,6 +1650,9 @@ static void append_properties(DBusMessageIter *dict, 
dbus_bool_t limited,
        connman_dbus_dict_append_dict(dict, "IPv6.Configuration",
                                                append_ipv6config, service);
 
+       connman_dbus_dict_append_basic(dict, "6to4",
+                               DBUS_TYPE_BOOLEAN, &service->enabled_6to4);
+
        connman_dbus_dict_append_array(dict, "Nameservers",
                                DBUS_TYPE_STRING, append_dns, service);
 
@@ -1851,6 +1855,21 @@ void __connman_service_set_passphrase(struct 
connman_service *service,
        __connman_storage_save_service(service);
 }
 
+connman_bool_t __connman_service_6to4_enabled(struct connman_service *service)
+{
+       enum connman_ipconfig_method method;
+
+       if (service == NULL)
+               return FALSE;
+
+       method = __connman_ipconfig_get_method(service->ipconfig_ipv6);
+       if (method == CONNMAN_IPCONFIG_METHOD_UNKNOWN ||
+                               method == CONNMAN_IPCONFIG_METHOD_OFF)
+               return FALSE;
+
+       return service->enabled_6to4;
+}
+
 static DBusMessage *get_properties(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
@@ -2281,6 +2300,31 @@ static DBusMessage *set_property(DBusConnection *conn,
                                                        ipv4, ipv6);
 
                __connman_storage_save_service(service);
+       } else if (g_str_equal(name, "6to4") == TRUE) {
+               connman_bool_t six2four;
+
+               if (type != DBUS_TYPE_BOOLEAN)
+                       return __connman_error_invalid_arguments(msg);
+
+               dbus_message_iter_get_basic(&value, &six2four);
+
+               if (service->enabled_6to4 == six2four)
+                       return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+
+               service->enabled_6to4 = six2four;
+               if (service->enabled_6to4 == TRUE) {
+                       if (__connman_service_6to4_enabled(service) == TRUE) {
+                               struct connman_ipaddress *address;
+                               address =
+                                       __connman_ipconfig_get_system_address(
+                                               service->ipconfig_ipv4);
+                               if (address)
+                                       __connman_6to4_probe(address->local);
+                       }
+               } else
+                       __connman_6to4_remove();
+
+               __connman_storage_save_service(service);
        } else
                return __connman_error_invalid_property(msg);
 
@@ -4756,6 +4800,8 @@ static int service_load(struct connman_service *service)
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
        case CONNMAN_SERVICE_TYPE_SYSTEM:
        case CONNMAN_SERVICE_TYPE_ETHERNET:
+               service->enabled_6to4 = g_key_file_get_boolean(keyfile,
+                                       service->identifier, "6to4", NULL);
        case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
        case CONNMAN_SERVICE_TYPE_GADGET:
@@ -4830,6 +4876,10 @@ static int service_load(struct connman_service *service)
                                        CONNMAN_SERVICE_STATE_FAILURE;
                        service->error = string2error(str);
                }
+
+               service->enabled_6to4 = g_key_file_get_boolean(keyfile,
+                                       service->identifier, "6to4", NULL);
+
                break;
        }
 
@@ -4944,6 +4994,8 @@ update:
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
        case CONNMAN_SERVICE_TYPE_SYSTEM:
        case CONNMAN_SERVICE_TYPE_ETHERNET:
+               g_key_file_set_boolean(keyfile, service->identifier,
+                                               "6to4", service->enabled_6to4);
        case CONNMAN_SERVICE_TYPE_GPS:
        case CONNMAN_SERVICE_TYPE_VPN:
        case CONNMAN_SERVICE_TYPE_GADGET:
@@ -5000,6 +5052,10 @@ update:
                        g_key_file_remove_key(keyfile, service->identifier,
                                                        "Failure", NULL);
                }
+
+               g_key_file_set_boolean(keyfile, service->identifier,
+                                               "6to4", service->enabled_6to4);
+
                break;
        }
 
-- 
1.7.0.4

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

Reply via email to