summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancis Dupont <fdupont@isc.org>2016-02-20 14:43:21 +0100
committerFrancis Dupont <fdupont@isc.org>2016-02-20 14:43:21 +0100
commit23a0327469e0e96711750206d67eb84dd3aedc34 (patch)
tree0b7fa9095b8f7b31333383a7a0bc3296c76e76e7
parentd02e6c3e22c10a3899b5fd79da618b00159d4e71 (diff)
downloadisc-dhcp-rt41750.tar.gz
Add IRT to default requested option list when statelessrt41750
-rw-r--r--RELNOTES4
-rw-r--r--client/clparse.c85
-rw-r--r--client/dhclient.c6
3 files changed, 44 insertions, 51 deletions
diff --git a/RELNOTES b/RELNOTES
index f2069c38..aeb87419 100644
--- a/RELNOTES
+++ b/RELNOTES
@@ -233,6 +233,10 @@ by Eric Young (eay@cryptsoft.com).
Please look at doc/DHCPv4-over-DHCPv6 for more details.
[ISC-Bugs #35711]
+- Add the IRT (Information Refresh Time) option to the default requested
+ option list of the DHCPv6 stateless client.
+ [ISC-Bugs #41750]
+
Changes since 4.3.3b1
- None
diff --git a/client/clparse.c b/client/clparse.c
index 643b3fae..b60fc4d5 100644
--- a/client/clparse.c
+++ b/client/clparse.c
@@ -31,9 +31,8 @@
struct client_config top_level_config;
-#define NUM_DEFAULT_REQUESTED_OPTS 9
-/* There can be 2 extra requested options for DHCPv4-over-DHCPv6. */
-struct option *default_requested_options[NUM_DEFAULT_REQUESTED_OPTS + 2 + 1];
+#define NUM_DEFAULT_REQUESTED_OPTS 11
+struct option *default_requested_options[NUM_DEFAULT_REQUESTED_OPTS + 1];
static void parse_client_default_duid(struct parse *cfile);
static void parse_client6_lease_statement(struct parse *cfile);
@@ -44,6 +43,7 @@ static struct dhc6_ia *parse_client6_ia_pd_statement(struct parse *cfile);
static struct dhc6_addr *parse_client6_iaaddr_statement(struct parse *cfile);
static struct dhc6_addr *parse_client6_iaprefix_statement(struct parse *cfile);
#endif /* DHCPv6 */
+extern int stateless;
/* client-conf-file :== client-declarations END_OF_FILE
client-declarations :== <nil>
@@ -55,6 +55,7 @@ isc_result_t read_client_conf ()
struct client_config *config;
struct interface_info *ip;
isc_result_t status;
+ unsigned last_index;
unsigned code;
/*
@@ -70,94 +71,88 @@ isc_result_t read_client_conf ()
memset(default_requested_options, 0, sizeof(default_requested_options));
/* 1 */
+ last_index = 0;
code = DHO_SUBNET_MASK;
- option_code_hash_lookup(&default_requested_options[0],
+ option_code_hash_lookup(&default_requested_options[last_index],
dhcp_universe.code_hash, &code, 0, MDL);
/* 2 */
+ last_index++;
code = DHO_BROADCAST_ADDRESS;
- option_code_hash_lookup(&default_requested_options[1],
+ option_code_hash_lookup(&default_requested_options[last_index],
dhcp_universe.code_hash, &code, 0, MDL);
/* 3 */
+ last_index++;
code = DHO_TIME_OFFSET;
- option_code_hash_lookup(&default_requested_options[2],
+ option_code_hash_lookup(&default_requested_options[last_index],
dhcp_universe.code_hash, &code, 0, MDL);
/* 4 */
+ last_index++;
code = DHO_ROUTERS;
- option_code_hash_lookup(&default_requested_options[3],
+ option_code_hash_lookup(&default_requested_options[last_index],
dhcp_universe.code_hash, &code, 0, MDL);
/* 5 */
+ last_index++;
code = DHO_DOMAIN_NAME;
- option_code_hash_lookup(&default_requested_options[4],
+ option_code_hash_lookup(&default_requested_options[last_index],
dhcp_universe.code_hash, &code, 0, MDL);
/* 6 */
+ last_index++;
code = DHO_DOMAIN_NAME_SERVERS;
- option_code_hash_lookup(&default_requested_options[5],
+ option_code_hash_lookup(&default_requested_options[last_index],
dhcp_universe.code_hash, &code, 0, MDL);
/* 7 */
+ last_index++;
code = DHO_HOST_NAME;
- option_code_hash_lookup(&default_requested_options[6],
+ option_code_hash_lookup(&default_requested_options[last_index],
dhcp_universe.code_hash, &code, 0, MDL);
/* 8 */
+ last_index++;
code = D6O_NAME_SERVERS;
- option_code_hash_lookup(&default_requested_options[7],
+ option_code_hash_lookup(&default_requested_options[last_index],
dhcpv6_universe.code_hash, &code, 0, MDL);
/* 9 */
+ last_index++;
code = D6O_DOMAIN_SEARCH;
- option_code_hash_lookup(&default_requested_options[8],
+ option_code_hash_lookup(&default_requested_options[last_index],
dhcpv6_universe.code_hash, &code, 0, MDL);
- for (code = 0 ; code < NUM_DEFAULT_REQUESTED_OPTS ; code++) {
- if (default_requested_options[code] == NULL)
- log_fatal("Unable to find option definition for "
- "index %u during default parameter request "
- "assembly.", code);
+ /* Called from run_stateless() so the IRT should be requested */
+ if (stateless) {
+ /* 10 */
+ last_index++;
+ code = D6O_INFORMATION_REFRESH_TIME;
+ option_code_hash_lookup(&default_requested_options[last_index],
+ dhcpv6_universe.code_hash,
+ &code, 0, MDL);
}
#ifdef DHCP4o6
- /* DHCPv4-over-DHCPv6 extra requested options in code order */
+ /* The DHCP4o6 server option should be requested */
if (dhcpv4_over_dhcpv6 == 1) {
- /* The DHCP4o6 server option should be requested */
+ /* 10 or 11 */
+ last_index++;
code = D6O_DHCP4_O_DHCP6_SERVER;
- option_code_hash_lookup(&default_requested_options[9],
+ option_code_hash_lookup(&default_requested_options[last_index],
dhcpv6_universe.code_hash,
&code, 0, MDL);
- if (default_requested_options[9] == NULL) {
- log_fatal("Unable to find option definition for "
- "index %u during default parameter request "
- "assembly.", code);
- }
- } else if (dhcpv4_over_dhcpv6 > 1) {
- /* Called from run_stateless so the IRT should
- be requested too */
- code = D6O_INFORMATION_REFRESH_TIME;
- option_code_hash_lookup(&default_requested_options[9],
- dhcpv6_universe.code_hash,
- &code, 0, MDL);
- if (default_requested_options[9] == NULL) {
- log_fatal("Unable to find option definition for "
- "index %u during default parameter request "
- "assembly.", code);
- }
- code = D6O_DHCP4_O_DHCP6_SERVER;
- option_code_hash_lookup(&default_requested_options[10],
- dhcpv6_universe.code_hash,
- &code, 0, MDL);
- if (default_requested_options[10] == NULL) {
+ }
+#endif
+
+ for (code = 0 ; code <= last_index ; code++) {
+ if (default_requested_options[code] == NULL)
log_fatal("Unable to find option definition for "
"index %u during default parameter request "
"assembly.", code);
- }
}
-#endif
-
+
/* Initialize the top level client configuration. */
memset (&top_level_config, 0, sizeof top_level_config);
diff --git a/client/dhclient.c b/client/dhclient.c
index 6e2480eb..5f0de860 100644
--- a/client/dhclient.c
+++ b/client/dhclient.c
@@ -892,12 +892,6 @@ void run_stateless(int exit_mode, u_int16_t port)
usage("No interfaces available for stateless command: %s", "-S");
/* Parse the dhclient.conf file. */
-#ifdef DHCP4o6
- if (dhcpv4_over_dhcpv6) {
- /* Mark we want to request IRT too! */
- dhcpv4_over_dhcpv6++;
- }
-#endif
read_client_conf();
/* Parse the lease database. */