From: Marcin Siodelski Date: Wed, 6 Mar 2019 15:47:00 +0000 (+0100) Subject: [#488,!259] Parse siaddr, sname and boot-file-name in shared network parser. X-Git-Tag: 494-dhcp4configparser-sharednetworkssanitychecks-is-buggy_base~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=076e3663450000fedd290febef3e47692d7029da;p=thirdparty%2Fkea.git [#488,!259] Parse siaddr, sname and boot-file-name in shared network parser. --- diff --git a/src/lib/dhcpsrv/parsers/shared_network_parser.cc b/src/lib/dhcpsrv/parsers/shared_network_parser.cc index 283ad68ecf..712c2f570d 100644 --- a/src/lib/dhcpsrv/parsers/shared_network_parser.cc +++ b/src/lib/dhcpsrv/parsers/shared_network_parser.cc @@ -6,6 +6,7 @@ #include +#include #include #include #include @@ -15,6 +16,7 @@ #include #include +using namespace isc::asiolink; using namespace isc::data; namespace isc { @@ -72,6 +74,57 @@ SharedNetwork4Parser::parse(const data::ConstElementPtr& shared_network_data) { "authoritative")); } + // Set next-server + if (shared_network_data->contains("next-server")) { + std::string next_server; + try { + next_server = getString(shared_network_data, "next-server"); + if (!next_server.empty()) { + shared_network->setSiaddr(IOAddress(next_server)); + } + } catch (...) { + ConstElementPtr next = shared_network_data->get("next-server"); + std::string pos; + if (next) { + pos = next->getPosition().str(); + } else { + pos = shared_network_data->getPosition().str(); + } + isc_throw(DhcpConfigError, "invalid parameter next-server : " + << next_server << "(" << pos << ")"); + } + } + + // Set server-hostname. + if (shared_network_data->contains("server-hostname")) { + std::string sname = getString(shared_network_data, "server-hostname"); + if (!sname.empty()) { + if (sname.length() >= Pkt4::MAX_SNAME_LEN) { + ConstElementPtr error = shared_network_data->get("server-hostname"); + isc_throw(DhcpConfigError, "server-hostname must be at most " + << Pkt4::MAX_SNAME_LEN - 1 << " bytes long, it is " + << sname.length() << " (" + << error->getPosition() << ")"); + } + shared_network->setSname(sname); + } + } + + // Set boot-file-name. + if (shared_network_data->contains("boot-file-name")) { + std::string filename = getString(shared_network_data, "boot-file-name"); + if (!filename.empty()) { + if (filename.length() > Pkt4::MAX_FILE_LEN) { + ConstElementPtr error = shared_network_data->get("boot-file-name"); + isc_throw(DhcpConfigError, "boot-file-name must be at most " + << Pkt4::MAX_FILE_LEN - 1 << " bytes long, it is " + << filename.length() << " (" + << error->getPosition() << ")"); + } + shared_network->setFilename(filename); + } + } + if (shared_network_data->contains("client-class")) { std::string client_class = getString(shared_network_data, "client-class"); if (!client_class.empty()) { diff --git a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc index 2a7e0dbddd..d52c3d8896 100644 --- a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc +++ b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc @@ -229,9 +229,6 @@ TEST_F(SharedNetwork4ParserTest, parse) { ASSERT_NO_THROW(network = parser.parse(config_element)); ASSERT_TRUE(network); - /// @todo Validate next-server, server-hostname, boot-file-name once - /// they become a part of the shared network. - // Check basic parameters. EXPECT_TRUE(network->getAuthoritative()); EXPECT_EQ("srv1", network->getClientClass().get()); @@ -243,6 +240,9 @@ TEST_F(SharedNetwork4ParserTest, parse) { EXPECT_TRUE(network->getCalculateTeeTimes()); EXPECT_EQ(0.345, network->getT1Percent()); EXPECT_EQ(0.721, network->getT2Percent()); + EXPECT_EQ("/dev/null", network->getFilename().get()); + EXPECT_EQ("10.0.0.1", network->getSiaddr().get().toText()); + EXPECT_EQ("example.org", network->getSname().get()); // Relay information. auto relay_info = network->getRelayInfo();