diff options
Diffstat (limited to 'src/lib/dhcpsrv/memfile_lease_limits.h')
-rw-r--r-- | src/lib/dhcpsrv/memfile_lease_limits.h | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/lib/dhcpsrv/memfile_lease_limits.h b/src/lib/dhcpsrv/memfile_lease_limits.h new file mode 100644 index 0000000..79f62ad --- /dev/null +++ b/src/lib/dhcpsrv/memfile_lease_limits.h @@ -0,0 +1,162 @@ +// Copyright (C) 2022 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 MEMFILE_LEASE_LIMITS_H +#define MEMFILE_LEASE_LIMITS_H + +#include <asiolink/io_address.h> +#include <cc/data.h> +#include <dhcp/classify.h> +#include <dhcpsrv/lease.h> +#include <dhcpsrv/subnet_id.h> +#include <stats/stats_mgr.h> + +#include <unordered_map> + +namespace isc { +namespace dhcp { + +/// @brief Container that maintains counts of leases per class and lease type. +/// +/// For methods on this class which accept the lease type as a parameter the value +/// is one of the following Lease::TYPE_V4, Lease::TYPE_NA, Lease::TYPE_PD. Kea +/// does not support Lease::TYPE_TA leases and this value is treated as invalid. +/// Note that for simplicity and performance an instance of container is assumed +/// to be used either only for DHCPv4 processing or DHCPv6 processing but not both +/// concurrently. +class ClassLeaseCounter { +public: + /// @brief Defines ClassCountMap as an unordered map of counts. + typedef std::unordered_map<ClientClass, size_t> ClassCountMap; + + /// @brief Constructor + ClassLeaseCounter() = default; + + /// @brief Destructor + ~ClassLeaseCounter() = default; + + /// @brief Fetches the lease count for the given class and lease type. + /// + /// @param client_class class for which the count is desired + /// @param ltype lease type for which the count is desired, defaults to + /// Lease::TYPE_V4 + /// + /// @return Number of leases for the class and lease type. If there is no + /// entry found for the class and lease type, a value of zero is returned. + size_t getClassCount(const ClientClass& client_class, + const Lease::Type& ltype = Lease::TYPE_V4) const; + + /// @brief Sets the lease count for the given class and lease type to a value. + /// + /// @param client_class class for which the count is desired + /// @param count new count value for the class and lease type. + /// @param ltype lease type for which the count is desired, defaults + /// to Lease::TYPE_V4 + void setClassCount(const ClientClass& client_class, size_t count, + const Lease::Type& ltype = Lease::TYPE_V4); + + /// @brief Adjust the count for a given class and lease type by a signed offset. + /// + /// If no entry exists in container for the class and type, a new one is created. + /// + /// @param client_class client class to adjust + /// @param offset signed amount to add to the current count + /// @param ltype lease type for which the count is desired, defaults + /// to Lease::TYPE_V4 + void adjustClassCount(const ClientClass& client_class, int offset, + const Lease::Type& ltype = Lease::TYPE_V4); + + /// @brief Adjust the count for a list of classes for a lease type by + /// a signed offset. + /// + /// @param classes list of classes to adjust + /// @param offset signed amount to add the current count + /// @param ltype lease type for which the count is desired, defaults + /// to Lease::TYPE_V4 + void adjustClassCounts(data::ConstElementPtr classes, int offset, + const Lease::Type& ltype = Lease::TYPE_V4); + + /// @brief Increment the counts for all of a lease's classes by one + /// + /// Function is intended to be whenever a new lease is being added. + /// + /// @param lease lease whose classes are to be incremented + void addLease(LeasePtr lease); + + /// @brief Adjust class lease counts given a new and old version of a lease + /// + /// Function is intended to be used whenever an existing lease is being updated. + /// If, upon comparison of the two leases, either the lease states or the class + /// lists are different then: + /// + /// -# Decrement the counts for the old class list if the old lease state + /// is Lease::STATE_DEFAULT + /// -# Increment the counts for the new class list if the new lease state + /// is Lease::STATE_DEFAULT + /// + /// @param new_lease new version of the lease + /// @param old_lease old version of the lease + void updateLease(LeasePtr new_lease, LeasePtr old_lease); + + /// @brief Decrement the counts for all of a lease's classes by one + /// + /// Function is intended to be whenever an existing lease is being deleted. + /// + /// @param lease lease whose classes are to be decremented + void removeLease(LeasePtr lease); + + /// @brief Remove all entries. + void clear() { + addresses_by_class_.clear(); + pds_by_class_.clear(); + } + + /// @brief Get the number of entries for a given lease type + /// + /// @param ltype type of lease for which the number of entries is desired, + /// defaults to Lease::TYPE_V4 + /// + /// @return Number of entries for the lease type + size_t size(const Lease::Type& ltype = Lease::TYPE_V4) const { + return (getConstCountMap(ltype).size()); + } + + /// @brief Fetches the list of classes from the lease's user-context + /// + /// @param lease lease from which to fetch classes + /// @return ElementPtr to an Element::List containing the client classes or an + /// empty List. + static data::ConstElementPtr getLeaseClientClasses(LeasePtr lease); + +private: + /// @brief Fetches the map used to count the given lease type. + /// + /// @param ltype type of lease of for which the map is desired, + /// defaults to Lease::TYPE_V4 + /// + /// @return Reference to the map for the lease type + ClassCountMap& getCountMap(const Lease::Type& ltype = Lease::TYPE_V4) { + return (ltype == Lease::TYPE_PD ? pds_by_class_ : addresses_by_class_); + } + + const ClassCountMap& getConstCountMap(const Lease::Type& ltype = Lease::TYPE_V4) const { + return (ltype == Lease::TYPE_PD ? pds_by_class_ : addresses_by_class_); + } + + /// @brief Contains counts for classes for addresses. This map is used + /// to house either Lease::TYPE_V4 when used for V4 or Lease::TYPE_NA + /// when used for V6. + ClassCountMap addresses_by_class_; + + /// @brief Contains counts for classes for Lease::TYPE_PD. Applicable + /// only for V6 use. + ClassCountMap pds_by_class_; +}; + +} // namespace dhcp +} // namespace isc + +#endif // MEMFILE_LEASE_LIMITS_H |