SubnetConfigParser::SubnetConfigParser(uint16_t family)
: pools_(new PoolStorage()),
address_family_(family),
- options_(new CfgOption()) {
+ options_(new CfgOption()),
+ check_iface_(true) {
relay_info_.reset(new isc::dhcp::Network::RelayInfo());
}
SubnetPtr
-SubnetConfigParser::parse(ConstElementPtr subnet) {
+SubnetConfigParser::parse(ConstElementPtr subnet, bool check_iface) {
+
+ check_iface_ = check_iface;
ConstElementPtr options_params = subnet->get("option-data");
if (options_params) {
}
Subnet4Ptr
-Subnet4ConfigParser::parse(ConstElementPtr subnet) {
+Subnet4ConfigParser::parse(ConstElementPtr subnet, bool check_iface) {
// Check parameters.
checkKeywords(SimpleParser4::SUBNET4_PARAMETERS, subnet);
parser.parse(pools_, pools);
}
- SubnetPtr generic = SubnetConfigParser::parse(subnet);
+ SubnetPtr generic = SubnetConfigParser::parse(subnet, check_iface);
if (!generic) {
// Sanity check: not supposed to fail.
if (params->contains("interface")) {
std::string iface = getString(params, "interface");
if (!iface.empty()) {
- if (!IfaceMgr::instance().getIface(iface)) {
+ if (check_iface_ && !IfaceMgr::instance().getIface(iface)) {
ConstElementPtr error = params->get("interface");
isc_throw(DhcpConfigError, "Specified network interface name " << iface
<< " for subnet " << subnet4->toText()
//**************************** Subnets4ListConfigParser **********************
size_t
-Subnets4ListConfigParser::parse(SrvConfigPtr cfg, ConstElementPtr subnets_list) {
+Subnets4ListConfigParser::parse(SrvConfigPtr cfg,
+ ConstElementPtr subnets_list,
+ bool check_iface) {
size_t cnt = 0;
BOOST_FOREACH(ConstElementPtr subnet_json, subnets_list->listValue()) {
Subnet4ConfigParser parser;
- Subnet4Ptr subnet = parser.parse(subnet_json);
+ Subnet4Ptr subnet = parser.parse(subnet_json, check_iface);
if (subnet) {
// Adding a subnet to the Configuration Manager may fail if the
size_t
Subnets4ListConfigParser::parse(Subnet4Collection& subnets,
- data::ConstElementPtr subnets_list) {
+ data::ConstElementPtr subnets_list,
+ bool check_iface) {
size_t cnt = 0;
BOOST_FOREACH(ConstElementPtr subnet_json, subnets_list->listValue()) {
Subnet4ConfigParser parser;
- Subnet4Ptr subnet = parser.parse(subnet_json);
+ Subnet4Ptr subnet = parser.parse(subnet_json, check_iface);
if (subnet) {
try {
auto ret = subnets.push_back(subnet);
}
Subnet6Ptr
-Subnet6ConfigParser::parse(ConstElementPtr subnet) {
+Subnet6ConfigParser::parse(ConstElementPtr subnet, bool check_iface) {
// Check parameters.
checkKeywords(SimpleParser6::SUBNET6_PARAMETERS, subnet);
parser.parse(pools_, pd_pools);
}
- SubnetPtr generic = SubnetConfigParser::parse(subnet);
+ SubnetPtr generic = SubnetConfigParser::parse(subnet, check_iface);
if (!generic) {
// Sanity check: not supposed to fail.
// Get interface name. If it is defined, then the subnet is available
// directly over specified network interface.
if (!iface.unspecified() && !iface.empty()) {
- if (!IfaceMgr::instance().getIface(iface)) {
+ if (check_iface_ && !IfaceMgr::instance().getIface(iface)) {
ConstElementPtr error = params->get("interface");
isc_throw(DhcpConfigError, "Specified network interface name " << iface
<< " for subnet " << subnet6->toText()
//**************************** Subnet6ListConfigParser ********************
size_t
-Subnets6ListConfigParser::parse(SrvConfigPtr cfg, ConstElementPtr subnets_list) {
+Subnets6ListConfigParser::parse(SrvConfigPtr cfg,
+ ConstElementPtr subnets_list,
+ bool check_iface) {
size_t cnt = 0;
BOOST_FOREACH(ConstElementPtr subnet_json, subnets_list->listValue()) {
Subnet6ConfigParser parser;
- Subnet6Ptr subnet = parser.parse(subnet_json);
+ Subnet6Ptr subnet = parser.parse(subnet_json, check_iface);
// Adding a subnet to the Configuration Manager may fail if the
// subnet id is invalid (duplicate). Thus, we catch exceptions
size_t
Subnets6ListConfigParser::parse(Subnet6Collection& subnets,
- ConstElementPtr subnets_list) {
+ ConstElementPtr subnets_list,
+ bool check_iface) {
size_t cnt = 0;
BOOST_FOREACH(ConstElementPtr subnet_json, subnets_list->listValue()) {
Subnet6ConfigParser parser;
- Subnet6Ptr subnet = parser.parse(subnet_json);
+ Subnet6Ptr subnet = parser.parse(subnet_json, check_iface);
if (subnet) {
try {
auto ret = subnets.push_back(subnet);
/// Subnet6ConfigParser) classes.
///
/// @param subnet pointer to the content of subnet definition
+ /// @param check_iface Check if the specified interface exists in
+ /// the system.
/// @return a pointer to newly created subnet
///
/// @throw isc::DhcpConfigError if subnet configuration parsing failed.
- SubnetPtr parse(isc::data::ConstElementPtr subnet);
+ SubnetPtr parse(isc::data::ConstElementPtr subnet,
+ bool check_iface = true);
/// @brief Instantiates the subnet based on a given IP prefix and prefix
/// length.
/// Pointer to the options configuration.
CfgOptionPtr options_;
+
+ /// Check if the specified interface exists in the system.
+ bool check_iface_;
};
/// @anchor Subnet4ConfigParser
/// Configuration Manager.
///
/// @param subnet A new subnet being configured.
+ /// @param check_iface Check if the specified interface exists in
+ /// the system.
/// @return a pointer to created Subnet4 object
- Subnet4Ptr parse(data::ConstElementPtr subnet);
+ Subnet4Ptr parse(data::ConstElementPtr subnet, bool check_iface = true);
protected:
///
/// @param cfg Pointer to server configuration.
/// @param subnets_list pointer to a list of IPv4 subnets
+ /// @param check_iface Check if the specified interface exists in
+ /// the system.
/// @return number of subnets created
- size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list);
+ size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list,
+ bool check_iface = true);
/// @brief Parses contents of the subnet4 list.
///
/// @param [out] subnets Container where parsed subnets will be stored.
/// @param subnets_list pointer to a list of IPv4 subnets
+ /// @param check_iface Check if the specified interface exists in
+ /// the system.
/// @return Number of subnets created.
size_t parse(Subnet4Collection& subnets,
- data::ConstElementPtr subnets_list);
+ data::ConstElementPtr subnets_list,
+ bool check_iface = true);
};
/// @brief Parser for IPv6 pool definitions.
/// Configuration Manager.
///
/// @param subnet A new subnet being configured.
+ /// @param check_iface Check if the specified interface exists in
+ /// the system.
/// @return a pointer to created Subnet6 object
- Subnet6Ptr parse(data::ConstElementPtr subnet);
+ Subnet6Ptr parse(data::ConstElementPtr subnet, bool check_iface = true);
protected:
/// @brief Issues a DHCP6 server specific warning regarding duplicate subnet
///
/// @param cfg configuration (parsed subnets will be stored here)
/// @param subnets_list pointer to a list of IPv6 subnets
+ /// @param check_iface Check if the specified interface exists in
+ /// the system.
/// @throw DhcpConfigError if CfgMgr rejects the subnet (e.g. subnet-id is a duplicate)
- size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list);
+ size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list,
+ bool check_iface = true);
/// @brief Parses contents of the subnet6 list.
///
/// @param [out] subnets Container where parsed subnets will be stored.
/// @param subnets_list pointer to a list of IPv6 subnets
+ /// @param check_iface Check if the specified interface exists in
+ /// the system.
/// @return Number of subnets created.
size_t parse(Subnet6Collection& subnets,
- data::ConstElementPtr subnets_list);
+ data::ConstElementPtr subnets_list,
+ bool check_iface = true);
};
namespace dhcp {
SharedNetwork4Ptr
-SharedNetwork4Parser::parse(const data::ConstElementPtr& shared_network_data) {
+SharedNetwork4Parser::parse(const data::ConstElementPtr& shared_network_data,
+ bool check_iface) {
SharedNetwork4Ptr shared_network;
try {
// interface is an optional parameter
if (shared_network_data->contains("interface")) {
+ // check_iface applies only on subnets?
shared_network->setIface(getString(shared_network_data, "interface"));
}
// Create parser instance of subnet4.
Subnets4ListConfigParser parser;
Subnet4Collection subnets;
- parser.parse(subnets, json);
+ parser.parse(subnets, json, check_iface);
// Add all returned subnets into shared network.
for (auto subnet = subnets.cbegin(); subnet != subnets.cend();
}
SharedNetwork6Ptr
-SharedNetwork6Parser::parse(const data::ConstElementPtr& shared_network_data) {
+SharedNetwork6Parser::parse(const data::ConstElementPtr& shared_network_data,
+ bool check_iface) {
SharedNetwork6Ptr shared_network;
std::string name;
try {
// Get interface name. If it is defined, then the subnet is available
// directly over specified network interface.
+ // check_iface applies only on subnets?
if (!iface.unspecified() && !iface.empty()) {
shared_network->setIface(iface);
}
// Create parser instance of subnet6.
Subnets6ListConfigParser parser;
Subnet6Collection subnets;
- parser.parse(subnets, json);
+ parser.parse(subnets, json, check_iface);
// Add all returned subnets into shared network.
for (auto subnet = subnets.cbegin(); subnet != subnets.cend();
///
/// @param shared_network_data Data element holding shared network
/// configuration to be parsed.
+ /// @param check_iface Check if the specified interface exists in
+ /// the system.
///
/// @return Pointer to an object representing shared network.
/// @throw DhcpConfigError when shared network configuration is invalid.
SharedNetwork4Ptr
- parse(const data::ConstElementPtr& shared_network_data);
+ parse(const data::ConstElementPtr& shared_network_data,
+ bool check_iface = true);
};
/// @brief Implements parser for IPv6 shared networks.
///
/// @param shared_network_data Data element holding shared network
/// configuration to be parsed.
+ /// @param check_iface Check if the specified interface exists in
+ /// the system.
///
/// @return Pointer to an object representing shared network.
/// @throw DhcpConfigError when shared network configuration is invalid.
SharedNetwork6Ptr
- parse(const data::ConstElementPtr& shared_network_data);
+ parse(const data::ConstElementPtr& shared_network_data,
+ bool check_iface = true);
};
} // enf of namespace isc::dhcp