diff options
author | Luke T. Shumaker <lukeshu@lukeshu.com> | 2024-11-11 18:32:45 -0700 |
---|---|---|
committer | Luke T. Shumaker <lukeshu@lukeshu.com> | 2024-11-11 19:30:14 -0700 |
commit | 1e36c3801c8f31b96db51f4c22eae20bbb9c821d (patch) | |
tree | cd961e203f552c53b3a2a0abd030429ee669f60d | |
parent | 03c22d47ae495cde6a2e4d068646550f2a2ccfb9 (diff) |
Fix handling of DHCP_INFINITY
-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) { |