summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Markwalder <tmark@isc.org>2016-11-01 14:05:24 -0400
committerThomas Markwalder <tmark@isc.org>2016-11-01 14:05:24 -0400
commite0735300c02e9ba47605a174ea3a3f79e98cda28 (patch)
tree0893291c861aae64c09f63d0d5456825c91c9593
parent6077a4bba8481ae0914cdc7a7ccf0ac05fcdedfe (diff)
downloadisc-dhcp-e0735300c02e9ba47605a174ea3a3f79e98cda28.tar.gz
[master] DHCPINFORM response now includes options down to the pool scope
Merges in rt43219.
-rw-r--r--RELNOTES6
-rw-r--r--server/dhcp.c17
2 files changed, 21 insertions, 2 deletions
diff --git a/RELNOTES b/RELNOTES
index 1e3b124e..6f6e274b 100644
--- a/RELNOTES
+++ b/RELNOTES
@@ -140,6 +140,12 @@ by Eric Young (eay@cryptsoft.com).
section in the README file for the recommended procedure.
[ISC-Bugs #29402]
+- When replying to a DHCPINFORM, the server will now include options specified
+ at the pool scope, provided the ciaddr field of the DHCPINFORM is populated.
+ Prior to this the server only evaluated options down to the subnet scope.
+ Thanks to Fernando Soto at BlueCat Networks for reporting the issue.
+ [ISC-Bugs #43219]
+
Changes since 4.3.0 (bug fixes)
- Tidy up several small tickets.
diff --git a/server/dhcp.c b/server/dhcp.c
index a490f635..af456580 100644
--- a/server/dhcp.c
+++ b/server/dhcp.c
@@ -1085,6 +1085,7 @@ void dhcpinform (packet, ms_nulltp)
#if defined (DEBUG_INFORM_HOST)
int h_w_fixed_addr = 0;
#endif
+ struct lease* cip_lease = NULL;
/* The client should set ciaddr to its IP address, but apparently
it's common for clients not to do this, so we'll use their IP
@@ -1231,11 +1232,23 @@ void dhcpinform (packet, ms_nulltp)
maybe_return_agent_options(packet, options);
- /* Execute statements in scope starting with the subnet scope. */
+ /* If we have ciaddr, find its lease so we can find its pool. */
+ if (zeroed_ciaddr == ISC_FALSE) {
+ find_lease_by_ip_addr (&cip_lease, cip, MDL);
+ }
+
+ /* Execute statements starting at the pool scope if we can
+ * otherwise the subnet scope is a far as we can go. */
execute_statements_in_scope(NULL, packet, NULL, NULL,
packet->options, options,
- &global_scope, subnet->group,
+ &global_scope,
+ (cip_lease != NULL &&
+ cip_lease->pool != NULL ?
+ cip_lease->pool->group : subnet->group),
NULL, NULL);
+ if (cip_lease) {
+ lease_dereference (&cip_lease, MDL);
+ }
/* Execute statements in the class scopes. */
for (i = packet->class_count; i > 0; i--) {