Kea  2.1.7-git
host_container.h
Go to the documentation of this file.
1 // Copyright (C) 2014-2021 Internet Systems Consortium, Inc. ("ISC")
2 //
3 // This Source Code Form is subject to the terms of the Mozilla Public
4 // License, v. 2.0. If a copy of the MPL was not distributed with this
5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 
7 #ifndef HOST_CONTAINER_H
8 #define HOST_CONTAINER_H
9 
10 #include <dhcpsrv/host.h>
11 #include <dhcpsrv/subnet_id.h>
12 #include <boost/multi_index_container.hpp>
13 #include <boost/multi_index/composite_key.hpp>
14 #include <boost/multi_index/mem_fun.hpp>
15 #include <boost/multi_index/member.hpp>
16 #include <boost/multi_index/ordered_index.hpp>
17 #include <boost/multi_index/hashed_index.hpp>
18 
19 namespace isc {
20 namespace dhcp {
21 
33 typedef boost::multi_index_container<
34  // This container stores pointers to Host objects.
35  HostPtr,
36  // Start specification of indexes here.
37  boost::multi_index::indexed_by<
38  // First index is used to search for the host using one of the
39  // identifiers, i.e. HW address or DUID. The elements of this
40  // index are non-unique because there may be multiple reservations
41  // for the same host belonging to a different subnets.
42  boost::multi_index::ordered_non_unique<
43  // The index comprises actual identifier (HW address or DUID) in
44  // a binary form and a type of the identifier which indicates
45  // that it is HW address or DUID.
46  boost::multi_index::composite_key<
47  // Composite key uses members of the Host class.
48  Host,
49  // Binary identifier is retrieved from the Host class using
50  // a getIdentifier method.
51  boost::multi_index::const_mem_fun<
52  Host, const std::vector<uint8_t>&,
54  >,
55  // Identifier type is retrieved from the Host class using
56  // a getIdentifierType method.
57  boost::multi_index::const_mem_fun<
60  >
61  >
62  >,
63 
64  // Second index is used to search for the host using reserved IPv4
65  // address.
66  boost::multi_index::ordered_non_unique<
67  // Index using values returned by the @c Host::getIPv4Reservation.
68  boost::multi_index::const_mem_fun<Host, const asiolink::IOAddress&,
70  >,
71 
72  // Third index is used to search for the host using IPv4 subnet id
73  boost::multi_index::ordered_non_unique<
74  // Index using values returned by the @c Host::getIPv4SubnetID
75  boost::multi_index::const_mem_fun<Host, SubnetID,
77  >,
78 
79  // Forth index is used to search for the host using IPv6 subnet id
80  boost::multi_index::ordered_non_unique<
81  // Index using values returned by the @c Host::getIPv6SubnetID
82  boost::multi_index::const_mem_fun<Host, SubnetID,
84  >,
85 
86  // Fifth index is used to search by increasing host id
87  boost::multi_index::ordered_unique<
88  // Index using values returned by the @c Host::getHostId
89  boost::multi_index::const_mem_fun<Host, uint64_t,
91  >,
92 
93  // Sixth index is used to search for the host using hostname
94  // (case-sensitive compare so the key is in lower case).
95  boost::multi_index::ordered_non_unique<
96  // Index using values returned by the @c Host::getLowerHostname
97  boost::multi_index::const_mem_fun<Host, std::string,
99  >
100  >
102 
107 typedef HostContainer::nth_index<0>::type HostContainerIndex0;
108 
110 typedef std::pair<HostContainerIndex0::iterator,
111  HostContainerIndex0::iterator> HostContainerIndex0Range;
112 
117 typedef HostContainer::nth_index<1>::type HostContainerIndex1;
118 
120 typedef std::pair<HostContainerIndex1::iterator,
121  HostContainerIndex1::iterator> HostContainerIndex1Range;
122 
127 typedef HostContainer::nth_index<2>::type HostContainerIndex2;
128 
130 typedef std::pair<HostContainerIndex2::iterator,
131  HostContainerIndex2::iterator> HostContainerIndex2Range;
132 
137 typedef HostContainer::nth_index<3>::type HostContainerIndex3;
138 
140 typedef std::pair<HostContainerIndex3::iterator,
141  HostContainerIndex3::iterator> HostContainerIndex3Range;
142 
146 typedef HostContainer::nth_index<4>::type HostContainerIndex4;
147 
149 typedef std::pair<HostContainerIndex4::iterator,
150  HostContainerIndex4::iterator> HostContainerIndex4Range;
151 
155 typedef HostContainer::nth_index<5>::type HostContainerIndex5;
156 
164 
169  HostResrv6Tuple(const IPv6Resrv& resrv, const HostPtr& host)
170  : resrv_(resrv), host_(host), subnet_id_(host ? host->getIPv6SubnetID() : SUBNET_ID_GLOBAL) {
171  }
172 
175 
177  HostPtr host_;
178 
180  const SubnetID subnet_id_;
181 
183  const asiolink::IOAddress& getKey() const {
184  return (resrv_.getPrefix());
185  }
186 };
187 
193 typedef boost::multi_index_container<
194 
195  // This containers stores (IPv6Resrv, HostPtr) tuples
197 
198  // Start specification of indexes here.
199  boost::multi_index::indexed_by<
200 
201  // First index is used to search by an address.
202  boost::multi_index::ordered_non_unique<
203 
204  // Address is extracted by calling IPv6Resrv::getPrefix()
205  // and it will return an IOAddress object.
206  boost::multi_index::const_mem_fun<
207  HostResrv6Tuple, const asiolink::IOAddress&, &HostResrv6Tuple::getKey>
208  >,
209 
210  // Second index is used to search by (subnet_id, address) pair.
211  // This is
212  boost::multi_index::ordered_non_unique<
213 
216  boost::multi_index::composite_key<
217 
218  // Composite key uses members of the HostResrv6Tuple class.
220 
221  // First key extractor. Gets subnet-id as a member of the
222  // HostResrv6Tuple structure.
223  boost::multi_index::member<HostResrv6Tuple, const SubnetID,
225 
226  // Second key extractor. Address is extracted by calling
227  // IPv6Resrv::getPrefix() and it will return an IOAddress object.
228  boost::multi_index::const_mem_fun<
229  HostResrv6Tuple, const asiolink::IOAddress&,
230  &HostResrv6Tuple::getKey
231  >
232  >
233  >,
234 
235  // Third index is used to search for the host using IPv6 subnet id
236  boost::multi_index::ordered_non_unique<
237  // Index using values returned by the @c Host::getIPv6SubnetID
238  boost::multi_index::member<HostResrv6Tuple, const SubnetID,
239  &HostResrv6Tuple::subnet_id_>
240  >
241  >
243 
248 typedef HostContainer6::nth_index<0>::type HostContainer6Index0;
249 
251 typedef std::pair<HostContainer6Index0::iterator,
252  HostContainer6Index0::iterator> HostContainer6Index0Range;
253 
258 typedef HostContainer6::nth_index<1>::type HostContainer6Index1;
259 
261 typedef std::pair<HostContainer6Index1::iterator,
262  HostContainer6Index1::iterator> HostContainer6Index1Range;
263 
268 typedef HostContainer6::nth_index<2>::type HostContainer6Index2;
269 
271 typedef std::pair<HostContainer6Index2::iterator,
272  HostContainer6Index2::iterator> HostContainer6Index2Range;
273 
274 }; // end of isc::dhcp namespace
275 }; // end of isc namespace
276 
277 #endif // HOST_CONTAINER_H
std::pair< HostContainer6Index2::iterator, HostContainer6Index2::iterator > HostContainer6Index2Range
Results range returned using the HostContainer6Index2.
std::pair< HostContainer6Index0::iterator, HostContainer6Index0::iterator > HostContainer6Index0Range
Results range returned using the HostContainer6Index0.
HostContainer6::nth_index< 1 >::type HostContainer6Index1
Second index type in the HostContainer6.
Defines one entry for the Host Container for v6 hosts.
boost::multi_index_container< HostPtr, boost::multi_index::indexed_by< boost::multi_index::ordered_non_unique< boost::multi_index::composite_key< Host, boost::multi_index::const_mem_fun< Host, const std::vector< uint8_t > &, &Host::getIdentifier >, boost::multi_index::const_mem_fun< Host, Host::IdentifierType, &Host::getIdentifierType > > >, boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun< Host, const asiolink::IOAddress &, &Host::getIPv4Reservation > >, boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun< Host, SubnetID, &Host::getIPv4SubnetID > >, boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun< Host, SubnetID, &Host::getIPv6SubnetID > >, boost::multi_index::ordered_unique< boost::multi_index::const_mem_fun< Host, uint64_t, &Host::getHostId > >, boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun< Host, std::string, &Host::getLowerHostname > > >> HostContainer
Multi-index container holding host reservations.
std::pair< HostContainer6Index1::iterator, HostContainer6Index1::iterator > HostContainer6Index1Range
Results range returned using the HostContainer6Index1.
const IPv6Resrv resrv_
Address or prefix reservation.
boost::shared_ptr< Host > HostPtr
Pointer to the Host object.
Definition: host.h:785
HostResrv6Tuple(const IPv6Resrv &resrv, const HostPtr &host)
Default constructor.
std::pair< HostContainerIndex1::iterator, HostContainerIndex1::iterator > HostContainerIndex1Range
Results range returned using the HostContainerIndex1.
HostContainer6::nth_index< 2 >::type HostContainer6Index2
Third index type in the HostContainer6.
HostID getHostId() const
Returns Host ID (primary key in MySQL and PostgreSQL backends)
Definition: host.h:676
HostContainer::nth_index< 0 >::type HostContainerIndex0
First index type in the HostContainer.
std::pair< HostContainerIndex0::iterator, HostContainerIndex0::iterator > HostContainerIndex0Range
Results range returned using the HostContainerIndex0.
IPv6 reservation for a host.
Definition: host.h:161
HostContainer::nth_index< 3 >::type HostContainerIndex3
Forth index type in the HostContainer.
std::pair< HostContainerIndex4::iterator, HostContainerIndex4::iterator > HostContainerIndex4Range
Results range returned using the HostContainerIndex4.
const asiolink::IOAddress & getKey() const
Key extractor (used in the second composite key)
SubnetID getIPv4SubnetID() const
Returns subnet identifier for IPv4 reservation.
Definition: host.h:498
HostContainer::nth_index< 1 >::type HostContainerIndex1
Second index type in the HostContainer.
HostContainer6::nth_index< 0 >::type HostContainer6Index0
First index type in the HostContainer6.
HostPtr host_
Pointer to the host object.
const asiolink::IOAddress & getIPv4Reservation() const
Returns reserved IPv4 address.
Definition: host.h:525
Defines the logger used by the top-level component of kea-lfc.
std::pair< HostContainerIndex2::iterator, HostContainerIndex2::iterator > HostContainerIndex2Range
Results range returned using the HostContainerIndex2.
HostContainer::nth_index< 4 >::type HostContainerIndex4
Fifth index type in the HostContainer.
SubnetID getIPv6SubnetID() const
Returns subnet identifier for IPv6 reservations.
Definition: host.h:503
IdentifierType getIdentifierType() const
Returns the identifier type.
Definition: host.cc:217
const SubnetID subnet_id_
Value of the IPv6 Subnet-id.
std::string getLowerHostname() const
Returns reserved hostname in lower case.
Definition: host.h:574
std::pair< HostContainerIndex3::iterator, HostContainerIndex3::iterator > HostContainerIndex3Range
Results range returned using the HostContainerIndex3.
boost::multi_index_container< HostResrv6Tuple, boost::multi_index::indexed_by< boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun< HostResrv6Tuple, const asiolink::IOAddress &, &HostResrv6Tuple::getKey > >, boost::multi_index::ordered_non_unique< boost::multi_index::composite_key< HostResrv6Tuple, boost::multi_index::member< HostResrv6Tuple, const SubnetID, &HostResrv6Tuple::subnet_id_ >, boost::multi_index::const_mem_fun< HostResrv6Tuple, const asiolink::IOAddress &, &HostResrv6Tuple::getKey > > >, boost::multi_index::ordered_non_unique< boost::multi_index::member< HostResrv6Tuple, const SubnetID, &HostResrv6Tuple::subnet_id_ > > >> HostContainer6
Multi-index container holding IPv6 reservations.
HostContainer::nth_index< 2 >::type HostContainerIndex2
Third index type in the HostContainer.
HostContainer::nth_index< 5 >::type HostContainerIndex5
Sixth index type in the HostContainer.
IdentifierType
Type of the host identifier.
Definition: host.h:307
const std::vector< uint8_t > & getIdentifier() const
Returns the identifier in a binary form.
Definition: host.cc:212
const asiolink::IOAddress & getPrefix() const
Returns prefix for the reservation.
Definition: host.h:190
uint32_t SubnetID
Defines unique IPv4 or IPv6 subnet identifier.
Definition: subnet_id.h:24