]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-dhcp-client: store lifetime and friends in usec_t
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 4 Sep 2023 14:16:35 +0000 (23:16 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 5 Sep 2023 17:02:21 +0000 (02:02 +0900)
src/libsystemd-network/dhcp-lease-internal.h
src/libsystemd-network/sd-dhcp-client.c
src/libsystemd-network/sd-dhcp-lease.c
src/network/networkd-dhcp-prefix-delegation.c
src/network/networkd-dhcp4.c
src/network/networkd-json.c
src/network/networkd-network.h
src/systemd/sd-dhcp-client.h
src/systemd/sd-dhcp-lease.h

index 6503e3ce2d23d7ca89d40b1f7a1a6b89010500de..4f0e96fc232fe3cc2a7b44bcb9abf6d898a4d4ff 100644 (file)
@@ -29,9 +29,9 @@ struct sd_dhcp_lease {
         unsigned n_ref;
 
         /* each 0 if unset */
-        uint32_t t1;
-        uint32_t t2;
-        uint32_t lifetime;
+        usec_t t1;
+        usec_t t2;
+        usec_t lifetime;
 
         /* each 0 if unset */
         be32_t address;
index 9ec7a2256e5497a1833a7c336e9a4d69e828e9ea..b7de3e843a7f285ef7603a6389c9f93f84f7d87a 100644 (file)
@@ -102,7 +102,7 @@ struct sd_dhcp_client {
         char *mudurl;
         char **user_class;
         uint32_t mtu;
-        uint32_t fallback_lease_lifetime;
+        usec_t fallback_lease_lifetime;
         uint32_t xid;
         usec_t start_time;
         usec_t t1_time;
@@ -747,11 +747,12 @@ int sd_dhcp_client_set_socket_priority(sd_dhcp_client *client, int socket_priori
         return 0;
 }
 
-int sd_dhcp_client_set_fallback_lease_lifetime(sd_dhcp_client *client, uint32_t fallback_lease_lifetime) {
+int sd_dhcp_client_set_fallback_lease_lifetime(sd_dhcp_client *client, uint64_t fallback_lease_lifetime) {
         assert_return(client, -EINVAL);
         assert_return(!sd_dhcp_client_is_running(client), -EBUSY);
         assert_return(fallback_lease_lifetime > 0, -EINVAL);
 
+        assert_cc(sizeof(usec_t) == sizeof(uint64_t));
         client->fallback_lease_lifetime = fallback_lease_lifetime;
 
         return 0;
@@ -1290,8 +1291,7 @@ static int client_timeout_resend(
 
         sd_dhcp_client *client = ASSERT_PTR(userdata);
         DHCP_CLIENT_DONT_DESTROY(client);
-        usec_t next_timeout;
-        uint64_t time_now;
+        usec_t time_now, next_timeout;
         int r;
 
         assert(s);
@@ -1439,7 +1439,7 @@ error:
 }
 
 static int client_initialize_time_events(sd_dhcp_client *client) {
-        uint64_t usec = 0;
+        usec_t usec = 0;
         int r;
 
         assert(client);
@@ -1447,7 +1447,7 @@ static int client_initialize_time_events(sd_dhcp_client *client) {
 
         if (client->start_delay > 0) {
                 assert_se(sd_event_now(client->event, CLOCK_BOOTTIME, &usec) >= 0);
-                usec += client->start_delay;
+                usec = usec_add(usec, client->start_delay);
         }
 
         r = event_reset_time(client->event, &client->timeout_resend,
@@ -1725,10 +1725,10 @@ static int client_set_lease_timeouts(sd_dhcp_client *client) {
         assert(client);
         assert(client->event);
         assert(client->lease);
-        assert(client->lease->lifetime);
+        assert(client->lease->lifetime > 0);
 
         /* don't set timers for infinite leases */
-        if (client->lease->lifetime == 0xffffffff) {
+        if (client->lease->lifetime == USEC_INFINITY) {
                 (void) event_source_disable(client->timeout_t1);
                 (void) event_source_disable(client->timeout_t2);
                 (void) event_source_disable(client->timeout_expire);
@@ -1748,14 +1748,18 @@ static int client_set_lease_timeouts(sd_dhcp_client *client) {
         if (client->lease->t1 == 0 || client->lease->t1 >= client->lease->t2)
                 client->lease->t1 = T1_DEFAULT(client->lease->lifetime);
         /* now, if t1 >= t2, t1 *must* be T1_DEFAULT, since the previous check
-         * could not evalate to false if t1 >= t2; so setting t2 to T2_DEFAULT
+         * could not evaluate to false if t1 >= t2; so setting t2 to T2_DEFAULT
          * guarantees t1 < t2. */
         if (client->lease->t1 >= client->lease->t2)
                 client->lease->t2 = T2_DEFAULT(client->lease->lifetime);
 
-        client->expire_time = client->request_sent + client->lease->lifetime * USEC_PER_SEC;
-        client->t1_time = client->request_sent + client->lease->t1 * USEC_PER_SEC;
-        client->t2_time = client->request_sent + client->lease->t2 * USEC_PER_SEC;
+        assert(client->lease->t1 > 0);
+        assert(client->lease->t1 < client->lease->t2);
+        assert(client->lease->t2 < client->lease->lifetime);
+
+        client->expire_time = usec_add(client->request_sent, client->lease->lifetime);
+        client->t1_time = usec_add(client->request_sent, client->lease->t1);
+        client->t2_time = usec_add(client->request_sent, client->lease->t2);
 
         /* RFC2131 section 4.4.5:
          * Times T1 and T2 SHOULD be chosen with some random "fuzz".
index d09908b5a2e6a3edab68d812558ee1ae3b5feacd..229d5656d9cf6c2a81952419fac06c976fa5eb15 100644 (file)
@@ -54,36 +54,36 @@ int sd_dhcp_lease_get_broadcast(sd_dhcp_lease *lease, struct in_addr *addr) {
         return 0;
 }
 
-int sd_dhcp_lease_get_lifetime(sd_dhcp_lease *lease, uint32_t *lifetime) {
+int sd_dhcp_lease_get_lifetime(sd_dhcp_lease *lease, uint64_t *ret) {
         assert_return(lease, -EINVAL);
-        assert_return(lifetime, -EINVAL);
+        assert_return(ret, -EINVAL);
 
         if (lease->lifetime <= 0)
                 return -ENODATA;
 
-        *lifetime = lease->lifetime;
+        *ret = lease->lifetime;
         return 0;
 }
 
-int sd_dhcp_lease_get_t1(sd_dhcp_lease *lease, uint32_t *t1) {
+int sd_dhcp_lease_get_t1(sd_dhcp_lease *lease, uint64_t *ret) {
         assert_return(lease, -EINVAL);
-        assert_return(t1, -EINVAL);
+        assert_return(ret, -EINVAL);
 
         if (lease->t1 <= 0)
                 return -ENODATA;
 
-        *t1 = lease->t1;
+        *ret = lease->t1;
         return 0;
 }
 
-int sd_dhcp_lease_get_t2(sd_dhcp_lease *lease, uint32_t *t2) {
+int sd_dhcp_lease_get_t2(sd_dhcp_lease *lease, uint64_t *ret) {
         assert_return(lease, -EINVAL);
-        assert_return(t2, -EINVAL);
+        assert_return(ret, -EINVAL);
 
         if (lease->t2 <= 0)
                 return -ENODATA;
 
-        *t2 = lease->t2;
+        *ret = lease->t2;
         return 0;
 }
 
@@ -389,6 +389,25 @@ static int lease_parse_u32(const uint8_t *option, size_t len, uint32_t *ret, uin
         return 0;
 }
 
+static int lease_parse_u32_seconds(const uint8_t *option, size_t len, usec_t *ret) {
+        uint32_t val;
+        int r;
+
+        assert(option);
+        assert(ret);
+
+        r = lease_parse_u32(option, len, &val, 1);
+        if (r < 0)
+                return r;
+
+        if (val == UINT32_MAX)
+                *ret = USEC_INFINITY;
+        else
+                *ret = val * USEC_PER_SEC;
+
+        return 0;
+}
+
 static int lease_parse_u16(const uint8_t *option, size_t len, uint16_t *ret, uint16_t min) {
         assert(option);
         assert(ret);
@@ -658,7 +677,7 @@ int dhcp_lease_parse_options(uint8_t code, uint8_t len, const void *option, void
         switch (code) {
 
         case SD_DHCP_OPTION_IP_ADDRESS_LEASE_TIME:
-                r = lease_parse_u32(option, len, &lease->lifetime, 1);
+                r = lease_parse_u32_seconds(option, len, &lease->lifetime);
                 if (r < 0)
                         log_debug_errno(r, "Failed to parse lease time, ignoring: %m");
 
@@ -783,13 +802,13 @@ int dhcp_lease_parse_options(uint8_t code, uint8_t len, const void *option, void
                 break;
 
         case SD_DHCP_OPTION_RENEWAL_TIME:
-                r = lease_parse_u32(option, len, &lease->t1, 1);
+                r = lease_parse_u32_seconds(option, len, &lease->t1);
                 if (r < 0)
                         log_debug_errno(r, "Failed to parse T1 time, ignoring: %m");
                 break;
 
         case SD_DHCP_OPTION_REBINDING_TIME:
-                r = lease_parse_u32(option, len, &lease->t2, 1);
+                r = lease_parse_u32_seconds(option, len, &lease->t2);
                 if (r < 0)
                         log_debug_errno(r, "Failed to parse T2 time, ignoring: %m");
                 break;
@@ -1002,7 +1021,7 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
         uint16_t mtu;
         _cleanup_free_ sd_dhcp_route **routes = NULL;
         char **search_domains;
-        uint32_t t1, t2, lifetime;
+        usec_t t;
         int r;
 
         assert(lease);
@@ -1048,17 +1067,17 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
         if (r >= 0)
                 fprintf(f, "MTU=%" PRIu16 "\n", mtu);
 
-        r = sd_dhcp_lease_get_t1(lease, &t1);
+        r = sd_dhcp_lease_get_t1(lease, &t);
         if (r >= 0)
-                fprintf(f, "T1=%" PRIu32 "\n", t1);
+                fprintf(f, "T1=%s\n", FORMAT_TIMESPAN(t, USEC_PER_SEC));
 
-        r = sd_dhcp_lease_get_t2(lease, &t2);
+        r = sd_dhcp_lease_get_t2(lease, &t);
         if (r >= 0)
-                fprintf(f, "T2=%" PRIu32 "\n", t2);
+                fprintf(f, "T2=%s\n", FORMAT_TIMESPAN(t, USEC_PER_SEC));
 
-        r = sd_dhcp_lease_get_lifetime(lease, &lifetime);
+        r = sd_dhcp_lease_get_lifetime(lease, &t);
         if (r >= 0)
-                fprintf(f, "LIFETIME=%" PRIu32 "\n", lifetime);
+                fprintf(f, "LIFETIME=%s\n", FORMAT_TIMESPAN(t, USEC_PER_SEC));
 
         r = sd_dhcp_lease_get_dns(lease, &addresses);
         if (r > 0) {
@@ -1390,19 +1409,19 @@ int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
         }
 
         if (lifetime) {
-                r = safe_atou32(lifetime, &lease->lifetime);
+                r = parse_sec(lifetime, &lease->lifetime);
                 if (r < 0)
                         log_debug_errno(r, "Failed to parse lifetime %s, ignoring: %m", lifetime);
         }
 
         if (t1) {
-                r = safe_atou32(t1, &lease->t1);
+                r = parse_sec(t1, &lease->t1);
                 if (r < 0)
                         log_debug_errno(r, "Failed to parse T1 %s, ignoring: %m", t1);
         }
 
         if (t2) {
-                r = safe_atou32(t2, &lease->t2);
+                r = parse_sec(t2, &lease->t2);
                 if (r < 0)
                         log_debug_errno(r, "Failed to parse T2 %s, ignoring: %m", t2);
         }
index 169f1b3b5ebe1ad1e1ca759bcf4d723432175435..964aae1fd8b6028a13ae7a0f331832e278772b85 100644 (file)
@@ -855,7 +855,6 @@ static int dhcp4_pd_assign_subnet_prefix(Link *link, Link *uplink) {
         struct in6_addr sixrd_prefix, pd_prefix;
         const struct in_addr *br_addresses;
         struct in_addr ipv4address;
-        uint32_t lifetime_sec;
         usec_t lifetime_usec, now_usec;
         int r;
 
@@ -868,12 +867,12 @@ static int dhcp4_pd_assign_subnet_prefix(Link *link, Link *uplink) {
         if (r < 0)
                 return log_link_warning_errno(uplink, r, "Failed to get DHCPv4 address: %m");
 
-        r = sd_dhcp_lease_get_lifetime(uplink->dhcp_lease, &lifetime_sec);
+        r = sd_dhcp_lease_get_lifetime(uplink->dhcp_lease, &lifetime_usec);
         if (r < 0)
                 return log_link_warning_errno(uplink, r, "Failed to get lifetime of DHCPv4 lease: %m");
 
         assert_se(sd_event_now(uplink->manager->event, CLOCK_BOOTTIME, &now_usec) >= 0);
-        lifetime_usec = sec_to_usec(lifetime_sec, now_usec);
+        lifetime_usec = usec_add(lifetime_usec, now_usec);
 
         r = sd_dhcp_lease_get_6rd(uplink->dhcp_lease, &ipv4masklen, &sixrd_prefixlen, &sixrd_prefix, &br_addresses, NULL);
         if (r < 0)
@@ -929,7 +928,6 @@ int dhcp4_pd_prefix_acquired(Link *uplink) {
         struct in_addr ipv4address;
         union in_addr_union server_address;
         const struct in_addr *br_addresses;
-        uint32_t lifetime_sec;
         usec_t lifetime_usec, now_usec;
         Link *link;
         int r;
@@ -942,12 +940,12 @@ int dhcp4_pd_prefix_acquired(Link *uplink) {
         if (r < 0)
                 return log_link_warning_errno(uplink, r, "Failed to get DHCPv4 address: %m");
 
-        r = sd_dhcp_lease_get_lifetime(uplink->dhcp_lease, &lifetime_sec);
+        r = sd_dhcp_lease_get_lifetime(uplink->dhcp_lease, &lifetime_usec);
         if (r < 0)
                 return log_link_warning_errno(uplink, r, "Failed to get lifetime of DHCPv4 lease: %m");
 
         assert_se(sd_event_now(uplink->manager->event, CLOCK_BOOTTIME, &now_usec) >= 0);
-        lifetime_usec = sec_to_usec(lifetime_sec, now_usec);
+        lifetime_usec = usec_add(lifetime_usec, now_usec);
 
         r = sd_dhcp_lease_get_server_identifier(uplink->dhcp_lease, &server_address.in);
         if (r < 0)
index f952d6dfbcc2f555a61183151e7764d749fc49a4..dbd1001068128f509ac0af8043807069dbbb92b1 100644 (file)
@@ -910,15 +910,14 @@ static int dhcp4_request_address(Link *link, bool announce) {
                 return log_link_debug_errno(link, r, "DHCP error: failed to get DHCP server IP address: %m");
 
         if (!FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DHCP)) {
-                uint32_t lifetime_sec;
                 usec_t now_usec;
 
-                r = sd_dhcp_lease_get_lifetime(link->dhcp_lease, &lifetime_sec);
+                r = sd_dhcp_lease_get_lifetime(link->dhcp_lease, &lifetime_usec);
                 if (r < 0)
                         return log_link_warning_errno(link, r, "DHCP error: no lifetime: %m");
 
                 assert_se(sd_event_now(link->manager->event, CLOCK_BOOTTIME, &now_usec) >= 0);
-                lifetime_usec = sec_to_usec(lifetime_sec, now_usec);
+                lifetime_usec = usec_add(lifetime_usec, now_usec);
         } else
                 lifetime_usec = USEC_INFINITY;
 
@@ -1617,8 +1616,8 @@ static int dhcp4_configure(Link *link) {
                         return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed to set socket priority: %m");
         }
 
-        if (link->network->dhcp_fallback_lease_lifetime > 0) {
-                r = sd_dhcp_client_set_fallback_lease_lifetime(link->dhcp_client, link->network->dhcp_fallback_lease_lifetime);
+        if (link->network->dhcp_fallback_lease_lifetime_usec > 0) {
+                r = sd_dhcp_client_set_fallback_lease_lifetime(link->dhcp_client, link->network->dhcp_fallback_lease_lifetime_usec);
                 if (r < 0)
                         return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed set to lease lifetime: %m");
         }
@@ -1877,7 +1876,7 @@ int config_parse_dhcp_fallback_lease_lifetime(
         assert(data);
 
         if (isempty(rvalue)) {
-                network->dhcp_fallback_lease_lifetime = 0;
+                network->dhcp_fallback_lease_lifetime_usec = 0;
                 return 0;
         }
 
@@ -1888,7 +1887,7 @@ int config_parse_dhcp_fallback_lease_lifetime(
                 return 0;
         }
 
-        network->dhcp_fallback_lease_lifetime = UINT32_MAX;
+        network->dhcp_fallback_lease_lifetime_usec = USEC_INFINITY;
 
         return 0;
 }
index 92a086af64251f4b1929fa6fc6fa83582f651430..0619c6163186bb19ebac59e8526d6455ea7664b8 100644 (file)
@@ -1131,8 +1131,7 @@ static int dhcp6_client_append_json(Link *link, JsonVariant **v) {
 
 static int dhcp_client_lease_append_json(Link *link, JsonVariant **v) {
         _cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
-        uint32_t t1, t2;
-        uint64_t lease_timestamp_usec;
+        usec_t lease_timestamp_usec, t1, t2;
         int r;
 
         assert(link);
@@ -1155,9 +1154,9 @@ static int dhcp_client_lease_append_json(Link *link, JsonVariant **v) {
 
         r = json_build(&w, JSON_BUILD_OBJECT(
                                 JSON_BUILD_PAIR_FINITE_USEC("Timeout1USec",
-                                                            sec_to_usec(t1, lease_timestamp_usec)),
+                                                            usec_add(t1, lease_timestamp_usec)),
                                 JSON_BUILD_PAIR_FINITE_USEC("Timeout2USec",
-                                                            sec_to_usec(t2, lease_timestamp_usec)),
+                                                            usec_add(t2, lease_timestamp_usec)),
                                 JSON_BUILD_PAIR_FINITE_USEC("LeaseTimestampUSec", lease_timestamp_usec)));
         if (r < 0)
                 return r;
index 3e1110e6d7d8e5fd2678bb6cebdcc99d78a75e16..98cc1f5abc97e779895d4ad9fdb0b0959afae446 100644 (file)
@@ -127,7 +127,7 @@ struct Network {
         bool dhcp_route_metric_set;
         uint32_t dhcp_route_table;
         bool dhcp_route_table_set;
-        uint32_t dhcp_fallback_lease_lifetime;
+        usec_t dhcp_fallback_lease_lifetime_usec;
         uint32_t dhcp_route_mtu;
         uint16_t dhcp_client_port;
         int dhcp_critical;
index 45ab8765d25534c229bc401f2bb3730c0b3bec17..8845b9241e9f2c035b4ec1cbf6d221804de0cb97 100644 (file)
@@ -318,7 +318,7 @@ int sd_dhcp_client_set_socket_priority(
                 int so_priority);
 int sd_dhcp_client_set_fallback_lease_lifetime(
                 sd_dhcp_client *client,
-                uint32_t fallback_lease_lifetime);
+                uint64_t fallback_lease_lifetime);
 
 int sd_dhcp_client_add_option(sd_dhcp_client *client, sd_dhcp_option *v);
 int sd_dhcp_client_add_vendor_option(sd_dhcp_client *client, sd_dhcp_option *v);
index 8a270595722f1f893eee3efc91d2dcc9c2ee5bc5..114884dc6c82cc26ec4ed3eb531d84ba10f171fe 100644 (file)
@@ -47,9 +47,9 @@ __extension__ typedef enum sd_dhcp_lease_server_type_t {
 } sd_dhcp_lease_server_type_t;
 
 int sd_dhcp_lease_get_address(sd_dhcp_lease *lease, struct in_addr *addr);
-int sd_dhcp_lease_get_lifetime(sd_dhcp_lease *lease, uint32_t *lifetime);
-int sd_dhcp_lease_get_t1(sd_dhcp_lease *lease, uint32_t *t1);
-int sd_dhcp_lease_get_t2(sd_dhcp_lease *lease, uint32_t *t2);
+int sd_dhcp_lease_get_lifetime(sd_dhcp_lease *lease, uint64_t *ret);
+int sd_dhcp_lease_get_t1(sd_dhcp_lease *lease, uint64_t *ret);
+int sd_dhcp_lease_get_t2(sd_dhcp_lease *lease, uint64_t *ret);
 int sd_dhcp_lease_get_broadcast(sd_dhcp_lease *lease, struct in_addr *addr);
 int sd_dhcp_lease_get_netmask(sd_dhcp_lease *lease, struct in_addr *addr);
 int sd_dhcp_lease_get_prefix(sd_dhcp_lease *lease, struct in_addr *ret_prefix, uint8_t *ret_prefixlen);