%PDF- %PDF-
| Direktori : /backups/router/usr/local/include/kea/dhcpsrv/ |
| Current File : //backups/router/usr/local/include/kea/dhcpsrv/memfile_lease_storage.h |
// Copyright (C) 2015-2024 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 <asiolink/io_address.h>
#include <dhcpsrv/lease.h>
#include <dhcpsrv/subnet_id.h>
#include <boost/multi_index/indexed_by.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/composite_key.hpp>
#include <functional>
#include <vector>
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 (and address for v6).
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<AddressIndexTag>,
boost::multi_index::member<Lease, isc::asiolink::IOAddress, &Lease::addr_>
>,
// Specification of the second index starts here.
boost::multi_index::ordered_non_unique<
boost::multi_index::tag<DuidIaidTypeIndexTag>,
// 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, const std::vector<uint8_t>&,
&Lease6::getDuidVector>,
// The two other ingredients of this index are IAID and
// lease type.
boost::multi_index::member<Lease6, uint32_t, &Lease6::iaid_>,
boost::multi_index::member<Lease6, Lease::Type, &Lease6::type_>
>
>,
// Specification of the third index starts here.
boost::multi_index::ordered_non_unique<
boost::multi_index::tag<ExpirationIndexTag>,
// 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, bool,
&Lease::stateExpiredReclaimed>,
// Lease expiration time.
boost::multi_index::const_mem_fun<Lease, int64_t,
&Lease::getExpirationTime>
>
>,
// Specification of the fourth index starts here.
// This index sorts leases by SubnetID and address.
boost::multi_index::ordered_unique<
boost::multi_index::tag<SubnetIdIndexTag>,
boost::multi_index::composite_key<
Lease6,
// Subnet id.
boost::multi_index::member<Lease,
isc::dhcp::SubnetID,
&Lease::subnet_id_>,
// Address.
boost::multi_index::member<Lease,
isc::asiolink::IOAddress,
&Lease::addr_>
>
>,
// 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<DuidIndexTag>,
boost::multi_index::const_mem_fun<Lease6,
const std::vector<uint8_t>&,
&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<HostnameIndexTag>,
boost::multi_index::member<Lease, std::string, &Lease::hostname_>
>,
// Specification of the seventh index starts here.
boost::multi_index::ordered_non_unique<
boost::multi_index::tag<SubnetIdPoolIdIndexTag>,
// 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<Lease, SubnetID, &Lease::subnet_id_>,
// 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<Lease, uint32_t, &Lease::pool_id_>
>
>
>
> 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<AddressIndexTag>,
// The IPv4 address are held in addr_ members that belong to
// Lease class.
boost::multi_index::member<Lease, isc::asiolink::IOAddress, &Lease::addr_>
>,
// Specification of the second index starts here.
boost::multi_index::ordered_non_unique<
boost::multi_index::tag<HWAddressSubnetIdIndexTag>,
// 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, const std::vector<uint8_t>&,
&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<Lease, SubnetID, &Lease::subnet_id_>
>
>,
// Specification of the third index starts here.
boost::multi_index::ordered_non_unique<
boost::multi_index::tag<ClientIdSubnetIdIndexTag>,
// 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, const std::vector<uint8_t>&,
&Lease4::getClientIdVector>,
// The subnet id is accessed through the subnet_id_ member.
boost::multi_index::member<Lease, uint32_t, &Lease::subnet_id_>
>
>,
// Specification of the fourth index starts here.
boost::multi_index::ordered_non_unique<
boost::multi_index::tag<ExpirationIndexTag>,
// 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, bool,
&Lease::stateExpiredReclaimed>,
// Lease expiration time.
boost::multi_index::const_mem_fun<Lease, int64_t,
&Lease::getExpirationTime>
>
>,
// Specification of the fifth index starts here.
// This index sorts leases by SubnetID.
boost::multi_index::ordered_non_unique<
boost::multi_index::tag<SubnetIdIndexTag>,
boost::multi_index::member<Lease, isc::dhcp::SubnetID, &Lease::subnet_id_>
>,
// 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<HostnameIndexTag>,
boost::multi_index::member<Lease, std::string, &Lease::hostname_>
>,
// 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<RemoteIdIndexTag>,
boost::multi_index::member<Lease4,
std::vector<uint8_t>,
&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<RelayIdIndexTag>,
boost::multi_index::composite_key<
Lease4,
// Relay id.
boost::multi_index::member<Lease4,
std::vector<uint8_t>,
&Lease4::relay_id_>,
// Address.
boost::multi_index::member<Lease,
isc::asiolink::IOAddress,
&Lease::addr_>
>
>,
// Specification of the ninth index starts here.
boost::multi_index::ordered_non_unique<
boost::multi_index::tag<SubnetIdPoolIdIndexTag>,
// 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<Lease, SubnetID, &Lease::subnet_id_>,
// 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<Lease, uint32_t, &Lease::pool_id_>
>
>
>
> 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<AddressIndexTag>::type Lease6StorageAddressIndex;
/// @brief DHCPv6 lease storage index by DUID, IAID, lease type.
typedef Lease6Storage::index<DuidIaidTypeIndexTag>::type Lease6StorageDuidIaidTypeIndex;
/// @brief DHCPv6 lease storage index by expiration time.
typedef Lease6Storage::index<ExpirationIndexTag>::type Lease6StorageExpirationIndex;
/// @brief DHCPv6 lease storage index by subnet-id.
typedef Lease6Storage::index<SubnetIdIndexTag>::type Lease6StorageSubnetIdIndex;
/// @brief DHCPv6 lease storage index subnet-id and pool-id.
typedef Lease6Storage::index<SubnetIdPoolIdIndexTag>::type Lease6StorageSubnetIdPoolIdIndex;
/// @brief DHCPv6 lease storage index by DUID.
typedef Lease6Storage::index<DuidIndexTag>::type Lease6StorageDuidIndex;
/// @brief DHCPv6 lease storage index by hostname.
typedef Lease6Storage::index<HostnameIndexTag>::type Lease6StorageHostnameIndex;
/// @brief DHCPv4 lease storage index by address.
typedef Lease4Storage::index<AddressIndexTag>::type Lease4StorageAddressIndex;
/// @brief DHCPv4 lease storage index by expiration time.
typedef Lease4Storage::index<ExpirationIndexTag>::type Lease4StorageExpirationIndex;
/// @brief DHCPv4 lease storage index by HW address and subnet-id.
typedef Lease4Storage::index<HWAddressSubnetIdIndexTag>::type
Lease4StorageHWAddressSubnetIdIndex;
/// @brief DHCPv4 lease storage index by client-id and subnet-id.
typedef Lease4Storage::index<ClientIdSubnetIdIndexTag>::type
Lease4StorageClientIdSubnetIdIndex;
/// @brief DHCPv4 lease storage index subnet-id.
typedef Lease4Storage::index<SubnetIdIndexTag>::type Lease4StorageSubnetIdIndex;
/// @brief DHCPv4 lease storage index subnet-id and pool-id.
typedef Lease4Storage::index<SubnetIdPoolIdIndexTag>::type Lease4StorageSubnetIdPoolIdIndex;
/// @brief DHCPv4 lease storage index by hostname.
typedef Lease4Storage::index<HostnameIndexTag>::type Lease4StorageHostnameIndex;
/// @brief DHCPv4 lease storage index by remote-id.
typedef Lease4Storage::index<RemoteIdIndexTag>::type Lease4StorageRemoteIdIndex;
/// @brief DHCPv4 lease storage range by remote-id.
typedef std::pair<Lease4StorageRemoteIdIndex::const_iterator,
Lease4StorageRemoteIdIndex::const_iterator> Lease4StorageRemoteIdRange;
/// @brief DHCPv4 lease storage index by relay-id.
typedef Lease4Storage::index<RelayIdIndexTag>::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<uint8_t>& id)
: lease_addr_(lease_addr), id_(id) {
}
/// @brief Lease address.
isc::asiolink::IOAddress lease_addr_;
/// @brief Remote or relay opaque identifier.
std::vector<uint8_t> id_;
};
/// @brief Pointer to a Lease6ExtendedInfo object.
typedef boost::shared_ptr<Lease6ExtendedInfo> 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<RelayIdIndexTag>,
boost::multi_index::composite_key<
Lease6ExtendedInfo,
boost::multi_index::member<Lease6ExtendedInfo,
std::vector<uint8_t>,
&Lease6ExtendedInfo::id_>,
boost::multi_index::member<Lease6ExtendedInfo,
isc::asiolink::IOAddress,
&Lease6ExtendedInfo::lease_addr_>
>
>,
// Last index is by lease address.
boost::multi_index::hashed_non_unique<
boost::multi_index::tag<LeaseAddressIndexTag>,
boost::multi_index::member<Lease6ExtendedInfo,
isc::asiolink::IOAddress,
&Lease6ExtendedInfo::lease_addr_>
>
>
> 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<RemoteIdIndexTag>,
boost::multi_index::member<Lease6ExtendedInfo,
std::vector<uint8_t>,
&Lease6ExtendedInfo::id_>
>,
// Last index is by lease address.
boost::multi_index::hashed_non_unique<
boost::multi_index::tag<LeaseAddressIndexTag>,
boost::multi_index::member<Lease6ExtendedInfo,
isc::asiolink::IOAddress,
&Lease6ExtendedInfo::lease_addr_>
>
>
> Lease6ExtendedInfoRemoteIdTable;
/// @brief Lease6 extended information by relay id index.
typedef Lease6ExtendedInfoRelayIdTable::index<RelayIdIndexTag>::type
RelayIdIndex;
/// @brief Lease6 extended information by lease address index of by relay id table.
typedef Lease6ExtendedInfoRelayIdTable::index<LeaseAddressIndexTag>::type
LeaseAddressRelayIdIndex;
/// @brief Lease6 extended information by remote id index.
typedef Lease6ExtendedInfoRemoteIdTable::index<RemoteIdIndexTag>::type
RemoteIdIndex;
/// @brief Lease6 extended information by remote id range.
typedef std::pair<RemoteIdIndex::const_iterator, RemoteIdIndex::const_iterator>
RemoteIdIndexRange;
/// @brief Lease6 extended information by lease address index of by remote id table.
typedef Lease6ExtendedInfoRemoteIdTable::index<LeaseAddressIndexTag>::type
LeaseAddressRemoteIdIndex;
//@}
} // end of isc::dhcp namespace
} // end of isc namespace
#endif // MEMFILE_LEASE_STORAGE_H