diff options
Diffstat (limited to 'plugins/ofono.c')
-rwxr-xr-x[-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..100755 --- 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; |