16 #include <boost/foreach.hpp>
28 if (getBySubnetId(subnet->getID())) {
30 << subnet->getID() <<
"' is already in use");
32 }
else if (getByPrefix(subnet->toText())) {
36 << subnet->toText() <<
"' already exists");
40 .arg(subnet->toText());
41 subnets_.push_back(subnet);
47 auto subnet_it = index.find(subnet->getID());
48 if (subnet_it == index.end()) {
52 index.erase(subnet_it);
55 .arg(subnet->toText());
59 CfgSubnets6::getBySubnetId(
const SubnetID& subnet_id)
const {
61 auto subnet_it = index.find(subnet_id);
62 return ((subnet_it != index.cend()) ? (*subnet_it) :
ConstSubnet6Ptr());
66 CfgSubnets6::getByPrefix(
const std::string& subnet_text)
const {
68 auto subnet_it = index.find(subnet_text);
69 return ((subnet_it != index.cend()) ? (*subnet_it) :
ConstSubnet6Ptr());
73 CfgSubnets6::initSelector(
const Pkt6Ptr& query) {
82 if (!query->relay_info_.empty()) {
92 Pkt6::RELAY_GET_FIRST);
140 const bool is_relay_address)
const {
144 if (is_relay_address) {
145 for (Subnet6Collection::const_iterator subnet = subnets_.begin();
146 subnet != subnets_.end(); ++subnet) {
150 if (is_relay_address &&
151 ((*subnet)->hasRelayAddress(address)) &&
152 (*subnet)->clientSupported(client_classes)) {
154 DHCPSRV_CFGMGR_SUBNET6_RELAY)
155 .arg((*subnet)->toText()).arg(address.
toText());
164 for (Subnet6Collection::const_iterator subnet = subnets_.begin();
165 subnet != subnets_.end(); ++subnet) {
166 if ((*subnet)->inRange(address) &&
167 (*subnet)->clientSupported(client_classes)) {
169 .arg((*subnet)->toText()).arg(address.
toText());
180 CfgSubnets6::selectSubnet(
const std::string& iface_name,
184 if (!iface_name.empty()) {
185 for (Subnet6Collection::const_iterator subnet = subnets_.begin();
186 subnet != subnets_.end(); ++subnet) {
191 if ((iface_name == (*subnet)->getIface()) &&
192 (*subnet)->clientSupported(client_classes)) {
195 DHCPSRV_CFGMGR_SUBNET6_IFACE)
196 .arg((*subnet)->toText()).arg(iface_name);
207 CfgSubnets6::selectSubnet(
const OptionPtr& interface_id,
208 const ClientClasses& client_classes)
const {
212 for (Subnet6Collection::const_iterator subnet = subnets_.begin();
213 subnet != subnets_.end(); ++subnet) {
217 if ((*subnet)->getInterfaceId() &&
218 (*subnet)->getInterfaceId()->equals(interface_id) &&
219 (*subnet)->clientSupported(client_classes)) {
222 DHCPSRV_CFGMGR_SUBNET6_IFACE_ID)
223 .arg((*subnet)->toText());
237 for (
auto subnet = subnets_.begin(); subnet != subnets_.end(); ++subnet) {
238 if ((*subnet)->getID() ==
id) {
246 CfgSubnets6::removeStatistics() {
249 StatsMgr& stats_mgr = StatsMgr::instance();
251 for (Subnet6Collection::const_iterator subnet6 = subnets_.begin();
252 subnet6 != subnets_.end(); ++subnet6) {
253 SubnetID subnet_id = (*subnet6)->getID();
254 stats_mgr.
del(StatsMgr::generateName(
"subnet", subnet_id,
"total-nas"));
256 stats_mgr.
del(StatsMgr::generateName(
"subnet", subnet_id,
259 stats_mgr.
del(StatsMgr::generateName(
"subnet", subnet_id,
"total-pds"));
261 stats_mgr.
del(StatsMgr::generateName(
"subnet", subnet_id,
264 stats_mgr.
del(StatsMgr::generateName(
"subnet", subnet_id,
265 "declined-addresses"));
267 stats_mgr.
del(StatsMgr::generateName(
"subnet", subnet_id,
268 "declined-reclaimed-addresses"));
270 stats_mgr.
del(StatsMgr::generateName(
"subnet", subnet_id,
271 "reclaimed-leases"));
276 CfgSubnets6::updateStatistics() {
279 StatsMgr& stats_mgr = StatsMgr::instance();
281 for (Subnet6Collection::const_iterator subnet6 = subnets_.begin();
282 subnet6 != subnets_.end(); ++subnet6) {
283 SubnetID subnet_id = (*subnet6)->getID();
285 stats_mgr.
setValue(StatsMgr::generateName(
"subnet", subnet_id,
288 ((*subnet6)->getPoolCapacity(Lease::TYPE_NA)));
290 stats_mgr.
setValue(StatsMgr::generateName(
"subnet", subnet_id,
293 ((*subnet6)->getPoolCapacity(Lease::TYPE_PD)));
297 if (subnets_.begin() != subnets_.end()) {
298 LeaseMgrFactory::instance().recountLeaseStats6();
303 CfgSubnets6::toElement()
const {
306 for (Subnet6Collection::const_iterator subnet = subnets_.cbegin();
307 subnet != subnets_.cend(); ++subnet) {
308 result->add((*subnet)->toElement());