mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-23 17:34:00 +03:00
parent
338009e0db
commit
fcb51238e0
@ -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":
|
||||||
|
@ -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 */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user