]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#1405] disable reservatio modes flags if any is explicitly configured
authorRazvan Becheriu <razvan@isc.org>
Thu, 15 Oct 2020 15:43:46 +0000 (18:43 +0300)
committerRazvan Becheriu <razvan@isc.org>
Wed, 18 Nov 2020 13:55:23 +0000 (15:55 +0200)
src/bin/dhcp4/json_config_parser.cc
src/bin/dhcp6/json_config_parser.cc

index c11a96953e88b1efdc12c75f60a78e5913141d54..4f1a844ce4b38be395b5d83a4f6dd881f63fb2cc 100644 (file)
@@ -367,22 +367,22 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set,
         // default values and will insert derived values as well.
         mutable_cfg = boost::const_pointer_cast<Element>(config_set);
 
+        bool found = false;
+        ConstElementPtr reservations_out_of_pool = mutable_cfg->get("reservations-out-of-pool");
+        if (reservations_out_of_pool) {
+            found = true;
+        }
+        ConstElementPtr reservations_in_subnet = mutable_cfg->get("reservations-in-subnet");
+        if (reservations_in_subnet) {
+            found = true;
+        }
+        ConstElementPtr reservations_global = mutable_cfg->get("reservations-global");
+        if (reservations_global) {
+            found = true;
+        }
         ConstElementPtr reservation_mode = mutable_cfg->get("reservation-mode");
         if (reservation_mode) {
             // log warning for deprecated option
-            bool found = false;
-            reservation_mode = mutable_cfg->get("reservations-out-of-pool");
-            if (reservation_mode) {
-                found = true;
-            }
-            reservation_mode = mutable_cfg->get("reservations-in-subnet");
-            if (reservation_mode) {
-                found = true;
-            }
-            reservation_mode = mutable_cfg->get("reservations-global");
-            if (reservation_mode) {
-                found = true;
-            }
             if (found) {
                 isc_throw(DhcpConfigError, "invalid use of both 'reservation-mode'"
                                            " and one of 'reservations-out-of-pool'"
@@ -391,6 +391,19 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set,
             }
         }
 
+        // reset all other reservation flags to overwrite default values.
+        if (found) {
+            if (!reservations_out_of_pool) {
+                mutable_cfg->set("reservations-out-of-pool", Element::create(false));
+            }
+            if (!reservations_in_subnet) {
+                mutable_cfg->set("reservations-in-subnet", Element::create(false));
+            }
+            if (!reservations_global) {
+                mutable_cfg->set("reservations-global", Element::create(false));
+            }
+        }
+
         // Relocate dhcp-ddns parameters that have moved to global scope.
         // Rule is that a global value overrides the dhcp-ddns value, so
         // we need to do this before we apply global defaults.
index 641a8b614541df2f667ff26396491af8ef97858c..b5979dbe4ea1954355d248fd1b0d2995adc86895 100644 (file)
@@ -468,22 +468,22 @@ configureDhcp6Server(Dhcpv6Srv& server, isc::data::ConstElementPtr config_set,
         // default values and will insert derived values as well.
         mutable_cfg = boost::const_pointer_cast<Element>(config_set);
 
+        bool found = false;
+        ConstElementPtr reservations_out_of_pool = mutable_cfg->get("reservations-out-of-pool");
+        if (reservations_out_of_pool) {
+            found = true;
+        }
+        ConstElementPtr reservations_in_subnet = mutable_cfg->get("reservations-in-subnet");
+        if (reservations_in_subnet) {
+            found = true;
+        }
+        ConstElementPtr reservations_global = mutable_cfg->get("reservations-global");
+        if (reservations_global) {
+            found = true;
+        }
         ConstElementPtr reservation_mode = mutable_cfg->get("reservation-mode");
         if (reservation_mode) {
             // log warning for deprecated option
-            bool found = false;
-            reservation_mode = mutable_cfg->get("reservations-out-of-pool");
-            if (reservation_mode) {
-                found = true;
-            }
-            reservation_mode = mutable_cfg->get("reservations-in-subnet");
-            if (reservation_mode) {
-                found = true;
-            }
-            reservation_mode = mutable_cfg->get("reservations-global");
-            if (reservation_mode) {
-                found = true;
-            }
             if (found) {
                 isc_throw(DhcpConfigError, "invalid use of both 'reservation-mode'"
                                            " and one of 'reservations-out-of-pool'"
@@ -492,6 +492,19 @@ configureDhcp6Server(Dhcpv6Srv& server, isc::data::ConstElementPtr config_set,
             }
         }
 
+        // reset all other reservation flags to overwrite default values.
+        if (found) {
+            if (!reservations_out_of_pool) {
+                mutable_cfg->set("reservations-out-of-pool", Element::create(false));
+            }
+            if (!reservations_in_subnet) {
+                mutable_cfg->set("reservations-in-subnet", Element::create(false));
+            }
+            if (!reservations_global) {
+                mutable_cfg->set("reservations-global", Element::create(false));
+            }
+        }
+
         // Relocate dhcp-ddns parameters that have moved to global scope.
         // Rule is that a global value overrides the dhcp-ddns value, so
         // we need to do this before we apply global defaults.