// Copyright (C) 2015-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 MEMFILE_LEASE_STORAGE_H #define MEMFILE_LEASE_STORAGE_H #include #include #include #include #include #include #include #include #include #include #include #include namespace isc { namespace dhcp { /// @brief Tag for indexes by address. struct AddressIndexTag { }; /// @brief Tag for indexes by DUID, IAID, lease type tuple. struct DuidIaidTypeIndexTag { }; /// @brief Tag for indexes by expiration time. struct ExpirationIndexTag { }; /// @brief Tag for indexes by HW address, subnet-id tuple. struct HWAddressSubnetIdIndexTag { }; /// @brief Tag for indexes by client-id, subnet-id tuple. struct ClientIdSubnetIdIndexTag { }; /// @brief Tag for indexes by subnet-id. struct SubnetIdIndexTag { }; /// @brief Tag for indexes by subnet-id and pool-id. struct SubnetIdPoolIdIndexTag { }; /// @brief Tag for index using DUID. struct DuidIndexTag { }; /// @brief Tag for index using hostname. struct HostnameIndexTag { }; /// @brief Tag for index using remote-id. struct RemoteIdIndexTag { }; /// @brief Tag for index using relay-id. struct RelayIdIndexTag { }; /// @name Multi index containers holding DHCPv4 and DHCPv6 leases. /// //@{ /// @brief A multi index container holding DHCPv6 leases. /// /// The leases in the container may be accessed using different indexes: /// - using an IPv6 address, /// - using a composite index: DUID, IAID and lease type. /// - using a composite index: boolean flag indicating if the state is /// "expired-reclaimed" and expiration time. /// - using subnet ID. /// - using hostname. /// /// Indexes can be accessed using the index number (from 0 to 5) or a /// name tag. It is recommended to use the tags to access indexes as /// they do not depend on the order of indexes in the container. typedef boost::multi_index_container< // It holds pointers to Lease6 objects. Lease6Ptr, boost::multi_index::indexed_by< // Specification of the first index starts here. // This index sorts leases by IPv6 addresses represented as // IOAddress objects. boost::multi_index::ordered_unique< boost::multi_index::tag, boost::multi_index::member >, // Specification of the second index starts here. boost::multi_index::ordered_non_unique< boost::multi_index::tag, // This is a composite index that will be used to search for // the lease using three attributes: DUID, IAID and lease type. boost::multi_index::composite_key< Lease6, // The DUID can be retrieved from the Lease6 object using // a getDuidVector const function. boost::multi_index::const_mem_fun&, &Lease6::getDuidVector>, // The two other ingredients of this index are IAID and // lease type. boost::multi_index::member, boost::multi_index::member > >, // Specification of the third index starts here. boost::multi_index::ordered_non_unique< boost::multi_index::tag, // This is a composite index that is used to search for // the expired leases. Depending on the value of the first component // of the search key, the reclaimed or not reclaimed leases can // be searched. boost::multi_index::composite_key< Lease6, // The boolean value specifying if lease is reclaimed or not. boost::multi_index::const_mem_fun, // Lease expiration time. boost::multi_index::const_mem_fun > >, // Specification of the fourth index starts here. // This index sorts leases by SubnetID. boost::multi_index::ordered_non_unique< boost::multi_index::tag, boost::multi_index::member >, // Specification of the fifth index starts here // This index is used to retrieve leases for matching duid. boost::multi_index::ordered_non_unique< boost::multi_index::tag, boost::multi_index::const_mem_fun&, &Lease6::getDuidVector> >, // Specification of the sixth index starts here // This index is used to retrieve leases for matching hostname. boost::multi_index::ordered_non_unique< boost::multi_index::tag, boost::multi_index::member >, // Specification of the seventh index starts here. boost::multi_index::ordered_non_unique< boost::multi_index::tag, // This is a composite index that combines two attributes of the // Lease6 object: subnet id and pool id. boost::multi_index::composite_key< Lease6, // The subnet id is held in the subnet_id_ member of Lease6 // class. Note that the subnet_id_ is defined in the base // class (Lease) so we have to point to this class rather // than derived class: Lease6. boost::multi_index::member, // The pool id is held in the pool_id_ member of Lease6 // class. Note that the pool_id_ is defined in the base // class (Lease) so we have to point to this class rather // than derived class: Lease6. boost::multi_index::member > > > > Lease6Storage; // Specify the type name of this container. /// @brief A multi index container holding DHCPv4 leases. /// /// The leases in the container may be accessed using different indexes: /// - IPv4 address, /// - composite index: hardware address and subnet id, /// - composite index: client id and subnet id, /// - using a composite index: boolean flag indicating if the state is /// "expired-reclaimed" and expiration time. /// - using subnet id. /// - using hostname. /// - using remote id. /// - using a composite index: /// /// Indexes can be accessed using the index number (from 0 to 5) or a /// name tag. It is recommended to use the tags to access indexes as /// they do not depend on the order of indexes in the container. typedef boost::multi_index_container< // It holds pointers to Lease4 objects. Lease4Ptr, // Specification of search indexes starts here. boost::multi_index::indexed_by< // Specification of the first index starts here. // This index sorts leases by IPv4 addresses represented as // IOAddress objects. boost::multi_index::ordered_unique< boost::multi_index::tag, // The IPv4 address are held in addr_ members that belong to // Lease class. boost::multi_index::member >, // Specification of the second index starts here. boost::multi_index::ordered_non_unique< boost::multi_index::tag, // This is a composite index that combines two attributes of the // Lease4 object: hardware address and subnet id. boost::multi_index::composite_key< Lease4, // The hardware address is held in the hwaddr_ member of the // Lease4 object, which is a HWAddr object. Boost does not // provide a key extractor for getting a member of a member, // so we need a simple method for that. boost::multi_index::const_mem_fun&, &Lease::getHWAddrVector>, // The subnet id is held in the subnet_id_ member of Lease4 // class. Note that the subnet_id_ is defined in the base // class (Lease) so we have to point to this class rather // than derived class: Lease4. boost::multi_index::member > >, // Specification of the third index starts here. boost::multi_index::ordered_non_unique< boost::multi_index::tag, // This is a composite index that uses two values to search for a // lease: client id and subnet id. boost::multi_index::composite_key< Lease4, // The client id can be retrieved from the Lease4 object by // calling getClientIdVector const function. boost::multi_index::const_mem_fun&, &Lease4::getClientIdVector>, // The subnet id is accessed through the subnet_id_ member. boost::multi_index::member > >, // Specification of the fourth index starts here. boost::multi_index::ordered_non_unique< boost::multi_index::tag, // This is a composite index that will be used to search for // the expired leases. Depending on the value of the first component // of the search key, the reclaimed or not reclaimed leases will can // be searched. boost::multi_index::composite_key< Lease4, // The boolean value specifying if lease is reclaimed or not. boost::multi_index::const_mem_fun, // Lease expiration time. boost::multi_index::const_mem_fun > >, // Specification of the fifth index starts here. // This index sorts leases by SubnetID. boost::multi_index::ordered_non_unique< boost::multi_index::tag, boost::multi_index::member >, // Specification of the sixth index starts here. // This index is used to retrieve leases for matching hostname. boost::multi_index::ordered_non_unique< boost::multi_index::tag, boost::multi_index::member >, // Specification of the seventh index starts here. // This index is used to retrieve leases for matching remote id // for Bulk Lease Query. boost::multi_index::hashed_non_unique< boost::multi_index::tag, boost::multi_index::member, &Lease4::remote_id_> >, // Specification of the eighth index starts here. // This index is used to retrieve leases for matching relay id // for Bulk Lease Query. boost::multi_index::ordered_non_unique< boost::multi_index::tag, boost::multi_index::composite_key< Lease4, // Relay id. boost::multi_index::member, &Lease4::relay_id_>, // Address. boost::multi_index::member > >, // Specification of the ninth index starts here. boost::multi_index::ordered_non_unique< boost::multi_index::tag, // This is a composite index that combines two attributes of the // Lease4 object: subnet id and pool id. boost::multi_index::composite_key< Lease4, // The subnet id is held in the subnet_id_ member of Lease4 // class. Note that the subnet_id_ is defined in the base // class (Lease) so we have to point to this class rather // than derived class: Lease4. boost::multi_index::member, // The pool id is held in the pool_id_ member of Lease4 // class. Note that the pool_id_ is defined in the base // class (Lease) so we have to point to this class rather // than derived class: Lease4. boost::multi_index::member > > > > Lease4Storage; // Specify the type name for this container. //@} /// @name Indexes used by the multi index containers /// //@{ /// @brief DHCPv6 lease storage index by address. typedef Lease6Storage::index::type Lease6StorageAddressIndex; /// @brief DHCPv6 lease storage index by DUID, IAID, lease type. typedef Lease6Storage::index::type Lease6StorageDuidIaidTypeIndex; /// @brief DHCPv6 lease storage index by expiration time. typedef Lease6Storage::index::type Lease6StorageExpirationIndex; /// @brief DHCPv6 lease storage index by subnet-id. typedef Lease6Storage::index::type Lease6StorageSubnetIdIndex; /// @brief DHCPv6 lease storage index subnet-id and pool-id. typedef Lease6Storage::index::type Lease6StorageSubnetIdPoolIdIndex; /// @brief DHCPv6 lease storage index by DUID. typedef Lease6Storage::index::type Lease6StorageDuidIndex; /// @brief DHCPv6 lease storage index by hostname. typedef Lease6Storage::index::type Lease6StorageHostnameIndex; /// @brief DHCPv4 lease storage index by address. typedef Lease4Storage::index::type Lease4StorageAddressIndex; /// @brief DHCPv4 lease storage index by expiration time. typedef Lease4Storage::index::type Lease4StorageExpirationIndex; /// @brief DHCPv4 lease storage index by HW address and subnet-id. typedef Lease4Storage::index::type Lease4StorageHWAddressSubnetIdIndex; /// @brief DHCPv4 lease storage index by client-id and subnet-id. typedef Lease4Storage::index::type Lease4StorageClientIdSubnetIdIndex; /// @brief DHCPv4 lease storage index subnet-id. typedef Lease4Storage::index::type Lease4StorageSubnetIdIndex; /// @brief DHCPv4 lease storage index subnet-id and pool-id. typedef Lease4Storage::index::type Lease4StorageSubnetIdPoolIdIndex; /// @brief DHCPv4 lease storage index by hostname. typedef Lease4Storage::index::type Lease4StorageHostnameIndex; /// @brief DHCPv4 lease storage index by remote-id. typedef Lease4Storage::index::type Lease4StorageRemoteIdIndex; /// @brief DHCPv4 lease storage range by remote-id. typedef std::pair Lease4StorageRemoteIdRange; /// @brief DHCPv4 lease storage index by relay-id. typedef Lease4Storage::index::type Lease4StorageRelayIdIndex; //@} /// @name Multi index containers holding DHCPv6 lease extended informations /// for Bulk Lease Query. //@{ /// @brief Lease6 extended informations for Bulk Lease Query. class Lease6ExtendedInfo { public: /// @brief Constructor. /// /// @param lease_addr Lease address. /// @param id Identifier. Lease6ExtendedInfo(const isc::asiolink::IOAddress& lease_addr, const std::vector& id) : lease_addr_(lease_addr), id_(id) { } /// @brief Lease address. isc::asiolink::IOAddress lease_addr_; /// @brief Remote or relay opaque identifier. std::vector id_; }; /// @brief Pointer to a Lease6ExtendedInfo object. typedef boost::shared_ptr Lease6ExtendedInfoPtr; /// @brief Tag for indexes by lease address. struct LeaseAddressIndexTag { }; /// @brief A multi index container holding lease6 extended info for by relay id. /// /// The lease6 extended info may be accessed using different indexes: /// - using relay id, and lease address for getting lower bounds. /// - using lease address for deletes. /// /// The choice of binary trees was governed by the fact a large number of /// clients can be behind a relay. /// /// Indexes can be accessed using the index number (from 0 to 5) or a /// name tag. It is recommended to use the tags to access indexes as /// they do not depend on the order of indexes in the container. typedef boost::multi_index_container< // It holds pointers to lease6 extended info. Lease6ExtendedInfoPtr, boost::multi_index::indexed_by< // First index is by relay id and lease address. boost::multi_index::ordered_non_unique< boost::multi_index::tag, boost::multi_index::composite_key< Lease6ExtendedInfo, boost::multi_index::member, &Lease6ExtendedInfo::id_>, boost::multi_index::member > >, // Last index is by lease address. boost::multi_index::hashed_non_unique< boost::multi_index::tag, boost::multi_index::member > > > Lease6ExtendedInfoRelayIdTable; /// @brief A multi index container holding lease6 extended info for by remote id. /// /// The lease6 extended info may be accessed using different indexes: /// - using remote id. /// - using lease address for deletes. /// /// The internal layout of remote id is not used. The choice of hash tables /// was governed by the fact a small number of clients should share the same /// remote id. /// /// Indexes can be accessed using the index number (from 0 to 5) or a /// name tag. It is recommended to use the tags to access indexes as /// they do not depend on the order of indexes in the container. typedef boost::multi_index_container< // It holds pointers to lease6 extended info. Lease6ExtendedInfoPtr, boost::multi_index::indexed_by< // First index is by remote id. boost::multi_index::hashed_non_unique< boost::multi_index::tag, boost::multi_index::member, &Lease6ExtendedInfo::id_> >, // Last index is by lease address. boost::multi_index::hashed_non_unique< boost::multi_index::tag, boost::multi_index::member > > > Lease6ExtendedInfoRemoteIdTable; /// @brief Lease6 extended information by relay id index. typedef Lease6ExtendedInfoRelayIdTable::index::type RelayIdIndex; /// @brief Lease6 extended information by lease address index of by relay id table. typedef Lease6ExtendedInfoRelayIdTable::index::type LeaseAddressRelayIdIndex; /// @brief Lease6 extended information by remote id index. typedef Lease6ExtendedInfoRemoteIdTable::index::type RemoteIdIndex; /// @brief Lease6 extended information by remote id range. typedef std::pair RemoteIdIndexRange; /// @brief Lease6 extended information by lease address index of by remote id table. typedef Lease6ExtendedInfoRemoteIdTable::index::type LeaseAddressRemoteIdIndex; //@} } // end of isc::dhcp namespace } // end of isc namespace #endif // MEMFILE_LEASE_STORAGE_H