summaryrefslogtreecommitdiffstats
path: root/src/lib/dhcpsrv/flq_allocation_state.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/dhcpsrv/flq_allocation_state.h')
-rw-r--r--src/lib/dhcpsrv/flq_allocation_state.h108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/lib/dhcpsrv/flq_allocation_state.h b/src/lib/dhcpsrv/flq_allocation_state.h
new file mode 100644
index 0000000..194edcf
--- /dev/null
+++ b/src/lib/dhcpsrv/flq_allocation_state.h
@@ -0,0 +1,108 @@
+// Copyright (C) 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 FLQ_ALLOCATION_STATE_H
+#define FLQ_ALLOCATION_STATE_H
+
+#include <dhcpsrv/allocation_state.h>
+#include <dhcpsrv/pool.h>
+#include <dhcpsrv/subnet.h>
+#include <boost/shared_ptr.hpp>
+#include <cstdint>
+
+namespace isc {
+namespace dhcp {
+
+/// @brief Forward declaration of the @c PoolFreeLeaseQueueAllocationState.
+class PoolFreeLeaseQueueAllocationState;
+
+/// @brief Type of the pointer to the @c PoolFreeLeaseQueueAllocationState.
+typedef boost::shared_ptr<PoolFreeLeaseQueueAllocationState> PoolFreeLeaseQueueAllocationStatePtr;
+
+/// @brief Pool allocation state used by the FLQ allocator.
+class PoolFreeLeaseQueueAllocationState : public AllocationState {
+public:
+
+ /// @brief Factory function creating the state instance from a pool.
+ ///
+ /// @param pool instance of the pool for which the allocation state
+ /// should be instantiated.
+ /// @return new allocation state instance.
+ static PoolFreeLeaseQueueAllocationStatePtr create(const PoolPtr& pool);
+
+ /// @brief Constructor.
+ ///
+ /// Instantiates the allocation state for the specified lease type.
+ ///
+ /// @param type lease type.
+ PoolFreeLeaseQueueAllocationState(Lease::Type type);
+
+ /// @brief Checks if the pool has run out of free leases.
+ ///
+ /// @return true if the pool has no free leases, false otherwise.
+ bool exhausted() const;
+
+ /// @brief Adds a free lease to the queue.
+ ///
+ /// @param address lease address.
+ void addFreeLease(const asiolink::IOAddress& address);
+
+ /// @brief Deletes free lease from the queue.
+ ///
+ /// @param address lease address.
+ void deleteFreeLease(const asiolink::IOAddress& address);
+
+ /// @brief Returns next available lease.
+ ///
+ /// @return next free lease address or IPv4/IPv6 zero address when
+ /// there are no free leases.
+ asiolink::IOAddress offerFreeLease();
+
+ /// @brief Returns the current number of free leases in the queue.
+ ///
+ /// @return the number of free leases in the queue.
+ size_t getFreeLeaseCount() const;
+
+private:
+
+ /// @brief A multi-index container holding free leases.
+ ///
+ /// When it is used as a storage for IPv4 leases, the @c AddressType
+ /// should be @c uint32_t. For IPv6 leases, it should be @c IOAddress.
+ /// Note that using the @c uint32_t for the IPv4 case significantly reduces
+ /// the amount of memory occupied by the container by removing the overhead
+ /// of holding the entire IOAddress instance.
+ template<typename AddressType>
+ using FreeLeaseQueue = boost::multi_index_container<
+ AddressType,
+ boost::multi_index::indexed_by<
+ boost::multi_index::sequenced<>,
+ boost::multi_index::hashed_unique<
+ boost::multi_index::identity<AddressType>
+ >
+ >
+ >;
+
+ /// @brief A multi-index container holding free IPv4 leases.
+ typedef boost::shared_ptr<FreeLeaseQueue<uint32_t>> FreeLease4QueuePtr;
+
+ /// @brief A multi-index container holding free IPv6 leases.
+ typedef boost::shared_ptr<FreeLeaseQueue<asiolink::IOAddress>> FreeLease6QueuePtr;
+
+ /// @brief An instance of the multi-index container holding
+ /// free IPv4 leases.
+ FreeLease4QueuePtr free_lease4_queue_;
+
+ /// @brief An instance of the multi-index container holding
+ /// free IPv6 leases.
+ FreeLease6QueuePtr free_lease6_queue_;
+};
+
+
+} // end of isc::dhcp namespace
+} // end of isc namespace
+
+#endif // FLQ_ALLOCATION_STATE_H