From: Marcin Siodelski Date: Fri, 12 Apr 2019 09:27:49 +0000 (+0200) Subject: [#517,!301] Shared network parser supports reservation-mode parameter. X-Git-Tag: Kea-1.6.0-beta~259 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e6533001e9d850432254d3cfe995a4f7abcee6e2;p=thirdparty%2Fkea.git [#517,!301] Shared network parser supports reservation-mode parameter. --- diff --git a/src/lib/dhcpsrv/parsers/base_network_parser.cc b/src/lib/dhcpsrv/parsers/base_network_parser.cc index a48299a0da..6cbbf9717d 100644 --- a/src/lib/dhcpsrv/parsers/base_network_parser.cc +++ b/src/lib/dhcpsrv/parsers/base_network_parser.cc @@ -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 diff --git a/src/lib/dhcpsrv/parsers/base_network_parser.h b/src/lib/dhcpsrv/parsers/base_network_parser.h index 61cadf287c..5910f85216 100644 --- a/src/lib/dhcpsrv/parsers/base_network_parser.h +++ b/src/lib/dhcpsrv/parsers/base_network_parser.h @@ -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 diff --git a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc index acbee86c10..d1c061d962 100644 --- a/src/lib/dhcpsrv/parsers/dhcp_parsers.cc +++ b/src/lib/dhcpsrv/parsers/dhcp_parsers.cc @@ -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")) { diff --git a/src/lib/dhcpsrv/parsers/shared_network_parser.cc b/src/lib/dhcpsrv/parsers/shared_network_parser.cc index 0482dc3d10..15fd80d912 100644 --- a/src/lib/dhcpsrv/parsers/shared_network_parser.cc +++ b/src/lib/dhcpsrv/parsers/shared_network_parser.cc @@ -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) { diff --git a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc index d52c3d8896..9b04036a6b 100644 --- a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc +++ b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc @@ -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();