1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-02-23 21:57:46 +03:00

Merge pull request #13494 from yuwata/dhcp6-delay

dhcp6: rfc8415 fixes
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2019-09-17 09:14:12 +02:00 committed by GitHub
commit 8dd2fb558f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 2 deletions

View File

@ -29,6 +29,9 @@
#define MAX_MAC_ADDR_LEN INFINIBAND_ALEN
#define IRT_DEFAULT 1 * USEC_PER_DAY
#define IRT_MINIMUM 600 * USEC_PER_SEC
/* what to request from the server, addresses (IA_NA) and/or prefixes (IA_PD) */
enum {
DHCP6_REQUEST_IA_NA = 1,
@ -71,6 +74,8 @@ struct sd_dhcp6_client {
void *userdata;
struct duid duid;
size_t duid_len;
usec_t information_request_time_usec;
usec_t information_refresh_time_usec;
};
static const uint16_t default_req_opts[] = {
@ -820,6 +825,7 @@ static int client_parse_message(
uint32_t lt_t1 = ~0, lt_t2 = ~0;
bool clientid = false;
size_t pos = 0;
usec_t irt = IRT_DEFAULT;
int r;
assert(client);
@ -994,6 +1000,10 @@ static int client_parse_message(
return r;
break;
case SD_DHCP6_OPTION_INFORMATION_REFRESH_TIME:
irt = be32toh(*(be32_t *) optval) * USEC_PER_SEC;
break;
}
pos += offsetof(DHCP6Option, data) + optlen;
@ -1025,6 +1035,8 @@ static int client_parse_message(
}
}
client->information_refresh_time_usec = MAX(irt, IRT_MINIMUM);
return 0;
}
@ -1425,8 +1437,15 @@ int sd_dhcp6_client_start(sd_dhcp6_client *client) {
client->fd = r;
}
if (client->information_request)
if (client->information_request) {
usec_t t = now(CLOCK_MONOTONIC);
if (t < usec_add(client->information_request_time_usec, client->information_refresh_time_usec))
return 0;
client->information_request_time_usec = t;
state = DHCP6_STATE_INFORMATION_REQUEST;
}
log_dhcp6_client(client, "Started in %s mode",
client->information_request? "Information request":

View File

@ -365,7 +365,7 @@ _public_ int sd_ndisc_start(sd_ndisc *nd) {
r = event_reset_time(nd->event, &nd->timeout_event_source,
clock_boottime_or_monotonic(),
0, 0,
time_now + USEC_PER_SEC / 2, 1 * USEC_PER_SEC, /* See RFC 8415 sec. 18.2.1 */
ndisc_timeout, nd,
nd->event_priority, "ndisc-timeout", true);
if (r < 0)

View File

@ -66,6 +66,7 @@ enum {
SD_DHCP6_OPTION_IA_PD_PREFIX = 26, /* RFC 3633, prefix delegation */
SD_DHCP6_OPTION_SNTP_SERVERS = 31, /* RFC 4075, deprecated */
SD_DHCP6_OPTION_INFORMATION_REFRESH_TIME = 32, /* RFC 8415, sec. 21.23 */
/* option code 35 is unassigned */