]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[5360] client-class and match-client-id params on shared-network level
authorTomek Mrugalski <tomasz@isc.org>
Fri, 15 Sep 2017 18:00:40 +0000 (20:00 +0200)
committerTomek Mrugalski <tomasz@isc.org>
Fri, 15 Sep 2017 18:00:40 +0000 (20:00 +0200)
src/bin/dhcp4/dhcp4_parser.yy
src/bin/dhcp6/dhcp6_parser.yy
src/lib/dhcpsrv/parsers/shared_network_parser.cc
src/lib/dhcpsrv/parsers/simple_parser4.cc
src/lib/dhcpsrv/parsers/simple_parser6.cc
src/lib/dhcpsrv/tests/shared_network_parser_unittest.cc

index 8165add8bcd95dcc0d047a48b4265b2fd2ea2c86..062fd59d836b7e73d5b42388a9a6126015e54531 100644 (file)
@@ -1023,7 +1023,7 @@ shared_network_param: name
                     | next_server
                     | relay
                     | reservation_mode
-                    | client_classes
+                    | client_class
                     | valid_lifetime
                     | unknown_map_entry
                     ;
index 7c791bf20be50706deac9cfe6d8af8d966f1ed22..5b59e0dc5b5148adf2eb272918d4f6512aa41ec2 100644 (file)
@@ -1009,7 +1009,7 @@ shared_network_param: name
                     | option_data_list
                     | relay
                     | reservation_mode
-                    | client_classes
+                    | client_class
                     | preferred_lifetime
                     | rapid_commit
                     | valid_lifetime
index 632228c2a9784f062fb7ff6c6a783b2c185553a7..0dc74cbbfcb1a329fc15003036b220fe5d126e8c 100644 (file)
@@ -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");
 
index 21a2bcbcae89b70a7363dbf56a12868ac728cee7..f30dd0cfbce6927ca533c597eb51109edfb058d3 100644 (file)
@@ -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",
index a041c55b97ab1cd445c30c2d6351b45ea47de960..a4592cf5202fd755844897d47abe7ccbe0943b05 100644 (file)
@@ -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",
index 218029f1e6ccb93314cfd025122574deaaf39aa2..d8cc6313f1806ff24b64b5682d779cc994028d11 100644 (file)
@@ -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