diff options
Diffstat (limited to 'libdhcp/dhcp_client.c')
-rw-r--r-- | libdhcp/dhcp_client.c | 26 |
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) { |