From: Jarko Poutiainen <jarko.poutiai...@oss.tieto.com>

-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 <jarko.poutiai...@oss.tieto.com> and
Pasi Sjöholm <pasi.sjoh...@jollamobile.com>
---
 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
connman@connman.net
https://lists.connman.net/mailman/listinfo/connman

Reply via email to