From: Yu Watanabe Date: Mon, 4 Sep 2023 14:16:35 +0000 (+0900) Subject: sd-dhcp-client: store lifetime and friends in usec_t X-Git-Tag: v255-rc1~574^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5fde4d37d49aebc507f2ef93447ccbd092c6006b;p=thirdparty%2Fsystemd.git sd-dhcp-client: store lifetime and friends in usec_t --- diff --git a/src/libsystemd-network/dhcp-lease-internal.h b/src/libsystemd-network/dhcp-lease-internal.h index 6503e3ce2d2..4f0e96fc232 100644 --- a/src/libsystemd-network/dhcp-lease-internal.h +++ b/src/libsystemd-network/dhcp-lease-internal.h @@ -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; diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c index 9ec7a2256e5..b7de3e843a7 100644 --- a/src/libsystemd-network/sd-dhcp-client.c +++ b/src/libsystemd-network/sd-dhcp-client.c @@ -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". diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c index d09908b5a2e..229d5656d9c 100644 --- a/src/libsystemd-network/sd-dhcp-lease.c +++ b/src/libsystemd-network/sd-dhcp-lease.c @@ -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); } diff --git a/src/network/networkd-dhcp-prefix-delegation.c b/src/network/networkd-dhcp-prefix-delegation.c index 169f1b3b5eb..964aae1fd8b 100644 --- a/src/network/networkd-dhcp-prefix-delegation.c +++ b/src/network/networkd-dhcp-prefix-delegation.c @@ -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) diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index f952d6dfbcc..dbd10010681 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -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; } diff --git a/src/network/networkd-json.c b/src/network/networkd-json.c index 92a086af642..0619c616318 100644 --- a/src/network/networkd-json.c +++ b/src/network/networkd-json.c @@ -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; diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 3e1110e6d7d..98cc1f5abc9 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -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; diff --git a/src/systemd/sd-dhcp-client.h b/src/systemd/sd-dhcp-client.h index 45ab8765d25..8845b9241e9 100644 --- a/src/systemd/sd-dhcp-client.h +++ b/src/systemd/sd-dhcp-client.h @@ -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); diff --git a/src/systemd/sd-dhcp-lease.h b/src/systemd/sd-dhcp-lease.h index 8a270595722..114884dc6c8 100644 --- a/src/systemd/sd-dhcp-lease.h +++ b/src/systemd/sd-dhcp-lease.h @@ -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);