}
// Checks if the known-clients field is indeed used for pool selection.
-TEST_F(Dhcpv4SrvTest, clientPoolKnown) {
+// Unknown variant.
+TEST_F(Dhcpv4SrvTest, clientPoolUnknown) {
IfaceMgrTestConfig test_config(true);
IfaceMgr::instance().openSockets4();
EXPECT_EQ("192.0.3.1", offer->getYiaddr().toText());
}
+// Checks if the known-clients field is indeed used for pool selection.
+// Known variant.
+TEST_F(Dhcpv4SrvTest, clientPoolKnown) {
+ IfaceMgrTestConfig test_config(true);
+ IfaceMgr::instance().openSockets4();
+
+ NakedDhcpv4Srv srv(0);
+
+ // This test configures 2 pools.
+ string config = "{ \"interfaces-config\": {"
+ " \"interfaces\": [ \"*\" ]"
+ "},"
+ "\"rebind-timer\": 2000, "
+ "\"renew-timer\": 1000, "
+ "\"subnet4\": [ "
+ "{ \"pools\": [ { "
+ " \"pool\": \"192.0.2.1 - 192.0.2.100\", "
+ " \"known-clients\": \"never\" }, "
+ " { \"pool\": \"192.0.3.1 - 192.0.3.100\", "
+ " \"known-clients\": \"only\" } ], "
+ " \"reservations\": [ { "
+ " \"hw-address\": \"00:11:22:33:44:55\", "
+ " \"hostname\": \"foo\" } ], "
+ " \"subnet\": \"192.0.0.0/16\" } "
+ "],"
+ "\"valid-lifetime\": 4000 }";
+
+ ConstElementPtr json;
+ ASSERT_NO_THROW(json = parseDHCP4(config, true));
+
+ ConstElementPtr status;
+ EXPECT_NO_THROW(status = configureDhcp4Server(srv, json));
+
+ CfgMgr::instance().commit();
+
+ // check if returned status is OK
+ ASSERT_TRUE(status);
+ comment_ = config::parseAnswer(rcode_, status);
+ ASSERT_EQ(0, rcode_);
+
+ // Create a simple packet
+ Pkt4Ptr dis = Pkt4Ptr(new Pkt4(DHCPDISCOVER, 1234));
+ const HWAddr& hw = HWAddr::fromText("00:11:22:33:44:55");
+ HWAddrPtr hw_addr(new HWAddr(hw));
+ dis->setHWAddr(hw_addr);
+ dis->setRemoteAddr(IOAddress("192.0.2.1"));
+ dis->setCiaddr(IOAddress("192.0.2.1"));
+ dis->setIface("eth0");
+ OptionPtr clientid = generateClientId();
+ dis->addOption(clientid);
+
+ // First pool requires no reservation so the second will be used
+ Pkt4Ptr offer = srv.processDiscover(dis);
+ ASSERT_TRUE(offer);
+ EXPECT_EQ(DHCPOFFER, offer->getType());
+ EXPECT_EQ("192.0.3.1", offer->getYiaddr().toText());
+}
+
// Verifies last resort option 43 is backward compatible
TEST_F(Dhcpv4SrvTest, option43LastResort) {
IfaceMgrTestConfig test_config(true);
}
}
+ /// @brief Create a solicit
+ Pkt6Ptr createSolicit(std::string remote_addr = "fe80::abcd") {
+ OptionPtr clientid = generateClientId();
+ Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234));
+ query->setRemoteAddr(IOAddress(remote_addr));
+ query->addOption(clientid);
+ query->setIface("eth1");
+ query->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000));
+ return (query);
+ }
+
/// @brief Interface Manager's fake configuration control.
IfaceMgrTestConfig iface_mgr_test_config_;
};
ASSERT_NO_THROW(configure(config));
// Create packets with enough to select the subnet
- OptionPtr clientid = generateClientId();
- Pkt6Ptr query1(new Pkt6(DHCPV6_SOLICIT, 1234));
- query1->setRemoteAddr(IOAddress("fe80::abcd"));
- query1->addOption(clientid);
- query1->setIface("eth1");
- query1->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000));
- Pkt6Ptr query2(new Pkt6(DHCPV6_SOLICIT, 1234));
- query2->setRemoteAddr(IOAddress("fe80::abcd"));
- query2->addOption(clientid);
- query2->setIface("eth1");
- query2->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000));
- Pkt6Ptr query3(new Pkt6(DHCPV6_SOLICIT, 1234));
- query3->setRemoteAddr(IOAddress("fe80::abcd"));
- query3->addOption(clientid);
- query3->setIface("eth1");
- query3->addOption(generateIA(D6O_IA_NA, 345, 1500, 3000));
+ Pkt6Ptr query1 = createSolicit();
+ Pkt6Ptr query2 = createSolicit();
+ Pkt6Ptr query3 = createSolicit();
// Create and add an ORO option to the first 2 queries
OptionUint16ArrayPtr oro(new OptionUint16Array(Option::V6, D6O_ORO));
// Create a packet with enough to select the subnet and go through
// the SOLICIT processing
- Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234));
- query->setRemoteAddr(IOAddress("fe80::abcd"));
- OptionPtr clientid = generateClientId();
- query->addOption(clientid);
- query->setIface("eth1");
- query->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000));
+ Pkt6Ptr query = createSolicit();
// Create and add an ORO option to the query
OptionUint16ArrayPtr oro(new OptionUint16Array(Option::V6, D6O_ORO));
// Create a packet with enough to select the subnet and go through
// the SOLICIT processing
- Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234));
- query->setRemoteAddr(IOAddress("fe80::abcd"));
- OptionPtr clientid = generateClientId();
- query->addOption(clientid);
- query->setIface("eth1");
- query->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000));
+ Pkt6Ptr query = createSolicit();
// Create and add an ORO option to the query
OptionUint16ArrayPtr oro(new OptionUint16Array(Option::V6, D6O_ORO));
// Create a packet with enough to select the subnet and go through
// the SOLICIT processing
- Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234));
- query->setRemoteAddr(IOAddress("fe80::abcd"));
- OptionPtr clientid = generateClientId();
- query->addOption(clientid);
- query->setIface("eth1");
- query->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000));
+ Pkt6Ptr query = createSolicit();
// Create and add an ORO option to the query
OptionUint16ArrayPtr oro(new OptionUint16Array(Option::V6, D6O_ORO));
// Create a packet with enough to select the subnet and go through
// the SOLICIT processing
- Pkt6Ptr query(new Pkt6(DHCPV6_SOLICIT, 1234));
- query->setRemoteAddr(IOAddress("fe80::abcd"));
- OptionPtr clientid = generateClientId();
- query->addOption(clientid);
- query->setIface("eth1");
- query->addOption(generateIA(D6O_IA_NA, 123, 1500, 3000));
+ Pkt6Ptr query = createSolicit();
// Do not add an ORO.
OptionPtr oro = query->getOption(D6O_ORO);
ASSERT_NO_THROW(configure(config));
- 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);
+ Pkt6Ptr sol = createSolicit("2001:db8:1::3");
// This discover does not belong to foo class, so it will not
// be serviced
ASSERT_NO_THROW(configure(config));
- OptionPtr clientid = generateClientId();
- Pkt6Ptr query1 = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234));
- query1->setRemoteAddr(IOAddress("2001:db8:1::3"));
- query1->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000));
- query1->addOption(clientid);
- query1->setIface("eth1");
- Pkt6Ptr query2 = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234));
- query2->setRemoteAddr(IOAddress("2001:db8:1::3"));
- query2->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000));
- query2->addOption(clientid);
- query2->setIface("eth1");
- Pkt6Ptr query3 = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234));
- query3->setRemoteAddr(IOAddress("2001:db8:1::3"));
- query3->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000));
- query3->addOption(clientid);
- query3->setIface("eth1");
+ Pkt6Ptr query1 = createSolicit("2001:db8:1::3");
+ Pkt6Ptr query2 = createSolicit("2001:db8:1::3");
+ Pkt6Ptr query3 = createSolicit("2001:db8:1::3");
// This discover does not belong to foo class, so it will not
// be serviced
ASSERT_NO_THROW(configure(config));
- OptionPtr clientid1 = generateClientId();
- Pkt6Ptr query1 = Pkt6Ptr(new Pkt6(DHCPV6_SOLICIT, 1234));
- query1->setRemoteAddr(IOAddress("2001:db8:1::3"));
- query1->addOption(generateIA(D6O_IA_NA, 234, 1500, 3000));
- query1->addOption(clientid1);
- query1->setIface("eth1");
+ Pkt6Ptr query1 = createSolicit("2001:db8:1::3");
// First pool requires reservation so the second will be used
srv.classifyPacket(query1);
NakedDhcpv6Srv srv(0);
// Let's create a SOLICIT.
- 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);
+ Pkt6Ptr sol = createSolicit("2001:db8:1::3");
// Now let's add a vendor-class with id=1234 and content "foo"
OptionVendorClassPtr vendor_class(new OptionVendorClass(Option::V6, 1234));
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);
+ Pkt6Ptr sol = createSolicit("2001:db8:1::3");
// Now pretend the packet came via one relay.
Pkt6::RelayInfo relay;