diff options
author | Thomas Markwalder <tmark@isc.org> | 2016-11-01 14:05:24 -0400 |
---|---|---|
committer | Thomas Markwalder <tmark@isc.org> | 2016-11-01 14:05:24 -0400 |
commit | e0735300c02e9ba47605a174ea3a3f79e98cda28 (patch) | |
tree | 0893291c861aae64c09f63d0d5456825c91c9593 | |
parent | 6077a4bba8481ae0914cdc7a7ccf0ac05fcdedfe (diff) | |
download | isc-dhcp-e0735300c02e9ba47605a174ea3a3f79e98cda28.tar.gz |
[master] DHCPINFORM response now includes options down to the pool scope
Merges in rt43219.
-rw-r--r-- | RELNOTES | 6 | ||||
-rw-r--r-- | server/dhcp.c | 17 |
2 files changed, 21 insertions, 2 deletions
@@ -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--) { |