summaryrefslogtreecommitdiff
path: root/src/network.c
diff options
context:
space:
mode:
authorJukka Rissanen <jukka.rissanen@linux.intel.com>2012-01-05 13:38:13 +0200
committerDaniel Wagner <daniel.wagner@bmw-carit.de>2012-01-05 13:17:26 +0100
commit5f5b3609c4f9884954623d7e6bf2ae1ae7096637 (patch)
treebd15c937959e83da53cd25a3fbbe6e923ee66cb7 /src/network.c
parent590763aee614ce046c2927e716842a52c8da6a6e (diff)
downloadconnman-5f5b3609c4f9884954623d7e6bf2ae1ae7096637.tar.gz
connman-5f5b3609c4f9884954623d7e6bf2ae1ae7096637.tar.bz2
connman-5f5b3609c4f9884954623d7e6bf2ae1ae7096637.zip
dhcpv6: Handle address expiration by restarting the stack.
Diffstat (limited to 'src/network.c')
-rw-r--r--src/network.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/network.c b/src/network.c
index 1790fbae..bff0e7e2 100644
--- a/src/network.c
+++ b/src/network.c
@@ -1013,6 +1013,28 @@ err:
return err;
}
+static void autoconf_ipv6_set(struct connman_network *network);
+static void dhcpv6_callback(struct connman_network *network,
+ connman_bool_t success);
+
+/*
+ * Have a separate callback for renew so that we do not do autoconf
+ * in wrong phase as the dhcpv6_callback() is also called when doing
+ * DHCPv6 solicitation.
+ */
+static void dhcpv6_renew_callback(struct connman_network *network,
+ connman_bool_t success)
+{
+ if (success == TRUE)
+ dhcpv6_callback(network, success);
+ else {
+ stop_dhcpv6(network);
+
+ /* restart and do solicit again. */
+ autoconf_ipv6_set(network);
+ }
+}
+
static void dhcpv6_callback(struct connman_network *network,
connman_bool_t success)
{
@@ -1026,9 +1048,9 @@ static void dhcpv6_callback(struct connman_network *network,
return;
}
- __connman_dhcpv6_start_renew(network, dhcpv6_callback);
-
- return;
+ if (__connman_dhcpv6_start_renew(network,
+ dhcpv6_renew_callback) == -ETIMEDOUT)
+ dhcpv6_renew_callback(network, FALSE);
} else
stop_dhcpv6(network);
}