]> git.decadent.org.uk Git - odhcp6c.git/blobdiff - src/odhcp6c.c
Stop rebinding when all IAs are lost
[odhcp6c.git] / src / odhcp6c.c
index 798598ff3965c089a332e1c5900d01b675e0a850..0a46947f4a5e2adc689b9dfd4ebc8ad412d18369 100644 (file)
@@ -391,6 +391,12 @@ int main(_unused int argc, char* const argv[])
 
                                odhcp6c_clear_state(STATE_SERVER_ID); // Remove binding
 
+                               odhcp6c_get_state(STATE_IA_PD, &ia_pd_len);
+                               odhcp6c_get_state(STATE_IA_NA, &ia_na_len);
+
+                               if (ia_pd_len == 0 && ia_na_len == 0)
+                                       break;
+
                                // If we have IAs, try rebind otherwise restart
                                res = dhcpv6_request(DHCPV6_MSG_REBIND);
                                odhcp6c_signal_process();
@@ -453,7 +459,7 @@ static int usage(void)
        "       -f              Don't send Client FQDN option\n"
        "       -k              Don't send a RELEASE when stopping\n"
        "       -t <seconds>    Maximum timeout for DHCPv6-SOLICIT (3600)\n"
-       "       -m <seconds>    Minimum time between accepting updates (60)\n"
+       "       -m <seconds>    Minimum time between accepting updates (30)\n"
        "\nInvocation options:\n"
        "       -p <pidfile>    Set pidfile (/var/run/odhcp6c.pid)\n"
        "       -d              Daemonize\n"
@@ -470,7 +476,7 @@ uint64_t odhcp6c_get_milli_time(void)
 {
        struct timespec t = {0, 0};
        syscall(SYS_clock_gettime, CLOCK_MONOTONIC, &t);
-       return t.tv_sec * 1000 + t.tv_nsec / 1000000;
+       return ((uint64_t)t.tv_sec) * 1000 + ((uint64_t)t.tv_nsec) / 1000000;
 }