| From 1b320f2dd24d075410bc595a6d3b21e303e4883f Mon Sep 17 00:00:00 2001 |
| From: Denton Gentry <dgentry@google.com> |
| Date: Sun, 1 Jul 2012 23:56:59 -0700 |
| Subject: [PATCH] Allow for a minimum IRT for DHCP6. |
| |
| + DHCP6 servers which do not include an INFORMATION_REFRESH_TIME |
| option are effectively saying the information in the DHCP6 response |
| is valid indefinitely. |
| + dhclient will exit, as it would never need to send another request. |
| + Information is *never* valid forever, even if the server thinks it is. |
| |
| + --never-gonna-give-you-up <seconds> imposes a refresh interval |
| even if the server did not state one. |
| |
| + it also Rickrolls the rest of the team. |
| --- |
| client/dhc6.c | 9 ++++++--- |
| client/dhclient.c | 23 +++++++++++++++++++++++ |
| 2 files changed, 29 insertions(+), 3 deletions(-) |
| |
| diff --git a/client/dhc6.c b/client/dhc6.c |
| index 24f3f18..b90d2f1 100644 |
| --- a/client/dhc6.c |
| +++ b/client/dhc6.c |
| @@ -116,6 +116,7 @@ static int check_timing6(struct client_state *client, u_int8_t msg_type, |
| |
| extern int onetry; |
| extern int stateless; |
| +extern int force_default_irt; |
| |
| /* |
| * The "best" default DUID, since we cannot predict any information |
| @@ -4805,9 +4806,11 @@ dhc6_check_irt(struct client_state *client) |
| break; |
| } |
| } |
| - /* Simply return gives a endless loop waiting for nothing. */ |
| - if (!found) |
| + |
| + if (!found && !force_default_irt) { |
| + /* Simply return gives a endless loop waiting for nothing. */ |
| exit(0); |
| + } |
| |
| oc = lookup_option(&dhcpv6_universe, client->active_lease->options, |
| D6O_INFORMATION_REFRESH_TIME); |
| @@ -4829,7 +4832,7 @@ dhc6_check_irt(struct client_state *client) |
| } |
| data_string_forget(&irt, MDL); |
| } else |
| - expire = IRT_DEFAULT; |
| + expire = force_default_irt ? force_default_irt : IRT_DEFAULT; |
| |
| if (expire != MAX_TIME) { |
| log_debug("PRC: Refresh event scheduled in %u seconds.", |
| diff --git a/client/dhclient.c b/client/dhclient.c |
| index 1209a96..7a6bc09 100644 |
| --- a/client/dhclient.c |
| +++ b/client/dhclient.c |
| @@ -40,6 +40,7 @@ |
| |
| TIME default_lease_time = 43200; /* 12 hours... */ |
| TIME max_lease_time = 86400; /* 24 hours... */ |
| +int force_default_irt = 0; |
| |
| const char *path_dhclient_conf = _PATH_DHCLIENT_CONF; |
| const char *path_dhclient_db = NULL; |
| @@ -97,6 +98,7 @@ static int check_domain_name(const char *ptr, size_t len, int dots); |
| static int check_domain_name_list(const char *ptr, size_t len, int dots); |
| static int check_option_values(struct universe *universe, unsigned int opt, |
| const char *ptr, size_t len); |
| +static int validate_irt(const char *irt); |
| |
| int |
| main(int argc, char **argv) { |
| @@ -289,6 +291,10 @@ main(int argc, char **argv) { |
| wanted_ia_na = 0; |
| } |
| wanted_ia_pd++; |
| + } else if (!strcmp(argv[i], "--never-gonna-give-you-up")) { |
| + if (++i == argc) |
| + usage(); |
| + force_default_irt = validate_irt(argv[i]); |
| #endif /* DHCPv6 */ |
| } else if (!strcmp(argv[i], "-v")) { |
| quiet = 0; |
| @@ -694,6 +700,7 @@ static void usage() |
| log_fatal("Usage: dhclient " |
| #ifdef DHCPv6 |
| "[-4|-6] [-SNTP1dvrx] [-nw] [-p <port>]\n" |
| + " [--never-gonna-give-you-up <interval>]\n" |
| #else /* DHCPv6 */ |
| "[-1dvrx] [-nw] [-p <port>]\n" |
| #endif /* DHCPv6 */ |
| @@ -4106,3 +4113,19 @@ add_reject(struct packet *packet) { |
| */ |
| log_info("Server added to list of rejected servers."); |
| } |
| + |
| +static int |
| +validate_irt(const char *irt) { |
| + long local_irt = 0; |
| + char *endptr; |
| + |
| + errno = 0; |
| + local_irt = strtol(irt, &endptr, 10); |
| + |
| + if ((*endptr != '\0') || (errno == ERANGE) || (errno == EINVAL)) |
| + log_fatal ("Invalid IRT: %s", irt); |
| + if (local_irt < IRT_MINIMUM) |
| + log_fatal ("Invalid IRT %ld < minimum (%d)", local_irt, IRT_MINIMUM); |
| + |
| + return (int)local_irt; |
| +} |
| -- |
| 1.7.9.4 |
| |