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;
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;
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;
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);
}
static int client_initialize_time_events(sd_dhcp_client *client) {
- uint64_t usec = 0;
+ usec_t usec = 0;
int r;
assert(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,
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);
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".
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;
}
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);
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");
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;
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);
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) {
}
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);
}
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;
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)
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;
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)
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;
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");
}
assert(data);
if (isempty(rvalue)) {
- network->dhcp_fallback_lease_lifetime = 0;
+ network->dhcp_fallback_lease_lifetime_usec = 0;
return 0;
}
return 0;
}
- network->dhcp_fallback_lease_lifetime = UINT32_MAX;
+ network->dhcp_fallback_lease_lifetime_usec = USEC_INFINITY;
return 0;
}
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);
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;
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;
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);
} 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);