summaryrefslogtreecommitdiff
path: root/server/dhcp.c
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 /server/dhcp.c
parent6077a4bba8481ae0914cdc7a7ccf0ac05fcdedfe (diff)
downloadisc-dhcp-e0735300c02e9ba47605a174ea3a3f79e98cda28.tar.gz
[master] DHCPINFORM response now includes options down to the pool scope
Merges in rt43219.
Diffstat (limited to 'server/dhcp.c')
-rw-r--r--server/dhcp.c17
1 files changed, 15 insertions, 2 deletions
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--) {