diff options
author | taesubkim <taesub.kim@samsung.com> | 2016-04-26 15:47:01 +0900 |
---|---|---|
committer | taesubkim <taesub.kim@samsung.com> | 2016-04-26 16:14:46 +0900 |
commit | 22633ced6225d294ce8483efbf2b39ea0c0c1b65 (patch) | |
tree | 8c5f2312feec413068a18e57a80321b31b4f7b74 /plugins/ofono.c | |
parent | bcae74da8fa2958b3fec9153fc33e41f0e0317bf (diff) | |
download | connman-22633ced6225d294ce8483efbf2b39ea0c0c1b65.tar.gz connman-22633ced6225d294ce8483efbf2b39ea0c0c1b65.tar.bz2 connman-22633ced6225d294ce8483efbf2b39ea0c0c1b65.zip |
Imported Upstream version 1.29upstream/1.29
Change-Id: I2958446c35966d9ed72df0120b80561be7d89f54
Signed-off-by: Taesub Kim <taesub.kim@samsung.com>
Diffstat (limited to 'plugins/ofono.c')
-rw-r--r-- | plugins/ofono.c | 108 |
1 files changed, 93 insertions, 15 deletions
diff --git a/plugins/ofono.c b/plugins/ofono.c index 7af551ba..5cd83029 100644 --- a/plugins/ofono.c +++ b/plugins/ofono.c @@ -277,13 +277,11 @@ static void set_connected(struct modem_data *modem) if (!service) return; + connman_service_create_ip4config(service, index); + connman_network_set_ipv4_method(modem->network, method); + if (method == CONNMAN_IPCONFIG_METHOD_FIXED || method == CONNMAN_IPCONFIG_METHOD_DHCP) { - connman_service_create_ip4config(service, index); - connman_network_set_index(modem->network, index); - - connman_network_set_ipv4_method(modem->network, method); - setip = true; } @@ -293,11 +291,10 @@ static void set_connected(struct modem_data *modem) } method = modem->context->ipv6_method; - if (method == CONNMAN_IPCONFIG_METHOD_FIXED) { - connman_service_create_ip6config(service, index); - connman_network_set_ipv6_method(modem->network, method); - connman_network_set_ipaddress(modem->network, - modem->context->ipv6_address); + connman_service_create_ip6config(service, index); + connman_network_set_ipv6_method(modem->network, method); + + if (method == CONNMAN_IPCONFIG_METHOD_AUTO) { setip = true; } @@ -317,18 +314,32 @@ static void set_connected(struct modem_data *modem) modem->context->ipv6_nameservers); } - if (setip) + if (setip) { + connman_network_set_index(modem->network, index); connman_network_set_connected(modem->network, true); + } } static void set_disconnected(struct modem_data *modem) { DBG("%s", modem->path); - if (!modem->network) - return; + if (modem->network) + connman_network_set_connected(modem->network, false); - connman_network_set_connected(modem->network, false); + if (modem->context) { + g_free(modem->context->ipv4_nameservers); + modem->context->ipv4_nameservers = NULL; + if (modem->context->ipv4_method != CONNMAN_IPCONFIG_METHOD_OFF) + modem->context->ipv4_method = + CONNMAN_IPCONFIG_METHOD_UNKNOWN; + + g_free(modem->context->ipv6_nameservers); + modem->context->ipv6_nameservers = NULL; + if (modem->context->ipv6_method != CONNMAN_IPCONFIG_METHOD_OFF) + modem->context->ipv6_method = + CONNMAN_IPCONFIG_METHOD_UNKNOWN; + } } typedef void (*set_property_cb)(struct modem_data *data, @@ -755,6 +766,10 @@ static void extract_ipv4_settings(DBusMessageIter *array, const char *interface = NULL; int index = -1; + connman_ipaddress_free(context->ipv4_address); + context->ipv4_address = NULL; + context->index = -1; + if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_ARRAY) return; @@ -854,6 +869,10 @@ static void extract_ipv6_settings(DBusMessageIter *array, const char *interface = NULL; int index = -1; + connman_ipaddress_free(context->ipv6_address); + context->ipv6_address = NULL; + context->index = -1; + if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_ARRAY) return; @@ -905,7 +924,7 @@ static void extract_ipv6_settings(DBusMessageIter *array, if (index < 0) goto out; - context->ipv6_method = CONNMAN_IPCONFIG_METHOD_FIXED; + context->ipv6_method = CONNMAN_IPCONFIG_METHOD_AUTO; context->ipv6_address = connman_ipaddress_alloc(CONNMAN_IPCONFIG_TYPE_IPV6); @@ -1065,12 +1084,53 @@ static void remove_network(struct modem_data *modem) modem->network = NULL; } +static int set_context_ipconfig(struct network_context *context, + const char *protocol) +{ + DBG("context %p protocol %s", context, protocol); + + if (!context || !protocol) + return -EINVAL; + + if (g_str_equal(protocol, "ip")) { + if (context->ipv4_method == CONNMAN_IPCONFIG_METHOD_OFF) + context->ipv4_method = CONNMAN_IPCONFIG_METHOD_UNKNOWN; + + context->ipv6_method = CONNMAN_IPCONFIG_METHOD_OFF; + + connman_ipaddress_free(context->ipv6_address); + context->ipv6_address = NULL; + + } else if (g_str_equal(protocol, "ipv6")) { + if (context->ipv6_method == CONNMAN_IPCONFIG_METHOD_OFF) + context->ipv6_method = CONNMAN_IPCONFIG_METHOD_UNKNOWN; + + context->ipv4_method = CONNMAN_IPCONFIG_METHOD_OFF; + + connman_ipaddress_free(context->ipv4_address); + context->ipv4_address = NULL; + + } else if (g_str_equal(protocol, "dual")) { + if (context->ipv4_method == CONNMAN_IPCONFIG_METHOD_OFF) + context->ipv4_method = CONNMAN_IPCONFIG_METHOD_UNKNOWN; + + if (context->ipv6_method == CONNMAN_IPCONFIG_METHOD_OFF) + context->ipv6_method = CONNMAN_IPCONFIG_METHOD_UNKNOWN; + } + + DBG("ipv4 method %d ipv6 method %d", context->ipv4_method, + context->ipv6_method); + + return 0; +} + static int add_cm_context(struct modem_data *modem, const char *context_path, DBusMessageIter *dict) { const char *context_type = NULL; struct network_context *context = NULL; dbus_bool_t active = FALSE; + const char *ip_protocol = NULL; DBG("%s context path %s", modem->path, context_path); @@ -1123,7 +1183,14 @@ static int add_cm_context(struct modem_data *modem, const char *context_path, modem->valid_apn = false; DBG("%s AccessPointName '%s'", modem->path, apn); + } else if (g_str_equal(key, "Protocol") && + dbus_message_iter_get_arg_type(&value) == DBUS_TYPE_STRING ) { + + dbus_message_iter_get_basic(&value, &ip_protocol); + + DBG("%s Protocol %s", modem->path, ip_protocol); } + dbus_message_iter_next(dict); } @@ -1132,6 +1199,9 @@ static int add_cm_context(struct modem_data *modem, const char *context_path, return -EINVAL; } + if (ip_protocol) + set_context_ipconfig(context, ip_protocol); + modem->context = context; modem->active = active; @@ -1246,6 +1316,14 @@ static gboolean context_changed(DBusConnection *conn, remove_network(modem); } + + } else if (g_str_equal(key, "Protocol") && + dbus_message_iter_get_arg_type(&value) == DBUS_TYPE_STRING ) { + const char *ip_protocol; + + dbus_message_iter_get_basic(&value, &ip_protocol); + + set_context_ipconfig(modem->context, ip_protocol); } return TRUE; |