--- 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