|
|
5a3797e |
diff -up dhcp-4.2.0/client/dhc6.c.retransmission dhcp-4.2.0/client/dhc6.c
|
|
|
5a3797e |
--- dhcp-4.2.0/client/dhc6.c.retransmission 2010-07-21 16:18:51.000000000 +0200
|
|
|
5a3797e |
+++ dhcp-4.2.0/client/dhc6.c 2010-07-21 16:19:52.000000000 +0200
|
|
|
5a3797e |
@@ -357,7 +357,7 @@ dhc6_retrans_init(struct client_state *c
|
|
|
ed7e418 |
static void
|
|
|
ed7e418 |
dhc6_retrans_advance(struct client_state *client)
|
|
|
ed7e418 |
{
|
|
|
ed7e418 |
- struct timeval elapsed;
|
|
|
ed7e418 |
+ struct timeval elapsed, elapsed_after_RT;
|
|
|
ed7e418 |
|
|
|
ed7e418 |
/* elapsed = cur - start */
|
|
|
ed7e418 |
elapsed.tv_sec = cur_tv.tv_sec - client->start_time.tv_sec;
|
|
|
5a3797e |
@@ -374,6 +374,8 @@ dhc6_retrans_advance(struct client_state
|
|
|
ed7e418 |
elapsed.tv_sec += 1;
|
|
|
ed7e418 |
elapsed.tv_usec -= 1000000;
|
|
|
ed7e418 |
}
|
|
|
ed7e418 |
+ elapsed_after_RT.tv_sec = elapsed.tv_sec;
|
|
|
ed7e418 |
+ elapsed_after_RT.tv_usec = elapsed.tv_usec;
|
|
|
ed7e418 |
|
|
|
ed7e418 |
/*
|
|
|
ed7e418 |
* RT for each subsequent message transmission is based on the previous
|
|
|
5a3797e |
@@ -411,13 +413,10 @@ dhc6_retrans_advance(struct client_state
|
|
|
ed7e418 |
elapsed.tv_usec -= 1000000;
|
|
|
ed7e418 |
}
|
|
|
ed7e418 |
if (elapsed.tv_sec >= client->MRD) {
|
|
|
ed7e418 |
- /*
|
|
|
ed7e418 |
- * wake at RT + cur = start + MRD
|
|
|
ed7e418 |
- */
|
|
|
ed7e418 |
- client->RT = client->MRD +
|
|
|
ed7e418 |
- (client->start_time.tv_sec - cur_tv.tv_sec);
|
|
|
ed7e418 |
- client->RT = client->RT * 100 +
|
|
|
ed7e418 |
- (client->start_time.tv_usec - cur_tv.tv_usec) / 10000;
|
|
|
ed7e418 |
+ client->RT = client->MRD - elapsed_after_RT.tv_sec;
|
|
|
ed7e418 |
+ client->RT = client->RT * 100 - elapsed_after_RT.tv_usec / 10000;
|
|
|
ed7e418 |
+ if (client->RT < 0)
|
|
|
ed7e418 |
+ client->RT = 0;
|
|
|
ed7e418 |
}
|
|
|
ed7e418 |
client->txcount++;
|
|
|
ed7e418 |
}
|
|
|
5a3797e |
@@ -1505,7 +1504,7 @@ do_init6(void *input)
|
|
|
ed7e418 |
elapsed.tv_usec += 1000000;
|
|
|
ed7e418 |
}
|
|
|
ed7e418 |
/* Check if finished (-1 argument). */
|
|
|
ed7e418 |
- if ((client->MRD != 0) && (elapsed.tv_sec > client->MRD)) {
|
|
|
ed7e418 |
+ if ((client->MRD != 0) && (elapsed.tv_sec >= client->MRD)) {
|
|
|
ed7e418 |
log_info("Max retransmission duration exceeded.");
|
|
|
ed7e418 |
client->state = S_STOPPED;
|
|
|
ed7e418 |
if (client->active_lease != NULL) {
|
|
|
5a3797e |
@@ -1925,7 +1924,7 @@ do_info_request6(void *input)
|
|
|
ed7e418 |
elapsed.tv_usec += 1000000;
|
|
|
ed7e418 |
}
|
|
|
ed7e418 |
/* Check if finished (-1 argument). */
|
|
|
ed7e418 |
- if ((client->MRD != 0) && (elapsed.tv_sec > client->MRD)) {
|
|
|
ed7e418 |
+ if ((client->MRD != 0) && (elapsed.tv_sec >= client->MRD)) {
|
|
|
ed7e418 |
log_info("Max retransmission duration exceeded.");
|
|
|
ed7e418 |
exit(2);
|
|
|
ed7e418 |
}
|
|
|
5a3797e |
@@ -2046,7 +2045,7 @@ do_confirm6(void *input)
|
|
|
ed7e418 |
elapsed.tv_sec -= 1;
|
|
|
ed7e418 |
elapsed.tv_usec += 1000000;
|
|
|
ed7e418 |
}
|
|
|
ed7e418 |
- if ((client->MRD != 0) && (elapsed.tv_sec > client->MRD)) {
|
|
|
ed7e418 |
+ if ((client->MRD != 0) && (elapsed.tv_sec >= client->MRD)) {
|
|
|
ed7e418 |
log_info("Max retransmission duration exceeded.");
|
|
|
ed7e418 |
start_bound(client);
|
|
|
ed7e418 |
return;
|
|
|
5a3797e |
@@ -3293,7 +3292,7 @@ do_select6(void *input)
|
|
|
ed7e418 |
elapsed.tv_sec -= 1;
|
|
|
ed7e418 |
elapsed.tv_usec += 1000000;
|
|
|
ed7e418 |
}
|
|
|
ed7e418 |
- if ((client->MRD != 0) && (elapsed.tv_sec > client->MRD)) {
|
|
|
ed7e418 |
+ if ((client->MRD != 0) && (elapsed.tv_sec >= client->MRD)) {
|
|
|
ed7e418 |
log_info("Max retransmission duration exceeded.");
|
|
|
ed7e418 |
abort = ISC_TRUE;
|
|
|
ed7e418 |
}
|