From: Jarko Poutiainen <[email protected]> -Reset ipv4/6_method to CONNMAN_IPCONFIG_METHOD_UNKNOWN when protocol is set ip/ipv6/dual on ofono.
-IPv6 configuration method is either CONNMAN_IPCONFIG_METHOD_FIXED (ipv6-pdp) or CONNMAN_IPCONFIG_METHOD_AUTO (SLAAC/DHCPv6, dual/ipv4v6-pdp). -When connection is set active, method needs to be set CONNMAN_IPCONFIG_METHOD_UNKNOWN so that no old configuration is used in case only ipv4/ipv6-configuration is set. -Nameservers need to also reset when new addresses are extracted so that they are not reused when pdp-protocol changes from ipv6 to dual/ipv4v6. Patch by Jarko Poutiainen <[email protected]> and Pasi Sjöholm <[email protected]> --- plugins/ofono.c | 114 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 77 insertions(+), 37 deletions(-) diff --git a/plugins/ofono.c b/plugins/ofono.c index 7a8442b..5422528 100644 --- a/plugins/ofono.c +++ b/plugins/ofono.c @@ -266,10 +266,8 @@ static void set_connected(struct modem_data *modem) index = modem->context->index; - method = modem->context->ipv4_method; - if (index < 0 || (!modem->context->ipv4_address && - method == CONNMAN_IPCONFIG_METHOD_FIXED)) { - connman_error("Invalid index and/or address"); + if (index < 0 ) { + connman_error("Invalid index"); return; } @@ -277,28 +275,48 @@ static void set_connected(struct modem_data *modem) if (!service) return; - if (method == CONNMAN_IPCONFIG_METHOD_FIXED || - method == CONNMAN_IPCONFIG_METHOD_DHCP) { + method = modem->context->ipv4_method; + if (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; - } - - if (method == CONNMAN_IPCONFIG_METHOD_FIXED) { - connman_network_set_ipaddress(modem->network, + } else if (method == CONNMAN_IPCONFIG_METHOD_FIXED) { + if (modem->context->ipv4_address) { + connman_service_create_ip4config(service, index); + connman_network_set_ipv4_method(modem->network, method); + connman_network_set_ipaddress(modem->network, modem->context->ipv4_address); + setip = true; + } else { + connman_error("Invalid ipv4-address"); + return; + } + } else { + connman_service_create_ip4config(service, index); + connman_network_set_ipv4_method(modem->network, CONNMAN_IPCONFIG_METHOD_UNKNOWN); } method = modem->context->ipv6_method; - if (method == CONNMAN_IPCONFIG_METHOD_FIXED) { + if (method == CONNMAN_IPCONFIG_METHOD_AUTO) { connman_service_create_ip6config(service, index); connman_network_set_ipv6_method(modem->network, method); - connman_network_set_ipaddress(modem->network, - modem->context->ipv6_address); + setip = true; + } else if (method == CONNMAN_IPCONFIG_METHOD_FIXED) { + if (modem->context->ipv6_address) { + connman_service_create_ip6config(service, index); + connman_network_set_ipv6_method(modem->network, method); + connman_network_set_ipaddress(modem->network, + modem->context->ipv6_address); + setip = true; + } else { + connman_error("Invalid ipv6-address"); + return; + } + } else { + connman_service_create_ip6config(service, index); + connman_network_set_ipv6_method(modem->network, CONNMAN_IPCONFIG_METHOD_UNKNOWN); } /* Set the nameservers */ @@ -317,8 +335,12 @@ 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); + } else { + connman_error("Invalid address"); + } } static void set_disconnected(struct modem_data *modem) @@ -757,6 +779,8 @@ static void extract_ipv4_settings(DBusMessageIter *array, connman_ipaddress_free(context->ipv4_address); context->ipv4_address = NULL; + g_free(context->ipv4_nameservers); + context->ipv4_nameservers = NULL; context->index = -1; if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_ARRAY) @@ -824,20 +848,23 @@ static void extract_ipv4_settings(DBusMessageIter *array, context->index = index; - if (context->ipv4_method != CONNMAN_IPCONFIG_METHOD_FIXED) - goto out; + if (address) { - context->ipv4_address = connman_ipaddress_alloc(CONNMAN_IPCONFIG_TYPE_IPV4); - if (!context->ipv4_address) { - context->index = -1; - goto out; - } + if (context->ipv4_method != CONNMAN_IPCONFIG_METHOD_FIXED) + goto out; + + context->ipv4_address = connman_ipaddress_alloc(CONNMAN_IPCONFIG_TYPE_IPV4); + if (!context->ipv4_address) { + context->index = -1; + goto out; + } - connman_ipaddress_set_ipv4(context->ipv4_address, address, - netmask, gateway); + connman_ipaddress_set_ipv4(context->ipv4_address, address, + netmask, gateway); - g_free(context->ipv4_nameservers); - context->ipv4_nameservers = nameservers; + g_free(context->ipv4_nameservers); + context->ipv4_nameservers = nameservers; + } out: if (context->ipv4_nameservers != nameservers) @@ -860,6 +887,8 @@ static void extract_ipv6_settings(DBusMessageIter *array, connman_ipaddress_free(context->ipv6_address); context->ipv6_address = NULL; + g_free(context->ipv6_nameservers); + context->ipv6_nameservers = NULL; context->index = -1; if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_ARRAY) @@ -913,20 +942,26 @@ static void extract_ipv6_settings(DBusMessageIter *array, if (index < 0) goto out; - context->ipv6_method = CONNMAN_IPCONFIG_METHOD_FIXED; + if (address) { - context->ipv6_address = - connman_ipaddress_alloc(CONNMAN_IPCONFIG_TYPE_IPV6); - if (!context->ipv6_address) - goto out; + context->ipv6_address = + connman_ipaddress_alloc(CONNMAN_IPCONFIG_TYPE_IPV6); + if (!context->ipv6_address) + goto out; - context->index = index; - connman_ipaddress_set_ipv6(context->ipv6_address, address, - prefix_length, gateway); + context->ipv6_method = CONNMAN_IPCONFIG_METHOD_FIXED; - g_free(context->ipv6_nameservers); - context->ipv6_nameservers = nameservers; + context->index = index; + connman_ipaddress_set_ipv6(context->ipv6_address, address, + prefix_length, gateway); + + g_free(context->ipv6_nameservers); + context->ipv6_nameservers = nameservers; + } else { + context->index = index; + context->ipv6_method = CONNMAN_IPCONFIG_METHOD_AUTO; + } out: if (context->ipv6_nameservers != nameservers) g_free(nameservers); @@ -1210,6 +1245,11 @@ static gboolean context_changed(DBusConnection *conn, DBG("%s IPv6.Settings", modem->path); extract_ipv6_settings(&value, modem->context); + } else if (g_str_equal(key, "Protocol")) { + DBG("%s Protocol", modem->path); + + modem->context->ipv4_method = CONNMAN_IPCONFIG_METHOD_UNKNOWN; + modem->context->ipv6_method = CONNMAN_IPCONFIG_METHOD_UNKNOWN; } else if (g_str_equal(key, "Active")) { dbus_bool_t active; -- 2.1.0 _______________________________________________ connman mailing list [email protected] https://lists.connman.net/mailman/listinfo/connman
