summaryrefslogtreecommitdiff
path: root/libdhcp/dhcp_client.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdhcp/dhcp_client.c')
-rw-r--r--libdhcp/dhcp_client.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/libdhcp/dhcp_client.c b/libdhcp/dhcp_client.c
index d4c849c..4e2aaaf 100644
--- a/libdhcp/dhcp_client.c
+++ b/libdhcp/dhcp_client.c
@@ -633,18 +633,22 @@ static void dhcp_client_take_lease(struct dhcp_client *client, struct dhcp_recv_
client->lease_server_id =
*((struct net_ip4_addr *)msg->options[DHCP_OPT_DHCP_SERVER_ID].dat);
- uint64_t duration_of_lease_ns =
+ uint64_t dur_ns_end =
((uint64_t)uint32be_decode(msg->options[DHCP_OPT_ADDRESS_TIME].dat))*NS_PER_S;
- uint64_t t1_ns = msg->options[DHCP_OPT_RENEWAL_TIME].len
- ? uint32be_decode(msg->options[DHCP_OPT_RENEWAL_TIME].dat)*NS_PER_S
- : duration_of_lease_ns/2;
- uint64_t t2_ns = msg->options[DHCP_OPT_REBINDING_TIME].len
- ? uint32be_decode(msg->options[DHCP_OPT_RENEWAL_TIME].dat)*NS_PER_S
- : (duration_of_lease_ns*7)/8; /* 0.875 = 7/8 */
-
- client->lease_time_ns_t1 = client->time_ns_init + t1_ns;
- client->lease_time_ns_t2 = client->time_ns_init + t2_ns;
- client->lease_time_ns_end = client->time_ns_init + duration_of_lease_ns;
+ uint64_t dur_ns_t1 = msg->options[DHCP_OPT_RENEWAL_TIME].len
+ ? ((uint64_t)uint32be_decode(msg->options[DHCP_OPT_RENEWAL_TIME].dat))*NS_PER_S
+ : (dur_ns_end == DHCP_INFINITY * NS_PER_S)
+ ? DHCP_INFINITY * NS_PER_S
+ : dur_ns_end/2;
+ uint64_t dur_ns_t2 = msg->options[DHCP_OPT_REBINDING_TIME].len
+ ? ((uint64_t)uint32be_decode(msg->options[DHCP_OPT_RENEWAL_TIME].dat))*NS_PER_S
+ : (dur_ns_end == DHCP_INFINITY * NS_PER_S)
+ ? DHCP_INFINITY * NS_PER_S
+ : (dur_ns_end*7)/8; /* 0.875 = 7/8 */
+
+ client->lease_time_ns_t1 = (dur_ns_t1 == DHCP_INFINITY * NS_PER_S) ? 0 : client->time_ns_init + dur_ns_t1;
+ client->lease_time_ns_t2 = (dur_ns_t2 == DHCP_INFINITY * NS_PER_S) ? 0 : client->time_ns_init + dur_ns_t2;
+ client->lease_time_ns_end = (dur_ns_end == DHCP_INFINITY * NS_PER_S) ? 0 : client->time_ns_init + dur_ns_end;
}
static __attribute__((noreturn)) void dhcp_client_run(struct dhcp_client *client) {