dhcp->set("option-data", cfg_option_->toElement());
// Set subnets and shared networks.
- ConstElementPtr subnets;
+
+ // We have two problems to solve:
+ // - a subnet is unparsed once:
+ // * if it is a plain subnet in the global subnet list
+ // * if it is a member of a shared network in the shared network
+ // subnet list
+ // - unparsed subnets must be kept to add host reservations in them.
+ // Of course this can be done only when subnets are unparsed.
+
+ // The list of all unparsed subnets
+ std::vector<ElementPtr> sn_list;
+
if (family == AF_INET) {
- subnets = cfg_subnets4_->toElement();
- dhcp->set("subnet4", subnets);
+ // Get plain subnets
+ ElementPtr plain_subnets = Element::createList();
+ const Subnet4Collection* subnets = cfg_subnets4_->getAll();
+ for (Subnet4Collection::const_iterator subnet = subnets->cbegin();
+ subnet != subnets->cend(); ++subnet) {
+ // Skip subnets which are in a shared-network
+ SharedNetwork4Ptr network;
+ (*subnet)->getSharedNetwork(network);
+ if (network) {
+ continue;
+ }
+ ElementPtr subnet_cfg = (*subnet)->toElement();
+ sn_list.push_back(subnet_cfg);
+ plain_subnets->add(subnet_cfg);
+ }
+ dhcp->set("subnet4", plain_subnets);
- ConstElementPtr shared_networks = cfg_shared_networks4_->toElement();
+ // Get shared networks
+ ElementPtr shared_networks = cfg_shared_networks4_->toElement();
dhcp->set("shared-networks", shared_networks);
+ // Get subnets in shared network subnet lists
+ const std::vector<ElementPtr> networks = shared_networks->listValue();
+ for (auto network = networks.cbegin();
+ network != networks.cend(); ++network) {
+ const std::vector<ElementPtr> sh_list =
+ (*network)->get("subnet4")->listValue();
+ for (auto subnet = sh_list.cbegin();
+ subnet != sh_list.cend(); ++subnet) {
+ sn_list.push_back(*subnet);
+ }
+ }
+
} else {
- subnets = cfg_subnets6_->toElement();
- dhcp->set("subnet6", subnets);
+ // Get plain subnets
+ ElementPtr plain_subnets = Element::createList();
+ const Subnet6Collection* subnets = cfg_subnets6_->getAll();
+ for (Subnet6Collection::const_iterator subnet = subnets->cbegin();
+ subnet != subnets->cend(); ++subnet) {
+ // Skip subnets which are in a shared-network
+ SharedNetwork6Ptr network;
+ (*subnet)->getSharedNetwork(network);
+ if (network) {
+ continue;
+ }
+ ElementPtr subnet_cfg = (*subnet)->toElement();
+ sn_list.push_back(subnet_cfg);
+ plain_subnets->add(subnet_cfg);
+ }
+ dhcp->set("subnet6", plain_subnets);
- ConstElementPtr shared_networks = cfg_shared_networks6_->toElement();
+ // Get shared networks
+ ElementPtr shared_networks = cfg_shared_networks6_->toElement();
dhcp->set("shared-networks", shared_networks);
+
+ // Get subnets in shared network subnet lists
+ const std::vector<ElementPtr> networks = shared_networks->listValue();
+ for (auto network = networks.cbegin();
+ network != networks.cend(); ++network) {
+ const std::vector<ElementPtr> sh_list =
+ (*network)->get("subnet6")->listValue();
+ for (auto subnet = sh_list.cbegin();
+ subnet != sh_list.cend(); ++subnet) {
+ sn_list.push_back(*subnet);
+ }
+ }
}
// Insert reservations
CfgHostsList resv_list;
resv_list.internalize(cfg_hosts_->toElement());
- const std::vector<ElementPtr>& sn_list = subnets->listValue();
- for (std::vector<ElementPtr>::const_iterator subnet = sn_list.begin();
- subnet != sn_list.end(); ++subnet) {
+ for (std::vector<ElementPtr>::const_iterator subnet = sn_list.cbegin();
+ subnet != sn_list.cend(); ++subnet) {
ConstElementPtr id = (*subnet)->get("id");
if (isNull(id)) {
isc_throw(ToElementError, "subnet has no id");