]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dhcp: introduce sd_dhcp_lease_get_timestamp()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 4 Sep 2023 17:52:48 +0000 (02:52 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 5 Sep 2023 17:02:21 +0000 (02:02 +0900)
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.

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/systemd/sd-dhcp-client.h
src/systemd/sd-dhcp-lease.h

index 4f0e96fc232fe3cc2a7b44bcb9abf6d898a4d4ff..04a98938761156f840b3ddfcf19f1febf4a82985 100644 (file)
@@ -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;
index b7de3e843a7f285ef7603a6389c9f93f84f7d87a..854eca5a584db4ab2a5810db5da06fe2cef56f0a 100644 (file)
@@ -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);
index 229d5656d9cf6c2a81952419fac06c976fa5eb15..97985c74c72ca74641b43ceb22e21a40813144b3 100644 (file)
 #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, &timestamp); \
+                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);
index 964aae1fd8b6028a13ae7a0f331832e278772b85..284e6a20ad0c2362d89ad772c01bb9d4ea874f33 100644 (file)
@@ -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");
index dbd1001068128f509ac0af8043807069dbbb92b1..01fdba208d03666b7d5027e2888dfc99006532f5 100644 (file)
@@ -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;
 
index 0619c6163186bb19ebac59e8526d6455ea7664b8..f7a0c9215c9824fa0a715a6436b4fdb3ca1b860a 100644 (file)
@@ -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;
 
index 8845b9241e9f2c035b4ec1cbf6d221804de0cb97..95ff829af39468b511f62b9dd955474c1c804626 100644 (file)
@@ -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);
index 114884dc6c82cc26ec4ed3eb531d84ba10f171fe..8c2d0fb7f96b8a08231e5cb6326282547f9f73d4 100644 (file)
@@ -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);