parser = new StringParser(config_id, string_values_);
} else if (config_id.compare("4o6-interface") == 0) {
parser = new StringParser(config_id, string_values_);
+ } else if (config_id.compare("4o6-interface-id") == 0) {
+ parser = new StringParser(config_id, string_values_);
} else {
isc_throw(NotImplemented, "unsupported parameter: " << config_id);
}
// Don't care. 4o6-subnet is optional.
}
+ // Try 4o6 specific paramter: 4o6-interface-id
+ try {
+ std::string ifaceid = string_values_->getParam("4o6-interface-id");
+ OptionBuffer tmp(ifaceid.begin(), ifaceid.end());
+ OptionPtr opt(new Option(Option::V6, D6O_INTERFACE_ID, tmp));
+ subnet4->get4o6().interface_id_ = opt;
+ subnet4->get4o6().enabled_ = true;
+ } catch (const DhcpConfigError&) {
+
+ }
+
// Try setting up client class (if specified)
try {
string client_class = string_values_->getParam("client-class");
checkResult(status, 0);
// Now check if the configuration was indeed handled and we have
- // expected pool configured.
+ // expected subnet configured...
Subnet4Ptr subnet = CfgMgr::instance().getStagingCfg()->
getCfgSubnets4()->selectSubnet(IOAddress("192.0.2.200"));
ASSERT_TRUE(subnet);
+ // ... and that subnet has 4o6 network interface specified.
Cfg4o6& dhcp4o6 = subnet->get4o6();
EXPECT_TRUE(dhcp4o6.enabled_);
EXPECT_EQ(IOAddress("2001:db8::543"), dhcp4o6.subnet4o6_.first);
EXPECT_EQ("ethX", dhcp4o6.iface4o6_);
}
+// Checks if the DHCPv4 is able to parse the configuration with 4o6 network
+// interface-id.
+TEST_F(Dhcp4ParserTest, 4o6subnetInterfaceId) {
+
+ ConstElementPtr status;
+
+ // Just a plain v4 config (no 4o6 parameters)
+ string config = "{ " + genIfaceConfig() + "," +
+ "\"rebind-timer\": 2000, "
+ "\"renew-timer\": 1000, "
+ "\"subnet4\": [ { "
+ " \"pools\": [ { \"pool\": \"192.0.2.1 - 192.0.2.100\" } ],"
+ " \"subnet\": \"192.0.2.0/24\","
+ " \"4o6-interface-id\": \"vlan123\" } ],"
+ "\"valid-lifetime\": 4000 }";
+
+ ElementPtr json = Element::fromJSON(config);
+
+ EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
+
+ // check if returned status is OK
+ checkResult(status, 0);
+
+ // Now check if the configuration was indeed handled and we have
+ // expected 4o6-interface-id configured.
+ Subnet4Ptr subnet = CfgMgr::instance().getStagingCfg()->
+ getCfgSubnets4()->selectSubnet(IOAddress("192.0.2.200"));
+ ASSERT_TRUE(subnet);
+
+ Cfg4o6& dhcp4o6 = subnet->get4o6();
+ EXPECT_TRUE(dhcp4o6.enabled_);
+ OptionPtr ifaceid = dhcp4o6.interface_id_;
+ ASSERT_TRUE(ifaceid);
+
+ vector<uint8_t> data = ifaceid->getData();
+ const char *exp_data = "vlan123";
+ // Let's convert vlan123 to vector<uint8_t> format.
+ // We need to skip the last \0 byte, thuse sizeof() - 1.
+ vector<uint8_t> exp(exp_data, exp_data + sizeof(exp_data) - 1);
+
+ EXPECT_TRUE(exp == data);
+}
+
+
}
/// Specifies if 4o6 is enabled on this subnet.
bool enabled_;
- /// Specifies the network interface used as subnet selector
+ /// Specifies the network interface used as v4 subnet selector.
std::string iface4o6_;
- /// Specifies the IPv6 subnet used for subnet selection
+ /// Specifies the IPv6 subnet used for v4 subnet selection.
std::pair<asiolink::IOAddress, uint8_t> subnet4o6_;
+
+ /// Specifies the v6 interface-id used for v4 subnet selection.
+ OptionPtr interface_id_;
};
/// @brief A configuration holder for IPv4 subnet.