X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=src%2Fdhcpv6.c;h=64c0cb44e90107b184590d6d265e03286c09c8c6;hb=007ae1a6ae8092878adccde1f610ea9dd86e5aad;hp=cfa5a407f1408f2d6d03a452121fac9e16ee66c3;hpb=98045e630ab1c728e48a6cb8bcacbcd7e09dd085;p=odhcp6c.git diff --git a/src/dhcpv6.c b/src/dhcpv6.c index cfa5a40..64c0cb4 100644 --- a/src/dhcpv6.c +++ b/src/dhcpv6.c @@ -350,14 +350,14 @@ static int64_t dhcpv6_rand_delay(int64_t time) { int random; odhcp6c_random(&random, sizeof(random)); - return (time * (random % 1000)) / 10000; + return (time * ((int64_t)random % 1000LL)) / 10000LL; } int dhcpv6_request(enum dhcpv6_msg type) { uint8_t buf[1536]; - uint32_t timeout = UINT32_MAX; + uint64_t timeout = UINT32_MAX; struct dhcpv6_retx *retx = &dhcpv6_retx[type]; if (retx->delay) { @@ -371,14 +371,14 @@ int dhcpv6_request(enum dhcpv6_msg type) else if (type == DHCPV6_MSG_UNKNOWN) timeout = t1; else if (type == DHCPV6_MSG_RENEW) - timeout = t2 - t1; + timeout = (t2 > t1) ? t2 - t1 : 0; else if (type == DHCPV6_MSG_REBIND) - timeout = t3 - t2; + timeout = (t3 > t2) ? t3 - t2 : 0; if (timeout == 0) return -1; - syslog(LOG_NOTICE, "Sending %s (timeout %us)", retx->name, timeout); + syslog(LOG_NOTICE, "Sending %s (timeout %us)", retx->name, (unsigned)timeout); uint64_t start = odhcp6c_get_milli_time(), round_start = start, elapsed; @@ -726,29 +726,23 @@ static int dhcpv6_handle_reply(enum dhcpv6_msg orig, if (error) continue; - // Update times - if (l_t1 > 0 && t1 > l_t1) - t1 = l_t1; - - if (l_t2 > 0 && t2 > l_t2) - t2 = l_t2; - uint32_t n = dhcpv6_parse_ia(&ia_hdr[1], odata + olen); - if (n < t1) - t1 = n; + if (!l_t1) + l_t1 = 300; - if (n < t2) - t2 = n; + if (!l_t2) + l_t2 = 600; if (n < t3) t3 = n; - if (t2 >= t3) - t2 = 8 * t3 / 10; + // Update times + if (l_t1 > 0 && t1 > l_t1) + t1 = l_t1; - if (t1 >= t2) - t1 = 5 * t2 / 8; + if (l_t2 > 0 && t2 > l_t2) + t2 = l_t2; } else if (otype == DHCPV6_OPT_DNS_SERVERS) { if (olen % 16 == 0)