]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-dhcp-server: store lifetime and friends in usec_t 29092/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 4 Sep 2023 14:40:14 +0000 (23:40 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 19 Sep 2023 20:04:03 +0000 (05:04 +0900)
src/libsystemd-network/dhcp-server-internal.h
src/libsystemd-network/sd-dhcp-server.c
src/network/networkd-dhcp-server.c
src/systemd/sd-dhcp-server.h

index 16b92545685a3fd55c82c048bff49df9270e0565..a2dae1cd4a8f1b722770a76a5eb7a3d78ac9883d 100644 (file)
@@ -81,7 +81,8 @@ struct sd_dhcp_server {
         Hashmap *static_leases_by_client_id;
         Hashmap *static_leases_by_address;
 
-        uint32_t max_lease_time, default_lease_time;
+        usec_t max_lease_time;
+        usec_t default_lease_time;
 
         sd_dhcp_server_callback_t callback;
         void *callback_userdata;
@@ -101,7 +102,7 @@ typedef struct DHCPRequest {
         size_t max_optlen;
         be32_t server_id;
         be32_t requested_ip;
-        uint32_t lifetime;
+        usec_t lifetime;
         const uint8_t *agent_info_option;
         char *hostname;
 } DHCPRequest;
index a9bb7657d1a277a8793b150fdfb11514eb34e1d1..a917406ceca984b417719f09ffa1fcdbf6ac2e39 100644 (file)
@@ -206,8 +206,8 @@ int sd_dhcp_server_new(sd_dhcp_server **ret, int ifindex) {
                 .netmask = htobe32(INADDR_ANY),
                 .ifindex = ifindex,
                 .bind_to_interface = true,
-                .default_lease_time = DIV_ROUND_UP(DHCP_DEFAULT_LEASE_TIME_USEC, USEC_PER_SEC),
-                .max_lease_time = DIV_ROUND_UP(DHCP_MAX_LEASE_TIME_USEC, USEC_PER_SEC),
+                .default_lease_time = DHCP_DEFAULT_LEASE_TIME_USEC,
+                .max_lease_time = DHCP_MAX_LEASE_TIME_USEC,
         };
 
         *ret = TAKE_PTR(server);
@@ -589,7 +589,7 @@ static int server_send_offer_or_ack(
         packet->dhcp.yiaddr = address;
         packet->dhcp.siaddr = server->boot_server_address.s_addr;
 
-        lease_time = htobe32(req->lifetime);
+        lease_time = usec_to_be32_sec(req->lifetime);
         r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
                                SD_DHCP_OPTION_IP_ADDRESS_LEASE_TIME, 4,
                                &lease_time);
@@ -735,7 +735,7 @@ static int parse_request(uint8_t code, uint8_t len, const void *option, void *us
         switch (code) {
         case SD_DHCP_OPTION_IP_ADDRESS_LEASE_TIME:
                 if (len == 4)
-                        req->lifetime = unaligned_read_be32(option);
+                        req->lifetime = unaligned_be32_sec_to_usec(option, /* max_as_infinity = */ true);
 
                 break;
         case SD_DHCP_OPTION_REQUESTED_IP_ADDRESS:
@@ -844,7 +844,7 @@ static int ensure_sane_request(sd_dhcp_server *server, DHCPRequest *req, DHCPMes
                 req->max_optlen = DHCP_MIN_OPTIONS_SIZE;
 
         if (req->lifetime <= 0)
-                req->lifetime = MAX(1ULL, server->default_lease_time);
+                req->lifetime = MAX(USEC_PER_SEC, server->default_lease_time);
 
         if (server->max_lease_time > 0 && req->lifetime > server->max_lease_time)
                 req->lifetime = server->max_lease_time;
@@ -997,7 +997,7 @@ static int server_ack_request(sd_dhcp_server *server, DHCPRequest *req, DHCPLeas
         if (r < 0)
                 return r;
 
-        expiration = usec_add(req->lifetime * USEC_PER_SEC, time_now);
+        expiration = usec_add(req->lifetime, time_now);
 
         if (existing_lease) {
                 assert(existing_lease->server);
@@ -1487,24 +1487,18 @@ int sd_dhcp_server_set_timezone(sd_dhcp_server *server, const char *tz) {
         return 1;
 }
 
-int sd_dhcp_server_set_max_lease_time(sd_dhcp_server *server, uint32_t t) {
+int sd_dhcp_server_set_max_lease_time(sd_dhcp_server *server, uint64_t t) {
         assert_return(server, -EINVAL);
 
-        if (t == server->max_lease_time)
-                return 0;
-
         server->max_lease_time = t;
-        return 1;
+        return 0;
 }
 
-int sd_dhcp_server_set_default_lease_time(sd_dhcp_server *server, uint32_t t) {
+int sd_dhcp_server_set_default_lease_time(sd_dhcp_server *server, uint64_t t) {
         assert_return(server, -EINVAL);
 
-        if (t == server->default_lease_time)
-                return 0;
-
         server->default_lease_time = t;
-        return 1;
+        return 0;
 }
 
 int sd_dhcp_server_set_servers(
index 0857311d5eaa7375806ac57a190bfa5af0b2b457..dacbb7e129b60549c184f204edca2a9b223fe422 100644 (file)
@@ -391,15 +391,13 @@ static int dhcp4_server_configure(Link *link) {
                 return log_link_error_errno(link, r, "Failed to configure address pool for DHCPv4 server instance: %m");
 
         if (link->network->dhcp_server_max_lease_time_usec > 0) {
-                r = sd_dhcp_server_set_max_lease_time(link->dhcp_server,
-                                                      DIV_ROUND_UP(link->network->dhcp_server_max_lease_time_usec, USEC_PER_SEC));
+                r = sd_dhcp_server_set_max_lease_time(link->dhcp_server, link->network->dhcp_server_max_lease_time_usec);
                 if (r < 0)
                         return log_link_error_errno(link, r, "Failed to set maximum lease time for DHCPv4 server instance: %m");
         }
 
         if (link->network->dhcp_server_default_lease_time_usec > 0) {
-                r = sd_dhcp_server_set_default_lease_time(link->dhcp_server,
-                                                          DIV_ROUND_UP(link->network->dhcp_server_default_lease_time_usec, USEC_PER_SEC));
+                r = sd_dhcp_server_set_default_lease_time(link->dhcp_server, link->network->dhcp_server_default_lease_time_usec);
                 if (r < 0)
                         return log_link_error_errno(link, r, "Failed to set default lease time for DHCPv4 server instance: %m");
         }
index e361c62a9cb9271fe3b1c86b3eead9900bd876f1..64d95258fd6cb0091f27bde9f0783376c7f11547 100644 (file)
@@ -82,8 +82,8 @@ int sd_dhcp_server_add_option(sd_dhcp_server *server, sd_dhcp_option *v);
 int sd_dhcp_server_add_vendor_option(sd_dhcp_server *server, sd_dhcp_option *v);
 int sd_dhcp_server_set_static_lease(sd_dhcp_server *server, const struct in_addr *address, uint8_t *client_id, size_t client_id_size);
 
-int sd_dhcp_server_set_max_lease_time(sd_dhcp_server *server, uint32_t t);
-int sd_dhcp_server_set_default_lease_time(sd_dhcp_server *server, uint32_t t);
+int sd_dhcp_server_set_max_lease_time(sd_dhcp_server *server, uint64_t t);
+int sd_dhcp_server_set_default_lease_time(sd_dhcp_server *server, uint64_t t);
 
 int sd_dhcp_server_forcerenew(sd_dhcp_server *server);