From: Tomek Mrugalski Date: Fri, 15 Sep 2017 18:00:40 +0000 (+0200) Subject: [5360] client-class and match-client-id params on shared-network level X-Git-Tag: trac5073a_base~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=67c386b58271f58344dd85b36dc2f6f79eabc6ad;p=thirdparty%2Fkea.git [5360] client-class and match-client-id params on shared-network level --- diff --git a/src/bin/dhcp4/dhcp4_parser.yy b/src/bin/dhcp4/dhcp4_parser.yy index 8165add8bc..062fd59d83 100644 --- a/src/bin/dhcp4/dhcp4_parser.yy +++ b/src/bin/dhcp4/dhcp4_parser.yy @@ -1023,7 +1023,7 @@ shared_network_param: name | next_server | relay | reservation_mode - | client_classes + | client_class | valid_lifetime | unknown_map_entry ; diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index 7c791bf20b..5b59e0dc5b 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -1009,7 +1009,7 @@ shared_network_param: name | option_data_list | relay | reservation_mode - | client_classes + | client_class | preferred_lifetime | rapid_commit | valid_lifetime diff --git a/src/lib/dhcpsrv/parsers/shared_network_parser.cc b/src/lib/dhcpsrv/parsers/shared_network_parser.cc index 632228c2a9..0dc74cbbfc 100644 --- a/src/lib/dhcpsrv/parsers/shared_network_parser.cc +++ b/src/lib/dhcpsrv/parsers/shared_network_parser.cc @@ -57,6 +57,19 @@ SharedNetwork4Parser::parse(const data::ConstElementPtr& shared_network_data) { shared_network->add(*subnet); } } + + if (shared_network_data->contains("match-client-id")) { + shared_network->setMatchClientId(getBoolean(shared_network_data, + "match-client-id")); + } + + if (shared_network_data->contains("client-class")) { + std::string client_class = getString(shared_network_data, "client-class"); + if (!client_class.empty()) { + shared_network->allowClientClass(client_class); + } + } + } catch (const std::exception& ex) { isc_throw(DhcpConfigError, ex.what() << " (" << shared_network_data->getPosition() << ")"); @@ -88,6 +101,13 @@ SharedNetwork6Parser::parse(const data::ConstElementPtr& shared_network_data) { parser.parse(cfg_option, json); } + if (shared_network_data->contains("client-class")) { + std::string client_class = getString(shared_network_data, "client-class"); + if (!client_class.empty()) { + shared_network->allowClientClass(client_class); + } + } + if (shared_network_data->contains("subnet6")) { auto json = shared_network_data->get("subnet6"); diff --git a/src/lib/dhcpsrv/parsers/simple_parser4.cc b/src/lib/dhcpsrv/parsers/simple_parser4.cc index 21a2bcbcae..f30dd0cfbc 100644 --- a/src/lib/dhcpsrv/parsers/simple_parser4.cc +++ b/src/lib/dhcpsrv/parsers/simple_parser4.cc @@ -118,6 +118,7 @@ const SimpleDefaults SimpleParser4::IFACE4_DEFAULTS = { /// This list is also used for inheriting from global to shared networks /// and from shared networks to subnets within it. const ParamsList SimpleParser4::INHERIT_TO_SUBNET4 = { + "client-class", "interface", "match-client-id", "next-server", diff --git a/src/lib/dhcpsrv/parsers/simple_parser6.cc b/src/lib/dhcpsrv/parsers/simple_parser6.cc index a041c55b97..a4592cf520 100644 --- a/src/lib/dhcpsrv/parsers/simple_parser6.cc +++ b/src/lib/dhcpsrv/parsers/simple_parser6.cc @@ -103,6 +103,7 @@ const SimpleDefaults SimpleParser6::IFACE6_DEFAULTS = { /// This list is also used for inheriting from global to shared networks /// and from shared networks to subnets within it. const ParamsList SimpleParser6::INHERIT_TO_SUBNET6 = { + "client-class", "interface", "interface-id", "preferred-lifetime", diff --git a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc index 218029f1e6..d8cc6313f1 100644 --- a/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc +++ b/src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc @@ -140,6 +140,28 @@ TEST_F(SharedNetwork4ParserTest, missingName) { ASSERT_THROW(network = parser.parse(config_element), DhcpConfigError); } +// This test verifies that it's possible to specify client-class +// and match-client-id on shared-network level. +TEST_F(SharedNetwork4ParserTest, clientClassMatchClientId) { + std::string config = getWorkingConfig(); + ElementPtr config_element = Element::fromJSON(config); + + config_element->set("match-client-id", Element::create(false)); + config_element->set("client-class", Element::create("alpha")); + + // Parse configuration specified above. + SharedNetwork4Parser parser; + SharedNetwork4Ptr network; + network = parser.parse(config_element); + ASSERT_TRUE(network); + + const ClientClasses classes = network->getClientClasses(); + ASSERT_EQ(1, classes.size()); + EXPECT_TRUE(classes.contains("alpha")); + + EXPECT_FALSE(network->getMatchClientId()); +} + /// @brief Test fixture class for SharedNetwork6Parser class. class SharedNetwork6ParserTest : public ::testing::Test { public: @@ -238,5 +260,23 @@ TEST_F(SharedNetwork6ParserTest, parse) { EXPECT_EQ("2001:db8:1::cafe", addresses[0].toText()); } +// This test verifies that it's possible to specify client-class +// on shared-network level. +TEST_F(SharedNetwork6ParserTest, clientClass) { + std::string config = getWorkingConfig(); + ElementPtr config_element = Element::fromJSON(config); + + config_element->set("client-class", Element::create("alpha")); + + // Parse configuration specified above. + SharedNetwork6Parser parser; + SharedNetwork6Ptr network; + network = parser.parse(config_element); + ASSERT_TRUE(network); + + const ClientClasses classes = network->getClientClasses(); + ASSERT_EQ(1, classes.size()); + EXPECT_TRUE(classes.contains("alpha")); +} } // end of anonymous namespace