]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#517,!301] Shared network parser supports reservation-mode parameter.
authorMarcin Siodelski <marcin@isc.org>
Fri, 12 Apr 2019 09:27:49 +0000 (11:27 +0200)
committerMarcin Siodelski <marcin@isc.org>
Tue, 16 Apr 2019 09:11:07 +0000 (11:11 +0200)
src/lib/dhcpsrv/parsers/base_network_parser.cc
src/lib/dhcpsrv/parsers/base_network_parser.h
src/lib/dhcpsrv/parsers/dhcp_parsers.cc
src/lib/dhcpsrv/parsers/shared_network_parser.cc
src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc

index a48299a0daf507f8ee894e5eff5aa84f276d9faa..6cbbf9717dbea817e7845ccc2c0f35e942367316 100644 (file)
@@ -77,6 +77,22 @@ BaseNetworkParser::parseTeePercents(const ConstElementPtr& network_data,
     network->setT1Percent(t1_percent);
 }
 
+void
+BaseNetworkParser::parseHostReservationMode(const data::ConstElementPtr& network_data,
+                                            NetworkPtr& network) {
+    if (network_data->contains("reservation-mode")) {
+        try {
+            std::string hr_mode = getString(network_data, "reservation-mode");
+            network->setHostReservationMode(Network::hrModeFromString(hr_mode));
+        } catch (const BadValue& ex) {
+            isc_throw(DhcpConfigError, "invalid reservation-mode parameter: "
+                      << ex.what() << " (" << getPosition("reservation-mode",
+                                                          network_data) << ")");
+        }
+    }
+}
+
+
 
 } // end of namespace isc::dhcp
 } // end of namespace isc
index 61cadf287c6a61e248f3f17d25ab23bc45ebb039..5910f85216371abc50f1be521bb466c078189a33 100644 (file)
@@ -49,6 +49,15 @@ protected:
     /// invalid.
     void parseTeePercents(const data::ConstElementPtr& network_data,
                           NetworkPtr& network);
+
+    /// @brief Parses host reservation mode.
+    //
+    /// @param shared_network_data Data element holding shared network
+    /// configuration to be parsed.
+    /// @param [out] network Pointer to a network in which parsed data is
+    /// to be stored.
+    void parseHostReservationMode(const data::ConstElementPtr& network_data,
+                                  NetworkPtr& network);
 };
 
 } // end of namespace isc::dhcp
index acbee86c1069234cf5a7e035ae40868934705317..d1c061d962d4eb9084ccf391e6de9ff89a0cbfb1 100644 (file)
@@ -801,16 +801,7 @@ Subnet4ConfigParser::initSubnet(data::ConstElementPtr params,
     }
 
     // Let's set host reservation mode.
-    if (params->contains("reservation-mode")) {
-        try {
-            std::string hr_mode = getString(params, "reservation-mode");
-            subnet4->setHostReservationMode(Network::hrModeFromString(hr_mode));
-        } catch (const BadValue& ex) {
-            isc_throw(DhcpConfigError, "Failed to process specified value "
-                      " of reservation-mode parameter: " << ex.what()
-                      << "(" << getPosition("reservation-mode", params) << ")");
-        }
-    }
+    parseHostReservationMode(params, network);
 
     // Try setting up client class.
     if (params->contains("client-class")) {
@@ -1227,16 +1218,7 @@ Subnet6ConfigParser::initSubnet(data::ConstElementPtr params,
 
     // Let's set host reservation mode. If not specified, the default value of
     // all will be used.
-    if (params->contains("reservation-mode")) {
-        try {
-            std::string hr_mode = getString(params, "reservation-mode");
-            subnet6->setHostReservationMode(Network::hrModeFromString(hr_mode));
-        } catch (const BadValue& ex) {
-            isc_throw(DhcpConfigError, "Failed to process specified value "
-                      " of reservation-mode parameter: " << ex.what()
-                      << "(" << getPosition("reservation-mode", params) << ")");
-        }
-    }
+    parseHostReservationMode(params, network);
 
     // Try setting up client class.
     if (params->contains("client-class")) {
index 0482dc3d106eed35deb036609bc9f2674cf0062f..15fd80d91245ce825dfa0a3576279ad17e9e098f 100644 (file)
@@ -162,6 +162,9 @@ SharedNetwork4Parser::parse(const data::ConstElementPtr& shared_network_data) {
             }
         }
 
+        // reservation-mode
+        parseHostReservationMode(shared_network_data, network);
+
         parseTeePercents(shared_network_data, network);
 
     } catch (const DhcpConfigError&) {
@@ -271,6 +274,9 @@ SharedNetwork6Parser::parse(const data::ConstElementPtr& shared_network_data) {
             }
         }
 
+        // reservation-mode
+        parseHostReservationMode(shared_network_data, network);
+
         parseTeePercents(shared_network_data, network);
 
     } catch (const std::exception& ex) {
index d52c3d88967857dcf49b6b039ce4765b58a65f87..9b04036a6b380c43bc8a9a81208c66be00889b2d 100644 (file)
@@ -243,6 +243,7 @@ TEST_F(SharedNetwork4ParserTest, parse) {
     EXPECT_EQ("/dev/null", network->getFilename().get());
     EXPECT_EQ("10.0.0.1", network->getSiaddr().get().toText());
     EXPECT_EQ("example.org", network->getSname().get());
+    EXPECT_EQ(Network::HR_OUT_OF_POOL, network->getHostReservationMode());
 
     // Relay information.
     auto relay_info = network->getRelayInfo();