Kea 2.2.0
memfile_lease_mgr.h
Go to the documentation of this file.
1// Copyright (C) 2012-2022 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 MEMFILE_LEASE_MGR_H
8#define MEMFILE_LEASE_MGR_H
9
13#include <dhcp/hwaddr.h>
18#include <dhcpsrv/lease_mgr.h>
19
20#include <boost/scoped_ptr.hpp>
21#include <boost/shared_ptr.hpp>
22
23#include <mutex>
24
25namespace isc {
26namespace dhcp {
27
28class LFCSetup;
29
80class Memfile_LeaseMgr : public LeaseMgr {
81public:
82
92 static const int MAJOR_VERSION_V4 = 2;
93
95 static const int MINOR_VERSION_V4 = 1;
97
109 static const int MAJOR_VERSION_V6 = 4;
110
112 static const int MINOR_VERSION_V6 = 0;
114
115
122 enum Universe {
124 V6
125 };
126
130
131
153
155 virtual ~Memfile_LeaseMgr();
156
158 static std::string getDBVersion(Universe const& u);
159
165 virtual bool addLease(const Lease4Ptr& lease) override;
166
172 virtual bool addLease(const Lease6Ptr& lease) override;
173
182 virtual Lease4Ptr getLease4(const isc::asiolink::IOAddress& addr) const override;
183
194 virtual Lease4Collection getLease4(const isc::dhcp::HWAddr& hwaddr) const override;
195
209 virtual Lease4Ptr getLease4(const HWAddr& hwaddr,
210 SubnetID subnet_id) const override;
211
217 virtual Lease4Collection getLease4(const ClientId& client_id) const override;
218
231 virtual Lease4Ptr getLease4(const ClientId& clientid,
232 SubnetID subnet_id) const override;
233
239 virtual Lease4Collection getLeases4(SubnetID subnet_id) const override;
240
246 virtual Lease4Collection getLeases4(const std::string& hostname) const override;
247
251 virtual Lease4Collection getLeases4() const override;
252
277 virtual Lease4Collection
278 getLeases4(const asiolink::IOAddress& lower_bound_address,
279 const LeasePageSize& page_size) const override;
280
290 virtual Lease6Ptr getLease6(Lease::Type type,
291 const isc::asiolink::IOAddress& addr) const override;
292
302 const DUID& duid,
303 uint32_t iaid) const override;
304
318 const DUID& duid,
319 uint32_t iaid,
320 SubnetID subnet_id) const override;
321
327 virtual Lease6Collection getLeases6(SubnetID subnet_id) const override;
328
334 virtual Lease6Collection getLeases6(const std::string& hostname) const override;
335
339 virtual Lease6Collection getLeases6() const override;
340
344 virtual Lease6Collection getLeases6(const DUID& duid) const override;
345
370 virtual Lease6Collection
371 getLeases6(const asiolink::IOAddress& lower_bound_address,
372 const LeasePageSize& page_size) const override;
373
384 virtual void getExpiredLeases4(Lease4Collection& expired_leases,
385 const size_t max_leases) const override;
386
397 virtual void getExpiredLeases6(Lease6Collection& expired_leases,
398 const size_t max_leases) const override;
399
417 virtual void updateLease4(const Lease4Ptr& lease4) override;
418
436 virtual void updateLease6(const Lease6Ptr& lease6) override;
437
452 virtual bool deleteLease(const Lease4Ptr& lease) override;
453
468 virtual bool deleteLease(const Lease6Ptr& lease) override;
469
477 virtual uint64_t deleteExpiredReclaimedLeases4(const uint32_t secs) override;
478
486 virtual uint64_t deleteExpiredReclaimedLeases6(const uint32_t secs) override;
487
496 virtual size_t wipeLeases4(const SubnetID& subnet_id) override;
497
506 virtual size_t wipeLeases6(const SubnetID& subnet_id) override;
507
519 virtual std::string
520 checkLimits4(isc::data::ConstElementPtr const& user_context) const override;
521
533 virtual std::string
534 checkLimits6(isc::data::ConstElementPtr const& user_context) const override;
535
540 virtual bool isJsonSupported() const override;
541
542private:
543
547
553 bool addLeaseInternal(const Lease4Ptr& lease);
554
560 bool addLeaseInternal(const Lease6Ptr& lease);
561
567 Lease4Ptr getLease4Internal(const isc::asiolink::IOAddress& addr) const;
568
573 void getLease4Internal(const isc::dhcp::HWAddr& hwaddr,
574 Lease4Collection& collection) const;
575
583 Lease4Ptr getLease4Internal(const HWAddr& hwaddr,
584 SubnetID subnet_id) const;
585
590 void getLease4Internal(const ClientId& client_id,
591 Lease4Collection& collection) const;
592
600 Lease4Ptr getLease4Internal(const ClientId& clientid,
601 const HWAddr& hwaddr,
602 SubnetID subnet_id) const;
603
610 Lease4Ptr getLease4Internal(const ClientId& clientid,
611 SubnetID subnet_id) const;
612
617 void getLeases4Internal(SubnetID subnet_id,
618 Lease4Collection& collection) const;
619
624 void getLeases4Internal(const std::string& hostname,
625 Lease4Collection& collection) const;
626
630 void getLeases4Internal(Lease4Collection& collection) const;
631
638 void getLeases4Internal(const asiolink::IOAddress& lower_bound_address,
639 const LeasePageSize& page_size,
640 Lease4Collection& collection) const;
641
648 Lease6Ptr getLease6Internal(Lease::Type type,
649 const isc::asiolink::IOAddress& addr) const;
650
658 void getLeases6Internal(Lease::Type type,
659 const DUID& duid,
660 uint32_t iaid,
661 Lease6Collection& collection) const;
662
671 void getLeases6Internal(Lease::Type type,
672 const DUID& duid,
673 uint32_t iaid,
674 SubnetID subnet_id,
675 Lease6Collection& collection) const;
676
681 void getLeases6Internal(SubnetID subnet_id,
682 Lease6Collection& collection) const;
683
688 void getLeases6Internal(const std::string& hostname,
689 Lease6Collection& collection) const;
690
694 void getLeases6Internal(Lease6Collection& collection) const;
695
700 void getLeases6Internal(const DUID& duid,
701 Lease6Collection& collection) const;
702
709 void getLeases6Internal(const asiolink::IOAddress& lower_bound_address,
710 const LeasePageSize& page_size,
711 Lease6Collection& collection) const;
712
719 void getExpiredLeases4Internal(Lease4Collection& expired_leases,
720 const size_t max_leases) const;
721
728 void getExpiredLeases6Internal(Lease6Collection& expired_leases,
729 const size_t max_leases) const;
730
745 void updateLease4Internal(const Lease4Ptr& lease4);
746
761 void updateLease6Internal(const Lease6Ptr& lease6);
762
777 bool deleteLeaseInternal(const Lease4Ptr& addr);
778
793 bool deleteLeaseInternal(const Lease6Ptr& addr);
794
800 size_t wipeLeases4Internal(const SubnetID& subnet_id);
801
807 size_t wipeLeases6Internal(const SubnetID& subnet_id);
809
836 template<typename IndexType, typename LeaseType, typename StorageType,
837 typename LeaseFileType>
838 uint64_t deleteExpiredReclaimedLeases(const uint32_t secs,
839 const Universe& universe,
840 StorageType& storage,
841 LeaseFileType& lease_file) const;
842
849 int64_t getSubnetStat(const SubnetID& subnet_id, const std::string& stat_label) const;
850
861 bool getLeaseLimit(data::ConstElementPtr parent, Lease::Type ltype, size_t& limit) const;
862
863public:
864
870 virtual std::string getType() const override {
871 return (std::string("memfile"));
872 }
873
879 virtual std::string getName() const override {
880 return ("memory");
881 }
882
888 virtual std::string getDescription() const override;
889
894 virtual std::pair<uint32_t, uint32_t> getVersion() const override;
895
900 virtual void commit() override;
901
906 virtual void rollback() override;
907
909
911
912
923 FILE_PID
924 };
925
944 static std::string appendSuffix(const std::string& file_name,
945 const LFCFileType& file_type);
947
948
952
953
957 std::string getDefaultLeaseFilePath(Universe u) const;
958
965 std::string getLeaseFilePath(Universe u) const;
966
978 bool persistLeases(Universe u) const;
979
981
982private:
983
984
1000 std::string initLeaseFilePath(Universe u);
1001
1057 template<typename LeaseObjectType, typename LeaseFileType,
1058 typename StorageType>
1059 bool loadLeasesFromFiles(const std::string& filename,
1060 boost::shared_ptr<LeaseFileType>& lease_file,
1061 StorageType& storage);
1062
1064 Lease4Storage storage4_;
1065
1067 Lease6Storage storage6_;
1068
1070 boost::shared_ptr<CSVLeaseFile4> lease_file4_;
1071
1073 boost::shared_ptr<CSVLeaseFile6> lease_file6_;
1074
1075public:
1076
1081
1082
1086 bool isLFCRunning() const;
1087
1090 int getLFCExitStatus() const;
1092
1100 virtual LeaseStatsQueryPtr startLeaseStatsQuery4() override;
1101
1110 virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery4(const SubnetID& subnet_id) override;
1111
1121 virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery4(const SubnetID& first_subnet_id,
1122 const SubnetID& last_subnet_id) override;
1123
1131 virtual LeaseStatsQueryPtr startLeaseStatsQuery6() override;
1132
1141 virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery6(const SubnetID& subnet_id) override;
1142
1152 virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery6(const SubnetID& first_subnet_id,
1153 const SubnetID& last_subnet_id) override;
1154
1158
1159
1160protected:
1161
1173 virtual void lfcCallback();
1175
1177
1178
1179private:
1180
1197 void lfcSetup(bool conversion_needed = false);
1198
1221 template<typename LeaseFileType>
1222 void lfcExecute(boost::shared_ptr<LeaseFileType>& lease_file);
1223
1225 boost::scoped_ptr<LFCSetup> lfc_setup_;
1226
1232
1234
1236 boost::scoped_ptr<std::mutex> mutex_;
1237
1239 ClassLeaseCounter class_lease_counter_;
1240
1241public:
1249 virtual size_t getClassLeaseCount(const ClientClass& client_class,
1250 const Lease::Type& ltype = Lease::TYPE_V4) const override;
1251
1259 virtual void recountClassLeases4() override;
1260
1268 virtual void recountClassLeases6() override;
1269
1273 virtual void clearClassLeaseCounts() override;
1274};
1275
1276} // namespace dhcp
1277} // namespace isc
1278
1279#endif // MEMFILE_LEASE_MGR_H
Common database connection class.
std::map< std::string, std::string > ParameterMap
Database configuration parameter map.
Container that maintains counts of leases per class and lease type.
Holds Client identifier or client IPv4 address.
Definition: duid.h:111
Holds DUID (DHCPv6 Unique Identifier)
Definition: duid.h:27
Abstract Lease Manager.
Definition: lease_mgr.h:223
static std::string getDBVersion()
Class method to return extended version info This class method must be redeclared and redefined in de...
Definition: lease_mgr.cc:354
Wraps value holding size of the page with leases.
Definition: lease_mgr.h:44
Concrete implementation of a lease database backend using flat file.
virtual void rollback() override
Rollback Transactions.
virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery6(const SubnetID &first_subnet_id, const SubnetID &last_subnet_id) override
Creates and runs the IPv6 lease stats query for a single subnet.
virtual void clearClassLeaseCounts() override
Clears the class-lease count map.
Memfile_LeaseMgr(const db::DatabaseConnection::ParameterMap &parameters)
The sole lease manager constructor.
bool isLFCRunning() const
Checks if the process performing lease file cleanup is running.
virtual void updateLease4(const Lease4Ptr &lease4) override
Updates IPv4 lease.
virtual size_t wipeLeases4(const SubnetID &subnet_id) override
Removes specified IPv4 leases.
virtual bool isJsonSupported() const override
Checks if JSON support is enabled in the database.
Universe
Specifies universe (V4, V6)
virtual std::string getType() const override
Return backend type.
LFCFileType
Types of the lease files used by the Lease File Cleanup.
@ FILE_PREVIOUS
Previous Lease File.
virtual bool deleteLease(const Lease4Ptr &lease) override
Deletes an IPv4 lease.
virtual void commit() override
Commit Transactions.
virtual size_t wipeLeases6(const SubnetID &subnet_id) override
Removed specified IPv6 leases.
int getLFCExitStatus() const
Returns the status code returned by the last executed LFC process.
bool persistLeases(Universe u) const
Specifies whether or not leases are written to disk.
virtual std::string getName() const override
Returns backend name.
virtual Lease4Collection getLeases4() const override
Returns all IPv4 leases.
virtual size_t getClassLeaseCount(const ClientClass &client_class, const Lease::Type &ltype=Lease::TYPE_V4) const override
Returns the class lease count for a given class and lease type.
virtual void getExpiredLeases6(Lease6Collection &expired_leases, const size_t max_leases) const override
Returns a collection of expired DHCPv6 leases.
virtual bool addLease(const Lease4Ptr &lease) override
Adds an IPv4 lease.
virtual void recountClassLeases6() override
Recount the leases per class for V6 leases.
virtual std::pair< uint32_t, uint32_t > getVersion() const override
Returns backend version.
std::string getLeaseFilePath(Universe u) const
Returns an absolute path to the lease file.
virtual Lease6Collection getLeases6() const override
Returns all IPv6 leases.
virtual void lfcCallback()
A callback function triggering Lease File Cleanup (LFC).
virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery4(const SubnetID &subnet_id) override
Creates and runs the IPv4 lease stats query for a single subnet.
virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery6(const SubnetID &subnet_id) override
Creates and runs the IPv6 lease stats query for a single subnet.
virtual std::string getDescription() const override
Returns description of the backend.
static std::string appendSuffix(const std::string &file_name, const LFCFileType &file_type)
Appends appropriate suffix to the file name.
virtual LeaseStatsQueryPtr startLeaseStatsQuery4() override
Creates and runs the IPv4 lease stats query.
virtual Lease6Ptr getLease6(Lease::Type type, const isc::asiolink::IOAddress &addr) const override
Returns existing IPv6 lease for a given IPv6 address.
virtual void recountClassLeases4() override
Recount the leases per class for V4 leases.
virtual void updateLease6(const Lease6Ptr &lease6) override
Updates IPv6 lease.
virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery4(const SubnetID &first_subnet_id, const SubnetID &last_subnet_id) override
Creates and runs the IPv4 lease stats query for a single subnet.
virtual uint64_t deleteExpiredReclaimedLeases4(const uint32_t secs) override
Deletes all expired-reclaimed DHCPv4 leases.
virtual std::string checkLimits6(isc::data::ConstElementPtr const &user_context) const override
Checks if the IPv6 lease limits set in the given user context are exceeded.
virtual LeaseStatsQueryPtr startLeaseStatsQuery6() override
Creates and runs the IPv6 lease stats query.
virtual Lease4Ptr getLease4(const isc::asiolink::IOAddress &addr) const override
Returns existing IPv4 lease for specified IPv4 address.
virtual ~Memfile_LeaseMgr()
Destructor (closes file)
virtual std::string checkLimits4(isc::data::ConstElementPtr const &user_context) const override
Checks if the IPv4 lease limits set in the given user context are exceeded.
std::string getDefaultLeaseFilePath(Universe u) const
Returns default path to the lease file.
virtual uint64_t deleteExpiredReclaimedLeases6(const uint32_t secs) override
Deletes all expired-reclaimed DHCPv6 leases.
virtual void getExpiredLeases4(Lease4Collection &expired_leases, const size_t max_leases) const override
Returns a collection of expired DHCPv4 leases.
static const int MAJOR_VERSION_V4
static const int MINOR_VERSION_V4
the minor version of the v4 memfile backend
static const int MINOR_VERSION_V6
the minor version of the v6 memfile backend
An abstract API for lease database.
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:27
std::string ClientClass
Defines a single class name.
Definition: classify.h:42
boost::multi_index_container< Lease4Ptr, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< AddressIndexTag >, boost::multi_index::member< Lease, isc::asiolink::IOAddress, &Lease::addr_ > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< HWAddressSubnetIdIndexTag >, boost::multi_index::composite_key< Lease4, boost::multi_index::const_mem_fun< Lease, const std::vector< uint8_t > &, &Lease::getHWAddrVector >, boost::multi_index::member< Lease, SubnetID, &Lease::subnet_id_ > > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< ClientIdSubnetIdIndexTag >, boost::multi_index::composite_key< Lease4, boost::multi_index::const_mem_fun< Lease4, const std::vector< uint8_t > &, &Lease4::getClientIdVector >, boost::multi_index::member< Lease, uint32_t, &Lease::subnet_id_ > > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< ExpirationIndexTag >, boost::multi_index::composite_key< Lease4, boost::multi_index::const_mem_fun< Lease, bool, &Lease::stateExpiredReclaimed >, boost::multi_index::const_mem_fun< Lease, int64_t, &Lease::getExpirationTime > > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetIdIndexTag >, boost::multi_index::member< Lease, isc::dhcp::SubnetID, &Lease::subnet_id_ > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< HostnameIndexTag >, boost::multi_index::member< Lease, std::string, &Lease::hostname_ > > > > Lease4Storage
A multi index container holding DHCPv4 leases.
boost::shared_ptr< Lease6 > Lease6Ptr
Pointer to a Lease6 structure.
Definition: lease.h:503
std::vector< Lease6Ptr > Lease6Collection
A collection of IPv6 leases.
Definition: lease.h:661
boost::shared_ptr< LeaseStatsQuery > LeaseStatsQueryPtr
Defines a pointer to a LeaseStatsQuery.
Definition: lease_mgr.h:208
uint32_t SubnetID
Defines unique IPv4 or IPv6 subnet identifier.
Definition: subnet_id.h:24
boost::multi_index_container< Lease6Ptr, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< AddressIndexTag >, boost::multi_index::member< Lease, isc::asiolink::IOAddress, &Lease::addr_ > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< DuidIaidTypeIndexTag >, boost::multi_index::composite_key< Lease6, boost::multi_index::const_mem_fun< Lease6, const std::vector< uint8_t > &, &Lease6::getDuidVector >, boost::multi_index::member< Lease6, uint32_t, &Lease6::iaid_ >, boost::multi_index::member< Lease6, Lease::Type, &Lease6::type_ > > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< ExpirationIndexTag >, boost::multi_index::composite_key< Lease6, boost::multi_index::const_mem_fun< Lease, bool, &Lease::stateExpiredReclaimed >, boost::multi_index::const_mem_fun< Lease, int64_t, &Lease::getExpirationTime > > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetIdIndexTag >, boost::multi_index::member< Lease, isc::dhcp::SubnetID, &Lease::subnet_id_ > >, 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 > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< HostnameIndexTag >, boost::multi_index::member< Lease, std::string, &Lease::hostname_ > > > > Lease6Storage
A multi index container holding DHCPv6 leases.
std::vector< Lease4Ptr > Lease4Collection
A collection of IPv4 leases.
Definition: lease.h:498
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
Definition: lease.h:284
Defines the logger used by the top-level component of kea-lfc.
Hardware type that represents information from DHCPv4 packet.
Definition: hwaddr.h:20
Type
Type of lease or pool.
Definition: lease.h:46
@ TYPE_V4
IPv4 lease.
Definition: lease.h:50