34#include <boost/foreach.hpp>
47const char* KEA_LFC_EXECUTABLE_ENV_NAME =
"KEA_LFC_EXECUTABLE";
104 void setup(
const uint32_t lfc_interval,
105 const boost::shared_ptr<CSVLeaseFile4>& lease_file4,
106 const boost::shared_ptr<CSVLeaseFile6>& lease_file6,
107 bool run_once_now =
false);
110 void execute(
const std::string& lease_file);
127 boost::scoped_ptr<ProcessSpawn> process_;
143 : process_(), callback_(callback), pid_(0),
159 timer_mgr_->unregisterTimer(
"memfile-lfc");
161 }
catch (
const std::exception& ex) {
172 const boost::shared_ptr<CSVLeaseFile4>& lease_file4,
173 const boost::shared_ptr<CSVLeaseFile6>& lease_file6,
177 std::string executable;
178 char* c_executable = getenv(KEA_LFC_EXECUTABLE_ENV_NAME);
180 executable = KEA_LFC_EXECUTABLE;
182 executable = c_executable;
186 std::string lease_file = lease_file4 ? lease_file4->getFilename() :
187 lease_file6->getFilename();
192 args.push_back(lease_file4 ?
"-4" :
"-6");
195 args.push_back(
"-x");
199 args.push_back(
"-i");
203 args.push_back(
"-o");
207 args.push_back(
"-f");
211 args.push_back(
"-p");
216 args.push_back(
"-c");
217 args.push_back(
"ignored-path");
229 if (lfc_interval > 0) {
236 timer_mgr_->registerTimer(
"memfile-lfc", callback_, lfc_interval * 1000,
238 timer_mgr_->setup(
"memfile-lfc");
261 process_->clearState(pid_);
273 .arg(process_->getCommandLine());
275 pid_ = process_->spawn();
287 pid_file.
write(pid_);
297 return (process_ && process_->isRunning(pid_));
304 " the process is null");
306 return (process_->getExitStatus(pid_));
369 return (
rows_.size());
465 void startSubnets() {
470 Lease4StorageSubnetIdIndex::const_iterator lower;
471 Lease4StorageSubnetIdIndex::const_iterator upper;
494 if (lower == upper) {
502 int64_t assigned = 0;
503 int64_t declined = 0;
504 for (Lease4StorageSubnetIdIndex::const_iterator lease = lower;
505 lease != upper; ++lease) {
508 if ((*lease)->subnet_id_ != cur_id) {
511 rows_.push_back(LeaseStatsRow(cur_id,
518 rows_.push_back(LeaseStatsRow(cur_id,
526 cur_id = (*lease)->subnet_id_;
566 void startSubnetPools() {
568 = storage4_.get<SubnetIdPoolIdIndexTag>();
571 Lease4StorageSubnetIdPoolIdIndex::const_iterator lower;
572 Lease4StorageSubnetIdPoolIdIndex::const_iterator upper;
584 if (lower == upper) {
592 uint32_t cur_pool_id = 0;
593 int64_t assigned = 0;
594 int64_t declined = 0;
595 for (Lease4StorageSubnetIdPoolIdIndex::const_iterator lease = lower;
596 lease != upper; ++lease) {
599 if ((*lease)->pool_id_ != cur_pool_id) {
601 rows_.push_back(LeaseStatsRow(cur_id,
603 assigned, cur_pool_id));
608 rows_.push_back(LeaseStatsRow(cur_id,
610 declined, cur_pool_id));
615 cur_pool_id = (*lease)->pool_id_;
620 if ((*lease)->subnet_id_ != cur_id) {
623 rows_.push_back(LeaseStatsRow(cur_id,
625 assigned, cur_pool_id));
630 rows_.push_back(LeaseStatsRow(cur_id,
632 declined, cur_pool_id));
638 cur_id = (*lease)->subnet_id_;
655 assigned, cur_pool_id));
660 declined, cur_pool_id));
759 virtual void startSubnets() {
764 Lease6StorageSubnetIdIndex::const_iterator lower;
765 Lease6StorageSubnetIdIndex::const_iterator upper;
787 if (lower == upper) {
795 int64_t assigned = 0;
796 int64_t declined = 0;
797 int64_t assigned_pds = 0;
798 int64_t registered = 0;
799 for (Lease6StorageSubnetIdIndex::const_iterator lease = lower;
800 lease != upper; ++lease) {
803 if ((*lease)->subnet_id_ != cur_id) {
819 if (assigned_pds > 0) {
826 if (registered > 0) {
835 cur_id = (*lease)->subnet_id_;
840 switch((*lease)->type_) {
874 if (assigned_pds > 0) {
879 if (registered > 0) {
902 virtual void startSubnetPools() {
904 = storage6_.get<SubnetIdPoolIdIndexTag>();
907 Lease6StorageSubnetIdPoolIdIndex::const_iterator lower;
908 Lease6StorageSubnetIdPoolIdIndex::const_iterator upper;
920 if (lower == upper) {
928 uint32_t cur_pool_id = 0;
929 int64_t assigned = 0;
930 int64_t declined = 0;
931 int64_t assigned_pds = 0;
932 for (Lease6StorageSubnetIdPoolIdIndex::const_iterator lease = lower;
933 lease != upper; ++lease) {
936 if ((*lease)->pool_id_ != cur_pool_id) {
940 assigned, cur_pool_id));
947 declined, cur_pool_id));
951 if (assigned_pds > 0) {
954 assigned_pds, cur_pool_id));
959 cur_pool_id = (*lease)->pool_id_;
964 if ((*lease)->subnet_id_ != cur_id) {
969 assigned, cur_pool_id));
976 declined, cur_pool_id));
980 if (assigned_pds > 0) {
983 assigned_pds, cur_pool_id));
989 cur_id = (*lease)->subnet_id_;
997 switch((*lease)->type_) {
1028 if (assigned_pds > 0) {
1050 :
TrackingLeaseMgr(), lfc_setup_(), conn_(parameters), mutex_(new std::mutex) {
1051 bool conversion_needed =
false;
1057 std::string universe = conn_.getParameter(
"universe");
1058 if (universe ==
"4") {
1059 std::string file4 = initLeaseFilePath(
V4);
1060 if (!file4.empty()) {
1061 conversion_needed = loadLeasesFromFiles<
Lease4,
1068 std::string file6 = initLeaseFilePath(
V6);
1069 if (!file6.empty()) {
1070 conversion_needed = loadLeasesFromFiles<
Lease6,
1089 if (conversion_needed) {
1094 lfcSetup(conversion_needed);
1101 if (conn_.reconnectCtl()->maxRetries() > 0) {
1103 <<
" values greater than zero are not supported by memfile");
1106 if (conn_.reconnectCtl()->retryInterval() > 0) {
1108 <<
" values greater than zero are not supported by memfile");
1125 std::stringstream tmp;
1126 tmp <<
"Memfile backend ";
1129 }
else if (u ==
V6) {
1138 if (family == AF_INET6) {
1146Memfile_LeaseMgr::handleDbLost() {
1156Memfile_LeaseMgr::addLeaseInternal(
const Lease4Ptr& lease) {
1157 if (getLease4Internal(lease->addr_)) {
1168 }
catch (
const CSVFileFatalError&) {
1174 storage4_.insert(lease);
1178 lease->updateCurrentExpirationTime();
1181 class_lease_counter_.addLease(lease);
1197 std::lock_guard<std::mutex> lock(*mutex_);
1198 return (addLeaseInternal(lease));
1200 return (addLeaseInternal(lease));
1205Memfile_LeaseMgr::addLeaseInternal(
const Lease6Ptr& lease) {
1206 if (getLease6Internal(lease->type_, lease->addr_)) {
1224 storage6_.insert(lease);
1228 lease->updateCurrentExpirationTime();
1231 class_lease_counter_.addLease(lease);
1251 std::lock_guard<std::mutex> lock(*mutex_);
1252 return (addLeaseInternal(lease));
1254 return (addLeaseInternal(lease));
1261 Lease4StorageAddressIndex::iterator l = idx.find(addr);
1262 if (l == idx.end()) {
1275 std::lock_guard<std::mutex> lock(*mutex_);
1276 return (getLease4Internal(addr));
1278 return (getLease4Internal(addr));
1283Memfile_LeaseMgr::getLease4Internal(
const HWAddr& hwaddr,
1289 std::pair<Lease4StorageHWAddressSubnetIdIndex::const_iterator,
1290 Lease4StorageHWAddressSubnetIdIndex::const_iterator> l
1291 = idx.equal_range(boost::make_tuple(hwaddr.
hwaddr_));
1293 BOOST_FOREACH(
auto const& lease, l) {
1305 std::lock_guard<std::mutex> lock(*mutex_);
1306 getLease4Internal(hwaddr, collection);
1308 getLease4Internal(hwaddr, collection);
1311 return (collection);
1315Memfile_LeaseMgr::getLease4Internal(
const HWAddr& hwaddr,
1321 Lease4StorageHWAddressSubnetIdIndex::const_iterator lease =
1322 idx.find(boost::make_tuple(hwaddr.
hwaddr_, subnet_id));
1324 if (lease == idx.end()) {
1329 return (
Lease4Ptr(
new Lease4(**lease)));
1340 std::lock_guard<std::mutex> lock(*mutex_);
1341 return (getLease4Internal(hwaddr, subnet_id));
1343 return (getLease4Internal(hwaddr, subnet_id));
1348Memfile_LeaseMgr::getLease4Internal(
const ClientId& client_id,
1354 std::pair<Lease4StorageClientIdSubnetIdIndex::const_iterator,
1355 Lease4StorageClientIdSubnetIdIndex::const_iterator> l
1356 = idx.equal_range(boost::make_tuple(client_id.
getClientId()));
1358 BOOST_FOREACH(
auto const& lease, l) {
1370 std::lock_guard<std::mutex> lock(*mutex_);
1371 getLease4Internal(client_id, collection);
1373 getLease4Internal(client_id, collection);
1376 return (collection);
1380Memfile_LeaseMgr::getLease4Internal(
const ClientId& client_id,
1386 Lease4StorageClientIdSubnetIdIndex::const_iterator lease =
1387 idx.find(boost::make_tuple(client_id.
getClientId(), subnet_id));
1389 if (lease == idx.end()) {
1393 return (
Lease4Ptr(
new Lease4(**lease)));
1401 .arg(client_id.
toText());
1404 std::lock_guard<std::mutex> lock(*mutex_);
1405 return (getLease4Internal(client_id, subnet_id));
1407 return (getLease4Internal(client_id, subnet_id));
1412Memfile_LeaseMgr::getLeases4Internal(
SubnetID subnet_id,
1415 std::pair<Lease4StorageSubnetIdIndex::const_iterator,
1416 Lease4StorageSubnetIdIndex::const_iterator> l =
1417 idx.equal_range(subnet_id);
1419 BOOST_FOREACH(
auto const& lease, l) {
1431 std::lock_guard<std::mutex> lock(*mutex_);
1432 getLeases4Internal(subnet_id, collection);
1434 getLeases4Internal(subnet_id, collection);
1437 return (collection);
1441Memfile_LeaseMgr::getLeases4Internal(
const std::string& hostname,
1444 std::pair<Lease4StorageHostnameIndex::const_iterator,
1445 Lease4StorageHostnameIndex::const_iterator> l =
1446 idx.equal_range(hostname);
1448 BOOST_FOREACH(
auto const& lease, l) {
1460 std::lock_guard<std::mutex> lock(*mutex_);
1461 getLeases4Internal(hostname, collection);
1463 getLeases4Internal(hostname, collection);
1466 return (collection);
1471 for (
auto const& lease : storage4_) {
1482 std::lock_guard<std::mutex> lock(*mutex_);
1483 getLeases4Internal(collection);
1485 getLeases4Internal(collection);
1488 return (collection);
1496 Lease4StorageAddressIndex::const_iterator lb = idx.lower_bound(lower_bound_address);
1499 if ((lb != idx.end()) && ((*lb)->addr_ == lower_bound_address)) {
1504 for (
auto lease = lb;
1505 (lease != idx.end()) &&
1506 (
static_cast<size_t>(std::distance(lb, lease)) < page_size.
page_size_);
1508 collection.push_back(
Lease4Ptr(
new Lease4(**lease)));
1516 if (!lower_bound_address.
isV4()) {
1518 "retrieving leases from the lease database, got "
1519 << lower_bound_address);
1524 .arg(lower_bound_address.
toText());
1528 std::lock_guard<std::mutex> lock(*mutex_);
1529 getLeases4Internal(lower_bound_address, page_size, collection);
1531 getLeases4Internal(lower_bound_address, page_size, collection);
1534 return (collection);
1541 std::lock_guard<std::mutex> lock(*mutex_);
1542 getLeases4ByStateInternal(state, subnet_id, collection);
1544 getLeases4ByStateInternal(state, subnet_id, collection);
1547 return (collection);
1551Memfile_LeaseMgr::getLeases4ByStateInternal(uint32_t state,
1554 if (subnet_id == 0) {
1555 return (getLeases4ByStateInternal(state, collection));
1558 std::pair<Lease4StorageStateIndex::const_iterator,
1559 Lease4StorageStateIndex::const_iterator> l =
1560 idx.equal_range(boost::make_tuple(state, subnet_id));
1562 BOOST_FOREACH(
auto const& lease, l) {
1563 collection.push_back(
Lease4Ptr(
new Lease4(*lease)));
1568Memfile_LeaseMgr::getLeases4ByStateInternal(uint32_t state,
1571 std::pair<Lease4StorageStateIndex::const_iterator,
1572 Lease4StorageStateIndex::const_iterator> l =
1573 idx.equal_range(boost::make_tuple(state));
1575 BOOST_FOREACH(
auto const& lease, l) {
1576 collection.push_back(
Lease4Ptr(
new Lease4(*lease)));
1581Memfile_LeaseMgr::getLease6Internal(
Lease::Type type,
1582 const isc::asiolink::IOAddress& addr)
const {
1583 Lease6Storage::iterator l = storage6_.find(addr);
1584 if (l == storage6_.end() || !(*l) || ((*l)->type_ != type)) {
1592Memfile_LeaseMgr::getLease6Internal(
const HWAddr& hwaddr,
1595 storage6_.get<HWAddressIndexTag>();
1596 std::pair<Lease6StorageHWAddressIndex::const_iterator,
1597 Lease6StorageHWAddressIndex::const_iterator> l
1598 = idx.equal_range(hwaddr.hwaddr_);
1600 BOOST_FOREACH(
auto const& lease, l) {
1601 collection.push_back(
Lease6Ptr(
new Lease6(*lease)));
1612 std::lock_guard<std::mutex> lock(*mutex_);
1613 getLease6Internal(hwaddr, collection);
1615 getLease6Internal(hwaddr, collection);
1618 return (collection);
1623 Lease6Storage::iterator l = storage6_.find(addr);
1624 if (l == storage6_.end() || !(*l)) {
1640 std::lock_guard<std::mutex> lock(*mutex_);
1641 return (getLease6Internal(type, addr));
1643 return (getLease6Internal(type, addr));
1648Memfile_LeaseMgr::getLeases6Internal(
Lease::Type type,
1655 std::pair<Lease6StorageDuidIaidTypeIndex::const_iterator,
1656 Lease6StorageDuidIaidTypeIndex::const_iterator> l =
1657 idx.equal_range(boost::make_tuple(duid.
getDuid(), iaid, type));
1659 for (Lease6StorageDuidIaidTypeIndex::const_iterator lease =
1660 l.first; lease != l.second; ++lease) {
1668 uint32_t iaid)
const {
1677 std::lock_guard<std::mutex> lock(*mutex_);
1678 getLeases6Internal(type, duid, iaid, collection);
1680 getLeases6Internal(type, duid, iaid, collection);
1683 return (collection);
1687Memfile_LeaseMgr::getLeases6Internal(
Lease::Type type,
1695 std::pair<Lease6StorageDuidIaidTypeIndex::const_iterator,
1696 Lease6StorageDuidIaidTypeIndex::const_iterator> l =
1697 idx.equal_range(boost::make_tuple(duid.
getDuid(), iaid, type));
1699 for (Lease6StorageDuidIaidTypeIndex::const_iterator lease =
1700 l.first; lease != l.second; ++lease) {
1702 if ((*lease)->subnet_id_ == subnet_id) {
1722 std::lock_guard<std::mutex> lock(*mutex_);
1723 getLeases6Internal(type, duid, iaid, subnet_id, collection);
1725 getLeases6Internal(type, duid, iaid, subnet_id, collection);
1728 return (collection);
1732Memfile_LeaseMgr::getLeases6Internal(
SubnetID subnet_id,
1735 std::pair<Lease6StorageSubnetIdIndex::const_iterator,
1736 Lease6StorageSubnetIdIndex::const_iterator> l =
1737 idx.equal_range(subnet_id);
1739 BOOST_FOREACH(
auto const& lease, l) {
1751 std::lock_guard<std::mutex> lock(*mutex_);
1752 getLeases6Internal(subnet_id, collection);
1754 getLeases6Internal(subnet_id, collection);
1757 return (collection);
1761Memfile_LeaseMgr::getLeases6Internal(
const std::string& hostname,
1764 std::pair<Lease6StorageHostnameIndex::const_iterator,
1765 Lease6StorageHostnameIndex::const_iterator> l =
1766 idx.equal_range(hostname);
1768 BOOST_FOREACH(
auto const& lease, l) {
1780 std::lock_guard<std::mutex> lock(*mutex_);
1781 getLeases6Internal(hostname, collection);
1783 getLeases6Internal(hostname, collection);
1786 return (collection);
1791 for (
auto const& lease : storage6_) {
1802 std::lock_guard<std::mutex> lock(*mutex_);
1803 getLeases6Internal(collection);
1805 getLeases6Internal(collection);
1808 return (collection);
1812Memfile_LeaseMgr::getLeases6Internal(
const DUID& duid,
1815 std::pair<Lease6StorageDuidIndex::const_iterator,
1816 Lease6StorageDuidIndex::const_iterator> l =
1817 idx.equal_range(duid.
getDuid());
1819 BOOST_FOREACH(
auto const& lease, l) {
1831 std::lock_guard<std::mutex> lock(*mutex_);
1832 getLeases6Internal(duid, collection);
1834 getLeases6Internal(duid, collection);
1837 return (collection);
1845 Lease6StorageAddressIndex::const_iterator lb = idx.lower_bound(lower_bound_address);
1848 if ((lb != idx.end()) && ((*lb)->addr_ == lower_bound_address)) {
1853 for (
auto lease = lb;
1854 (lease != idx.end()) &&
1855 (
static_cast<size_t>(std::distance(lb, lease)) < page_size.
page_size_);
1857 collection.push_back(
Lease6Ptr(
new Lease6(**lease)));
1865 if (!lower_bound_address.
isV6()) {
1867 "retrieving leases from the lease database, got "
1868 << lower_bound_address);
1873 .arg(lower_bound_address.
toText());
1877 std::lock_guard<std::mutex> lock(*mutex_);
1878 getLeases6Internal(lower_bound_address, page_size, collection);
1880 getLeases6Internal(lower_bound_address, page_size, collection);
1883 return (collection);
1887Memfile_LeaseMgr::getLeases6Internal(
SubnetID subnet_id,
1892 Lease6StorageSubnetIdIndex::const_iterator lb =
1893 idx.lower_bound(boost::make_tuple(subnet_id, lower_bound_address));
1896 if ((lb != idx.end()) && ((*lb)->addr_ == lower_bound_address)) {
1901 for (
auto it = lb; it != idx.end(); ++it) {
1902 if ((*it)->subnet_id_ != subnet_id) {
1906 collection.push_back(
Lease6Ptr(
new Lease6(**it)));
1907 if (collection.size() >= page_size.
page_size_) {
1911 return (collection);
1921 .arg(lower_bound_address.
toText())
1925 if (!lower_bound_address.
isV6()) {
1927 "retrieving leases from the lease database, got "
1928 << lower_bound_address);
1932 std::lock_guard<std::mutex> lock(*mutex_);
1933 return (getLeases6Internal(subnet_id,
1934 lower_bound_address,
1937 return (getLeases6Internal(subnet_id,
1938 lower_bound_address,
1947 std::lock_guard<std::mutex> lock(*mutex_);
1948 getLeases6ByStateInternal(state, subnet_id, collection);
1950 getLeases6ByStateInternal(state, subnet_id, collection);
1953 return (collection);
1957Memfile_LeaseMgr::getLeases6ByStateInternal(uint32_t state,
1960 if (subnet_id == 0) {
1961 return (getLeases6ByStateInternal(state, collection));
1964 std::pair<Lease6StorageStateIndex::const_iterator,
1965 Lease6StorageStateIndex::const_iterator> l =
1966 idx.equal_range(boost::make_tuple(state, subnet_id));
1968 BOOST_FOREACH(
auto const& lease, l) {
1969 collection.push_back(
Lease6Ptr(
new Lease6(*lease)));
1974Memfile_LeaseMgr::getLeases6ByStateInternal(uint32_t state,
1977 std::pair<Lease6StorageStateIndex::const_iterator,
1978 Lease6StorageStateIndex::const_iterator> l =
1979 idx.equal_range(boost::make_tuple(state));
1981 BOOST_FOREACH(
auto const& lease, l) {
1982 collection.push_back(
Lease6Ptr(
new Lease6(*lease)));
1987Memfile_LeaseMgr::getExpiredLeases4Internal(
Lease4Collection& expired_leases,
1988 const size_t max_leases)
const {
1996 Lease4StorageExpirationIndex::const_iterator ub =
1997 index.upper_bound(boost::make_tuple(
false, time(0)));
2000 for (Lease4StorageExpirationIndex::const_iterator lease = index.begin();
2002 ((max_leases == 0) ||
2003 (
static_cast<size_t>(std::distance(index.begin(), lease)) < max_leases));
2005 expired_leases.push_back(
Lease4Ptr(
new Lease4(**lease)));
2011 const size_t max_leases)
const {
2016 std::lock_guard<std::mutex> lock(*mutex_);
2017 getExpiredLeases4Internal(expired_leases, max_leases);
2019 getExpiredLeases4Internal(expired_leases, max_leases);
2024Memfile_LeaseMgr::getExpiredLeases6Internal(
Lease6Collection& expired_leases,
2025 const size_t max_leases)
const {
2033 Lease6StorageExpirationIndex::const_iterator ub =
2034 index.upper_bound(boost::make_tuple(
false, time(0)));
2037 for (Lease6StorageExpirationIndex::const_iterator lease = index.begin();
2039 ((max_leases == 0) ||
2040 (
static_cast<size_t>(std::distance(index.begin(), lease)) < max_leases));
2048 const size_t max_leases)
const {
2053 std::lock_guard<std::mutex> lock(*mutex_);
2054 getExpiredLeases6Internal(expired_leases, max_leases);
2056 getExpiredLeases6Internal(expired_leases, max_leases);
2061Memfile_LeaseMgr::updateLease4Internal(
const Lease4Ptr& lease) {
2068 Lease4StorageAddressIndex::const_iterator lease_it = index.find(lease->addr_);
2069 if (lease_it == index.end()) {
2071 << lease->addr_ <<
" - no such lease");
2072 }
else if ((!persist) && (((*lease_it)->cltt_ != lease->current_cltt_) ||
2073 ((*lease_it)->valid_lft_ != lease->current_valid_lft_))) {
2076 isc_throw(NoSuchLease,
"unable to update lease for address " <<
2077 lease->addr_.toText() <<
" either because the lease does not exist, "
2078 "it has been deleted or it has changed in the database.");
2087 }
catch (
const CSVFileFatalError&) {
2094 lease->updateCurrentExpirationTime();
2101 index.replace(lease_it,
Lease4Ptr(
new Lease4(*lease)));
2104 class_lease_counter_.updateLease(lease, old_lease);
2118 std::lock_guard<std::mutex> lock(*mutex_);
2119 updateLease4Internal(lease);
2121 updateLease4Internal(lease);
2126Memfile_LeaseMgr::updateLease6Internal(
const Lease6Ptr& lease) {
2137 Lease6StorageAddressIndex::const_iterator lease_it = index.find(lease->addr_);
2138 if (lease_it == index.end()) {
2140 << lease->addr_ <<
" - no such lease");
2141 }
else if ((!persist) && (((*lease_it)->cltt_ != lease->current_cltt_) ||
2142 ((*lease_it)->valid_lft_ != lease->current_valid_lft_))) {
2145 isc_throw(NoSuchLease,
"unable to update lease for address " <<
2146 lease->addr_.toText() <<
" either because the lease does not exist, "
2147 "it has been deleted or it has changed in the database.");
2156 }
catch (
const CSVFileFatalError&) {
2163 lease->updateCurrentExpirationTime();
2170 index.replace(lease_it,
Lease6Ptr(
new Lease6(*lease)));
2173 class_lease_counter_.updateLease(lease, old_lease);
2177 switch (recorded_action) {
2204 std::lock_guard<std::mutex> lock(*mutex_);
2205 updateLease6Internal(lease);
2207 updateLease6Internal(lease);
2212Memfile_LeaseMgr::deleteLeaseInternal(
const Lease4Ptr& lease) {
2214 Lease4Storage::iterator l = storage4_.find(addr);
2215 if (l == storage4_.end()) {
2222 Lease4 lease_copy = **l;
2225 lease_copy.valid_lft_ = 0;
2235 if (((*l)->cltt_ != lease->current_cltt_) ||
2236 ((*l)->valid_lft_ != lease->current_valid_lft_)) {
2244 class_lease_counter_.removeLease(lease);
2261 std::lock_guard<std::mutex> lock(*mutex_);
2262 return (deleteLeaseInternal(lease));
2264 return (deleteLeaseInternal(lease));
2269Memfile_LeaseMgr::deleteLeaseInternal(
const Lease6Ptr& lease) {
2273 Lease6Storage::iterator l = storage6_.find(addr);
2274 if (l == storage6_.end()) {
2281 Lease6 lease_copy = **l;
2283 lease_copy.valid_lft_ = 0;
2284 lease_copy.preferred_lft_ = 0;
2294 if (((*l)->cltt_ != lease->current_cltt_) ||
2295 ((*l)->valid_lft_ != lease->current_valid_lft_)) {
2303 class_lease_counter_.removeLease(lease);
2325 std::lock_guard<std::mutex> lock(*mutex_);
2326 return (deleteLeaseInternal(lease));
2328 return (deleteLeaseInternal(lease));
2339 std::lock_guard<std::mutex> lock(*mutex_);
2340 return (deleteExpiredReclaimedLeases<
2344 return (deleteExpiredReclaimedLeases<
2357 std::lock_guard<std::mutex> lock(*mutex_);
2358 return (deleteExpiredReclaimedLeases<
2362 return (deleteExpiredReclaimedLeases<
2368template<
typename IndexType,
typename LeaseType,
typename StorageType,
2369 typename LeaseFileType>
2371Memfile_LeaseMgr::deleteExpiredReclaimedLeases(
const uint32_t secs,
2372 const Universe& universe,
2373 StorageType& storage,
2374 LeaseFileType& lease_file) {
2387 typename IndexType::const_iterator upper_limit =
2388 index.upper_bound(boost::make_tuple(
true, time(0) - secs));
2397 typename IndexType::const_iterator lower_limit =
2398 index.upper_bound(boost::make_tuple(
true, std::numeric_limits<int64_t>::min()));
2401 uint64_t num_leases =
static_cast<uint64_t
>(std::distance(lower_limit, upper_limit));
2402 if (num_leases > 0) {
2412 for (
typename IndexType::const_iterator lease = lower_limit;
2413 lease != upper_limit; ++lease) {
2415 LeaseType lease_copy(**lease);
2418 lease_copy.valid_lft_ = 0;
2420 lease_file->append(lease_copy);
2429 index.erase(lower_limit, upper_limit);
2433 return (num_leases);
2438 return (std::string(
"In memory database with leases stored in a CSV file."));
2441std::pair<uint32_t, uint32_t>
2443 std::string
const& universe(conn_.getParameter(
"universe"));
2444 if (universe ==
"4") {
2446 }
else if (universe ==
"6") {
2465 std::string lease_file(file_name);
2466 if (lease_file.empty()) {
2476 std::string file_name;
2484 if (file_name.empty()) {
2496 std::string name(file_name);
2497 switch (file_type) {
2508 name +=
".completed";
2523 std::string filename ) {
2524 std::ostringstream s;;
2526 if (filename.empty()) {
2528 s << (u ==
V4 ?
"4" :
"6");
2531 s <<
"/" << filename;
2559Memfile_LeaseMgr::initLeaseFilePath(Universe u) {
2560 std::string persist_val;
2566 persist_val =
"true";
2573 }
else if (persist_val !=
"true") {
2574 isc_throw(isc::BadValue,
"invalid value 'persist="
2575 << persist_val <<
"'");
2578 std::string lease_file;
2580 lease_file = conn_.getParameter(
"name");
2581 }
catch (
const Exception&) {
2588 }
catch (
const SecurityWarn& ex) {
2593 return (lease_file);
2596template<
typename LeaseObjectType,
typename LeaseFileType,
typename StorageType>
2598Memfile_LeaseMgr::loadLeasesFromFiles(Universe u,
const std::string& filename,
2599 boost::shared_ptr<LeaseFileType>& lease_file,
2600 StorageType& storage) {
2608 isc_throw(DbOpenError,
"unable to load leases from files while the "
2609 "lease file cleanup is in progress");
2614 std::string max_row_errors_str =
"0";
2616 max_row_errors_str = conn_.getParameter(
"max-row-errors");
2617 }
catch (
const std::exception&) {
2621 int64_t max_row_errors64;
2623 max_row_errors64 = boost::lexical_cast<int64_t>(max_row_errors_str);
2624 }
catch (
const boost::bad_lexical_cast&) {
2625 isc_throw(isc::BadValue,
"invalid value of the max-row-errors "
2626 << max_row_errors_str <<
" specified");
2628 if ((max_row_errors64 < 0) ||
2629 (max_row_errors64 > std::numeric_limits<uint32_t>::max())) {
2630 isc_throw(isc::BadValue,
"invalid value of the max-row-errors "
2631 << max_row_errors_str <<
" specified");
2633 uint32_t max_row_errors =
static_cast<uint32_t
>(max_row_errors64);
2636 bool conversion_needed =
false;
2637 lease_file.reset(
new LeaseFileType(std::string(filename +
".completed")));
2638 if (lease_file->exists()) {
2641 conversion_needed = conversion_needed || lease_file->needsConversion();
2646 if (lease_file->exists()) {
2649 conversion_needed = conversion_needed || lease_file->needsConversion();
2653 if (lease_file->exists()) {
2656 conversion_needed = conversion_needed || lease_file->needsConversion();
2666 lease_file.reset(
new LeaseFileType(filename));
2668 max_row_errors,
false);
2669 conversion_needed = conversion_needed || lease_file->needsConversion();
2671 return (conversion_needed);
2676 return (lfc_setup_->isRunning());
2681 return (lfc_setup_->getExitStatus());
2686 return (lfc_setup_->getLastPid());
2702Memfile_LeaseMgr::lfcSetup(
bool conversion_needed) {
2703 std::string lfc_interval_str =
"3600";
2706 }
catch (
const std::exception&) {
2710 uint32_t lfc_interval = 0;
2712 lfc_interval = boost::lexical_cast<uint32_t>(lfc_interval_str);
2713 }
catch (
const boost::bad_lexical_cast&) {
2714 isc_throw(isc::BadValue,
"invalid value of the lfc-interval "
2715 << lfc_interval_str <<
" specified");
2722template<
typename LeaseFileType>
2724Memfile_LeaseMgr::lfcExecute(boost::shared_ptr<LeaseFileType>& lease_file) {
2736 if (!lease_file_finish.exists() && !lease_file_copy.exists()) {
2738 lease_file->close();
2741 do_lfc = (rename(lease_file->getFilename().c_str(),
2742 lease_file_copy.getFilename().c_str()) == 0);
2746 .arg(lease_file->getFilename())
2747 .arg(lease_file_copy.getFilename())
2748 .arg(strerror(errno));
2757 lease_file->open(
true);
2759 }
catch (
const CSVFileError& ex) {
2770 .arg(lease_file->getFilename())
2781 lfc_setup_->execute(lease_file->getFilename());
2788 std::ostringstream msg;
2789 msg <<
"'persist' parameter of 'memfile' lease backend "
2790 <<
"was configured to 'false'";
2807 if (new_pid == -1) {
2809 }
else if (new_pid != previous_pid) {
2820 std::lock_guard<std::mutex> lock(*mutex_);
2833 std::lock_guard<std::mutex> lock(*mutex_);
2846 std::lock_guard<std::mutex> lock(*mutex_);
2861 std::lock_guard<std::mutex> lock(*mutex_);
2874 std::lock_guard<std::mutex> lock(*mutex_);
2887 std::lock_guard<std::mutex> lock(*mutex_);
2900 std::lock_guard<std::mutex> lock(*mutex_);
2915 std::lock_guard<std::mutex> lock(*mutex_);
2933 std::pair<Lease4StorageSubnetIdIndex::const_iterator,
2934 Lease4StorageSubnetIdIndex::const_iterator> r =
2935 idx.equal_range(subnet_id);
2939 BOOST_FOREACH(
auto const& lease, r) {
2940 leases.push_back(lease);
2943 size_t num = leases.size();
2944 for (
auto const& l : leases) {
2948 .arg(subnet_id).arg(num);
2962 std::pair<Lease6StorageSubnetIdIndex::const_iterator,
2963 Lease6StorageSubnetIdIndex::const_iterator> r =
2964 idx.equal_range(subnet_id);
2968 BOOST_FOREACH(
auto const& lease, r) {
2969 leases.push_back(lease);
2972 size_t num = leases.size();
2973 for (
auto const& l : leases) {
2977 .arg(subnet_id).arg(num);
2984 class_lease_counter_.clear();
2985 for (
auto const& lease : storage4_) {
2988 class_lease_counter_.addLease(lease);
2995 class_lease_counter_.clear();
2996 for (
auto const& lease : storage6_) {
2999 class_lease_counter_.addLease(lease);
3008 std::lock_guard<std::mutex> lock(*mutex_);
3009 return(class_lease_counter_.getClassCount(client_class, ltype));
3011 return(class_lease_counter_.getClassCount(client_class, ltype));
3017 return(class_lease_counter_.clear());
3022 if (!user_context) {
3035 for (
unsigned i = 0; i < classes->size(); ++i) {
3044 std::string name = name_elem->stringValue();
3055 size_t lease_count = 0;
3061 if (lease_count >= limit) {
3062 std::ostringstream ss;
3063 ss <<
"address limit " << limit <<
" for client class \""
3064 << name <<
"\", current lease count " << lease_count;
3080 SubnetID subnet_id = id_elem->intValue();
3087 int64_t lease_count = 0;
3089 lease_count = getSubnetStat(subnet_id,
"assigned-addresses");
3093 if (
static_cast<uint64_t
>(lease_count) >= limit) {
3094 std::ostringstream ss;
3095 ss <<
"address limit " << limit <<
" for subnet ID " << subnet_id
3096 <<
", current lease count " << lease_count;
3108 if (!user_context) {
3122 for (
unsigned i = 0; i < classes->size(); ++i) {
3131 std::string name = name_elem->stringValue();
3136 if (!getLeaseLimit(class_elem, ltype, limit)) {
3138 if (!getLeaseLimit(class_elem, ltype, limit)) {
3146 size_t lease_count = 0;
3152 if (lease_count >= limit) {
3153 std::ostringstream ss;
3155 <<
" limit " << limit <<
" for client class \""
3156 << name <<
"\", current lease count " << lease_count;
3172 SubnetID subnet_id = id_elem->intValue();
3177 if (!getLeaseLimit(subnet_elem, ltype, limit)) {
3179 if (!getLeaseLimit(subnet_elem, ltype, limit)) {
3187 int64_t lease_count = 0;
3189 lease_count = getSubnetStat(subnet_id, (ltype ==
Lease::TYPE_NA ?
3190 "assigned-nas" :
"assigned-pds"));
3194 if (
static_cast<uint64_t
>(lease_count) >= limit) {
3195 std::ostringstream ss;
3197 <<
" limit " << limit <<
" for subnet ID " << subnet_id
3198 <<
", current lease count " << lease_count;
3208Memfile_LeaseMgr::getSubnetStat(
const SubnetID& subnet_id,
const std::string& stat_label)
const {
3214 if (samples && samples->size()) {
3215 auto sample = samples->get(0);
3216 if (sample->size()) {
3217 auto count_elem = sample->get(0);
3218 return (count_elem->intValue());
3228 "prefix-limit" :
"address-limit");
3230 limit = limit_elem->intValue();
3241 std::stringstream tmp;
3244 for (
auto const& it :
id) {
3248 tmp << std::setw(2) << std::setfill(
'0')
3249 <<
static_cast<unsigned int>(it);
3261 const time_t& qry_start_time ,
3262 const time_t& qry_end_time ) {
3266 .arg(lower_bound_address.
toText())
3267 .arg(idToText(relay_id))
3268 .arg(qry_start_time)
3272 if (!lower_bound_address.
isV4()) {
3274 "retrieving leases from the lease database, got "
3275 << lower_bound_address);
3279 if ((qry_start_time < 0) || (qry_end_time < 0)) {
3284 if ((qry_start_time > 0) && (qry_end_time > 0) &&
3285 (qry_start_time > qry_end_time)) {
3290 std::lock_guard<std::mutex> lock(*mutex_);
3291 return (getLeases4ByRelayIdInternal(relay_id,
3292 lower_bound_address,
3297 return (getLeases4ByRelayIdInternal(relay_id,
3298 lower_bound_address,
3306Memfile_LeaseMgr::getLeases4ByRelayIdInternal(
const OptionBuffer& relay_id,
3309 const time_t& qry_start_time,
3310 const time_t& qry_end_time) {
3313 Lease4StorageRelayIdIndex::const_iterator lb =
3314 idx.lower_bound(boost::make_tuple(relay_id, lower_bound_address));
3316 IOAddress last_addr = lower_bound_address;
3317 for (; lb != idx.end(); ++lb) {
3318 if ((*lb)->addr_ == last_addr) {
3322 if ((*lb)->relay_id_ != relay_id) {
3326 last_addr = (*lb)->addr_;
3327 if ((qry_start_time > 0) && ((*lb)->cltt_ < qry_start_time)) {
3331 if ((qry_end_time > 0) && ((*lb)->cltt_ > qry_end_time)) {
3335 collection.push_back(
Lease4Ptr(
new Lease4(**lb)));
3336 if (collection.size() >= page_size.
page_size_) {
3340 return (collection);
3347 const time_t& qry_start_time ,
3348 const time_t& qry_end_time ) {
3352 .arg(lower_bound_address.
toText())
3353 .arg(idToText(remote_id))
3354 .arg(qry_start_time)
3358 if (!lower_bound_address.
isV4()) {
3360 "retrieving leases from the lease database, got "
3361 << lower_bound_address);
3365 if ((qry_start_time < 0) || (qry_end_time < 0)) {
3370 if ((qry_start_time > 0) && (qry_end_time > 0) &&
3371 (qry_start_time > qry_end_time)) {
3376 std::lock_guard<std::mutex> lock(*mutex_);
3377 return (getLeases4ByRemoteIdInternal(remote_id,
3378 lower_bound_address,
3383 return (getLeases4ByRemoteIdInternal(remote_id,
3384 lower_bound_address,
3392Memfile_LeaseMgr::getLeases4ByRemoteIdInternal(
const OptionBuffer& remote_id,
3395 const time_t& qry_start_time,
3396 const time_t& qry_end_time) {
3398 std::map<IOAddress, Lease4Ptr> sorted;
3402 BOOST_FOREACH(
auto const& it, er) {
3404 if (addr <= lower_bound_address) {
3408 if ((qry_start_time > 0) && (it->cltt_ < qry_start_time)) {
3412 if ((qry_end_time > 0) && (it->cltt_ > qry_end_time)) {
3420 for (
auto const& it : sorted) {
3421 collection.push_back(
Lease4Ptr(
new Lease4(*it.second)));
3422 if (collection.size() >= page_size.
page_size_) {
3426 return (collection);
3432 std::lock_guard<std::mutex> lock(*mutex_);
3458 .arg(lower_bound_address.
toText())
3462 if (!lower_bound_address.
isV6()) {
3464 "retrieving leases from the lease database, got "
3465 << lower_bound_address);
3469 std::lock_guard<std::mutex> lock(*mutex_);
3470 return (getLeases6ByRelayIdInternal(relay_id,
3471 lower_bound_address,
3474 return (getLeases6ByRelayIdInternal(relay_id,
3475 lower_bound_address,
3481Memfile_LeaseMgr::getLeases6ByRelayIdInternal(
const DUID& relay_id,
3484 const std::vector<uint8_t>& relay_id_data = relay_id.
getDuid();
3487 RelayIdIndex::const_iterator lb =
3488 idx.lower_bound(boost::make_tuple(relay_id_data, lower_bound_address));
3491 IOAddress last_addr = lower_bound_address;
3492 for (; lb != idx.end(); ++lb) {
3493 if ((*lb)->lease_addr_ == last_addr) {
3497 if ((*lb)->id_ != relay_id_data) {
3501 last_addr = (*lb)->lease_addr_;
3502 Lease6Ptr lease = getAnyLease6Internal(last_addr);
3504 collection.push_back(lease);
3505 if (collection.size() >= page_size.
page_size_) {
3510 return (collection);
3520 .arg(lower_bound_address.
toText())
3521 .arg(idToText(remote_id));
3524 if (!lower_bound_address.
isV6()) {
3526 "retrieving leases from the lease database, got "
3527 << lower_bound_address);
3531 std::lock_guard<std::mutex> lock(*mutex_);
3532 return (getLeases6ByRemoteIdInternal(remote_id,
3533 lower_bound_address,
3536 return (getLeases6ByRemoteIdInternal(remote_id,
3537 lower_bound_address,
3543Memfile_LeaseMgr::getLeases6ByRemoteIdInternal(
const OptionBuffer& remote_id,
3547 std::set<IOAddress> sorted;
3551 BOOST_FOREACH(
auto const& it, er) {
3552 const IOAddress& addr = it->lease_addr_;
3553 if (addr <= lower_bound_address) {
3556 static_cast<void>(sorted.insert(addr));
3561 Lease6Ptr lease = getAnyLease6Internal(addr);
3563 collection.push_back(lease);
3564 if (collection.size() >= page_size.
page_size_) {
3569 return (collection);
3582 <<
" consistency configuration is null");
3584 auto check = cfg->getExtendedInfoSanityCheck();
3589 .arg(update ?
" updating in file" :
"");
3592 size_t modified = 0;
3594 size_t processed = 0;
3596 auto lease_it = index.begin();
3597 auto next_it = index.end();
3599 for (; lease_it != index.end(); lease_it = next_it) {
3600 next_it = std::next(lease_it);
3621 if (!
copy->relay_id_.empty() || !
copy->remote_id_.empty()) {
3622 index.replace(lease_it,
copy);
3625 }
catch (
const std::exception& ex) {
3628 .arg(lease->addr_.toText())
3653 auto check = cfg->getExtendedInfoSanityCheck();
3659 .arg(enabled ?
"enabled" :
"disabled");
3668 size_t modified = 0;
3669 size_t processed = 0;
3671 for (
auto const& lease : storage6_) {
3680 }
catch (
const std::exception& ex) {
3683 .arg(lease->addr_.toText())
3703 static_cast<void>(relay_id_idx.erase(addr));
3706 static_cast<void>(remote_id_idx.erase(addr));
3711 const std::vector<uint8_t>& relay_id) {
3719 const std::vector<uint8_t>& remote_id) {
3728 std::lock_guard<std::mutex> lock(*mutex_);
3729 writeLeases4Internal(filename);
3731 writeLeases4Internal(filename);
3736Memfile_LeaseMgr::writeLeases4Internal(
const std::string& filename) {
3738 std::ostringstream tmp;
3739 tmp << filename <<
".tmp" << getpid();
3740 auto tmpname = tmp.str();
3741 ::remove(tmpname.c_str());
3747 for (
auto const& lease : storage4_) {
3748 tmpfile.append(*lease);
3751 }
catch (
const std::exception&) {
3753 ::remove(tmpname.c_str());
3758 std::ostringstream bak;
3759 bak << filename <<
".bak" << getpid();
3760 auto bakname = bak.str();
3766 ::rename(filename.c_str(), bakname.c_str());
3769 ::rename(tmpname.c_str(), filename.c_str());
3774 ::rename(filename.c_str(), bakname.c_str());
3777 ::rename(tmpname.c_str(), filename.c_str());
3784 std::lock_guard<std::mutex> lock(*mutex_);
3785 writeLeases6Internal(filename);
3787 writeLeases6Internal(filename);
3792Memfile_LeaseMgr::writeLeases6Internal(
const std::string& filename) {
3794 std::ostringstream tmp;
3795 tmp << filename <<
".tmp" << getpid();
3796 auto tmpname = tmp.str();
3797 ::remove(tmpname.c_str());
3803 for (
auto const& lease : storage6_) {
3804 tmpfile.append(*lease);
3807 }
catch (
const std::exception&) {
3809 ::remove(tmpname.c_str());
3814 std::ostringstream bak;
3815 bak << filename <<
".bak" << getpid();
3816 auto bakname = bak.str();
3822 ::rename(filename.c_str(), bakname.c_str());
3825 ::rename(tmpname.c_str(), filename.c_str());
3830 ::rename(filename.c_str(), bakname.c_str());
3833 ::rename(tmpname.c_str(), filename.c_str());
3843 }
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.
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).