From 394fac52d0e79f9cc5b66e85d14a760da425c323 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 5 Sep 2023 15:50:50 +0900 Subject: [PATCH] sd-dhcp6-client: introduce sd_dhcp6_lease_get_t1() and friends --- src/libsystemd-network/dhcp6-lease-internal.h | 1 - src/libsystemd-network/sd-dhcp6-client.c | 10 +++- src/libsystemd-network/sd-dhcp6-lease.c | 53 ++++++++++++++----- src/network/networkd-json.c | 23 ++++---- src/systemd/sd-dhcp6-lease.h | 6 +++ 5 files changed, 69 insertions(+), 24 deletions(-) diff --git a/src/libsystemd-network/dhcp6-lease-internal.h b/src/libsystemd-network/dhcp6-lease-internal.h index c1eb23eba1a..0a2434b5ab0 100644 --- a/src/libsystemd-network/dhcp6-lease-internal.h +++ b/src/libsystemd-network/dhcp6-lease-internal.h @@ -47,7 +47,6 @@ struct sd_dhcp6_lease { char *captive_portal; }; -int dhcp6_lease_get_lifetime(sd_dhcp6_lease *lease, usec_t *ret_t1, usec_t *ret_t2, usec_t *ret_valid); int dhcp6_lease_set_clientid(sd_dhcp6_lease *lease, const uint8_t *id, size_t len); int dhcp6_lease_get_clientid(sd_dhcp6_lease *lease, uint8_t **ret_id, size_t *ret_len); int dhcp6_lease_set_serverid(sd_dhcp6_lease *lease, const uint8_t *id, size_t len); diff --git a/src/libsystemd-network/sd-dhcp6-client.c b/src/libsystemd-network/sd-dhcp6-client.c index 120384b3daf..4c500fc4a92 100644 --- a/src/libsystemd-network/sd-dhcp6-client.c +++ b/src/libsystemd-network/sd-dhcp6-client.c @@ -1069,7 +1069,15 @@ static int client_enter_bound_state(sd_dhcp6_client *client) { (void) event_source_disable(client->receive_message); (void) event_source_disable(client->timeout_resend); - r = dhcp6_lease_get_lifetime(client->lease, &lifetime_t1, &lifetime_t2, &lifetime_valid); + r = sd_dhcp6_lease_get_t1(client->lease, &lifetime_t1); + if (r < 0) + goto error; + + r = sd_dhcp6_lease_get_t2(client->lease, &lifetime_t2); + if (r < 0) + goto error; + + r = sd_dhcp6_lease_get_valid_lifetime(client->lease, &lifetime_valid); if (r < 0) goto error; diff --git a/src/libsystemd-network/sd-dhcp6-lease.c b/src/libsystemd-network/sd-dhcp6-lease.c index db9b471961d..3608586e5dc 100644 --- a/src/libsystemd-network/sd-dhcp6-lease.c +++ b/src/libsystemd-network/sd-dhcp6-lease.c @@ -70,20 +70,47 @@ static void dhcp6_lease_set_lifetime(sd_dhcp6_lease *lease) { lease->lifetime_t2 = t2; } -int dhcp6_lease_get_lifetime(sd_dhcp6_lease *lease, usec_t *ret_t1, usec_t *ret_t2, usec_t *ret_valid) { - assert(lease); - - if (!lease->ia_na && !lease->ia_pd) - return -ENODATA; +#define DEFINE_GET_TIME_FUNCTIONS(name, val) \ + int sd_dhcp6_lease_get_##name( \ + sd_dhcp6_lease *lease, \ + uint64_t *ret) { \ + \ + assert_return(lease, -EINVAL); \ + \ + if (!lease->ia_na && !lease->ia_pd) \ + return -ENODATA; \ + \ + if (ret) \ + *ret = lease->val; \ + return 0; \ + } \ + \ + int sd_dhcp6_lease_get_##name##_timestamp( \ + sd_dhcp6_lease *lease, \ + clockid_t clock, \ + uint64_t *ret) { \ + \ + usec_t s, t; \ + int r; \ + \ + assert_return(lease, -EINVAL); \ + \ + r = sd_dhcp6_lease_get_##name(lease, &s); \ + if (r < 0) \ + return r; \ + \ + r = sd_dhcp6_lease_get_timestamp(lease, clock, &t); \ + if (r < 0) \ + return r; \ + \ + if (ret) \ + *ret = time_span_to_stamp(s, t); \ + return 0; \ + } - if (ret_t1) - *ret_t1 = lease->lifetime_t1; - if (ret_t2) - *ret_t2 = lease->lifetime_t2; - if (ret_valid) - *ret_valid = lease->lifetime_valid; - return 0; -} +DEFINE_GET_TIME_FUNCTIONS(t1, lifetime_t1); +DEFINE_GET_TIME_FUNCTIONS(t2, lifetime_t1); +DEFINE_GET_TIME_FUNCTIONS(valid_lifetime, lifetime_valid); static void dhcp6_lease_set_server_address(sd_dhcp6_lease *lease, const struct in6_addr *server_address) { assert(lease); diff --git a/src/network/networkd-json.c b/src/network/networkd-json.c index 0b2f6e68b81..fc033d0258b 100644 --- a/src/network/networkd-json.c +++ b/src/network/networkd-json.c @@ -1045,7 +1045,7 @@ static int dhcp_server_append_json(Link *link, JsonVariant **v) { static int dhcp6_client_lease_append_json(Link *link, JsonVariant **v) { _cleanup_(json_variant_unrefp) JsonVariant *w = NULL; - usec_t lease_timestamp_usec; + usec_t ts, t1, t2; int r; assert(link); @@ -1054,17 +1054,22 @@ static int dhcp6_client_lease_append_json(Link *link, JsonVariant **v) { if (!link->dhcp6_lease) return 0; - r = sd_dhcp6_lease_get_timestamp(link->dhcp6_lease, CLOCK_BOOTTIME, &lease_timestamp_usec); + r = sd_dhcp6_lease_get_timestamp(link->dhcp6_lease, CLOCK_BOOTTIME, &ts); if (r < 0) - return 0; + return r; + + r = sd_dhcp6_lease_get_t1_timestamp(link->dhcp6_lease, CLOCK_BOOTTIME, &t1); + if (r < 0) + return r; + + r = sd_dhcp6_lease_get_t2_timestamp(link->dhcp6_lease, CLOCK_BOOTTIME, &t2); + if (r < 0) + return r; r = json_build(&w, JSON_BUILD_OBJECT( - JSON_BUILD_PAIR_FINITE_USEC("Timeout1USec", - usec_add(link->dhcp6_lease->lifetime_t1, lease_timestamp_usec)), - JSON_BUILD_PAIR_FINITE_USEC("Timeout2USec", - usec_add(link->dhcp6_lease->lifetime_t2, 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), + JSON_BUILD_PAIR_FINITE_USEC("LeaseTimestampUSec", ts))); if (r < 0) return r; diff --git a/src/systemd/sd-dhcp6-lease.h b/src/systemd/sd-dhcp6-lease.h index 607f85428d4..543dc940255 100644 --- a/src/systemd/sd-dhcp6-lease.h +++ b/src/systemd/sd-dhcp6-lease.h @@ -30,6 +30,12 @@ _SD_BEGIN_DECLARATIONS; typedef struct sd_dhcp6_lease sd_dhcp6_lease; int sd_dhcp6_lease_get_timestamp(sd_dhcp6_lease *lease, clockid_t clock, uint64_t *ret); +int sd_dhcp6_lease_get_t1(sd_dhcp6_lease *lease, uint64_t *ret); +int sd_dhcp6_lease_get_t1_timestamp(sd_dhcp6_lease *lease, clockid_t clock, uint64_t *ret); +int sd_dhcp6_lease_get_t2(sd_dhcp6_lease *lease, uint64_t *ret); +int sd_dhcp6_lease_get_t2_timestamp(sd_dhcp6_lease *lease, clockid_t clock, uint64_t *ret); +int sd_dhcp6_lease_get_valid_lifetime(sd_dhcp6_lease *lease, uint64_t *ret); +int sd_dhcp6_lease_get_valid_lifetime_timestamp(sd_dhcp6_lease *lease, clockid_t clock, uint64_t *ret); int sd_dhcp6_lease_get_server_address(sd_dhcp6_lease *lease, struct in6_addr *ret); int sd_dhcp6_lease_address_iterator_reset(sd_dhcp6_lease *lease); -- 2.39.2