diff options
author | Jukka Rissanen <jukka.rissanen@linux.intel.com> | 2012-01-05 13:38:13 +0200 |
---|---|---|
committer | Daniel Wagner <daniel.wagner@bmw-carit.de> | 2012-01-05 13:17:26 +0100 |
commit | 5f5b3609c4f9884954623d7e6bf2ae1ae7096637 (patch) | |
tree | bd15c937959e83da53cd25a3fbbe6e923ee66cb7 /src/network.c | |
parent | 590763aee614ce046c2927e716842a52c8da6a6e (diff) | |
download | connman-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.c | 28 |
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); } |