summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2024-11-11 18:32:45 -0700
committerLuke T. Shumaker <lukeshu@lukeshu.com>2024-11-11 19:30:14 -0700
commit1e36c3801c8f31b96db51f4c22eae20bbb9c821d (patch)
treecd961e203f552c53b3a2a0abd030429ee669f60d
parent03c22d47ae495cde6a2e4d068646550f2a2ccfb9 (diff)
Fix handling of DHCP_INFINITY
-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) {