From 5f5b3609c4f9884954623d7e6bf2ae1ae7096637 Mon Sep 17 00:00:00 2001 From: Jukka Rissanen Date: Thu, 5 Jan 2012 13:38:13 +0200 Subject: dhcpv6: Handle address expiration by restarting the stack. --- src/network.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) (limited to 'src/network.c') 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); } -- cgit v1.2.3