summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsbyx <steven@midlink.org>2014-02-06 08:05:45 +0100
committersbyx <steven@midlink.org>2014-02-06 08:05:45 +0100
commite5f128cc5b6137586a5868d4b861ce8bec7dd04d (patch)
tree30142aabccf6c5a22c34e30dd29f9042bd801945
parentdb2915f095db17cb10bf67d5b3bf67f891d45625 (diff)
parent073aa00c81dd2fe99645d2259d6126baf568d3a4 (diff)
downloadodhcp6c-e5f128cc5b6137586a5868d4b861ce8bec7dd04d.tar.gz
Merge pull request #15 from dedeckeh/bugfixes
Bugfixes
-rw-r--r--src/dhcpv6.c27
-rw-r--r--src/odhcp6c.c6
2 files changed, 20 insertions, 13 deletions
diff --git a/src/dhcpv6.c b/src/dhcpv6.c
index f18a3e9..4b1ba95 100644
--- a/src/dhcpv6.c
+++ b/src/dhcpv6.c
@@ -474,9 +474,9 @@ int dhcpv6_request(enum dhcpv6_msg type)
if (type == DHCPV6_MSG_UNKNOWN)
timeout = t1;
else if (type == DHCPV6_MSG_RENEW)
- timeout = (t2 > t1) ? t2 - t1 : 0;
+ timeout = (t2 > t1) ? t2 - t1 : ((t1 == UINT32_MAX) ? UINT32_MAX : 0);
else if (type == DHCPV6_MSG_REBIND)
- timeout = (t3 > t2) ? t3 - t2 : 0;
+ timeout = (t3 > t2) ? t3 - t2 : ((t2 == UINT32_MAX) ? UINT32_MAX : 0);
if (timeout == 0)
return -1;
@@ -514,8 +514,8 @@ int dhcpv6_request(enum dhcpv6_msg type)
uint64_t round_end = round_start + rto;
elapsed = round_start - start;
- // Don't wait too long
- if (round_end - start > timeout * 1000)
+ // Don't wait too long if timeout differs from infinite
+ if ((timeout != UINT32_MAX) && (round_end - start > timeout * 1000))
round_end = timeout * 1000 + start;
// Built and send package
@@ -542,9 +542,9 @@ int dhcpv6_request(enum dhcpv6_msg type)
// Set timeout for receiving
uint64_t t = round_end - round_start;
- struct timeval timeout = {t / 1000, (t % 1000) * 1000};
+ struct timeval tv = {t / 1000, (t % 1000) * 1000};
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,
- &timeout, sizeof(timeout));
+ &tv, sizeof(tv));
// Receive cycle
len = recvmsg(sock, &msg, 0);
@@ -589,8 +589,8 @@ int dhcpv6_request(enum dhcpv6_msg type)
// Allow
if (retx->handler_finish)
len = retx->handler_finish();
- } while (len < 0 && ((elapsed / 1000 < timeout) && (!retx->max_rc || rc < retx->max_rc)));
-
+ } while (len < 0 && ((timeout == UINT32_MAX) || (elapsed / 1000 < timeout)) &&
+ (!retx->max_rc || rc < retx->max_rc));
return len;
}
@@ -861,9 +861,14 @@ static int dhcpv6_handle_reply(enum dhcpv6_msg orig, _unused const int rc,
uint32_t elapsed = (last_update > 0) ? now - last_update : 0;
last_update = now;
- t1 -= elapsed;
- t2 -= elapsed;
- t3 -= elapsed;
+ if (t1 != UINT32_MAX)
+ t1 -= elapsed;
+
+ if (t2 != UINT32_MAX)
+ t2 -= elapsed;
+
+ if (t3 != UINT32_MAX)
+ t3 -= elapsed;
if (t1 < 0)
t1 = 0;
diff --git a/src/odhcp6c.c b/src/odhcp6c.c
index dbe2bdf..868e1c6 100644
--- a/src/odhcp6c.c
+++ b/src/odhcp6c.c
@@ -446,7 +446,7 @@ static int usage(void)
" -a Don't send Accept Reconfigure option\n"
" -f Don't send Client FQDN option\n"
" -k Don't send a RELEASE when stopping\n"
- " -t <seconds> Maximum timeout for DHCPv6-SOLICIT (120)\n"
+ " -t <seconds> Maximum timeout for DHCPv6-SOLICIT (3600)\n"
"\nInvocation options:\n"
" -p <pidfile> Set pidfile (/var/run/odhcp6c.pid)\n"
" -d Daemonize\n"
@@ -592,8 +592,10 @@ bool odhcp6c_update_entry_safe(enum odhcp6c_state state, struct odhcp6c_entry *n
if (new->valid > 0) {
if (x) {
- if (new->valid >= x->valid && new->valid - x->valid < 60 &&
+ if (new->valid >= x->valid && new->valid != UINT32_MAX &&
+ new->valid - x->valid < 60 &&
new->preferred >= x->preferred &&
+ new->preferred != UINT32_MAX &&
new->preferred - x->preferred < 60 &&
x->class == new->class)
return false;