summaryrefslogtreecommitdiffstats
path: root/src/lib/dhcpsrv/iterative_allocation_state.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/dhcpsrv/iterative_allocation_state.h')
-rw-r--r--src/lib/dhcpsrv/iterative_allocation_state.h138
1 files changed, 138 insertions, 0 deletions
diff --git a/src/lib/dhcpsrv/iterative_allocation_state.h b/src/lib/dhcpsrv/iterative_allocation_state.h
new file mode 100644
index 0000000..25d9d7a
--- /dev/null
+++ b/src/lib/dhcpsrv/iterative_allocation_state.h
@@ -0,0 +1,138 @@
+// 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/.
+
+#ifndef ITERATIVE_ALLOCATION_STATE_H
+#define ITERATIVE_ALLOCATION_STATE_H
+
+#include <asiolink/io_address.h>
+#include <dhcpsrv/allocation_state.h>
+#include <dhcpsrv/lease.h>
+#include <dhcpsrv/subnet.h>
+#include <boost/shared_ptr.hpp>
+#include <cstdint>
+#include <map>
+
+namespace isc {
+namespace dhcp {
+
+/// @brief Forward declaration of the @c SubnetIterativeAllocationState.
+class SubnetIterativeAllocationState;
+
+/// @brief Type of the pointer to the @c SubnetIterativeAllocationState.
+typedef boost::shared_ptr<SubnetIterativeAllocationState> SubnetIterativeAllocationStatePtr;
+
+/// @brief Subnet allocation state used by the iterative allocator.
+///
+/// It extends the base class with the mechanism to store the last
+/// allocated address or delegated prefix. The iterative allocator
+/// uses this information to pick the next address or delegated
+/// prefix on the next allocation request.
+class SubnetIterativeAllocationState : public SubnetAllocationState {
+public:
+
+ /// @brief Factory function creating the state instance from subnet.
+ ///
+ /// @param subnet instance of the subnet for which the allocation
+ /// state should be instantiated.
+ /// @return new allocation state instance.
+ static SubnetIterativeAllocationStatePtr create(const SubnetPtr& subnet);
+
+ /// @brief Constructor.
+ ///
+ /// @param prefix subnet prefix.
+ /// @param prefix_length subnet prefix length.
+ SubnetIterativeAllocationState(const asiolink::IOAddress& prefix,
+ const uint8_t prefix_length);
+
+ /// @brief Returns last allocated address or prefix.
+ ///
+ /// @return last allocated address or prefix.
+ asiolink::IOAddress getLastAllocated() const;
+
+ /// @brief Sets last allocated address or prefix.
+ ///
+ /// @param address an address or prefix last allocated.
+ void setLastAllocated(const asiolink::IOAddress& address);
+
+private:
+
+ /// @brief Last allocated address or delegated prefix.
+ ///
+ /// This is the last allocated address or delegated prefix that was
+ /// previously allocated from the particular subnet. It should be
+ /// noted that although the value is usually correct, there are
+ /// cases when it is invalid, e.g. after removing a pool,
+ /// restarting or changing allocation algorithms. For that purpose
+ /// it should be only considered a help that should not be fully
+ /// trusted.
+ asiolink::IOAddress last_allocated_;
+};
+
+/// @brief Forward declaration of the @c PoolIterativeAllocationState.
+class PoolIterativeAllocationState;
+
+/// @brief Type of the pointer to the @c PoolIterativeAllocationState.
+typedef boost::shared_ptr<PoolIterativeAllocationState> PoolIterativeAllocationStatePtr;
+
+/// @brief Pool allocation state used by the iterative allocator.
+///
+/// It extends the base class with the information about the last allocated
+/// address in the pool.
+class PoolIterativeAllocationState : public AllocationState {
+public:
+
+ /// @brief Factory function creating the state instance from pool.
+ ///
+ /// @param pool instance of the pool for which the allocation state
+ /// should be instantiated.
+ /// @return new allocation state instance.
+ static PoolIterativeAllocationStatePtr create(const PoolPtr& pool);
+
+ /// @brief Constructor.
+ ///
+ /// @param first first address in the pool.
+ PoolIterativeAllocationState(const asiolink::IOAddress& first);
+
+ /// @brief Returns the last address that was tried from this pool
+ ///
+ /// @return address or prefix that was last tried from this pool
+ isc::asiolink::IOAddress getLastAllocated() const {
+ return (last_allocated_);
+ }
+
+ /// @brief Checks if the last address is valid.
+ ///
+ /// @return true if the last address is valid, false otherwise.
+ bool isLastAllocatedValid() const {
+ return last_allocated_valid_;
+ }
+
+ /// @brief Sets the last address that was tried from this pool.
+ ///
+ /// @param address address or prefix to that was tried last.
+ void setLastAllocated(const asiolink::IOAddress& address) {
+ last_allocated_ = address;
+ last_allocated_valid_ = true;
+ }
+
+ /// @brief Resets the last address to invalid.
+ void resetLastAllocated() {
+ last_allocated_valid_ = false;
+ }
+
+private:
+
+ /// @brief Last allocated address or prefix.
+ isc::asiolink::IOAddress last_allocated_;
+
+ /// @brief Last allocated address status.
+ bool last_allocated_valid_;
+};
+
+} // end of namespace isc::dhcp
+} // end of namespace isc
+
+#endif // ITERATIVE_ALLOCATION_STATE_H