summaryrefslogtreecommitdiff
path: root/server/dhcp.c
diff options
context:
space:
mode:
authorThomas Markwalder <tmark@isc.org>2017-04-12 11:44:59 -0400
committerThomas Markwalder <tmark@isc.org>2017-04-12 11:44:59 -0400
commit0aa74669d97391f0f6d26800c37fbbec6bd52b20 (patch)
tree529a19200e91892bbbf9fc4acbf7c2a9304c2557 /server/dhcp.c
parent970d9b0b1bede8f6b2091ff31cdb6ce1749fcb75 (diff)
downloadisc-dhcp-0aa74669d97391f0f6d26800c37fbbec6bd52b20.tar.gz
[master] Execute pool statements separately in dhcpinform()
Merged 43291a.
Diffstat (limited to 'server/dhcp.c')
-rw-r--r--server/dhcp.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/server/dhcp.c b/server/dhcp.c
index af456580..1109e204 100644
--- a/server/dhcp.c
+++ b/server/dhcp.c
@@ -3,7 +3,7 @@
DHCP Protocol engine. */
/*
- * Copyright (c) 2004-2016 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 2004-2017 by Internet Systems Consortium, Inc. ("ISC")
* Copyright (c) 1995-2003 by Internet Software Consortium
*
* Permission to use, copy, modify, and distribute this software for any
@@ -1085,7 +1085,6 @@ 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
@@ -1232,22 +1231,32 @@ void dhcpinform (packet, ms_nulltp)
maybe_return_agent_options(packet, options);
+ /* Execute statements network statements starting at the subnet level */
+ execute_statements_in_scope(NULL, packet, NULL, NULL,
+ packet->options, options,
+ &global_scope, subnet->group,
+ NULL, NULL);
+
/* If we have ciaddr, find its lease so we can find its pool. */
if (zeroed_ciaddr == ISC_FALSE) {
+ struct lease* cip_lease = NULL;
+
find_lease_by_ip_addr (&cip_lease, cip, MDL);
- }
+
+ /* Overlay with pool options if ciaddr mapped to a lease. */
+ if (cip_lease) {
+ if (cip_lease->pool && cip_lease->pool->group) {
+ execute_statements_in_scope(
+ NULL, packet, NULL, NULL,
+ packet->options, options,
+ &global_scope,
+ cip_lease->pool->group,
+ cip_lease->pool->shared_network->group,
+ NULL);
+ }
- /* 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,
- (cip_lease != NULL &&
- cip_lease->pool != NULL ?
- cip_lease->pool->group : subnet->group),
- NULL, NULL);
- if (cip_lease) {
- lease_dereference (&cip_lease, MDL);
+ lease_dereference (&cip_lease, MDL);
+ }
}
/* Execute statements in the class scopes. */