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.
#include "dhcp-internal.h"
#include "dhcp-protocol.h"
#include "list.h"
+#include "time-util.h"
struct sd_dhcp_route {
struct in_addr dst_addr;
usec_t t1;
usec_t t2;
usec_t lifetime;
+ triple_timestamp timestamp;
/* each 0 if unset */
be32_t address;
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);
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);
#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);
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);
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);
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");
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;
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");
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;
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;
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);
} 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);