From: Yu Watanabe Date: Mon, 4 Sep 2023 17:52:48 +0000 (+0900) Subject: dhcp: introduce sd_dhcp_lease_get_timestamp() X-Git-Tag: v255-rc1~574^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a93538e89238f7a6df0236c3939a04aa46fa312a;p=thirdparty%2Fsystemd.git dhcp: introduce sd_dhcp_lease_get_timestamp() And drop sd_dhcp_client_get_lease_timestamp(). Also, this introduce sd_dhcp_lease_get_lifetime_timestamp() and friends, which provides timestamp of the lifetime and so on, while sd_dhcp_lease_get_lifetime() provides timestamp. --- diff --git a/src/libsystemd-network/dhcp-lease-internal.h b/src/libsystemd-network/dhcp-lease-internal.h index 4f0e96fc232..04a98938761 100644 --- a/src/libsystemd-network/dhcp-lease-internal.h +++ b/src/libsystemd-network/dhcp-lease-internal.h @@ -10,6 +10,7 @@ #include "dhcp-internal.h" #include "dhcp-protocol.h" #include "list.h" +#include "time-util.h" struct sd_dhcp_route { struct in_addr dst_addr; @@ -32,6 +33,7 @@ struct sd_dhcp_lease { usec_t t1; usec_t t2; usec_t lifetime; + triple_timestamp timestamp; /* 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 b7de3e843a7..854eca5a584 100644 --- a/src/libsystemd-network/sd-dhcp-client.c +++ b/src/libsystemd-network/sd-dhcp-client.c @@ -716,18 +716,6 @@ int sd_dhcp_client_get_lease(sd_dhcp_client *client, sd_dhcp_lease **ret) { return 0; } -int sd_dhcp_client_get_lease_timestamp(sd_dhcp_client *client, uint64_t *timestamp) { - assert_return(client, -EINVAL); - - if (!IN_SET(client->state, DHCP_STATE_BOUND, DHCP_STATE_RENEWING, DHCP_STATE_REBINDING)) - return -ENODATA; - - if(timestamp) - *timestamp = client->request_sent; - - return 0; -} - int sd_dhcp_client_set_service_type(sd_dhcp_client *client, int type) { assert_return(client, -EINVAL); assert_return(!sd_dhcp_client_is_running(client), -EBUSY); @@ -1727,6 +1715,8 @@ static int client_set_lease_timeouts(sd_dhcp_client *client) { assert(client->lease); assert(client->lease->lifetime > 0); + triple_timestamp_from_boottime(&client->lease->timestamp, client->request_sent); + /* don't set timers for infinite leases */ if (client->lease->lifetime == USEC_INFINITY) { (void) event_source_disable(client->timeout_t1); diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c index 229d5656d9c..97985c74c72 100644 --- a/src/libsystemd-network/sd-dhcp-lease.c +++ b/src/libsystemd-network/sd-dhcp-lease.c @@ -29,9 +29,23 @@ #include "stdio-util.h" #include "string-util.h" #include "strv.h" +#include "time-util.h" #include "tmpfile-util.h" #include "unaligned.h" +int sd_dhcp_lease_get_timestamp(sd_dhcp_lease *lease, clockid_t clock, uint64_t *ret) { + assert_return(lease, -EINVAL); + assert_return(TRIPLE_TIMESTAMP_HAS_CLOCK(clock), -EOPNOTSUPP); + assert_return(clock_supported(clock), -EOPNOTSUPP); + assert_return(ret, -EINVAL); + + if (!triple_timestamp_is_set(&lease->timestamp)) + return -ENODATA; + + *ret = triple_timestamp_by_clock(&lease->timestamp, clock); + return 0; +} + int sd_dhcp_lease_get_address(sd_dhcp_lease *lease, struct in_addr *addr) { assert_return(lease, -EINVAL); assert_return(addr, -EINVAL); @@ -87,6 +101,33 @@ int sd_dhcp_lease_get_t2(sd_dhcp_lease *lease, uint64_t *ret) { return 0; } +#define DEFINE_GET_TIMESTAMP(name) \ + int sd_dhcp_lease_get_##name##_timestamp( \ + sd_dhcp_lease *lease, \ + clockid_t clock, \ + uint64_t *ret) { \ + \ + usec_t t, timestamp; \ + int r; \ + \ + assert_return(ret, -EINVAL); \ + \ + r = sd_dhcp_lease_get_##name(lease, &t); \ + if (r < 0) \ + return r; \ + \ + r = sd_dhcp_lease_get_timestamp(lease, clock, ×tamp); \ + if (r < 0) \ + return r; \ + \ + *ret = usec_add(t, timestamp); \ + return 0; \ + } + +DEFINE_GET_TIMESTAMP(lifetime); +DEFINE_GET_TIMESTAMP(t1); +DEFINE_GET_TIMESTAMP(t2); + int sd_dhcp_lease_get_mtu(sd_dhcp_lease *lease, uint16_t *mtu) { assert_return(lease, -EINVAL); assert_return(mtu, -EINVAL); diff --git a/src/network/networkd-dhcp-prefix-delegation.c b/src/network/networkd-dhcp-prefix-delegation.c index 964aae1fd8b..284e6a20ad0 100644 --- a/src/network/networkd-dhcp-prefix-delegation.c +++ b/src/network/networkd-dhcp-prefix-delegation.c @@ -855,7 +855,7 @@ 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; - usec_t lifetime_usec, now_usec; + usec_t lifetime_usec; int r; assert(link); @@ -867,13 +867,10 @@ 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_usec); + r = sd_dhcp_lease_get_lifetime_timestamp(uplink->dhcp_lease, CLOCK_BOOTTIME, &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 = 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) return log_link_warning_errno(uplink, r, "Failed to get DHCPv4 6rd option: %m"); @@ -928,7 +925,7 @@ int dhcp4_pd_prefix_acquired(Link *uplink) { struct in_addr ipv4address; union in_addr_union server_address; const struct in_addr *br_addresses; - usec_t lifetime_usec, now_usec; + usec_t lifetime_usec; Link *link; int r; @@ -940,13 +937,10 @@ 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_usec); + r = sd_dhcp_lease_get_lifetime_timestamp(uplink->dhcp_lease, CLOCK_BOOTTIME, &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 = usec_add(lifetime_usec, now_usec); - r = sd_dhcp_lease_get_server_identifier(uplink->dhcp_lease, &server_address.in); if (r < 0) return log_link_warning_errno(uplink, r, "Failed to get server address of DHCPv4 lease: %m"); diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index dbd10010681..01fdba208d0 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -910,14 +910,9 @@ 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)) { - usec_t now_usec; - - r = sd_dhcp_lease_get_lifetime(link->dhcp_lease, &lifetime_usec); + r = sd_dhcp_lease_get_lifetime_timestamp(link->dhcp_lease, CLOCK_BOOTTIME, &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 = usec_add(lifetime_usec, now_usec); + return log_link_warning_errno(link, r, "DHCP error: failed to get lifetime: %m"); } else lifetime_usec = USEC_INFINITY; diff --git a/src/network/networkd-json.c b/src/network/networkd-json.c index 0619c616318..f7a0c9215c9 100644 --- a/src/network/networkd-json.c +++ b/src/network/networkd-json.c @@ -1140,24 +1140,22 @@ static int dhcp_client_lease_append_json(Link *link, JsonVariant **v) { if (!link->dhcp_client || !link->dhcp_lease) return 0; - r = sd_dhcp_lease_get_t1(link->dhcp_lease, &t1); + r = sd_dhcp_lease_get_timestamp(link->dhcp_lease, CLOCK_BOOTTIME, &lease_timestamp_usec); if (r < 0) return 0; - r = sd_dhcp_lease_get_t2(link->dhcp_lease, &t2); + r = sd_dhcp_lease_get_t1_timestamp(link->dhcp_lease, CLOCK_BOOTTIME, &t1); if (r < 0) return 0; - r = sd_dhcp_client_get_lease_timestamp(link->dhcp_client, &lease_timestamp_usec); + r = sd_dhcp_lease_get_t2_timestamp(link->dhcp_lease, CLOCK_BOOTTIME, &t2); if (r < 0) return 0; r = json_build(&w, JSON_BUILD_OBJECT( - JSON_BUILD_PAIR_FINITE_USEC("Timeout1USec", - usec_add(t1, lease_timestamp_usec)), - JSON_BUILD_PAIR_FINITE_USEC("Timeout2USec", - usec_add(t2, lease_timestamp_usec)), - JSON_BUILD_PAIR_FINITE_USEC("LeaseTimestampUSec", lease_timestamp_usec))); + JSON_BUILD_PAIR_FINITE_USEC("LeaseTimestampUSec", lease_timestamp_usec), + JSON_BUILD_PAIR_FINITE_USEC("Timeout1USec", t1), + JSON_BUILD_PAIR_FINITE_USEC("Timeout2USec", t2))); if (r < 0) return r; diff --git a/src/systemd/sd-dhcp-client.h b/src/systemd/sd-dhcp-client.h index 8845b9241e9..95ff829af39 100644 --- a/src/systemd/sd-dhcp-client.h +++ b/src/systemd/sd-dhcp-client.h @@ -329,7 +329,6 @@ int sd_dhcp_client_start(sd_dhcp_client *client); int sd_dhcp_client_send_release(sd_dhcp_client *client); int sd_dhcp_client_send_decline(sd_dhcp_client *client); int sd_dhcp_client_send_renew(sd_dhcp_client *client); -int sd_dhcp_client_get_lease_timestamp(sd_dhcp_client *client, uint64_t *timestamp); sd_dhcp_client *sd_dhcp_client_ref(sd_dhcp_client *client); sd_dhcp_client *sd_dhcp_client_unref(sd_dhcp_client *client); diff --git a/src/systemd/sd-dhcp-lease.h b/src/systemd/sd-dhcp-lease.h index 114884dc6c8..8c2d0fb7f96 100644 --- a/src/systemd/sd-dhcp-lease.h +++ b/src/systemd/sd-dhcp-lease.h @@ -47,9 +47,13 @@ __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_timestamp(sd_dhcp_lease *lease, clockid_t clock, uint64_t *ret); 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_lifetime_timestamp(sd_dhcp_lease *lease, clockid_t clock, uint64_t *ret); +int sd_dhcp_lease_get_t1_timestamp(sd_dhcp_lease *lease, clockid_t clock, uint64_t *ret); +int sd_dhcp_lease_get_t2_timestamp(sd_dhcp_lease *lease, clockid_t clock, 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);