BIND 10 trac3322, updated. 6975ad04e89daa261d03d2d8383a8b960fed3bae [3322] Unit-tests for DHCPv4 implemented.
BIND 10 source code commits
bind10-changes at lists.isc.org
Thu Feb 13 18:10:40 UTC 2014
The branch, trac3322 has been updated
via 6975ad04e89daa261d03d2d8383a8b960fed3bae (commit)
via 6a6d055a324242f2b6986848474c1dfc27bf5a0f (commit)
from 349644e019d4d89c03aee21bfda5dc159d1fe065 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 6975ad04e89daa261d03d2d8383a8b960fed3bae
Author: Tomek Mrugalski <tomasz at isc.org>
Date: Thu Feb 13 19:10:18 2014 +0100
[3322] Unit-tests for DHCPv4 implemented.
commit 6a6d055a324242f2b6986848474c1dfc27bf5a0f
Author: Tomek Mrugalski <tomasz at isc.org>
Date: Thu Feb 13 18:41:22 2014 +0100
[3322] Unit-tests for relay-ip override implemented.
-----------------------------------------------------------------------
Summary of changes:
src/bin/dhcp4/tests/dhcp4_srv_unittest.cc | 149 +++++++++++++++++++++++++++
src/bin/dhcp6/tests/dhcp6_srv_unittest.cc | 155 +++++++++++++++++++++++++++++
2 files changed, 304 insertions(+)
-----------------------------------------------------------------------
diff --git a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc
index ba787aa..cdc9e1f 100644
--- a/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc
+++ b/src/bin/dhcp4/tests/dhcp4_srv_unittest.cc
@@ -3373,6 +3373,155 @@ TEST_F(Dhcpv4SrvTest, clientClassify2) {
EXPECT_TRUE(srv.selectSubnet(dis));
}
+// Checks if relay IP address specified in the relay-info structure in
+// subnet4 is being used properly.
+TEST_F(Dhcpv4SrvTest, relayOverride) {
+
+ NakedDhcpv4Srv srv(0);
+
+ // We have 2 subnets defined. Note that both have a relay address
+ // defined. Both are not belonging to the subnets. That is
+ // important, because if the relay belongs to the subnet, there's
+ // no need to specify relay override.
+ string config = "{ \"interfaces\": [ \"*\" ],"
+ "\"rebind-timer\": 2000, "
+ "\"renew-timer\": 1000, "
+ "\"subnet4\": [ "
+ "{ \"pool\": [ \"192.0.2.2 - 192.0.2.100\" ],"
+ " \"relay\": { "
+ " \"ip-address\": \"192.0.5.1\""
+ " },"
+ " \"subnet\": \"192.0.2.0/24\" }, "
+ "{ \"pool\": [ \"192.0.3.1 - 192.0.3.100\" ],"
+ " \"relay\": { "
+ " \"ip-address\": \"192.0.5.2\""
+ " },"
+ " \"subnet\": \"192.0.3.0/24\" } "
+ "],"
+ "\"valid-lifetime\": 4000 }";
+
+ // Use this config to set up the server
+ ElementPtr json = Element::fromJSON(config);
+ ConstElementPtr status;
+ EXPECT_NO_THROW(status = configureDhcp4Server(srv, json));
+ ASSERT_TRUE(status);
+ comment_ = config::parseAnswer(rcode_, status);
+ ASSERT_EQ(0, rcode_);
+
+ // Let's get the subnet configuration objects
+ const Subnet4Collection* subnets = CfgMgr::instance().getSubnets4();
+ ASSERT_EQ(2, subnets->size());
+
+ // Let's get them for easy reference
+ Subnet4Ptr subnet1 = (*subnets)[0];
+ Subnet4Ptr subnet2 = (*subnets)[1];
+ ASSERT_TRUE(subnet1);
+ ASSERT_TRUE(subnet2);
+
+ // Let's create a packet.
+ Pkt4Ptr dis = Pkt4Ptr(new Pkt4(DHCPDISCOVER, 1234));
+ dis->setRemoteAddr(IOAddress("192.0.2.1"));
+ dis->setIface("eth0");
+ dis->setHops(1);
+ OptionPtr clientid = generateClientId();
+ dis->addOption(clientid);
+
+ // This is just a sanity check, we're using regular method: ciaddr 192.0.2.1
+ // belongs to the first subnet, so it is selected
+ dis->setGiaddr(IOAddress("192.0.2.1"));
+ EXPECT_TRUE(subnet1 == srv.selectSubnet(dis));
+
+ // Relay belongs to the second subnet, so it should be selected.
+ dis->setGiaddr(IOAddress("192.0.3.1"));
+ EXPECT_TRUE(subnet2 == srv.selectSubnet(dis));
+
+ // Now let's check if the relay override for the first subnets works
+ dis->setGiaddr(IOAddress("192.0.5.1"));
+ EXPECT_TRUE(subnet1 == srv.selectSubnet(dis));
+
+ // The same check for the second subnet...
+ dis->setGiaddr(IOAddress("192.0.5.2"));
+ EXPECT_TRUE(subnet2 == srv.selectSubnet(dis));
+
+ // And finally, let's check if mis-matched relay address will end up
+ // in not selecting a subnet at all
+ dis->setGiaddr(IOAddress("192.0.5.3"));
+ EXPECT_FALSE(srv.selectSubnet(dis));
+
+ // Finally, check that the relay override works only with relay address
+ // (GIADDR) and does not affect client address (CIADDR)
+ dis->setGiaddr(IOAddress("0.0.0.0"));
+ dis->setHops(0);
+ dis->setCiaddr(IOAddress("192.0.5.1"));
+ EXPECT_FALSE(srv.selectSubnet(dis));
+}
+
+// Checks if relay IP address specified in the relay-info structure can be
+// used together with client-classification.
+TEST_F(Dhcpv4SrvTest, relayOverrideAndClientClass) {
+
+ NakedDhcpv4Srv srv(0);
+
+ ConstElementPtr status;
+
+ // This test configures 2 subnets. They both are on the same link, so they
+ // have the same relay-ip address. Furthermore, the first subnet is
+ // reserved for clients that belong to class "foo".
+ string config = "{ \"interfaces\": [ \"*\" ],"
+ "\"rebind-timer\": 2000, "
+ "\"renew-timer\": 1000, "
+ "\"subnet4\": [ "
+ "{ \"pool\": [ \"192.0.2.2 - 192.0.2.100\" ],"
+ " \"client-class\": \"foo\", "
+ " \"relay\": { "
+ " \"ip-address\": \"192.0.5.1\""
+ " },"
+ " \"subnet\": \"192.0.2.0/24\" }, "
+ "{ \"pool\": [ \"192.0.3.1 - 192.0.3.100\" ],"
+ " \"relay\": { "
+ " \"ip-address\": \"192.0.5.1\""
+ " },"
+ " \"subnet\": \"192.0.3.0/24\" } "
+ "],"
+ "\"valid-lifetime\": 4000 }";
+
+ // Use this config to set up the server
+ ElementPtr json = Element::fromJSON(config);
+ EXPECT_NO_THROW(status = configureDhcp4Server(srv, json));
+ ASSERT_TRUE(status);
+ comment_ = config::parseAnswer(rcode_, status);
+ ASSERT_EQ(0, rcode_);
+
+ const Subnet4Collection* subnets = CfgMgr::instance().getSubnets4();
+ ASSERT_EQ(2, subnets->size());
+
+ // Let's get them for easy reference
+ Subnet4Ptr subnet1 = (*subnets)[0];
+ Subnet4Ptr subnet2 = (*subnets)[1];
+ ASSERT_TRUE(subnet1);
+ ASSERT_TRUE(subnet2);
+
+ // Let's create a packet.
+ Pkt4Ptr dis = Pkt4Ptr(new Pkt4(DHCPDISCOVER, 1234));
+ dis->setRemoteAddr(IOAddress("192.0.2.1"));
+ dis->setIface("eth0");
+ dis->setHops(1);
+ dis->setGiaddr(IOAddress("192.0.5.1"));
+ OptionPtr clientid = generateClientId();
+ dis->addOption(clientid);
+
+ // This packet does not belong to class foo, so it should be rejected in
+ // subnet[0], even though the relay-ip matches. It should be accepted in
+ // subnet[1], because the subnet matches and there are no class
+ // requirements.
+ EXPECT_TRUE(subnet2 == srv.selectSubnet(dis));
+
+ // Now let's add this packet to class foo and recheck. This time it should
+ // be accepted in the first subnet, because both class and relay-ip match.
+ dis->addClass("foo");
+ EXPECT_TRUE(subnet1 == srv.selectSubnet(dis));
+}
+
// This test verifies that the direct message is dropped when it has been
// received by the server via an interface for which there is no subnet
// configured. It also checks that the message is not dropped (is processed)
diff --git a/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc b/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc
index ea3692e..1a8e12b 100644
--- a/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc
+++ b/src/bin/dhcp6/tests/dhcp6_srv_unittest.cc
@@ -1806,6 +1806,161 @@ TEST_F(Dhcpv6SrvTest, clientClassify2) {
EXPECT_TRUE(srv.selectSubnet(sol));
}
+// Checks if relay IP address specified in the relay-info structure in
+// subnet4 is being used properly.
+TEST_F(Dhcpv6SrvTest, relayOverride) {
+
+ NakedDhcpv6Srv srv(0);
+
+ // We have 2 subnets defined. Note that both have a relay address
+ // defined. Both are not belonging to the subnets. That is
+ // important, because if the relay belongs to the subnet, there's
+ // no need to specify relay override.
+ string config = "{ \"interfaces\": [ \"*\" ],"
+ "\"preferred-lifetime\": 3000,"
+ "\"rebind-timer\": 2000, "
+ "\"renew-timer\": 1000, "
+ "\"subnet6\": [ "
+ " { \"pool\": [ \"2001:db8:1::/64\" ],"
+ " \"subnet\": \"2001:db8:1::/48\", "
+ " \"relay\": { "
+ " \"ip-address\": \"2001:db8:3::1\""
+ " }"
+ " }, "
+ " { \"pool\": [ \"2001:db8:2::/64\" ],"
+ " \"subnet\": \"2001:db8:2::/48\", "
+ " \"relay\": { "
+ " \"ip-address\": \"2001:db8:3::2\""
+ " }"
+ " } "
+ "],"
+ "\"valid-lifetime\": 4000 }";
+
+ // Use this config to set up the server
+ ElementPtr json = Element::fromJSON(config);
+ ConstElementPtr status;
+ EXPECT_NO_THROW(status = configureDhcp6Server(srv, json));
+ ASSERT_TRUE(status);
+ comment_ = config::parseAnswer(rcode_, status);
+ ASSERT_EQ(0, rcode_);
+
+ // Let's get the subnet configuration objects
+ const Subnet6Collection* subnets = CfgMgr::instance().getSubnets6();
+ ASSERT_EQ(2, subnets->size());
+
+ // Let's get them for easy reference
+ Subnet6Ptr subnet1 = (*subnets)[0];
+ Subnet6Ptr subnet2 = (*subnets)[1];
+ ASSERT_TRUE(subnet1);
+ ASSERT_TRUE(subnet2);
+
+ Pkt6Ptr sol = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234));
+ sol->setRemoteAddr(IOAddress("2001:db8:1::3"));
+ sol->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000));
+ OptionPtr clientid = generateClientId();
+ sol->addOption(clientid);
+
+ // Now pretend the packet came via one relay.
+ Pkt6::RelayInfo relay;
+ relay.linkaddr_ = IOAddress("2001:db8:1::1");
+ relay.peeraddr_ = IOAddress("fe80::1");
+
+ sol->relay_info_.push_back(relay);
+
+ // This is just a sanity check, we're using regular method: the relay
+ // belongs to the first (2001:db8:1::/64) subnet, so it's an easy decision.
+ EXPECT_TRUE(subnet1 == srv.selectSubnet(sol));
+
+ // Relay belongs to the second subnet, so it should be selected.
+ sol->relay_info_.back().linkaddr_ = IOAddress("2001:db8:2::1");
+ EXPECT_TRUE(subnet2 == srv.selectSubnet(sol));
+
+ // Now let's check if the relay override for the first subnets works
+ sol->relay_info_.back().linkaddr_ = IOAddress("2001:db8:3::1");
+ EXPECT_TRUE(subnet1 == srv.selectSubnet(sol));
+
+ // Now repeat that for relay matching the second subnet.
+ sol->relay_info_.back().linkaddr_ = IOAddress("2001:db8:3::2");
+ EXPECT_TRUE(subnet2 == srv.selectSubnet(sol));
+
+ // Finally, let's check that completely mismatched relay will not get us
+ // anything
+ sol->relay_info_.back().linkaddr_ = IOAddress("2001:db8:1234::1");
+ EXPECT_FALSE(srv.selectSubnet(sol));
+}
+
+// Checks if relay IP address specified in the relay-info structure can be
+// used together with client-classification.
+TEST_F(Dhcpv6SrvTest, relayOverrideAndClientClass) {
+
+ NakedDhcpv6Srv srv(0);
+
+ // This test configures 2 subnets. They both are on the same link, so they
+ // have the same relay-ip address. Furthermore, the first subnet is
+ // reserved for clients that belong to class "foo".
+ string config = "{ \"interfaces\": [ \"*\" ],"
+ "\"preferred-lifetime\": 3000,"
+ "\"rebind-timer\": 2000, "
+ "\"renew-timer\": 1000, "
+ "\"subnet6\": [ "
+ " { \"pool\": [ \"2001:db8:1::/64\" ],"
+ " \"subnet\": \"2001:db8:1::/48\", "
+ " \"client-class\": \"foo\", "
+ " \"relay\": { "
+ " \"ip-address\": \"2001:db8:3::1\""
+ " }"
+ " }, "
+ " { \"pool\": [ \"2001:db8:2::/64\" ],"
+ " \"subnet\": \"2001:db8:2::/48\", "
+ " \"relay\": { "
+ " \"ip-address\": \"2001:db8:3::1\""
+ " }"
+ " } "
+ "],"
+ "\"valid-lifetime\": 4000 }";
+
+ // Use this config to set up the server
+ ElementPtr json = Element::fromJSON(config);
+ ConstElementPtr status;
+ EXPECT_NO_THROW(status = configureDhcp6Server(srv, json));
+ ASSERT_TRUE(status);
+ comment_ = config::parseAnswer(rcode_, status);
+ ASSERT_EQ(0, rcode_);
+
+ // Let's get the subnet configuration objects
+ const Subnet6Collection* subnets = CfgMgr::instance().getSubnets6();
+ ASSERT_EQ(2, subnets->size());
+
+ // Let's get them for easy reference
+ Subnet6Ptr subnet1 = (*subnets)[0];
+ Subnet6Ptr subnet2 = (*subnets)[1];
+ ASSERT_TRUE(subnet1);
+ ASSERT_TRUE(subnet2);
+
+ Pkt6Ptr sol = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234));
+ sol->setRemoteAddr(IOAddress("2001:db8:1::3"));
+ sol->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000));
+ OptionPtr clientid = generateClientId();
+ sol->addOption(clientid);
+
+ // Now pretend the packet came via one relay.
+ Pkt6::RelayInfo relay;
+ relay.linkaddr_ = IOAddress("2001:db8:3::1");
+ relay.peeraddr_ = IOAddress("fe80::1");
+
+ sol->relay_info_.push_back(relay);
+
+ // This packet does not belong to class foo, so it should be rejected in
+ // subnet[0], even though the relay-ip matches. It should be accepted in
+ // subnet[1], because the subnet matches and there are no class
+ // requirements.
+ EXPECT_TRUE(subnet2 == srv.selectSubnet(sol));
+
+ // Now let's add this packet to class foo and recheck. This time it should
+ // be accepted in the first subnet, because both class and relay-ip match.
+ sol->addClass("foo");
+ EXPECT_TRUE(subnet1 == srv.selectSubnet(sol));
+}
/// @todo: Add more negative tests for processX(), e.g. extend sanityCheck() test
/// to call processX() methods.
More information about the bind10-changes
mailing list