summaryrefslogtreecommitdiffstats
path: root/src/lib/dhcpsrv/allocation_state.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/dhcpsrv/allocation_state.h')
-rw-r--r--src/lib/dhcpsrv/allocation_state.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/lib/dhcpsrv/allocation_state.h b/src/lib/dhcpsrv/allocation_state.h
new file mode 100644
index 0000000..9c6bd0f
--- /dev/null
+++ b/src/lib/dhcpsrv/allocation_state.h
@@ -0,0 +1,85 @@
+// 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 ALLOCATION_STATE_H
+#define ALLOCATION_STATE_H
+
+#include <dhcpsrv/lease.h>
+#include <boost/scoped_ptr.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <mutex>
+
+namespace isc {
+namespace dhcp {
+
+/// @brief Base class for representing allocation state in pools and subnets.
+///
+/// Allocators are used in Kea to implement different lease selection
+/// algorithms. They are stateful (i.e., they remember various information
+/// about the previous allocations) to work efficiently. For example, an
+/// iterative allocator must remember the last allocated address to pick
+/// the consecutive address when the new allocation request is issued.
+/// Allocation states differ between the allocators. State classes used
+/// by different allocators derive from this class.
+///
+/// The allocation states can be associated with pools and/or subnets.
+/// Both pool-specific and subnet-specific states derive from this class.
+class AllocationState {
+public:
+
+ /// @brief Virtual destructor.
+ virtual ~AllocationState() = default;
+};
+
+/// @brief Type of the pointer to the @c AllocationState.
+typedef boost::shared_ptr<AllocationState> AllocationStatePtr;
+
+/// @brief Common base class for subnet-specific allocation states.
+///
+/// All subnet-specific allocation states should derive from this class.
+/// It provides a mutex for thread-safe access to the class members.
+/// It maintains last allocation times for various lease types. These
+/// times are used by the shared networks to find the "preferred" subnet
+/// (i.e., a subnet from which the latest lease was assigned).
+class SubnetAllocationState : public AllocationState {
+public:
+
+ /// @brief Constructor.
+ ///
+ /// Initializes the mutex.
+ SubnetAllocationState();
+
+ /// @brief Returns last allocation time for the specified lease type.
+ ///
+ /// @return Last allocation time for the lease type or
+ /// @c boost::posix_time::neg_infin when no leases have been allocated
+ /// from this subnet yet.
+ boost::posix_time::ptime
+ getLastAllocatedTime() const;
+
+protected:
+
+ /// @brief Sets the last allocation time to current.
+ ///
+ /// This function should be called by derived classes. It should be
+ /// called in the thread-safe context.
+ void setCurrentAllocatedTimeInternal();
+
+ /// @brief Mutex used for thread-safe access to the state members.
+ boost::scoped_ptr<std::mutex> mutex_;
+
+ /// @brief Timestamp indicating when a lease has been last allocated
+ /// from the subnet.
+ boost::posix_time::ptime last_allocated_time_;
+};
+
+typedef boost::shared_ptr<SubnetAllocationState> SubnetAllocationStatePtr;
+
+} // end of namespace isc::dhcp
+} // end of namespace isc
+
+#endif // ALLOCATION_STATE_H