summaryrefslogtreecommitdiffstats
path: root/src/lib/dhcpsrv/allocator.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/dhcpsrv/allocator.cc')
-rw-r--r--src/lib/dhcpsrv/allocator.cc83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/lib/dhcpsrv/allocator.cc b/src/lib/dhcpsrv/allocator.cc
new file mode 100644
index 0000000..5925689
--- /dev/null
+++ b/src/lib/dhcpsrv/allocator.cc
@@ -0,0 +1,83 @@
+// Copyright (C) 2022-2023 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <config.h>
+#include <dhcpsrv/allocator.h>
+#include <dhcpsrv/lease_mgr_factory.h>
+#include <dhcpsrv/dhcpsrv_log.h>
+
+using namespace isc::util;
+
+namespace isc {
+namespace dhcp {
+
+Allocator::Allocator(Lease::Type type, const WeakSubnetPtr& subnet)
+ : inited_(false),
+ pool_type_(type),
+ subnet_id_(0),
+ subnet_(subnet) {
+ // Remember subnet ID in a separate variable. It may be needed in
+ // the destructor where the subnet weak pointer is unavailable.
+ subnet_id_ = subnet_.lock()->getID();
+}
+
+Allocator::~Allocator() {
+ if (!LeaseMgrFactory::haveInstance()) {
+ // If there is no lease manager instance, the callbacks are
+ // gone already anyway.
+ return;
+ }
+ // Remove the callbacks.
+ auto& lease_mgr = LeaseMgrFactory::instance();
+ lease_mgr.unregisterCallbacks(subnet_id_, pool_type_);
+}
+
+bool
+Allocator::isValidPrefixPool(Allocator::PrefixLenMatchType prefix_length_match,
+ PoolPtr pool, uint8_t hint_prefix_length) {
+ auto pool6 = boost::dynamic_pointer_cast<Pool6>(pool);
+ if (!pool6) {
+ return (false);
+ }
+
+ if (!hint_prefix_length) {
+ return (true);
+ }
+
+ if (prefix_length_match == Allocator::PREFIX_LEN_EQUAL &&
+ pool6->getLength() != hint_prefix_length) {
+ return (false);
+ }
+
+ if (prefix_length_match == Allocator::PREFIX_LEN_LOWER &&
+ pool6->getLength() >= hint_prefix_length) {
+ return (false);
+ }
+
+ if (prefix_length_match == Allocator::PREFIX_LEN_HIGHER &&
+ pool6->getLength() <= hint_prefix_length) {
+ return (false);
+ }
+
+ return (true);
+}
+
+void
+Allocator::initAfterConfigure() {
+ if (inited_) {
+ return;
+ }
+ auto subnet = subnet_.lock();
+ LOG_INFO(dhcpsrv_logger, DHCPSRV_CFGMGR_USE_ALLOCATOR)
+ .arg(getType())
+ .arg(Lease::typeToText(pool_type_))
+ .arg(subnet->toText());
+ initAfterConfigureInternal();
+ inited_ = true;
+}
+
+}
+}