1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-12-23 17:34:00 +03:00

dhcp6: read OPTION_INFORMATION_REFRESH_TIME option

Fixes #13460.
This commit is contained in:
Yu Watanabe 2019-09-07 03:29:46 +09:00
parent 338009e0db
commit fcb51238e0
2 changed files with 21 additions and 1 deletions

View File

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

View File

@ -66,6 +66,7 @@ enum {
SD_DHCP6_OPTION_IA_PD_PREFIX = 26, /* RFC 3633, prefix delegation */ SD_DHCP6_OPTION_IA_PD_PREFIX = 26, /* RFC 3633, prefix delegation */
SD_DHCP6_OPTION_SNTP_SERVERS = 31, /* RFC 4075, deprecated */ 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 */ /* option code 35 is unassigned */