27#include <boost/foreach.hpp>
44const char* KEA_LFC_EXECUTABLE_ENV_NAME =
"KEA_LFC_EXECUTABLE";
101 void setup(
const uint32_t lfc_interval,
102 const boost::shared_ptr<CSVLeaseFile4>& lease_file4,
103 const boost::shared_ptr<CSVLeaseFile6>& lease_file6,
104 bool run_once_now =
false);
107 void execute(
const std::string& lease_file);
124 boost::scoped_ptr<ProcessSpawn> process_;
140 : process_(), callback_(callback), pid_(0),
156 timer_mgr_->unregisterTimer(
"memfile-lfc");
158 }
catch (
const std::exception& ex) {
169 const boost::shared_ptr<CSVLeaseFile4>& lease_file4,
170 const boost::shared_ptr<CSVLeaseFile6>& lease_file6,
174 std::string executable;
175 char* c_executable = getenv(KEA_LFC_EXECUTABLE_ENV_NAME);
177 executable = KEA_LFC_EXECUTABLE;
179 executable = c_executable;
183 std::string lease_file = lease_file4 ? lease_file4->getFilename() :
184 lease_file6->getFilename();
189 args.push_back(lease_file4 ?
"-4" :
"-6");
192 args.push_back(
"-x");
196 args.push_back(
"-i");
200 args.push_back(
"-o");
204 args.push_back(
"-f");
208 args.push_back(
"-p");
213 args.push_back(
"-c");
214 args.push_back(
"ignored-path");
226 if (lfc_interval > 0) {
233 timer_mgr_->registerTimer(
"memfile-lfc", callback_, lfc_interval * 1000,
235 timer_mgr_->setup(
"memfile-lfc");
258 process_->clearState(pid_);
270 .arg(process_->getCommandLine());
272 pid_ = process_->spawn();
284 pid_file.
write(pid_);
294 return (process_ && process_->isRunning(pid_));
301 " the process is null");
303 return (process_->getExitStatus(pid_));
366 return (
rows_.size());
462 void startSubnets() {
467 Lease4StorageSubnetIdIndex::const_iterator lower;
468 Lease4StorageSubnetIdIndex::const_iterator upper;
491 if (lower == upper) {
499 int64_t assigned = 0;
500 int64_t declined = 0;
501 for (Lease4StorageSubnetIdIndex::const_iterator lease = lower;
502 lease != upper; ++lease) {
505 if ((*lease)->subnet_id_ != cur_id) {
508 rows_.push_back(LeaseStatsRow(cur_id,
515 rows_.push_back(LeaseStatsRow(cur_id,
523 cur_id = (*lease)->subnet_id_;
563 void startSubnetPools() {
565 = storage4_.get<SubnetIdPoolIdIndexTag>();
568 Lease4StorageSubnetIdPoolIdIndex::const_iterator lower;
569 Lease4StorageSubnetIdPoolIdIndex::const_iterator upper;
581 if (lower == upper) {
589 uint32_t cur_pool_id = 0;
590 int64_t assigned = 0;
591 int64_t declined = 0;
592 for (Lease4StorageSubnetIdPoolIdIndex::const_iterator lease = lower;
593 lease != upper; ++lease) {
596 if ((*lease)->pool_id_ != cur_pool_id) {
598 rows_.push_back(LeaseStatsRow(cur_id,
600 assigned, cur_pool_id));
605 rows_.push_back(LeaseStatsRow(cur_id,
607 declined, cur_pool_id));
612 cur_pool_id = (*lease)->pool_id_;
617 if ((*lease)->subnet_id_ != cur_id) {
620 rows_.push_back(LeaseStatsRow(cur_id,
622 assigned, cur_pool_id));
627 rows_.push_back(LeaseStatsRow(cur_id,
629 declined, cur_pool_id));
635 cur_id = (*lease)->subnet_id_;
652 assigned, cur_pool_id));
657 declined, cur_pool_id));
756 virtual void startSubnets() {
761 Lease6StorageSubnetIdIndex::const_iterator lower;
762 Lease6StorageSubnetIdIndex::const_iterator upper;
784 if (lower == upper) {
792 int64_t assigned = 0;
793 int64_t declined = 0;
794 int64_t assigned_pds = 0;
795 int64_t registered = 0;
796 for (Lease6StorageSubnetIdIndex::const_iterator lease = lower;
797 lease != upper; ++lease) {
800 if ((*lease)->subnet_id_ != cur_id) {
816 if (assigned_pds > 0) {
823 if (registered > 0) {
832 cur_id = (*lease)->subnet_id_;
837 switch((*lease)->type_) {
871 if (assigned_pds > 0) {
876 if (registered > 0) {
899 virtual void startSubnetPools() {
901 = storage6_.get<SubnetIdPoolIdIndexTag>();
904 Lease6StorageSubnetIdPoolIdIndex::const_iterator lower;
905 Lease6StorageSubnetIdPoolIdIndex::const_iterator upper;
917 if (lower == upper) {
925 uint32_t cur_pool_id = 0;
926 int64_t assigned = 0;
927 int64_t declined = 0;
928 int64_t assigned_pds = 0;
929 for (Lease6StorageSubnetIdPoolIdIndex::const_iterator lease = lower;
930 lease != upper; ++lease) {
933 if ((*lease)->pool_id_ != cur_pool_id) {
937 assigned, cur_pool_id));
944 declined, cur_pool_id));
948 if (assigned_pds > 0) {
951 assigned_pds, cur_pool_id));
956 cur_pool_id = (*lease)->pool_id_;
961 if ((*lease)->subnet_id_ != cur_id) {
966 assigned, cur_pool_id));
973 declined, cur_pool_id));
977 if (assigned_pds > 0) {
980 assigned_pds, cur_pool_id));
986 cur_id = (*lease)->subnet_id_;
994 switch((*lease)->type_) {
1025 if (assigned_pds > 0) {
1047 :
TrackingLeaseMgr(), lfc_setup_(), conn_(parameters), mutex_(new std::mutex) {
1048 bool conversion_needed =
false;
1054 std::string universe = conn_.getParameter(
"universe");
1055 if (universe ==
"4") {
1056 std::string file4 = initLeaseFilePath(
V4);
1057 if (!file4.empty()) {
1058 conversion_needed = loadLeasesFromFiles<
Lease4,
1065 std::string file6 = initLeaseFilePath(
V6);
1066 if (!file6.empty()) {
1067 conversion_needed = loadLeasesFromFiles<
Lease6,
1082 if (conversion_needed) {
1087 lfcSetup(conversion_needed);
1094 if (conn_.reconnectCtl()->maxRetries() > 0) {
1096 <<
" values greater than zero are not supported by memfile");
1099 if (conn_.reconnectCtl()->retryInterval() > 0) {
1101 <<
" values greater than zero are not supported by memfile");
1118 std::stringstream tmp;
1119 tmp <<
"Memfile backend ";
1122 }
else if (u ==
V6) {
1131 if (family == AF_INET6) {
1139Memfile_LeaseMgr::handleDbLost() {
1149Memfile_LeaseMgr::addLeaseInternal(
const Lease4Ptr& lease) {
1150 if (getLease4Internal(lease->addr_)) {
1161 }
catch (
const CSVFileFatalError&) {
1167 storage4_.insert(lease);
1171 lease->updateCurrentExpirationTime();
1174 class_lease_counter_.addLease(lease);
1190 std::lock_guard<std::mutex> lock(*mutex_);
1191 return (addLeaseInternal(lease));
1193 return (addLeaseInternal(lease));
1198Memfile_LeaseMgr::addLeaseInternal(
const Lease6Ptr& lease) {
1199 if (getLease6Internal(lease->type_, lease->addr_)) {
1217 storage6_.insert(lease);
1221 lease->updateCurrentExpirationTime();
1224 class_lease_counter_.addLease(lease);
1244 std::lock_guard<std::mutex> lock(*mutex_);
1245 return (addLeaseInternal(lease));
1247 return (addLeaseInternal(lease));
1254 Lease4StorageAddressIndex::iterator l = idx.find(addr);
1255 if (l == idx.end()) {
1268 std::lock_guard<std::mutex> lock(*mutex_);
1269 return (getLease4Internal(addr));
1271 return (getLease4Internal(addr));
1276Memfile_LeaseMgr::getLease4Internal(
const HWAddr& hwaddr,
1282 std::pair<Lease4StorageHWAddressSubnetIdIndex::const_iterator,
1283 Lease4StorageHWAddressSubnetIdIndex::const_iterator> l
1284 = idx.equal_range(boost::make_tuple(hwaddr.
hwaddr_));
1286 BOOST_FOREACH(
auto const& lease, l) {
1298 std::lock_guard<std::mutex> lock(*mutex_);
1299 getLease4Internal(hwaddr, collection);
1301 getLease4Internal(hwaddr, collection);
1304 return (collection);
1308Memfile_LeaseMgr::getLease4Internal(
const HWAddr& hwaddr,
1314 Lease4StorageHWAddressSubnetIdIndex::const_iterator lease =
1315 idx.find(boost::make_tuple(hwaddr.
hwaddr_, subnet_id));
1317 if (lease == idx.end()) {
1322 return (
Lease4Ptr(
new Lease4(**lease)));
1333 std::lock_guard<std::mutex> lock(*mutex_);
1334 return (getLease4Internal(hwaddr, subnet_id));
1336 return (getLease4Internal(hwaddr, subnet_id));
1341Memfile_LeaseMgr::getLease4Internal(
const ClientId& client_id,
1347 std::pair<Lease4StorageClientIdSubnetIdIndex::const_iterator,
1348 Lease4StorageClientIdSubnetIdIndex::const_iterator> l
1349 = idx.equal_range(boost::make_tuple(client_id.
getClientId()));
1351 BOOST_FOREACH(
auto const& lease, l) {
1363 std::lock_guard<std::mutex> lock(*mutex_);
1364 getLease4Internal(client_id, collection);
1366 getLease4Internal(client_id, collection);
1369 return (collection);
1373Memfile_LeaseMgr::getLease4Internal(
const ClientId& client_id,
1379 Lease4StorageClientIdSubnetIdIndex::const_iterator lease =
1380 idx.find(boost::make_tuple(client_id.
getClientId(), subnet_id));
1382 if (lease == idx.end()) {
1386 return (
Lease4Ptr(
new Lease4(**lease)));
1394 .arg(client_id.
toText());
1397 std::lock_guard<std::mutex> lock(*mutex_);
1398 return (getLease4Internal(client_id, subnet_id));
1400 return (getLease4Internal(client_id, subnet_id));
1405Memfile_LeaseMgr::getLeases4Internal(
SubnetID subnet_id,
1408 std::pair<Lease4StorageSubnetIdIndex::const_iterator,
1409 Lease4StorageSubnetIdIndex::const_iterator> l =
1410 idx.equal_range(subnet_id);
1412 BOOST_FOREACH(
auto const& lease, l) {
1424 std::lock_guard<std::mutex> lock(*mutex_);
1425 getLeases4Internal(subnet_id, collection);
1427 getLeases4Internal(subnet_id, collection);
1430 return (collection);
1434Memfile_LeaseMgr::getLeases4Internal(
const std::string& hostname,
1437 std::pair<Lease4StorageHostnameIndex::const_iterator,
1438 Lease4StorageHostnameIndex::const_iterator> l =
1439 idx.equal_range(hostname);
1441 BOOST_FOREACH(
auto const& lease, l) {
1453 std::lock_guard<std::mutex> lock(*mutex_);
1454 getLeases4Internal(hostname, collection);
1456 getLeases4Internal(hostname, collection);
1459 return (collection);
1464 for (
auto const& lease : storage4_) {
1475 std::lock_guard<std::mutex> lock(*mutex_);
1476 getLeases4Internal(collection);
1478 getLeases4Internal(collection);
1481 return (collection);
1489 Lease4StorageAddressIndex::const_iterator lb = idx.lower_bound(lower_bound_address);
1492 if ((lb != idx.end()) && ((*lb)->addr_ == lower_bound_address)) {
1497 for (
auto lease = lb;
1498 (lease != idx.end()) &&
1499 (
static_cast<size_t>(std::distance(lb, lease)) < page_size.
page_size_);
1501 collection.push_back(
Lease4Ptr(
new Lease4(**lease)));
1509 if (!lower_bound_address.
isV4()) {
1511 "retrieving leases from the lease database, got "
1512 << lower_bound_address);
1517 .arg(lower_bound_address.
toText());
1521 std::lock_guard<std::mutex> lock(*mutex_);
1522 getLeases4Internal(lower_bound_address, page_size, collection);
1524 getLeases4Internal(lower_bound_address, page_size, collection);
1527 return (collection);
1534 std::lock_guard<std::mutex> lock(*mutex_);
1535 getLeases4ByStateInternal(state, subnet_id, collection);
1537 getLeases4ByStateInternal(state, subnet_id, collection);
1540 return (collection);
1544Memfile_LeaseMgr::getLeases4ByStateInternal(uint32_t state,
1547 if (subnet_id == 0) {
1548 return (getLeases4ByStateInternal(state, collection));
1551 std::pair<Lease4StorageStateIndex::const_iterator,
1552 Lease4StorageStateIndex::const_iterator> l =
1553 idx.equal_range(boost::make_tuple(state, subnet_id));
1555 BOOST_FOREACH(
auto const& lease, l) {
1556 collection.push_back(
Lease4Ptr(
new Lease4(*lease)));
1561Memfile_LeaseMgr::getLeases4ByStateInternal(uint32_t state,
1564 std::pair<Lease4StorageStateIndex::const_iterator,
1565 Lease4StorageStateIndex::const_iterator> l =
1566 idx.equal_range(boost::make_tuple(state));
1568 BOOST_FOREACH(
auto const& lease, l) {
1569 collection.push_back(
Lease4Ptr(
new Lease4(*lease)));
1574Memfile_LeaseMgr::getLease6Internal(
Lease::Type type,
1575 const isc::asiolink::IOAddress& addr)
const {
1576 Lease6Storage::iterator l = storage6_.find(addr);
1577 if (l == storage6_.end() || !(*l) || ((*l)->type_ != type)) {
1585Memfile_LeaseMgr::getLease6Internal(
const HWAddr& hwaddr,
1588 storage6_.get<HWAddressIndexTag>();
1589 std::pair<Lease6StorageHWAddressIndex::const_iterator,
1590 Lease6StorageHWAddressIndex::const_iterator> l
1591 = idx.equal_range(hwaddr.hwaddr_);
1593 BOOST_FOREACH(
auto const& lease, l) {
1594 collection.push_back(
Lease6Ptr(
new Lease6(*lease)));
1605 std::lock_guard<std::mutex> lock(*mutex_);
1606 getLease6Internal(hwaddr, collection);
1608 getLease6Internal(hwaddr, collection);
1611 return (collection);
1616 Lease6Storage::iterator l = storage6_.find(addr);
1617 if (l == storage6_.end() || !(*l)) {
1633 std::lock_guard<std::mutex> lock(*mutex_);
1634 return (getLease6Internal(type, addr));
1636 return (getLease6Internal(type, addr));
1641Memfile_LeaseMgr::getLeases6Internal(
Lease::Type type,
1648 std::pair<Lease6StorageDuidIaidTypeIndex::const_iterator,
1649 Lease6StorageDuidIaidTypeIndex::const_iterator> l =
1650 idx.equal_range(boost::make_tuple(duid.
getDuid(), iaid, type));
1652 for (Lease6StorageDuidIaidTypeIndex::const_iterator lease =
1653 l.first; lease != l.second; ++lease) {
1661 uint32_t iaid)
const {
1670 std::lock_guard<std::mutex> lock(*mutex_);
1671 getLeases6Internal(type, duid, iaid, collection);
1673 getLeases6Internal(type, duid, iaid, collection);
1676 return (collection);
1680Memfile_LeaseMgr::getLeases6Internal(
Lease::Type type,
1688 std::pair<Lease6StorageDuidIaidTypeIndex::const_iterator,
1689 Lease6StorageDuidIaidTypeIndex::const_iterator> l =
1690 idx.equal_range(boost::make_tuple(duid.
getDuid(), iaid, type));
1692 for (Lease6StorageDuidIaidTypeIndex::const_iterator lease =
1693 l.first; lease != l.second; ++lease) {
1695 if ((*lease)->subnet_id_ == subnet_id) {
1715 std::lock_guard<std::mutex> lock(*mutex_);
1716 getLeases6Internal(type, duid, iaid, subnet_id, collection);
1718 getLeases6Internal(type, duid, iaid, subnet_id, collection);
1721 return (collection);
1725Memfile_LeaseMgr::getLeases6Internal(
SubnetID subnet_id,
1728 std::pair<Lease6StorageSubnetIdIndex::const_iterator,
1729 Lease6StorageSubnetIdIndex::const_iterator> l =
1730 idx.equal_range(subnet_id);
1732 BOOST_FOREACH(
auto const& lease, l) {
1744 std::lock_guard<std::mutex> lock(*mutex_);
1745 getLeases6Internal(subnet_id, collection);
1747 getLeases6Internal(subnet_id, collection);
1750 return (collection);
1754Memfile_LeaseMgr::getLeases6Internal(
const std::string& hostname,
1757 std::pair<Lease6StorageHostnameIndex::const_iterator,
1758 Lease6StorageHostnameIndex::const_iterator> l =
1759 idx.equal_range(hostname);
1761 BOOST_FOREACH(
auto const& lease, l) {
1773 std::lock_guard<std::mutex> lock(*mutex_);
1774 getLeases6Internal(hostname, collection);
1776 getLeases6Internal(hostname, collection);
1779 return (collection);
1784 for (
auto const& lease : storage6_) {
1795 std::lock_guard<std::mutex> lock(*mutex_);
1796 getLeases6Internal(collection);
1798 getLeases6Internal(collection);
1801 return (collection);
1805Memfile_LeaseMgr::getLeases6Internal(
const DUID& duid,
1808 std::pair<Lease6StorageDuidIndex::const_iterator,
1809 Lease6StorageDuidIndex::const_iterator> l =
1810 idx.equal_range(duid.
getDuid());
1812 BOOST_FOREACH(
auto const& lease, l) {
1824 std::lock_guard<std::mutex> lock(*mutex_);
1825 getLeases6Internal(duid, collection);
1827 getLeases6Internal(duid, collection);
1830 return (collection);
1838 Lease6StorageAddressIndex::const_iterator lb = idx.lower_bound(lower_bound_address);
1841 if ((lb != idx.end()) && ((*lb)->addr_ == lower_bound_address)) {
1846 for (
auto lease = lb;
1847 (lease != idx.end()) &&
1848 (
static_cast<size_t>(std::distance(lb, lease)) < page_size.
page_size_);
1850 collection.push_back(
Lease6Ptr(
new Lease6(**lease)));
1858 if (!lower_bound_address.
isV6()) {
1860 "retrieving leases from the lease database, got "
1861 << lower_bound_address);
1866 .arg(lower_bound_address.
toText());
1870 std::lock_guard<std::mutex> lock(*mutex_);
1871 getLeases6Internal(lower_bound_address, page_size, collection);
1873 getLeases6Internal(lower_bound_address, page_size, collection);
1876 return (collection);
1880Memfile_LeaseMgr::getLeases6Internal(
SubnetID subnet_id,
1885 Lease6StorageSubnetIdIndex::const_iterator lb =
1886 idx.lower_bound(boost::make_tuple(subnet_id, lower_bound_address));
1889 if ((lb != idx.end()) && ((*lb)->addr_ == lower_bound_address)) {
1894 for (
auto it = lb; it != idx.end(); ++it) {
1895 if ((*it)->subnet_id_ != subnet_id) {
1899 collection.push_back(
Lease6Ptr(
new Lease6(**it)));
1900 if (collection.size() >= page_size.
page_size_) {
1904 return (collection);
1914 .arg(lower_bound_address.
toText())
1918 if (!lower_bound_address.
isV6()) {
1920 "retrieving leases from the lease database, got "
1921 << lower_bound_address);
1925 std::lock_guard<std::mutex> lock(*mutex_);
1926 return (getLeases6Internal(subnet_id,
1927 lower_bound_address,
1930 return (getLeases6Internal(subnet_id,
1931 lower_bound_address,
1940 std::lock_guard<std::mutex> lock(*mutex_);
1941 getLeases6ByStateInternal(state, subnet_id, collection);
1943 getLeases6ByStateInternal(state, subnet_id, collection);
1946 return (collection);
1950Memfile_LeaseMgr::getLeases6ByStateInternal(uint32_t state,
1953 if (subnet_id == 0) {
1954 return (getLeases6ByStateInternal(state, collection));
1957 std::pair<Lease6StorageStateIndex::const_iterator,
1958 Lease6StorageStateIndex::const_iterator> l =
1959 idx.equal_range(boost::make_tuple(state, subnet_id));
1961 BOOST_FOREACH(
auto const& lease, l) {
1962 collection.push_back(
Lease6Ptr(
new Lease6(*lease)));
1967Memfile_LeaseMgr::getLeases6ByStateInternal(uint32_t state,
1970 std::pair<Lease6StorageStateIndex::const_iterator,
1971 Lease6StorageStateIndex::const_iterator> l =
1972 idx.equal_range(boost::make_tuple(state));
1974 BOOST_FOREACH(
auto const& lease, l) {
1975 collection.push_back(
Lease6Ptr(
new Lease6(*lease)));
1980Memfile_LeaseMgr::getExpiredLeases4Internal(
Lease4Collection& expired_leases,
1981 const size_t max_leases)
const {
1989 Lease4StorageExpirationIndex::const_iterator ub =
1990 index.upper_bound(boost::make_tuple(
false, time(0)));
1993 for (Lease4StorageExpirationIndex::const_iterator lease = index.begin();
1995 ((max_leases == 0) ||
1996 (
static_cast<size_t>(std::distance(index.begin(), lease)) < max_leases));
1998 expired_leases.push_back(
Lease4Ptr(
new Lease4(**lease)));
2004 const size_t max_leases)
const {
2009 std::lock_guard<std::mutex> lock(*mutex_);
2010 getExpiredLeases4Internal(expired_leases, max_leases);
2012 getExpiredLeases4Internal(expired_leases, max_leases);
2017Memfile_LeaseMgr::getExpiredLeases6Internal(
Lease6Collection& expired_leases,
2018 const size_t max_leases)
const {
2026 Lease6StorageExpirationIndex::const_iterator ub =
2027 index.upper_bound(boost::make_tuple(
false, time(0)));
2030 for (Lease6StorageExpirationIndex::const_iterator lease = index.begin();
2032 ((max_leases == 0) ||
2033 (
static_cast<size_t>(std::distance(index.begin(), lease)) < max_leases));
2041 const size_t max_leases)
const {
2046 std::lock_guard<std::mutex> lock(*mutex_);
2047 getExpiredLeases6Internal(expired_leases, max_leases);
2049 getExpiredLeases6Internal(expired_leases, max_leases);
2054Memfile_LeaseMgr::updateLease4Internal(
const Lease4Ptr& lease) {
2061 Lease4StorageAddressIndex::const_iterator lease_it = index.find(lease->addr_);
2062 if (lease_it == index.end()) {
2064 << lease->addr_ <<
" - no such lease");
2065 }
else if ((!persist) && (((*lease_it)->cltt_ != lease->current_cltt_) ||
2066 ((*lease_it)->valid_lft_ != lease->current_valid_lft_))) {
2069 isc_throw(NoSuchLease,
"unable to update lease for address " <<
2070 lease->addr_.toText() <<
" either because the lease does not exist, "
2071 "it has been deleted or it has changed in the database.");
2080 }
catch (
const CSVFileFatalError&) {
2087 lease->updateCurrentExpirationTime();
2094 index.replace(lease_it,
Lease4Ptr(
new Lease4(*lease)));
2097 class_lease_counter_.updateLease(lease, old_lease);
2111 std::lock_guard<std::mutex> lock(*mutex_);
2112 updateLease4Internal(lease);
2114 updateLease4Internal(lease);
2119Memfile_LeaseMgr::updateLease6Internal(
const Lease6Ptr& lease) {
2130 Lease6StorageAddressIndex::const_iterator lease_it = index.find(lease->addr_);
2131 if (lease_it == index.end()) {
2133 << lease->addr_ <<
" - no such lease");
2134 }
else if ((!persist) && (((*lease_it)->cltt_ != lease->current_cltt_) ||
2135 ((*lease_it)->valid_lft_ != lease->current_valid_lft_))) {
2138 isc_throw(NoSuchLease,
"unable to update lease for address " <<
2139 lease->addr_.toText() <<
" either because the lease does not exist, "
2140 "it has been deleted or it has changed in the database.");
2149 }
catch (
const CSVFileFatalError&) {
2156 lease->updateCurrentExpirationTime();
2163 index.replace(lease_it,
Lease6Ptr(
new Lease6(*lease)));
2166 class_lease_counter_.updateLease(lease, old_lease);
2170 switch (recorded_action) {
2197 std::lock_guard<std::mutex> lock(*mutex_);
2198 updateLease6Internal(lease);
2200 updateLease6Internal(lease);
2205Memfile_LeaseMgr::deleteLeaseInternal(
const Lease4Ptr& lease) {
2207 Lease4Storage::iterator l = storage4_.find(addr);
2208 if (l == storage4_.end()) {
2215 Lease4 lease_copy = **l;
2218 lease_copy.valid_lft_ = 0;
2228 if (((*l)->cltt_ != lease->current_cltt_) ||
2229 ((*l)->valid_lft_ != lease->current_valid_lft_)) {
2237 class_lease_counter_.removeLease(lease);
2254 std::lock_guard<std::mutex> lock(*mutex_);
2255 return (deleteLeaseInternal(lease));
2257 return (deleteLeaseInternal(lease));
2262Memfile_LeaseMgr::deleteLeaseInternal(
const Lease6Ptr& lease) {
2266 Lease6Storage::iterator l = storage6_.find(addr);
2267 if (l == storage6_.end()) {
2274 Lease6 lease_copy = **l;
2276 lease_copy.valid_lft_ = 0;
2277 lease_copy.preferred_lft_ = 0;
2287 if (((*l)->cltt_ != lease->current_cltt_) ||
2288 ((*l)->valid_lft_ != lease->current_valid_lft_)) {
2296 class_lease_counter_.removeLease(lease);
2318 std::lock_guard<std::mutex> lock(*mutex_);
2319 return (deleteLeaseInternal(lease));
2321 return (deleteLeaseInternal(lease));
2332 std::lock_guard<std::mutex> lock(*mutex_);
2333 return (deleteExpiredReclaimedLeases<
2337 return (deleteExpiredReclaimedLeases<
2350 std::lock_guard<std::mutex> lock(*mutex_);
2351 return (deleteExpiredReclaimedLeases<
2355 return (deleteExpiredReclaimedLeases<
2361template<
typename IndexType,
typename LeaseType,
typename StorageType,
2362 typename LeaseFileType>
2364Memfile_LeaseMgr::deleteExpiredReclaimedLeases(
const uint32_t secs,
2365 const Universe& universe,
2366 StorageType& storage,
2367 LeaseFileType& lease_file) {
2380 typename IndexType::const_iterator upper_limit =
2381 index.upper_bound(boost::make_tuple(
true, time(0) - secs));
2390 typename IndexType::const_iterator lower_limit =
2391 index.upper_bound(boost::make_tuple(
true, std::numeric_limits<int64_t>::min()));
2394 uint64_t num_leases =
static_cast<uint64_t
>(std::distance(lower_limit, upper_limit));
2395 if (num_leases > 0) {
2405 for (
typename IndexType::const_iterator lease = lower_limit;
2406 lease != upper_limit; ++lease) {
2408 LeaseType lease_copy(**lease);
2411 lease_copy.valid_lft_ = 0;
2413 lease_file->append(lease_copy);
2422 index.erase(lower_limit, upper_limit);
2426 return (num_leases);
2431 return (std::string(
"In memory database with leases stored in a CSV file."));
2434std::pair<uint32_t, uint32_t>
2436 std::string
const& universe(conn_.getParameter(
"universe"));
2437 if (universe ==
"4") {
2439 }
else if (universe ==
"6") {
2458 std::string lease_file(file_name);
2459 if (lease_file.empty()) {
2469 std::string file_name;
2477 if (file_name.empty()) {
2489 std::string name(file_name);
2490 switch (file_type) {
2501 name +=
".completed";
2516 std::string filename ) {
2517 std::ostringstream s;;
2519 if (filename.empty()) {
2521 s << (u ==
V4 ?
"4" :
"6");
2524 s <<
"/" << filename;
2552Memfile_LeaseMgr::initLeaseFilePath(Universe u) {
2553 std::string persist_val;
2559 persist_val =
"true";
2563 if (persist_val ==
"false") {
2566 }
else if (persist_val !=
"true") {
2567 isc_throw(isc::BadValue,
"invalid value 'persist="
2568 << persist_val <<
"'");
2571 std::string lease_file;
2573 lease_file = conn_.getParameter(
"name");
2574 }
catch (
const Exception&) {
2581 }
catch (
const SecurityWarn& ex) {
2586 return (lease_file);
2589template<
typename LeaseObjectType,
typename LeaseFileType,
typename StorageType>
2591Memfile_LeaseMgr::loadLeasesFromFiles(Universe u,
const std::string& filename,
2592 boost::shared_ptr<LeaseFileType>& lease_file,
2593 StorageType& storage) {
2601 isc_throw(DbOpenError,
"unable to load leases from files while the "
2602 "lease file cleanup is in progress");
2607 std::string max_row_errors_str =
"0";
2609 max_row_errors_str = conn_.getParameter(
"max-row-errors");
2610 }
catch (
const std::exception&) {
2614 int64_t max_row_errors64;
2616 max_row_errors64 = boost::lexical_cast<int64_t>(max_row_errors_str);
2617 }
catch (
const boost::bad_lexical_cast&) {
2618 isc_throw(isc::BadValue,
"invalid value of the max-row-errors "
2619 << max_row_errors_str <<
" specified");
2621 if ((max_row_errors64 < 0) ||
2622 (max_row_errors64 > std::numeric_limits<uint32_t>::max())) {
2623 isc_throw(isc::BadValue,
"invalid value of the max-row-errors "
2624 << max_row_errors_str <<
" specified");
2626 uint32_t max_row_errors =
static_cast<uint32_t
>(max_row_errors64);
2629 bool conversion_needed =
false;
2630 lease_file.reset(
new LeaseFileType(std::string(filename +
".completed")));
2631 if (lease_file->exists()) {
2634 conversion_needed = conversion_needed || lease_file->needsConversion();
2639 if (lease_file->exists()) {
2642 conversion_needed = conversion_needed || lease_file->needsConversion();
2646 if (lease_file->exists()) {
2649 conversion_needed = conversion_needed || lease_file->needsConversion();
2659 lease_file.reset(
new LeaseFileType(filename));
2661 max_row_errors,
false);
2662 conversion_needed = conversion_needed || lease_file->needsConversion();
2664 return (conversion_needed);
2669 return (lfc_setup_->isRunning());
2674 return (lfc_setup_->getExitStatus());
2679 return (lfc_setup_->getLastPid());
2695Memfile_LeaseMgr::lfcSetup(
bool conversion_needed) {
2696 std::string lfc_interval_str =
"3600";
2699 }
catch (
const std::exception&) {
2703 uint32_t lfc_interval = 0;
2705 lfc_interval = boost::lexical_cast<uint32_t>(lfc_interval_str);
2706 }
catch (
const boost::bad_lexical_cast&) {
2707 isc_throw(isc::BadValue,
"invalid value of the lfc-interval "
2708 << lfc_interval_str <<
" specified");
2715template<
typename LeaseFileType>
2717Memfile_LeaseMgr::lfcExecute(boost::shared_ptr<LeaseFileType>& lease_file) {
2729 if (!lease_file_finish.exists() && !lease_file_copy.exists()) {
2731 lease_file->close();
2734 do_lfc = (rename(lease_file->getFilename().c_str(),
2735 lease_file_copy.getFilename().c_str()) == 0);
2739 .arg(lease_file->getFilename())
2740 .arg(lease_file_copy.getFilename())
2741 .arg(strerror(errno));
2750 lease_file->open(
true);
2752 }
catch (
const CSVFileError& ex) {
2763 .arg(lease_file->getFilename())
2774 lfc_setup_->execute(lease_file->getFilename());
2781 std::ostringstream msg;
2782 msg <<
"'persist' parameter of 'memfile' lease backend "
2783 <<
"was configured to 'false'";
2800 if (new_pid == -1) {
2802 }
else if (new_pid != previous_pid) {
2813 std::lock_guard<std::mutex> lock(*mutex_);
2826 std::lock_guard<std::mutex> lock(*mutex_);
2839 std::lock_guard<std::mutex> lock(*mutex_);
2854 std::lock_guard<std::mutex> lock(*mutex_);
2867 std::lock_guard<std::mutex> lock(*mutex_);
2880 std::lock_guard<std::mutex> lock(*mutex_);
2893 std::lock_guard<std::mutex> lock(*mutex_);
2908 std::lock_guard<std::mutex> lock(*mutex_);
2926 std::pair<Lease4StorageSubnetIdIndex::const_iterator,
2927 Lease4StorageSubnetIdIndex::const_iterator> r =
2928 idx.equal_range(subnet_id);
2932 BOOST_FOREACH(
auto const& lease, r) {
2933 leases.push_back(lease);
2936 size_t num = leases.size();
2937 for (
auto const& l : leases) {
2941 .arg(subnet_id).arg(num);
2955 std::pair<Lease6StorageSubnetIdIndex::const_iterator,
2956 Lease6StorageSubnetIdIndex::const_iterator> r =
2957 idx.equal_range(subnet_id);
2961 BOOST_FOREACH(
auto const& lease, r) {
2962 leases.push_back(lease);
2965 size_t num = leases.size();
2966 for (
auto const& l : leases) {
2970 .arg(subnet_id).arg(num);
2977 class_lease_counter_.clear();
2978 for (
auto const& lease : storage4_) {
2981 class_lease_counter_.addLease(lease);
2988 class_lease_counter_.clear();
2989 for (
auto const& lease : storage6_) {
2992 class_lease_counter_.addLease(lease);
3001 std::lock_guard<std::mutex> lock(*mutex_);
3002 return(class_lease_counter_.getClassCount(client_class, ltype));
3004 return(class_lease_counter_.getClassCount(client_class, ltype));
3010 return(class_lease_counter_.clear());
3015 if (!user_context) {
3028 for (
unsigned i = 0; i < classes->size(); ++i) {
3037 std::string name = name_elem->stringValue();
3048 size_t lease_count = 0;
3054 if (lease_count >= limit) {
3055 std::ostringstream ss;
3056 ss <<
"address limit " << limit <<
" for client class \""
3057 << name <<
"\", current lease count " << lease_count;
3073 SubnetID subnet_id = id_elem->intValue();
3080 int64_t lease_count = 0;
3082 lease_count = getSubnetStat(subnet_id,
"assigned-addresses");
3086 if (
static_cast<uint64_t
>(lease_count) >= limit) {
3087 std::ostringstream ss;
3088 ss <<
"address limit " << limit <<
" for subnet ID " << subnet_id
3089 <<
", current lease count " << lease_count;
3101 if (!user_context) {
3115 for (
unsigned i = 0; i < classes->size(); ++i) {
3124 std::string name = name_elem->stringValue();
3129 if (!getLeaseLimit(class_elem, ltype, limit)) {
3131 if (!getLeaseLimit(class_elem, ltype, limit)) {
3139 size_t lease_count = 0;
3145 if (lease_count >= limit) {
3146 std::ostringstream ss;
3148 <<
" limit " << limit <<
" for client class \""
3149 << name <<
"\", current lease count " << lease_count;
3165 SubnetID subnet_id = id_elem->intValue();
3170 if (!getLeaseLimit(subnet_elem, ltype, limit)) {
3172 if (!getLeaseLimit(subnet_elem, ltype, limit)) {
3180 int64_t lease_count = 0;
3182 lease_count = getSubnetStat(subnet_id, (ltype ==
Lease::TYPE_NA ?
3183 "assigned-nas" :
"assigned-pds"));
3187 if (
static_cast<uint64_t
>(lease_count) >= limit) {
3188 std::ostringstream ss;
3190 <<
" limit " << limit <<
" for subnet ID " << subnet_id
3191 <<
", current lease count " << lease_count;
3206Memfile_LeaseMgr::getSubnetStat(
const SubnetID& subnet_id,
const std::string& stat_label)
const {
3212 if (samples && samples->size()) {
3213 auto sample = samples->get(0);
3214 if (sample->size()) {
3215 auto count_elem = sample->get(0);
3216 return (count_elem->intValue());
3226 "prefix-limit" :
"address-limit");
3228 limit = limit_elem->intValue();
3239 std::stringstream tmp;
3242 for (
auto const& it :
id) {
3246 tmp << std::setw(2) << std::setfill(
'0')
3247 <<
static_cast<unsigned int>(it);
3259 const time_t& qry_start_time ,
3260 const time_t& qry_end_time ) {
3264 .arg(lower_bound_address.
toText())
3265 .arg(idToText(relay_id))
3266 .arg(qry_start_time)
3270 if (!lower_bound_address.
isV4()) {
3272 "retrieving leases from the lease database, got "
3273 << lower_bound_address);
3277 if ((qry_start_time < 0) || (qry_end_time < 0)) {
3282 if ((qry_start_time > 0) && (qry_end_time > 0) &&
3283 (qry_start_time > qry_end_time)) {
3288 std::lock_guard<std::mutex> lock(*mutex_);
3289 return (getLeases4ByRelayIdInternal(relay_id,
3290 lower_bound_address,
3295 return (getLeases4ByRelayIdInternal(relay_id,
3296 lower_bound_address,
3304Memfile_LeaseMgr::getLeases4ByRelayIdInternal(
const OptionBuffer& relay_id,
3307 const time_t& qry_start_time,
3308 const time_t& qry_end_time) {
3311 Lease4StorageRelayIdIndex::const_iterator lb =
3312 idx.lower_bound(boost::make_tuple(relay_id, lower_bound_address));
3314 IOAddress last_addr = lower_bound_address;
3315 for (; lb != idx.end(); ++lb) {
3316 if ((*lb)->addr_ == last_addr) {
3320 if ((*lb)->relay_id_ != relay_id) {
3324 last_addr = (*lb)->addr_;
3325 if ((qry_start_time > 0) && ((*lb)->cltt_ < qry_start_time)) {
3329 if ((qry_end_time > 0) && ((*lb)->cltt_ > qry_end_time)) {
3333 collection.push_back(
Lease4Ptr(
new Lease4(**lb)));
3334 if (collection.size() >= page_size.
page_size_) {
3338 return (collection);
3345 const time_t& qry_start_time ,
3346 const time_t& qry_end_time ) {
3350 .arg(lower_bound_address.
toText())
3351 .arg(idToText(remote_id))
3352 .arg(qry_start_time)
3356 if (!lower_bound_address.
isV4()) {
3358 "retrieving leases from the lease database, got "
3359 << lower_bound_address);
3363 if ((qry_start_time < 0) || (qry_end_time < 0)) {
3368 if ((qry_start_time > 0) && (qry_end_time > 0) &&
3369 (qry_start_time > qry_end_time)) {
3374 std::lock_guard<std::mutex> lock(*mutex_);
3375 return (getLeases4ByRemoteIdInternal(remote_id,
3376 lower_bound_address,
3381 return (getLeases4ByRemoteIdInternal(remote_id,
3382 lower_bound_address,
3390Memfile_LeaseMgr::getLeases4ByRemoteIdInternal(
const OptionBuffer& remote_id,
3393 const time_t& qry_start_time,
3394 const time_t& qry_end_time) {
3396 std::map<IOAddress, Lease4Ptr> sorted;
3400 BOOST_FOREACH(
auto const& it, er) {
3402 if (addr <= lower_bound_address) {
3406 if ((qry_start_time > 0) && (it->cltt_ < qry_start_time)) {
3410 if ((qry_end_time > 0) && (it->cltt_ > qry_end_time)) {
3418 for (
auto const& it : sorted) {
3419 collection.push_back(
Lease4Ptr(
new Lease4(*it.second)));
3420 if (collection.size() >= page_size.
page_size_) {
3424 return (collection);
3430 std::lock_guard<std::mutex> lock(*mutex_);
3456 .arg(lower_bound_address.
toText())
3460 if (!lower_bound_address.
isV6()) {
3462 "retrieving leases from the lease database, got "
3463 << lower_bound_address);
3467 std::lock_guard<std::mutex> lock(*mutex_);
3468 return (getLeases6ByRelayIdInternal(relay_id,
3469 lower_bound_address,
3472 return (getLeases6ByRelayIdInternal(relay_id,
3473 lower_bound_address,
3479Memfile_LeaseMgr::getLeases6ByRelayIdInternal(
const DUID& relay_id,
3482 const std::vector<uint8_t>& relay_id_data = relay_id.
getDuid();
3485 RelayIdIndex::const_iterator lb =
3486 idx.lower_bound(boost::make_tuple(relay_id_data, lower_bound_address));
3489 IOAddress last_addr = lower_bound_address;
3490 for (; lb != idx.end(); ++lb) {
3491 if ((*lb)->lease_addr_ == last_addr) {
3495 if ((*lb)->id_ != relay_id_data) {
3499 last_addr = (*lb)->lease_addr_;
3500 Lease6Ptr lease = getAnyLease6Internal(last_addr);
3502 collection.push_back(lease);
3503 if (collection.size() >= page_size.
page_size_) {
3508 return (collection);
3518 .arg(lower_bound_address.
toText())
3519 .arg(idToText(remote_id));
3522 if (!lower_bound_address.
isV6()) {
3524 "retrieving leases from the lease database, got "
3525 << lower_bound_address);
3529 std::lock_guard<std::mutex> lock(*mutex_);
3530 return (getLeases6ByRemoteIdInternal(remote_id,
3531 lower_bound_address,
3534 return (getLeases6ByRemoteIdInternal(remote_id,
3535 lower_bound_address,
3541Memfile_LeaseMgr::getLeases6ByRemoteIdInternal(
const OptionBuffer& remote_id,
3545 std::set<IOAddress> sorted;
3549 BOOST_FOREACH(
auto const& it, er) {
3550 const IOAddress& addr = it->lease_addr_;
3551 if (addr <= lower_bound_address) {
3554 static_cast<void>(sorted.insert(addr));
3559 Lease6Ptr lease = getAnyLease6Internal(addr);
3561 collection.push_back(lease);
3562 if (collection.size() >= page_size.
page_size_) {
3567 return (collection);
3580 <<
" consistency configuration is null");
3582 auto check = cfg->getExtendedInfoSanityCheck();
3587 .arg(update ?
" updating in file" :
"");
3590 size_t modified = 0;
3592 size_t processed = 0;
3594 auto lease_it = index.begin();
3595 auto next_it = index.end();
3597 for (; lease_it != index.end(); lease_it = next_it) {
3598 next_it = std::next(lease_it);
3619 if (!
copy->relay_id_.empty() || !
copy->remote_id_.empty()) {
3620 index.replace(lease_it,
copy);
3623 }
catch (
const std::exception& ex) {
3626 .arg(lease->addr_.toText())
3651 auto check = cfg->getExtendedInfoSanityCheck();
3657 .arg(enabled ?
"enabled" :
"disabled");
3666 size_t modified = 0;
3667 size_t processed = 0;
3669 for (
auto const& lease : storage6_) {
3678 }
catch (
const std::exception& ex) {
3681 .arg(lease->addr_.toText())
3701 static_cast<void>(relay_id_idx.erase(addr));
3704 static_cast<void>(remote_id_idx.erase(addr));
3709 const std::vector<uint8_t>& relay_id) {
3717 const std::vector<uint8_t>& remote_id) {
3726 std::lock_guard<std::mutex> lock(*mutex_);
3727 writeLeases4Internal(filename);
3729 writeLeases4Internal(filename);
3734Memfile_LeaseMgr::writeLeases4Internal(
const std::string& filename) {
3736 std::ostringstream tmp;
3737 tmp << filename <<
".tmp" << getpid();
3738 auto tmpname = tmp.str();
3739 ::remove(tmpname.c_str());
3745 for (
auto const& lease : storage4_) {
3746 tmpfile.append(*lease);
3749 }
catch (
const std::exception&) {
3751 ::remove(tmpname.c_str());
3756 std::ostringstream bak;
3757 bak << filename <<
".bak" << getpid();
3758 auto bakname = bak.str();
3764 ::rename(filename.c_str(), bakname.c_str());
3767 ::rename(tmpname.c_str(), filename.c_str());
3772 ::rename(filename.c_str(), bakname.c_str());
3775 ::rename(tmpname.c_str(), filename.c_str());
3782 std::lock_guard<std::mutex> lock(*mutex_);
3783 writeLeases6Internal(filename);
3785 writeLeases6Internal(filename);
3790Memfile_LeaseMgr::writeLeases6Internal(
const std::string& filename) {
3792 std::ostringstream tmp;
3793 tmp << filename <<
".tmp" << getpid();
3794 auto tmpname = tmp.str();
3795 ::remove(tmpname.c_str());
3801 for (
auto const& lease : storage6_) {
3802 tmpfile.append(*lease);
3805 }
catch (
const std::exception&) {
3807 ::remove(tmpname.c_str());
3812 std::ostringstream bak;
3813 bak << filename <<
".bak" << getpid();
3814 auto bakname = bak.str();
3820 ::rename(filename.c_str(), bakname.c_str());
3823 ::rename(tmpname.c_str(), filename.c_str());
3828 ::rename(filename.c_str(), bakname.c_str());
3831 ::rename(tmpname.c_str(), filename.c_str());
3841 }
catch (
const std::exception& ex) {
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
A generic exception that is thrown if a function is called in a prohibited way.
A generic exception that is thrown when an unexpected error condition occurs.
The IOAddress class represents an IP addresses (version agnostic)
std::string toText() const
Convert the address to a string.
bool isV6() const
Convenience function to check for an IPv6 address.
bool isV4() const
Convenience function to check for an IPv4 address.
std::function< void()> Callback
Exception thrown when error occurs during spawning a process.
Utility class for spawning new processes.
static ElementPtr create(const Position &pos=ZERO_POSITION())
Create a NullElement.
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
std::string getParameter(const std::string &name) const
Returns value of a connection parameter.
util::ReconnectCtlPtr reconnectCtl()
The reconnect settings.
static bool invokeDbLostCallback(const util::ReconnectCtlPtr &db_reconnect_ctl)
Invokes the connection's lost connectivity callback.
static std::string redactedAccessString(const ParameterMap ¶meters)
Redact database access string.
static isc::asiolink::IOServicePtr & getIOService()
Returns pointer to the IO service.
std::map< std::string, std::string > ParameterMap
Database configuration parameter map.
Invalid address family used as input to Lease Manager.
Provides methods to access CSV file with DHCPv4 leases.
Provides methods to access CSV file with DHCPv6 leases.
static std::string sanityCheckToText(LeaseSanity check_type)
Converts lease sanity check value to printable text.
uint16_t getFamily() const
Returns address family.
std::string validatePath(const std::string data_path) const
Validates a file path against the supported directory for DHCP data.
static CfgMgr & instance()
returns a single instance of Configuration Manager
SrvConfigPtr getStagingCfg()
Returns a pointer to the staging configuration.
std::string getDataDir(bool reset=false, const std::string explicit_path="")
Fetches the supported DHCP data directory.
SrvConfigPtr getCurrentCfg()
Returns a pointer to the current configuration.
Holds Client identifier or client IPv4 address.
const std::vector< uint8_t > & getClientId() const
Returns reference to the client-id data.
Holds DUID (DHCPv6 Unique Identifier)
const std::vector< uint8_t > & getDuid() const
Returns a const reference to the actual DUID value.
std::string toText() const
Returns textual representation of the identifier (e.g.
int getLastPid() const
Returns pid of the last lease file cleanup.
void execute(const std::string &lease_file)
Spawns a new process.
int getExitStatus() const
Returns exit code of the last completed cleanup.
bool isRunning() const
Checks if the lease file cleanup is in progress.
LFCSetup(asiolink::IntervalTimer::Callback callback)
Constructor.
void setup(const uint32_t lfc_interval, const boost::shared_ptr< CSVLeaseFile4 > &lease_file4, const boost::shared_ptr< CSVLeaseFile6 > &lease_file6, bool run_once_now=false)
Sets the new configuration for the Lease File Cleanup.
Lease6 extended informations for Bulk Lease Query.
static void load(LeaseFileType &lease_file, StorageType &storage, const uint32_t max_errors=0, const bool close_file_on_exit=true)
Load leases from the lease file into the specified storage.
void setExtendedInfoTablesEnabled(const bool enabled)
Modifies the setting whether the lease6 extended info tables are enabled.
static bool upgradeLease6ExtendedInfo(const Lease6Ptr &lease, CfgConsistency::ExtendedInfoSanity check=CfgConsistency::EXTENDED_INFO_CHECK_FIX)
Upgrade a V6 lease user context to the new extended info entry.
bool getExtendedInfoTablesEnabled() const
Returns the setting indicating if lease6 extended info tables are enabled.
static void extractLease4ExtendedInfo(const Lease4Ptr &lease, bool ignore_errors=true)
Extract relay and remote identifiers from the extended info.
static bool upgradeLease4ExtendedInfo(const Lease4Ptr &lease, CfgConsistency::ExtendedInfoSanity check=CfgConsistency::EXTENDED_INFO_CHECK_FIX)
The following queries are used to fulfill Bulk Lease Query queries.
virtual bool addExtendedInfo6(const Lease6Ptr &lease)
Extract extended info from a lease6 and add it into tables.
Wraps value holding size of the page with leases.
const size_t page_size_
Holds page size.
LeaseStatsQuery(const SelectMode &select_mode=ALL_SUBNETS)
Constructor to query statistics for all subnets.
SubnetID getLastSubnetID() const
Returns the value of last subnet ID specified (or zero)
SubnetID getFirstSubnetID() const
Returns the value of first subnet ID specified (or zero)
SelectMode getSelectMode() const
Returns the selection criteria mode The value returned is based upon the constructor variant used and...
SelectMode
Defines the types of selection criteria supported.
Memfile derivation of the IPv4 statistical lease data query.
MemfileLeaseStatsQuery4(Lease4Storage &storage4, const SubnetID &first_subnet_id, const SubnetID &last_subnet_id)
Constructor for a subnet range query.
MemfileLeaseStatsQuery4(Lease4Storage &storage4, const SelectMode &select_mode=ALL_SUBNETS)
Constructor for an all subnets query.
virtual ~MemfileLeaseStatsQuery4()
Destructor.
void start()
Creates the IPv4 lease statistical data result set.
MemfileLeaseStatsQuery4(Lease4Storage &storage4, const SubnetID &subnet_id)
Constructor for a single subnet query.
Memfile derivation of the IPv6 statistical lease data query.
void start()
Creates the IPv6 lease statistical data result set.
virtual ~MemfileLeaseStatsQuery6()
Destructor.
MemfileLeaseStatsQuery6(Lease6Storage &storage6, const SubnetID &first_subnet_id, const SubnetID &last_subnet_id)
Constructor for a subnet range query.
MemfileLeaseStatsQuery6(Lease6Storage &storage6, const SelectMode &select_mode=ALL_SUBNETS)
Constructor.
MemfileLeaseStatsQuery6(Lease6Storage &storage6, const SubnetID &subnet_id)
Constructor for a single subnet query.
std::vector< LeaseStatsRow >::iterator next_pos_
An iterator for accessing the next row within the result set.
MemfileLeaseStatsQuery(const SubnetID &first_subnet_id, const SubnetID &last_subnet_id)
Constructor for subnet range query.
virtual bool getNextRow(LeaseStatsRow &row)
Fetches the next row in the result set.
std::vector< LeaseStatsRow > rows_
A vector containing the "result set".
MemfileLeaseStatsQuery(const SelectMode &select_mode=ALL_SUBNETS)
Constructor for all subnets query.
virtual ~MemfileLeaseStatsQuery()
Destructor.
int getRowCount() const
Returns the number of rows in the result set.
MemfileLeaseStatsQuery(const SubnetID &subnet_id)
Constructor for single subnet query.
Lease6ExtendedInfoRemoteIdTable remote_id6_
stores IPv6 by-remote-id cross-reference table
virtual void rollback() override
Rollback Transactions.
size_t extractExtendedInfo4(bool update, bool current)
Extract extended info for v4 leases.
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.
virtual size_t byRelayId6size() const override
Return the by-relay-id table size.
virtual data::ElementPtr getStatus() const override
Return status information.
virtual Lease4Collection getLeases4ByRelayId(const OptionBuffer &relay_id, const asiolink::IOAddress &lower_bound_address, const LeasePageSize &page_size, const time_t &qry_start_time=0, const time_t &qry_end_time=0) override
The following queries are used to fulfill Bulk Lease Query queries.
Memfile_LeaseMgr(const db::DatabaseConnection::ParameterMap ¶meters)
The sole lease manager constructor.
bool isLFCRunning() const
Checks if the process performing lease file cleanup is running.
virtual void writeLeases4(const std::string &filename) override
Write V4 leases to a file.
virtual void updateLease4(const Lease4Ptr &lease4) override
Updates IPv4 lease.
virtual size_t wipeLeases4(const SubnetID &subnet_id) override
Removes specified IPv4 leases.
virtual void deleteExtendedInfo6(const isc::asiolink::IOAddress &addr) override
Delete lease6 extended info from tables.
static bool isLFCProcessRunning(const std::string file_name, Universe u)
Check if LFC is running.
virtual bool isJsonSupported() const override
Checks if JSON support is enabled in the database.
Universe
Specifies universe (V4, V6)
static std::string getDefaultLeaseFilePath(Universe u, const std::string filename="")
Returns default path to the lease file.
static TrackingLeaseMgrPtr factory(const isc::db::DatabaseConnection::ParameterMap ¶meters)
Factory class method.
LFCFileType
Types of the lease files used by the Lease File Cleanup.
@ FILE_PREVIOUS
Previous Lease File.
@ FILE_FINISH
LFC Finish File.
@ FILE_OUTPUT
LFC Output File.
@ FILE_INPUT
Lease File Copy
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.
virtual std::pair< uint32_t, uint32_t > getVersion(const std::string &timer_name=std::string()) const override
Returns backend version.
int getLFCExitStatus() const
Returns the status code returned by the last executed LFC process.
virtual LeaseStatsQueryPtr startPoolLeaseStatsQuery6() override
Creates and runs the IPv6 lease stats query for all subnets and pools.
bool persistLeases(Universe u) const
Specifies whether or not leases are written to disk.
virtual void addRemoteId6(const isc::asiolink::IOAddress &lease_addr, const std::vector< uint8_t > &remote_id) override
Add lease6 extended info into by-remote-id table.
static std::string getDBVersion()
Return extended version info.
virtual Lease4Collection getLeases4() const override
Returns all IPv4 leases.
virtual size_t getClassLeaseCount(const ClientClass &client_class, const Lease::Type <ype=Lease::TYPE_V4) const override
Returns the class lease count for a given class and lease type.
virtual isc::data::ConstElementPtr lfcStartHandler() override
Handler for kea-lfc-start command.
virtual void getExpiredLeases6(Lease6Collection &expired_leases, const size_t max_leases) const override
Returns a collection of expired DHCPv6 leases.
void buildExtendedInfoTables6()
Extended information / Bulk Lease Query shared interface.
virtual bool addLease(const Lease4Ptr &lease) override
Adds an IPv4 lease.
virtual size_t byRemoteId6size() const override
Return the by-remote-id table size.
virtual void writeLeases6(const std::string &filename) override
Write V6 leases to a file.
Lease6ExtendedInfoRelayIdTable relay_id6_
stores IPv6 by-relay-id cross-reference table
virtual void recountClassLeases6() override
Recount the leases per class for V6 leases.
virtual Lease4Collection getLeases4ByRemoteId(const OptionBuffer &remote_id, const asiolink::IOAddress &lower_bound_address, const LeasePageSize &page_size, const time_t &qry_start_time=0, const time_t &qry_end_time=0) override
Returns existing IPv4 leases with a given remote-id.
virtual void wipeExtendedInfoTables6() override
Wipe extended info table (v6).
boost::shared_ptr< CSVLeaseFile4 > lease_file4_
Holds the pointer to the DHCPv4 lease file IO.
std::string getLeaseFilePath(Universe u) const
Returns an absolute path to the lease file.
virtual Lease6Collection getLeases6ByRemoteId(const OptionBuffer &remote_id, const asiolink::IOAddress &lower_bound_address, const LeasePageSize &page_size) override
Returns existing IPv6 leases with a given remote-id.
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.
int getLFCLastPid() const
Returns the last lfc process id.
virtual Lease6Collection getLeases6ByRelayId(const DUID &relay_id, const asiolink::IOAddress &lower_bound_address, const LeasePageSize &page_size) override
Returns existing IPv6 leases with a given relay-id.
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 void addRelayId6(const isc::asiolink::IOAddress &lease_addr, const std::vector< uint8_t > &relay_id) override
Add lease6 extended info into by-relay-id table.
virtual size_t upgradeExtendedInfo6(const LeasePageSize &page_size) override
Upgrade extended info (v6).
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.
static std::string getDBVersionInternal(Universe const &u)
Local version of getDBVersion() class method.
virtual LeaseStatsQueryPtr startPoolLeaseStatsQuery4() override
Creates and runs the IPv4 lease stats query for all subnets and pools.
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.
boost::shared_ptr< CSVLeaseFile6 > lease_file6_
Holds the pointer to the DHCPv6 lease file IO.
virtual size_t upgradeExtendedInfo4(const LeasePageSize &page_size) override
Upgrade extended info (v4).
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 unsigned int DB_CONNECTION
The network state is being altered by the DB connection recovery mechanics.
Attempt to update lease that was not there.
Manages a pool of asynchronous interval timers.
static const TimerMgrPtr & instance()
Returns pointer to the sole instance of the TimerMgr.
void trackAddLease(const LeasePtr &lease)
Invokes the callbacks when a new lease is added.
void trackUpdateLease(const LeasePtr &lease)
Invokes the callbacks when a lease is updated.
void trackDeleteLease(const LeasePtr &lease)
Invokes the callbacks when a lease is deleted.
TrackingLeaseMgr()
Constructor.
bool hasCallbacks() const
Checks if any callbacks have been registered.
static StatsMgr & instance()
Statistics Manager accessor method.
static std::string generateName(const std::string &context, Type index, const std::string &stat_name)
Generates statistic name in a given context.
Exception thrown when an unrecoverable error occurs such as disk-full on write.
RAII class creating a critical section.
static MultiThreadingMgr & instance()
Returns a single instance of Multi Threading Manager.
Exception thrown when an error occurs during PID file processing.
Class to help with processing PID files.
void write(int) const
Write the PID to the file.
void deleteFile() const
Delete the PID file.
std::string getLockname() const
Returns the path to the lock file.
int check() const
Read the PID in from the file and check it.
RAII device to handle a lock file to avoid race conditions.
bool isLocked()
Return the lock status.
This file contains several functions and constants that are used for handling commands and responses ...
int version()
returns Kea hooks version.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
isc::data::ConstElementPtr get(const std::string &name) const
Returns a single statistic as a JSON structure.
static const int MAJOR_VERSION_V4
static const int MINOR_VERSION_V4
the minor version of the v4 memfile backend
static const int MAJOR_VERSION_V6
static const int MINOR_VERSION_V6
the minor version of the v6 memfile backend
int get(CalloutHandle &handle)
The gss-tsig-get command.
#define LOG_ERROR(LOGGER, MESSAGE)
Macro to conveniently test error output and log it.
#define LOG_INFO(LOGGER, MESSAGE)
Macro to conveniently test info output and log it.
#define LOG_WARN(LOGGER, MESSAGE)
Macro to conveniently test warn output and log it.
#define LOG_DEBUG(LOGGER, LEVEL, MESSAGE)
Macro to conveniently test debug output and log it.
std::vector< std::string > ProcessArgs
Type of the container holding arguments of the executable being run as a background process.
std::vector< std::string > ProcessEnvVars
Type of the container holding environment variables of the executable being run as a background proce...
const int CONTROL_RESULT_EMPTY
Status code indicating that the specified command was completed correctly, but failed to produce any ...
const int CONTROL_RESULT_ERROR
Status code indicating a general failure.
ConstElementPtr createAnswer()
Creates a standard config/command level success answer message (i.e.
const int CONTROL_RESULT_COMMAND_UNSUPPORTED
Status code indicating that the specified command is not supported.
const int CONTROL_RESULT_SUCCESS
Status code indicating a successful operation.
void prettyPrint(ConstElementPtr element, std::ostream &out, unsigned indent, unsigned step)
Pretty prints the data into stream.
ElementPtr copy(ConstElementPtr from, unsigned level)
Copy the data up to a nesting level.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< Element > ElementPtr
const isc::log::MessageID DHCPSRV_MEMFILE_LFC_START
isc::log::Logger dhcpsrv_logger("dhcpsrv")
DHCP server library Logger.
const isc::log::MessageID DHCPSRV_MEMFILE_GET_SUBID_CLIENTID
const isc::log::MessageID DHCPSRV_MEMFILE_EXTRACT_EXTENDED_INFO4
std::string ClientClass
Defines a single class name.
const isc::log::MessageID DHCPSRV_MEMFILE_GET_SUBID_HWADDR
const isc::log::MessageID DHCPSRV_MEMFILE_WIPE_LEASES6
const isc::log::MessageID DHCPSRV_MEMFILE_LFC_RUNNING
const isc::log::MessageID DHCPSRV_MEMFILE_GET4
const isc::log::MessageID DHCPSRV_MEMFILE_BUILD_EXTENDED_INFO_TABLES6_ERROR
const isc::log::MessageID DHCPSRV_MEMFILE_GET_REMOTEID6
const isc::log::MessageID DHCPSRV_MEMFILE_GET_SUBID_PAGE6
const isc::log::MessageID DHCPSRV_MEMFILE_LFC_UNREGISTER_TIMER_FAILED
const isc::log::MessageID DHCPSRV_MEMFILE_LFC_SPAWN_FAIL
const isc::log::MessageID DHCPSRV_MEMFILE_PATH_SECURITY_WARNING
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_unique< boost::multi_index::tag< SubnetIdIndexTag >, boost::multi_index::composite_key< Lease6, boost::multi_index::member< Lease, isc::dhcp::SubnetID, &Lease::subnet_id_ >, boost::multi_index::member< Lease, isc::asiolink::IOAddress, &Lease::addr_ > > >, 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_ > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetIdPoolIdIndexTag >, boost::multi_index::composite_key< Lease6, boost::multi_index::member< Lease, SubnetID, &Lease::subnet_id_ >, boost::multi_index::member< Lease, uint32_t, &Lease::pool_id_ > > >, boost::multi_index::hashed_non_unique< boost::multi_index::tag< HWAddressIndexTag >, boost::multi_index::const_mem_fun< Lease, const std::vector< uint8_t > &, &Lease::getHWAddrVector > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< StateIndexTag >, boost::multi_index::composite_key< Lease6, boost::multi_index::member< Lease, uint32_t, &Lease::state_ >, boost::multi_index::member< Lease, SubnetID, &Lease::subnet_id_ > > > > > Lease6Storage
A multi index container holding DHCPv6 leases.
const isc::log::MessageID DHCPSRV_MEMFILE_DB
Lease6Storage::index< ExpirationIndexTag >::type Lease6StorageExpirationIndex
DHCPv6 lease storage index by expiration time.
const isc::log::MessageID DHCPSRV_MEMFILE_CONVERTING_LEASE_FILES
const isc::log::MessageID DHCPSRV_MEMFILE_LFC_SETUP
const isc::log::MessageID DHCPSRV_MEMFILE_WIPE_LEASES6_FINISHED
Lease4Storage::index< StateIndexTag >::type Lease4StorageStateIndex
DHCPv4 lease storage index by state (and subnet if).
Lease6Storage::index< DuidIndexTag >::type Lease6StorageDuidIndex
DHCPv6 lease storage index by DUID.
boost::shared_ptr< Lease6 > Lease6Ptr
Pointer to a Lease6 structure.
std::vector< Lease6Ptr > Lease6Collection
A collection of IPv6 leases.
boost::shared_ptr< LeaseStatsQuery > LeaseStatsQueryPtr
Defines a pointer to a LeaseStatsQuery.
const isc::log::MessageID DHCPSRV_MEMFILE_WIPE_LEASES4
Lease6Storage::index< SubnetIdPoolIdIndexTag >::type Lease6StorageSubnetIdPoolIdIndex
DHCPv6 lease storage index subnet-id and pool-id.
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_ > >, boost::multi_index::hashed_non_unique< boost::multi_index::tag< RemoteIdIndexTag >, boost::multi_index::member< Lease4, std::vector< uint8_t >, &Lease4::remote_id_ > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< RelayIdIndexTag >, boost::multi_index::composite_key< Lease4, boost::multi_index::member< Lease4, std::vector< uint8_t >, &Lease4::relay_id_ >, boost::multi_index::member< Lease, isc::asiolink::IOAddress, &Lease::addr_ > > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetIdPoolIdIndexTag >, boost::multi_index::composite_key< Lease4, boost::multi_index::member< Lease, SubnetID, &Lease::subnet_id_ >, boost::multi_index::member< Lease, uint32_t, &Lease::pool_id_ > > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< StateIndexTag >, boost::multi_index::composite_key< Lease4, boost::multi_index::member< Lease, uint32_t, &Lease::state_ >, boost::multi_index::member< Lease, SubnetID, &Lease::subnet_id_ > > > > > Lease4Storage
A multi index container holding DHCPv4 leases.
Lease6Storage::index< DuidIaidTypeIndexTag >::type Lease6StorageDuidIaidTypeIndex
DHCPv6 lease storage index by DUID, IAID, lease type.
boost::shared_ptr< TimerMgr > TimerMgrPtr
Type definition of the shared pointer to TimerMgr.
const isc::log::MessageID DHCPSRV_MEMFILE_GET_RELAYID4
const isc::log::MessageID DHCPSRV_MEMFILE_DELETE_EXPIRED_RECLAIMED_START
const isc::log::MessageID DHCPSRV_MEMFILE_LFC_LEASE_FILE_RENAME_FAIL
const isc::log::MessageID DHCPSRV_MEMFILE_UPDATE_ADDR4
const isc::log::MessageID DHCPSRV_MEMFILE_GET_SUBID6
Lease4Storage::index< ExpirationIndexTag >::type Lease4StorageExpirationIndex
DHCPv4 lease storage index by expiration time.
Lease6Storage::index< AddressIndexTag >::type Lease6StorageAddressIndex
DHCPv6 lease storage index by address.
const isc::log::MessageID DHCPSRV_MEMFILE_LFC_FAIL_PID_CREATE
const int DHCPSRV_DBG_TRACE_DETAIL
Additional information.
const isc::log::MessageID DHCPSRV_MEMFILE_GET_ADDR4
const isc::log::MessageID DHCPSRV_MEMFILE_ROLLBACK
const isc::log::MessageID DHCPSRV_MEMFILE_GET_HWADDR6
Lease6Storage::index< HWAddressIndexTag >::type Lease6StorageHWAddressIndex
DHCPv6 lease storage index by HW address.
const isc::log::MessageID DHCPSRV_MEMFILE_UPDATE_ADDR6
Lease4Storage::index< HostnameIndexTag >::type Lease4StorageHostnameIndex
DHCPv4 lease storage index by hostname.
std::pair< Lease4StorageRemoteIdIndex::const_iterator, Lease4StorageRemoteIdIndex::const_iterator > Lease4StorageRemoteIdRange
DHCPv4 lease storage range by remote-id.
const isc::log::MessageID DHCPSRV_MEMFILE_LFC_RESCHEDULED
Lease6Storage::index< HostnameIndexTag >::type Lease6StorageHostnameIndex
DHCPv6 lease storage index by hostname.
const isc::log::MessageID DHCPSRV_MEMFILE_GET_EXPIRED4
const isc::log::MessageID DHCPSRV_MEMFILE_GET_EXPIRED6
const isc::log::MessageID DHCPSRV_MEMFILE_GET_HOSTNAME4
Lease4Storage::index< ClientIdSubnetIdIndexTag >::type Lease4StorageClientIdSubnetIdIndex
DHCPv4 lease storage index by client-id and subnet-id.
Lease4Storage::index< HWAddressSubnetIdIndexTag >::type Lease4StorageHWAddressSubnetIdIndex
DHCPv4 lease storage index by HW address and subnet-id.
const isc::log::MessageID DHCPSRV_MEMFILE_EXTRACT_EXTENDED_INFO4_ERROR
const isc::log::MessageID DHCPSRV_MEMFILE_ADD_ADDR6
Lease6ExtendedInfoRelayIdTable::index< LeaseAddressIndexTag >::type LeaseAddressRelayIdIndex
Lease6 extended information by lease address index of by relay id table.
Lease6ExtendedInfoRelayIdTable::index< RelayIdIndexTag >::type RelayIdIndex
Lease6 extended information by relay id index.
Lease4Storage::index< RemoteIdIndexTag >::type Lease4StorageRemoteIdIndex
DHCPv4 lease storage index by remote-id.
uint32_t SubnetID
Defines unique IPv4 or IPv6 subnet identifier.
Lease6Storage::index< StateIndexTag >::type Lease6StorageStateIndex
DHCPv6 lease storage index by state (and subnet if).
const isc::log::MessageID DHCPSRV_MEMFILE_BEGIN_EXTRACT_EXTENDED_INFO4
const isc::log::MessageID DHCPSRV_MEMFILE_WIPE_LEASES4_FINISHED
const isc::log::MessageID DHCPSRV_MEMFILE_GET_SUBID4
const isc::log::MessageID DHCPSRV_MEMFILE_LFC_LEASE_FILE_REOPEN_FAIL
const isc::log::MessageID DHCPSRV_MEMFILE_COMMIT
const isc::log::MessageID DHCPSRV_MEMFILE_DELETE_EXPIRED_RECLAIMED4
boost::shared_ptr< CfgConsistency > CfgConsistencyPtr
Type used to for pointing to CfgConsistency structure.
const isc::log::MessageID DHCPSRV_MEMFILE_BEGIN_BUILD_EXTENDED_INFO_TABLES6
const isc::log::MessageID DHCPSRV_MEMFILE_GET_HOSTNAME6
const isc::log::MessageID DHCPSRV_MEMFILE_DELETE_EXPIRED_RECLAIMED6
const isc::log::MessageID DHCPSRV_MEMFILE_LFC_EXECUTE
std::pair< RemoteIdIndex::const_iterator, RemoteIdIndex::const_iterator > RemoteIdIndexRange
Lease6 extended information by remote id range.
const isc::log::MessageID DHCPSRV_MEMFILE_GET_RELAYID6
const isc::log::MessageID DHCPSRV_MEMFILE_NO_STORAGE
const isc::log::MessageID DHCPSRV_MEMFILE_BUILD_EXTENDED_INFO_TABLES6
std::unique_ptr< TrackingLeaseMgr > TrackingLeaseMgrPtr
TrackingLeaseMgr pointer.
const isc::log::MessageID DHCPSRV_MEMFILE_GET_PAGE4
const isc::log::MessageID DHCPSRV_MEMFILE_GET6_DUID
Lease4Storage::index< SubnetIdIndexTag >::type Lease4StorageSubnetIdIndex
DHCPv4 lease storage index subnet-id.
const isc::log::MessageID DHCPSRV_MEMFILE_GET_HWADDR4
std::vector< uint8_t > OptionBuffer
buffer types used in DHCP code.
const isc::log::MessageID DHCPSRV_MEMFILE_DELETE_ADDR4
std::vector< Lease4Ptr > Lease4Collection
A collection of IPv4 leases.
const isc::log::MessageID DHCPSRV_MEMFILE_GET_ADDR6
const isc::log::MessageID DHCPSRV_MEMFILE_ADD_ADDR4
const isc::log::MessageID DHCPSRV_MEMFILE_GET_CLIENTID
Lease4Storage::index< AddressIndexTag >::type Lease4StorageAddressIndex
DHCPv4 lease storage index by address.
const isc::log::MessageID DHCPSRV_MEMFILE_GET_IAID_DUID
const isc::log::MessageID DHCPSRV_MEMFILE_GET6
const isc::log::MessageID DHCPSRV_MEMFILE_GET_REMOTEID4
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
Lease6ExtendedInfoRemoteIdTable::index< LeaseAddressIndexTag >::type LeaseAddressRemoteIdIndex
Lease6 extended information by lease address index of by remote id table.
const int DHCPSRV_DBG_TRACE
DHCP server library logging levels.
const isc::log::MessageID DHCPSRV_MEMFILE_FAILED_TO_OPEN
Lease6Storage::index< SubnetIdIndexTag >::type Lease6StorageSubnetIdIndex
DHCPv6 lease storage index by subnet-id.
const isc::log::MessageID DHCPSRV_MEMFILE_GET_IAID_SUBID_DUID
boost::shared_ptr< Lease6ExtendedInfo > Lease6ExtendedInfoPtr
Pointer to a Lease6ExtendedInfo object.
const isc::log::MessageID DHCPSRV_MEMFILE_DELETE_ADDR6
Lease6ExtendedInfoRemoteIdTable::index< RemoteIdIndexTag >::type RemoteIdIndex
Lease6 extended information by remote id index.
Lease4Storage::index< SubnetIdPoolIdIndexTag >::type Lease4StorageSubnetIdPoolIdIndex
DHCPv4 lease storage index subnet-id and pool-id.
Lease4Storage::index< RelayIdIndexTag >::type Lease4StorageRelayIdIndex
DHCPv4 lease storage index by relay-id.
const isc::log::MessageID DHCPSRV_MEMFILE_GET_PAGE6
Defines the logger used by the top-level component of kea-lfc.
Tag for indexes by address.
Tag for indexes by client-id, subnet-id tuple.
Tag for indexes by DUID, IAID, lease type tuple.
Tag for index using DUID.
Tag for indexes by expiration time.
Hardware type that represents information from DHCPv4 packet.
std::vector< uint8_t > hwaddr_
std::string toText(bool include_htype=true) const
Returns textual representation of a hardware address (e.g.
Tag for indexes by HW address, subnet-id tuple.
Tag for index using hostname.
Structure that holds a lease for IPv4 address.
Structure that holds a lease for IPv6 address and/or prefix.
ExtendedInfoAction
Action on extended info tables.
@ ACTION_UPDATE
update extended info tables.
@ ACTION_DELETE
delete reference to the lease
@ ACTION_IGNORE
ignore extended info,
Tag for indexes by lease address.
Contains a single row of lease statistical data.
static constexpr uint32_t STATE_DEFAULT
A lease in the default state.
static constexpr uint32_t STATE_DECLINED
Declined lease.
static constexpr uint32_t STATE_REGISTERED
Registered self-generated lease.
Type
Type of lease or pool.
@ TYPE_PD
the lease contains IPv6 prefix (for prefix delegation)
@ TYPE_NA
the lease contains non-temporary IPv6 address
static std::string typeToText(Type type)
returns text representation of a lease type
Tag for index using relay-id.
Tag for index using remote-id.
Tag for indexes by subnet-id (and address for v6).