From: Pasi Sjöholm <pasi.sjoh...@jollamobile.com>

It is possible that IPv6.Settings-properties does not include
ip-address, gateway or nameservers when the context is made active.
This is due underlying ofono-driver/ril sending the assigned ipv4-addresses
first and then the assigned ipv6-addresses (within 3 secs).

This happens especially only with dual/ipv4v6-protocol. To be able
to reconfigure the addresses later we set the method either AUTO
or DHCP.
---
 plugins/ofono.c | 58 +++++++++++++++++++++++++++++++--------------------------
 1 file changed, 32 insertions(+), 26 deletions(-)

diff --git a/plugins/ofono.c b/plugins/ofono.c
index 8821f1e..16d3b41 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -257,7 +257,6 @@ static void network_context_free(struct network_context 
*context)
 static void set_connected(struct modem_data *modem)
 {
        struct connman_service *service;
-       bool setip = false;
        enum connman_ipconfig_method method;
        char *nameservers;
        int index;
@@ -266,10 +265,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 +274,36 @@ static void set_connected(struct modem_data *modem)
        if (!service)
                return;
 
-       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;
-       }
-
+       method = modem->context->ipv4_method;
        if (method == CONNMAN_IPCONFIG_METHOD_FIXED) {
-               connman_network_set_ipaddress(modem->network,
+               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);
+               } else {
+                       connman_error("Invalid ipv4-address");
+                       return;
+               }
+       } else {
+               connman_service_create_ip4config(service, index);
+               connman_network_set_ipv4_method(modem->network, 
CONNMAN_IPCONFIG_METHOD_DHCP);
        }
 
        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,
+               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_AUTO);
        }
 
        /* Set the nameservers */
@@ -317,8 +322,9 @@ static void set_connected(struct modem_data *modem)
                                        modem->context->ipv6_nameservers);
        }
 
-       if (setip)
-               connman_network_set_connected(modem->network, true);
+       connman_network_set_index(modem->network, index);
+       connman_network_set_connected(modem->network, true);
+
 }
 
 static void set_disconnected(struct modem_data *modem)
@@ -921,16 +927,16 @@ static void extract_ipv6_settings(DBusMessageIter *array,
        if (index < 0)
                goto out;
 
-       context->ipv6_method = CONNMAN_IPCONFIG_METHOD_FIXED;
-
        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);
+       if (!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;
-- 
2.1.0

_______________________________________________
connman mailing list
connman@connman.net
https://lists.connman.net/mailman/listinfo/connman

Reply via email to