24#include <boost/foreach.hpp>
41const char* KEA_LFC_EXECUTABLE_ENV_NAME =
"KEA_LFC_EXECUTABLE";
98 void setup(
const uint32_t lfc_interval,
99 const boost::shared_ptr<CSVLeaseFile4>& lease_file4,
100 const boost::shared_ptr<CSVLeaseFile6>& lease_file6,
101 bool run_once_now =
false);
104 void execute(
const std::string& lease_file);
121 boost::scoped_ptr<ProcessSpawn> process_;
137 : process_(), callback_(callback), pid_(0),
153 timer_mgr_->unregisterTimer(
"memfile-lfc");
155 }
catch (
const std::exception& ex) {
166 const boost::shared_ptr<CSVLeaseFile4>& lease_file4,
167 const boost::shared_ptr<CSVLeaseFile6>& lease_file6,
171 std::string executable;
172 char* c_executable = getenv(KEA_LFC_EXECUTABLE_ENV_NAME);
174 executable = KEA_LFC_EXECUTABLE;
176 executable = c_executable;
180 std::string lease_file = lease_file4 ? lease_file4->getFilename() :
181 lease_file6->getFilename();
186 args.push_back(lease_file4 ?
"-4" :
"-6");
189 args.push_back(
"-x");
193 args.push_back(
"-i");
197 args.push_back(
"-o");
201 args.push_back(
"-f");
205 args.push_back(
"-p");
210 args.push_back(
"-c");
211 args.push_back(
"ignored-path");
223 if (lfc_interval > 0) {
230 timer_mgr_->registerTimer(
"memfile-lfc", callback_, lfc_interval * 1000,
232 timer_mgr_->setup(
"memfile-lfc");
255 process_->clearState(pid_);
267 .arg(process_->getCommandLine());
269 pid_ = process_->spawn();
281 pid_file.
write(pid_);
291 return (process_ && process_->isRunning(pid_));
298 " the process is null");
300 return (process_->getExitStatus(pid_));
363 return (
rows_.size());
459 void startSubnets() {
464 Lease4StorageSubnetIdIndex::const_iterator lower;
465 Lease4StorageSubnetIdIndex::const_iterator upper;
488 if (lower == upper) {
496 int64_t assigned = 0;
497 int64_t declined = 0;
498 for (Lease4StorageSubnetIdIndex::const_iterator lease = lower;
499 lease != upper; ++lease) {
502 if ((*lease)->subnet_id_ != cur_id) {
505 rows_.push_back(LeaseStatsRow(cur_id,
512 rows_.push_back(LeaseStatsRow(cur_id,
520 cur_id = (*lease)->subnet_id_;
560 void startSubnetPools() {
562 = storage4_.get<SubnetIdPoolIdIndexTag>();
565 Lease4StorageSubnetIdPoolIdIndex::const_iterator lower;
566 Lease4StorageSubnetIdPoolIdIndex::const_iterator upper;
578 if (lower == upper) {
586 uint32_t cur_pool_id = 0;
587 int64_t assigned = 0;
588 int64_t declined = 0;
589 for (Lease4StorageSubnetIdPoolIdIndex::const_iterator lease = lower;
590 lease != upper; ++lease) {
593 if ((*lease)->pool_id_ != cur_pool_id) {
595 rows_.push_back(LeaseStatsRow(cur_id,
597 assigned, cur_pool_id));
602 rows_.push_back(LeaseStatsRow(cur_id,
604 declined, cur_pool_id));
609 cur_pool_id = (*lease)->pool_id_;
614 if ((*lease)->subnet_id_ != cur_id) {
617 rows_.push_back(LeaseStatsRow(cur_id,
619 assigned, cur_pool_id));
624 rows_.push_back(LeaseStatsRow(cur_id,
626 declined, cur_pool_id));
632 cur_id = (*lease)->subnet_id_;
649 assigned, cur_pool_id));
654 declined, cur_pool_id));
753 virtual void startSubnets() {
758 Lease6StorageSubnetIdIndex::const_iterator lower;
759 Lease6StorageSubnetIdIndex::const_iterator upper;
781 if (lower == upper) {
789 int64_t assigned = 0;
790 int64_t declined = 0;
791 int64_t assigned_pds = 0;
792 int64_t registered = 0;
793 for (Lease6StorageSubnetIdIndex::const_iterator lease = lower;
794 lease != upper; ++lease) {
797 if ((*lease)->subnet_id_ != cur_id) {
813 if (assigned_pds > 0) {
820 if (registered > 0) {
829 cur_id = (*lease)->subnet_id_;
834 switch((*lease)->type_) {
868 if (assigned_pds > 0) {
873 if (registered > 0) {
896 virtual void startSubnetPools() {
898 = storage6_.get<SubnetIdPoolIdIndexTag>();
901 Lease6StorageSubnetIdPoolIdIndex::const_iterator lower;
902 Lease6StorageSubnetIdPoolIdIndex::const_iterator upper;
914 if (lower == upper) {
922 uint32_t cur_pool_id = 0;
923 int64_t assigned = 0;
924 int64_t declined = 0;
925 int64_t assigned_pds = 0;
926 for (Lease6StorageSubnetIdPoolIdIndex::const_iterator lease = lower;
927 lease != upper; ++lease) {
930 if ((*lease)->pool_id_ != cur_pool_id) {
934 assigned, cur_pool_id));
941 declined, cur_pool_id));
945 if (assigned_pds > 0) {
948 assigned_pds, cur_pool_id));
953 cur_pool_id = (*lease)->pool_id_;
958 if ((*lease)->subnet_id_ != cur_id) {
963 assigned, cur_pool_id));
970 declined, cur_pool_id));
974 if (assigned_pds > 0) {
977 assigned_pds, cur_pool_id));
983 cur_id = (*lease)->subnet_id_;
991 switch((*lease)->type_) {
1022 if (assigned_pds > 0) {
1044 :
TrackingLeaseMgr(), lfc_setup_(), conn_(parameters), mutex_(new std::mutex) {
1045 bool conversion_needed =
false;
1051 std::string universe = conn_.getParameter(
"universe");
1052 if (universe ==
"4") {
1053 std::string file4 = initLeaseFilePath(
V4);
1054 if (!file4.empty()) {
1055 conversion_needed = loadLeasesFromFiles<
Lease4,
1062 std::string file6 = initLeaseFilePath(
V6);
1063 if (!file6.empty()) {
1064 conversion_needed = loadLeasesFromFiles<
Lease6,
1079 if (conversion_needed) {
1084 lfcSetup(conversion_needed);
1101 std::stringstream tmp;
1102 tmp <<
"Memfile backend ";
1105 }
else if (u ==
V6) {
1114 if (family == AF_INET6) {
1122Memfile_LeaseMgr::addLeaseInternal(
const Lease4Ptr& lease) {
1123 if (getLease4Internal(lease->addr_)) {
1135 storage4_.insert(lease);
1139 lease->updateCurrentExpirationTime();
1142 class_lease_counter_.
addLease(lease);
1158 std::lock_guard<std::mutex> lock(*mutex_);
1159 return (addLeaseInternal(lease));
1161 return (addLeaseInternal(lease));
1166Memfile_LeaseMgr::addLeaseInternal(
const Lease6Ptr& lease) {
1167 if (getLease6Internal(lease->type_, lease->addr_)) {
1180 storage6_.insert(lease);
1184 lease->updateCurrentExpirationTime();
1187 class_lease_counter_.
addLease(lease);
1207 std::lock_guard<std::mutex> lock(*mutex_);
1208 return (addLeaseInternal(lease));
1210 return (addLeaseInternal(lease));
1217 Lease4StorageAddressIndex::iterator l = idx.find(addr);
1218 if (l == idx.end()) {
1231 std::lock_guard<std::mutex> lock(*mutex_);
1232 return (getLease4Internal(addr));
1234 return (getLease4Internal(addr));
1239Memfile_LeaseMgr::getLease4Internal(
const HWAddr& hwaddr,
1245 std::pair<Lease4StorageHWAddressSubnetIdIndex::const_iterator,
1246 Lease4StorageHWAddressSubnetIdIndex::const_iterator> l
1247 = idx.equal_range(boost::make_tuple(hwaddr.
hwaddr_));
1249 BOOST_FOREACH(
auto const& lease, l) {
1261 std::lock_guard<std::mutex> lock(*mutex_);
1262 getLease4Internal(hwaddr, collection);
1264 getLease4Internal(hwaddr, collection);
1267 return (collection);
1271Memfile_LeaseMgr::getLease4Internal(
const HWAddr& hwaddr,
1277 Lease4StorageHWAddressSubnetIdIndex::const_iterator lease =
1278 idx.find(boost::make_tuple(hwaddr.
hwaddr_, subnet_id));
1280 if (lease == idx.end()) {
1285 return (
Lease4Ptr(
new Lease4(**lease)));
1296 std::lock_guard<std::mutex> lock(*mutex_);
1297 return (getLease4Internal(hwaddr, subnet_id));
1299 return (getLease4Internal(hwaddr, subnet_id));
1304Memfile_LeaseMgr::getLease4Internal(
const ClientId& client_id,
1310 std::pair<Lease4StorageClientIdSubnetIdIndex::const_iterator,
1311 Lease4StorageClientIdSubnetIdIndex::const_iterator> l
1312 = idx.equal_range(boost::make_tuple(client_id.
getClientId()));
1314 BOOST_FOREACH(
auto const& lease, l) {
1326 std::lock_guard<std::mutex> lock(*mutex_);
1327 getLease4Internal(client_id, collection);
1329 getLease4Internal(client_id, collection);
1332 return (collection);
1336Memfile_LeaseMgr::getLease4Internal(
const ClientId& client_id,
1342 Lease4StorageClientIdSubnetIdIndex::const_iterator lease =
1343 idx.find(boost::make_tuple(client_id.
getClientId(), subnet_id));
1345 if (lease == idx.end()) {
1349 return (
Lease4Ptr(
new Lease4(**lease)));
1357 .arg(client_id.
toText());
1360 std::lock_guard<std::mutex> lock(*mutex_);
1361 return (getLease4Internal(client_id, subnet_id));
1363 return (getLease4Internal(client_id, subnet_id));
1368Memfile_LeaseMgr::getLeases4Internal(
SubnetID subnet_id,
1371 std::pair<Lease4StorageSubnetIdIndex::const_iterator,
1372 Lease4StorageSubnetIdIndex::const_iterator> l =
1373 idx.equal_range(subnet_id);
1375 BOOST_FOREACH(
auto const& lease, l) {
1387 std::lock_guard<std::mutex> lock(*mutex_);
1388 getLeases4Internal(subnet_id, collection);
1390 getLeases4Internal(subnet_id, collection);
1393 return (collection);
1397Memfile_LeaseMgr::getLeases4Internal(
const std::string& hostname,
1400 std::pair<Lease4StorageHostnameIndex::const_iterator,
1401 Lease4StorageHostnameIndex::const_iterator> l =
1402 idx.equal_range(hostname);
1404 BOOST_FOREACH(
auto const& lease, l) {
1416 std::lock_guard<std::mutex> lock(*mutex_);
1417 getLeases4Internal(hostname, collection);
1419 getLeases4Internal(hostname, collection);
1422 return (collection);
1427 for (
auto const& lease : storage4_) {
1438 std::lock_guard<std::mutex> lock(*mutex_);
1439 getLeases4Internal(collection);
1441 getLeases4Internal(collection);
1444 return (collection);
1452 Lease4StorageAddressIndex::const_iterator lb = idx.lower_bound(lower_bound_address);
1455 if ((lb != idx.end()) && ((*lb)->addr_ == lower_bound_address)) {
1460 for (
auto lease = lb;
1461 (lease != idx.end()) &&
1462 (
static_cast<size_t>(std::distance(lb, lease)) < page_size.
page_size_);
1464 collection.push_back(
Lease4Ptr(
new Lease4(**lease)));
1472 if (!lower_bound_address.
isV4()) {
1474 "retrieving leases from the lease database, got "
1475 << lower_bound_address);
1480 .arg(lower_bound_address.
toText());
1484 std::lock_guard<std::mutex> lock(*mutex_);
1485 getLeases4Internal(lower_bound_address, page_size, collection);
1487 getLeases4Internal(lower_bound_address, page_size, collection);
1490 return (collection);
1494Memfile_LeaseMgr::getLease6Internal(
Lease::Type type,
1496 Lease6Storage::iterator l = storage6_.find(addr);
1497 if (l == storage6_.end() || !(*l) || ((*l)->type_ != type)) {
1505Memfile_LeaseMgr::getLease6Internal(
const HWAddr& hwaddr,
1508 storage6_.get<HWAddressIndexTag>();
1509 std::pair<Lease6StorageHWAddressIndex::const_iterator,
1510 Lease6StorageHWAddressIndex::const_iterator> l
1511 = idx.equal_range(hwaddr.hwaddr_);
1513 BOOST_FOREACH(
auto const& lease, l) {
1514 collection.push_back(
Lease6Ptr(
new Lease6(*lease)));
1525 std::lock_guard<std::mutex> lock(*mutex_);
1526 getLease6Internal(hwaddr, collection);
1528 getLease6Internal(hwaddr, collection);
1531 return (collection);
1536 Lease6Storage::iterator l = storage6_.find(addr);
1537 if (l == storage6_.end() || !(*l)) {
1553 std::lock_guard<std::mutex> lock(*mutex_);
1554 return (getLease6Internal(type, addr));
1556 return (getLease6Internal(type, addr));
1561Memfile_LeaseMgr::getLeases6Internal(
Lease::Type type,
1568 std::pair<Lease6StorageDuidIaidTypeIndex::const_iterator,
1569 Lease6StorageDuidIaidTypeIndex::const_iterator> l =
1570 idx.equal_range(boost::make_tuple(duid.
getDuid(), iaid, type));
1572 for (Lease6StorageDuidIaidTypeIndex::const_iterator lease =
1573 l.first; lease != l.second; ++lease) {
1581 uint32_t iaid)
const {
1590 std::lock_guard<std::mutex> lock(*mutex_);
1591 getLeases6Internal(type, duid, iaid, collection);
1593 getLeases6Internal(type, duid, iaid, collection);
1596 return (collection);
1600Memfile_LeaseMgr::getLeases6Internal(
Lease::Type type,
1608 std::pair<Lease6StorageDuidIaidTypeIndex::const_iterator,
1609 Lease6StorageDuidIaidTypeIndex::const_iterator> l =
1610 idx.equal_range(boost::make_tuple(duid.
getDuid(), iaid, type));
1612 for (Lease6StorageDuidIaidTypeIndex::const_iterator lease =
1613 l.first; lease != l.second; ++lease) {
1615 if ((*lease)->subnet_id_ == subnet_id) {
1635 std::lock_guard<std::mutex> lock(*mutex_);
1636 getLeases6Internal(type, duid, iaid, subnet_id, collection);
1638 getLeases6Internal(type, duid, iaid, subnet_id, collection);
1641 return (collection);
1645Memfile_LeaseMgr::getLeases6Internal(
SubnetID subnet_id,
1648 std::pair<Lease6StorageSubnetIdIndex::const_iterator,
1649 Lease6StorageSubnetIdIndex::const_iterator> l =
1650 idx.equal_range(subnet_id);
1652 BOOST_FOREACH(
auto const& lease, l) {
1664 std::lock_guard<std::mutex> lock(*mutex_);
1665 getLeases6Internal(subnet_id, collection);
1667 getLeases6Internal(subnet_id, collection);
1670 return (collection);
1674Memfile_LeaseMgr::getLeases6Internal(
const std::string& hostname,
1677 std::pair<Lease6StorageHostnameIndex::const_iterator,
1678 Lease6StorageHostnameIndex::const_iterator> l =
1679 idx.equal_range(hostname);
1681 BOOST_FOREACH(
auto const& lease, l) {
1693 std::lock_guard<std::mutex> lock(*mutex_);
1694 getLeases6Internal(hostname, collection);
1696 getLeases6Internal(hostname, collection);
1699 return (collection);
1704 for (
auto const& lease : storage6_) {
1715 std::lock_guard<std::mutex> lock(*mutex_);
1716 getLeases6Internal(collection);
1718 getLeases6Internal(collection);
1721 return (collection);
1725Memfile_LeaseMgr::getLeases6Internal(
const DUID& duid,
1728 std::pair<Lease6StorageDuidIndex::const_iterator,
1729 Lease6StorageDuidIndex::const_iterator> l =
1730 idx.equal_range(duid.
getDuid());
1732 BOOST_FOREACH(
auto const& lease, l) {
1744 std::lock_guard<std::mutex> lock(*mutex_);
1745 getLeases6Internal(duid, collection);
1747 getLeases6Internal(duid, collection);
1750 return (collection);
1758 Lease6StorageAddressIndex::const_iterator lb = idx.lower_bound(lower_bound_address);
1761 if ((lb != idx.end()) && ((*lb)->addr_ == lower_bound_address)) {
1766 for (
auto lease = lb;
1767 (lease != idx.end()) &&
1768 (
static_cast<size_t>(std::distance(lb, lease)) < page_size.
page_size_);
1770 collection.push_back(
Lease6Ptr(
new Lease6(**lease)));
1778 if (!lower_bound_address.
isV6()) {
1780 "retrieving leases from the lease database, got "
1781 << lower_bound_address);
1786 .arg(lower_bound_address.
toText());
1790 std::lock_guard<std::mutex> lock(*mutex_);
1791 getLeases6Internal(lower_bound_address, page_size, collection);
1793 getLeases6Internal(lower_bound_address, page_size, collection);
1796 return (collection);
1800Memfile_LeaseMgr::getLeases6Internal(
SubnetID subnet_id,
1805 Lease6StorageSubnetIdIndex::const_iterator lb =
1806 idx.lower_bound(boost::make_tuple(subnet_id, lower_bound_address));
1809 if ((lb != idx.end()) && ((*lb)->addr_ == lower_bound_address)) {
1814 for (
auto it = lb; it != idx.end(); ++it) {
1815 if ((*it)->subnet_id_ != subnet_id) {
1819 collection.push_back(
Lease6Ptr(
new Lease6(**it)));
1820 if (collection.size() >= page_size.
page_size_) {
1824 return (collection);
1834 .arg(lower_bound_address.
toText())
1838 if (!lower_bound_address.
isV6()) {
1840 "retrieving leases from the lease database, got "
1841 << lower_bound_address);
1845 std::lock_guard<std::mutex> lock(*mutex_);
1846 return (getLeases6Internal(subnet_id,
1847 lower_bound_address,
1850 return (getLeases6Internal(subnet_id,
1851 lower_bound_address,
1857Memfile_LeaseMgr::getExpiredLeases4Internal(
Lease4Collection& expired_leases,
1858 const size_t max_leases)
const {
1866 Lease4StorageExpirationIndex::const_iterator ub =
1867 index.upper_bound(boost::make_tuple(
false, time(0)));
1870 for (Lease4StorageExpirationIndex::const_iterator lease = index.begin();
1872 ((max_leases == 0) ||
1873 (
static_cast<size_t>(std::distance(index.begin(), lease)) < max_leases));
1881 const size_t max_leases)
const {
1886 std::lock_guard<std::mutex> lock(*mutex_);
1887 getExpiredLeases4Internal(expired_leases, max_leases);
1889 getExpiredLeases4Internal(expired_leases, max_leases);
1894Memfile_LeaseMgr::getExpiredLeases6Internal(
Lease6Collection& expired_leases,
1895 const size_t max_leases)
const {
1903 Lease6StorageExpirationIndex::const_iterator ub =
1904 index.upper_bound(boost::make_tuple(
false, time(0)));
1907 for (Lease6StorageExpirationIndex::const_iterator lease = index.begin();
1909 ((max_leases == 0) ||
1910 (
static_cast<size_t>(std::distance(index.begin(), lease)) < max_leases));
1918 const size_t max_leases)
const {
1923 std::lock_guard<std::mutex> lock(*mutex_);
1924 getExpiredLeases6Internal(expired_leases, max_leases);
1926 getExpiredLeases6Internal(expired_leases, max_leases);
1931Memfile_LeaseMgr::updateLease4Internal(
const Lease4Ptr& lease) {
1938 Lease4StorageAddressIndex::const_iterator lease_it = index.find(lease->addr_);
1939 if (lease_it == index.end()) {
1941 << lease->addr_ <<
" - no such lease");
1942 }
else if ((!persist) && (((*lease_it)->cltt_ != lease->current_cltt_) ||
1943 ((*lease_it)->valid_lft_ != lease->current_valid_lft_))) {
1946 isc_throw(NoSuchLease,
"unable to update lease for address " <<
1947 lease->addr_.toText() <<
" either because the lease does not exist, "
1948 "it has been deleted or it has changed in the database.");
1959 lease->updateCurrentExpirationTime();
1966 index.replace(lease_it,
Lease4Ptr(
new Lease4(*lease)));
1969 class_lease_counter_.updateLease(lease, old_lease);
1983 std::lock_guard<std::mutex> lock(*mutex_);
1984 updateLease4Internal(lease);
1986 updateLease4Internal(lease);
1991Memfile_LeaseMgr::updateLease6Internal(
const Lease6Ptr& lease) {
2002 Lease6StorageAddressIndex::const_iterator lease_it = index.find(lease->addr_);
2003 if (lease_it == index.end()) {
2005 << lease->addr_ <<
" - no such lease");
2006 }
else if ((!persist) && (((*lease_it)->cltt_ != lease->current_cltt_) ||
2007 ((*lease_it)->valid_lft_ != lease->current_valid_lft_))) {
2010 isc_throw(NoSuchLease,
"unable to update lease for address " <<
2011 lease->addr_.toText() <<
" either because the lease does not exist, "
2012 "it has been deleted or it has changed in the database.");
2023 lease->updateCurrentExpirationTime();
2030 index.replace(lease_it,
Lease6Ptr(
new Lease6(*lease)));
2033 class_lease_counter_.updateLease(lease, old_lease);
2037 switch (recorded_action) {
2064 std::lock_guard<std::mutex> lock(*mutex_);
2065 updateLease6Internal(lease);
2067 updateLease6Internal(lease);
2072Memfile_LeaseMgr::deleteLeaseInternal(
const Lease4Ptr& lease) {
2074 Lease4Storage::iterator l = storage4_.find(addr);
2075 if (l == storage4_.end()) {
2082 Lease4 lease_copy = **l;
2085 lease_copy.valid_lft_ = 0;
2090 if (((*l)->cltt_ != lease->current_cltt_) ||
2091 ((*l)->valid_lft_ != lease->current_valid_lft_)) {
2099 class_lease_counter_.removeLease(lease);
2116 std::lock_guard<std::mutex> lock(*mutex_);
2117 return (deleteLeaseInternal(lease));
2119 return (deleteLeaseInternal(lease));
2124Memfile_LeaseMgr::deleteLeaseInternal(
const Lease6Ptr& lease) {
2128 Lease6Storage::iterator l = storage6_.find(addr);
2129 if (l == storage6_.end()) {
2136 Lease6 lease_copy = **l;
2138 lease_copy.valid_lft_ = 0;
2139 lease_copy.preferred_lft_ = 0;
2144 if (((*l)->cltt_ != lease->current_cltt_) ||
2145 ((*l)->valid_lft_ != lease->current_valid_lft_)) {
2153 class_lease_counter_.removeLease(lease);
2175 std::lock_guard<std::mutex> lock(*mutex_);
2176 return (deleteLeaseInternal(lease));
2178 return (deleteLeaseInternal(lease));
2189 std::lock_guard<std::mutex> lock(*mutex_);
2190 return (deleteExpiredReclaimedLeases<
2194 return (deleteExpiredReclaimedLeases<
2207 std::lock_guard<std::mutex> lock(*mutex_);
2208 return (deleteExpiredReclaimedLeases<
2212 return (deleteExpiredReclaimedLeases<
2218template<
typename IndexType,
typename LeaseType,
typename StorageType,
2219 typename LeaseFileType>
2221Memfile_LeaseMgr::deleteExpiredReclaimedLeases(
const uint32_t secs,
2222 const Universe& universe,
2223 StorageType& storage,
2224 LeaseFileType& lease_file) {
2237 typename IndexType::const_iterator upper_limit =
2238 index.upper_bound(boost::make_tuple(
true, time(0) - secs));
2247 typename IndexType::const_iterator lower_limit =
2248 index.upper_bound(boost::make_tuple(
true, std::numeric_limits<int64_t>::min()));
2251 uint64_t num_leases =
static_cast<uint64_t
>(std::distance(lower_limit, upper_limit));
2252 if (num_leases > 0) {
2262 for (
typename IndexType::const_iterator lease = lower_limit;
2263 lease != upper_limit; ++lease) {
2265 LeaseType lease_copy(**lease);
2268 lease_copy.valid_lft_ = 0;
2269 lease_file->append(lease_copy);
2274 index.erase(lower_limit, upper_limit);
2278 return (num_leases);
2283 return (std::string(
"In memory database with leases stored in a CSV file."));
2286std::pair<uint32_t, uint32_t>
2288 std::string
const& universe(conn_.getParameter(
"universe"));
2289 if (universe ==
"4") {
2291 }
else if (universe ==
"6") {
2310 std::string lease_file(file_name);
2311 if (lease_file.empty()) {
2321 std::string file_name;
2329 if (file_name.empty()) {
2341 std::string name(file_name);
2342 switch (file_type) {
2353 name +=
".completed";
2368 std::string filename ) {
2369 std::ostringstream s;;
2371 if (filename.empty()) {
2373 s << (u ==
V4 ?
"4" :
"6");
2376 s <<
"/" << filename;
2404Memfile_LeaseMgr::initLeaseFilePath(Universe u) {
2405 std::string persist_val;
2411 persist_val =
"true";
2415 if (persist_val ==
"false") {
2418 }
else if (persist_val !=
"true") {
2419 isc_throw(isc::BadValue,
"invalid value 'persist="
2420 << persist_val <<
"'");
2423 std::string lease_file;
2425 lease_file = conn_.getParameter(
"name");
2426 }
catch (
const Exception&) {
2433 }
catch (
const SecurityWarn& ex) {
2438 return (lease_file);
2441template<
typename LeaseObjectType,
typename LeaseFileType,
typename StorageType>
2443Memfile_LeaseMgr::loadLeasesFromFiles(Universe u,
const std::string& filename,
2444 boost::shared_ptr<LeaseFileType>& lease_file,
2445 StorageType& storage) {
2453 isc_throw(DbOpenError,
"unable to load leases from files while the "
2454 "lease file cleanup is in progress");
2459 std::string max_row_errors_str =
"0";
2461 max_row_errors_str = conn_.getParameter(
"max-row-errors");
2462 }
catch (
const std::exception&) {
2466 int64_t max_row_errors64;
2468 max_row_errors64 = boost::lexical_cast<int64_t>(max_row_errors_str);
2469 }
catch (
const boost::bad_lexical_cast&) {
2470 isc_throw(isc::BadValue,
"invalid value of the max-row-errors "
2471 << max_row_errors_str <<
" specified");
2473 if ((max_row_errors64 < 0) ||
2474 (max_row_errors64 > std::numeric_limits<uint32_t>::max())) {
2475 isc_throw(isc::BadValue,
"invalid value of the max-row-errors "
2476 << max_row_errors_str <<
" specified");
2478 uint32_t max_row_errors =
static_cast<uint32_t
>(max_row_errors64);
2481 bool conversion_needed =
false;
2482 lease_file.reset(
new LeaseFileType(std::string(filename +
".completed")));
2483 if (lease_file->exists()) {
2486 conversion_needed = conversion_needed || lease_file->needsConversion();
2491 if (lease_file->exists()) {
2494 conversion_needed = conversion_needed || lease_file->needsConversion();
2498 if (lease_file->exists()) {
2501 conversion_needed = conversion_needed || lease_file->needsConversion();
2511 lease_file.reset(
new LeaseFileType(filename));
2513 max_row_errors,
false);
2514 conversion_needed = conversion_needed || lease_file->needsConversion();
2516 return (conversion_needed);
2521 return (lfc_setup_->isRunning());
2526 return (lfc_setup_->getExitStatus());
2531 return (lfc_setup_->getLastPid());
2547Memfile_LeaseMgr::lfcSetup(
bool conversion_needed) {
2548 std::string lfc_interval_str =
"3600";
2551 }
catch (
const std::exception&) {
2555 uint32_t lfc_interval = 0;
2557 lfc_interval = boost::lexical_cast<uint32_t>(lfc_interval_str);
2558 }
catch (
const boost::bad_lexical_cast&) {
2559 isc_throw(isc::BadValue,
"invalid value of the lfc-interval "
2560 << lfc_interval_str <<
" specified");
2567template<
typename LeaseFileType>
2569Memfile_LeaseMgr::lfcExecute(boost::shared_ptr<LeaseFileType>& lease_file) {
2581 if (!lease_file_finish.exists() && !lease_file_copy.exists()) {
2583 lease_file->close();
2586 do_lfc = (rename(lease_file->getFilename().c_str(),
2587 lease_file_copy.getFilename().c_str()) == 0);
2591 .arg(lease_file->getFilename())
2592 .arg(lease_file_copy.getFilename())
2593 .arg(strerror(errno));
2602 lease_file->open(
true);
2604 }
catch (
const CSVFileError& ex) {
2615 .arg(lease_file->getFilename())
2626 lfc_setup_->execute(lease_file->getFilename());
2633 std::ostringstream msg;
2634 msg <<
"'persist' parameter of 'memfile' lease backend "
2635 <<
"was configured to 'false'";
2652 if (new_pid == -1) {
2654 }
else if (new_pid != previous_pid) {
2665 std::lock_guard<std::mutex> lock(*mutex_);
2678 std::lock_guard<std::mutex> lock(*mutex_);
2691 std::lock_guard<std::mutex> lock(*mutex_);
2706 std::lock_guard<std::mutex> lock(*mutex_);
2719 std::lock_guard<std::mutex> lock(*mutex_);
2732 std::lock_guard<std::mutex> lock(*mutex_);
2745 std::lock_guard<std::mutex> lock(*mutex_);
2760 std::lock_guard<std::mutex> lock(*mutex_);
2778 std::pair<Lease4StorageSubnetIdIndex::const_iterator,
2779 Lease4StorageSubnetIdIndex::const_iterator> r =
2780 idx.equal_range(subnet_id);
2784 BOOST_FOREACH(
auto const& lease, r) {
2785 leases.push_back(lease);
2788 size_t num = leases.size();
2789 for (
auto const& l : leases) {
2793 .arg(subnet_id).arg(num);
2807 std::pair<Lease6StorageSubnetIdIndex::const_iterator,
2808 Lease6StorageSubnetIdIndex::const_iterator> r =
2809 idx.equal_range(subnet_id);
2813 BOOST_FOREACH(
auto const& lease, r) {
2814 leases.push_back(lease);
2817 size_t num = leases.size();
2818 for (
auto const& l : leases) {
2822 .arg(subnet_id).arg(num);
2829 class_lease_counter_.clear();
2830 for (
auto const& lease : storage4_) {
2833 class_lease_counter_.addLease(lease);
2840 class_lease_counter_.clear();
2841 for (
auto const& lease : storage6_) {
2844 class_lease_counter_.addLease(lease);
2853 std::lock_guard<std::mutex> lock(*mutex_);
2854 return(class_lease_counter_.getClassCount(client_class, ltype));
2856 return(class_lease_counter_.getClassCount(client_class, ltype));
2862 return(class_lease_counter_.clear());
2867 if (!user_context) {
2880 for (
unsigned i = 0; i < classes->size(); ++i) {
2889 std::string name = name_elem->stringValue();
2900 size_t lease_count = 0;
2906 if (lease_count >= limit) {
2907 std::ostringstream ss;
2908 ss <<
"address limit " << limit <<
" for client class \""
2909 << name <<
"\", current lease count " << lease_count;
2925 SubnetID subnet_id = id_elem->intValue();
2932 int64_t lease_count = 0;
2934 lease_count = getSubnetStat(subnet_id,
"assigned-addresses");
2938 if (
static_cast<uint64_t
>(lease_count) >= limit) {
2939 std::ostringstream ss;
2940 ss <<
"address limit " << limit <<
" for subnet ID " << subnet_id
2941 <<
", current lease count " << lease_count;
2953 if (!user_context) {
2967 for (
unsigned i = 0; i < classes->size(); ++i) {
2976 std::string name = name_elem->stringValue();
2981 if (!getLeaseLimit(class_elem, ltype, limit)) {
2983 if (!getLeaseLimit(class_elem, ltype, limit)) {
2991 size_t lease_count = 0;
2997 if (lease_count >= limit) {
2998 std::ostringstream ss;
3000 <<
" limit " << limit <<
" for client class \""
3001 << name <<
"\", current lease count " << lease_count;
3017 SubnetID subnet_id = id_elem->intValue();
3022 if (!getLeaseLimit(subnet_elem, ltype, limit)) {
3024 if (!getLeaseLimit(subnet_elem, ltype, limit)) {
3032 int64_t lease_count = 0;
3034 lease_count = getSubnetStat(subnet_id, (ltype ==
Lease::TYPE_NA ?
3035 "assigned-nas" :
"assigned-pds"));
3039 if (
static_cast<uint64_t
>(lease_count) >= limit) {
3040 std::ostringstream ss;
3042 <<
" limit " << limit <<
" for subnet ID " << subnet_id
3043 <<
", current lease count " << lease_count;
3058Memfile_LeaseMgr::getSubnetStat(
const SubnetID& subnet_id,
const std::string& stat_label)
const {
3064 if (samples && samples->size()) {
3065 auto sample = samples->get(0);
3066 if (sample->size()) {
3067 auto count_elem = sample->get(0);
3068 return (count_elem->intValue());
3078 "prefix-limit" :
"address-limit");
3080 limit = limit_elem->intValue();
3091 std::stringstream tmp;
3094 for (
auto const& it :
id) {
3098 tmp << std::setw(2) << std::setfill(
'0')
3099 <<
static_cast<unsigned int>(it);
3111 const time_t& qry_start_time ,
3112 const time_t& qry_end_time ) {
3116 .arg(lower_bound_address.
toText())
3117 .arg(idToText(relay_id))
3118 .arg(qry_start_time)
3122 if (!lower_bound_address.
isV4()) {
3124 "retrieving leases from the lease database, got "
3125 << lower_bound_address);
3129 if ((qry_start_time < 0) || (qry_end_time < 0)) {
3134 if ((qry_start_time > 0) && (qry_end_time > 0) &&
3135 (qry_start_time > qry_end_time)) {
3140 std::lock_guard<std::mutex> lock(*mutex_);
3141 return (getLeases4ByRelayIdInternal(relay_id,
3142 lower_bound_address,
3147 return (getLeases4ByRelayIdInternal(relay_id,
3148 lower_bound_address,
3156Memfile_LeaseMgr::getLeases4ByRelayIdInternal(
const OptionBuffer& relay_id,
3159 const time_t& qry_start_time,
3160 const time_t& qry_end_time) {
3163 Lease4StorageRelayIdIndex::const_iterator lb =
3164 idx.lower_bound(boost::make_tuple(relay_id, lower_bound_address));
3166 IOAddress last_addr = lower_bound_address;
3167 for (; lb != idx.end(); ++lb) {
3168 if ((*lb)->addr_ == last_addr) {
3172 if ((*lb)->relay_id_ != relay_id) {
3176 last_addr = (*lb)->addr_;
3177 if ((qry_start_time > 0) && ((*lb)->cltt_ < qry_start_time)) {
3181 if ((qry_end_time > 0) && ((*lb)->cltt_ > qry_end_time)) {
3185 collection.push_back(
Lease4Ptr(
new Lease4(**lb)));
3186 if (collection.size() >= page_size.
page_size_) {
3190 return (collection);
3197 const time_t& qry_start_time ,
3198 const time_t& qry_end_time ) {
3202 .arg(lower_bound_address.
toText())
3203 .arg(idToText(remote_id))
3204 .arg(qry_start_time)
3208 if (!lower_bound_address.
isV4()) {
3210 "retrieving leases from the lease database, got "
3211 << lower_bound_address);
3215 if ((qry_start_time < 0) || (qry_end_time < 0)) {
3220 if ((qry_start_time > 0) && (qry_end_time > 0) &&
3221 (qry_start_time > qry_end_time)) {
3226 std::lock_guard<std::mutex> lock(*mutex_);
3227 return (getLeases4ByRemoteIdInternal(remote_id,
3228 lower_bound_address,
3233 return (getLeases4ByRemoteIdInternal(remote_id,
3234 lower_bound_address,
3242Memfile_LeaseMgr::getLeases4ByRemoteIdInternal(
const OptionBuffer& remote_id,
3245 const time_t& qry_start_time,
3246 const time_t& qry_end_time) {
3248 std::map<IOAddress, Lease4Ptr> sorted;
3252 BOOST_FOREACH(
auto const& it, er) {
3254 if (addr <= lower_bound_address) {
3258 if ((qry_start_time > 0) && (it->cltt_ < qry_start_time)) {
3262 if ((qry_end_time > 0) && (it->cltt_ > qry_end_time)) {
3270 for (
auto const& it : sorted) {
3271 collection.push_back(
Lease4Ptr(
new Lease4(*it.second)));
3272 if (collection.size() >= page_size.
page_size_) {
3276 return (collection);
3282 std::lock_guard<std::mutex> lock(*mutex_);
3308 .arg(lower_bound_address.
toText())
3312 if (!lower_bound_address.
isV6()) {
3314 "retrieving leases from the lease database, got "
3315 << lower_bound_address);
3319 std::lock_guard<std::mutex> lock(*mutex_);
3320 return (getLeases6ByRelayIdInternal(relay_id,
3321 lower_bound_address,
3324 return (getLeases6ByRelayIdInternal(relay_id,
3325 lower_bound_address,
3331Memfile_LeaseMgr::getLeases6ByRelayIdInternal(
const DUID& relay_id,
3334 const std::vector<uint8_t>& relay_id_data = relay_id.
getDuid();
3337 RelayIdIndex::const_iterator lb =
3338 idx.lower_bound(boost::make_tuple(relay_id_data, lower_bound_address));
3341 IOAddress last_addr = lower_bound_address;
3342 for (; lb != idx.end(); ++lb) {
3343 if ((*lb)->lease_addr_ == last_addr) {
3347 if ((*lb)->id_ != relay_id_data) {
3351 last_addr = (*lb)->lease_addr_;
3352 Lease6Ptr lease = getAnyLease6Internal(last_addr);
3354 collection.push_back(lease);
3355 if (collection.size() >= page_size.
page_size_) {
3360 return (collection);
3370 .arg(lower_bound_address.
toText())
3371 .arg(idToText(remote_id));
3374 if (!lower_bound_address.
isV6()) {
3376 "retrieving leases from the lease database, got "
3377 << lower_bound_address);
3381 std::lock_guard<std::mutex> lock(*mutex_);
3382 return (getLeases6ByRemoteIdInternal(remote_id,
3383 lower_bound_address,
3386 return (getLeases6ByRemoteIdInternal(remote_id,
3387 lower_bound_address,
3393Memfile_LeaseMgr::getLeases6ByRemoteIdInternal(
const OptionBuffer& remote_id,
3397 std::set<IOAddress> sorted;
3401 BOOST_FOREACH(
auto const& it, er) {
3402 const IOAddress& addr = it->lease_addr_;
3403 if (addr <= lower_bound_address) {
3406 static_cast<void>(sorted.insert(addr));
3411 Lease6Ptr lease = getAnyLease6Internal(addr);
3413 collection.push_back(lease);
3414 if (collection.size() >= page_size.
page_size_) {
3419 return (collection);
3432 <<
" consistency configuration is null");
3434 auto check = cfg->getExtendedInfoSanityCheck();
3439 .arg(update ?
" updating in file" :
"");
3442 size_t modified = 0;
3444 size_t processed = 0;
3446 auto lease_it = index.begin();
3447 auto next_it = index.end();
3449 for (; lease_it != index.end(); lease_it = next_it) {
3450 next_it = std::next(lease_it);
3465 if (!
copy->relay_id_.empty() || !
copy->remote_id_.empty()) {
3466 index.replace(lease_it,
copy);
3469 }
catch (
const std::exception& ex) {
3472 .arg(lease->addr_.toText())
3497 auto check = cfg->getExtendedInfoSanityCheck();
3503 .arg(enabled ?
"enabled" :
"disabled");
3512 size_t modified = 0;
3513 size_t processed = 0;
3515 for (
auto const& lease : storage6_) {
3524 }
catch (
const std::exception& ex) {
3527 .arg(lease->addr_.toText())
3547 static_cast<void>(relay_id_idx.erase(addr));
3550 static_cast<void>(remote_id_idx.erase(addr));
3555 const std::vector<uint8_t>& relay_id) {
3563 const std::vector<uint8_t>& remote_id) {
3572 std::lock_guard<std::mutex> lock(*mutex_);
3573 writeLeases4Internal(filename);
3575 writeLeases4Internal(filename);
3580Memfile_LeaseMgr::writeLeases4Internal(
const std::string& filename) {
3586 std::ostringstream old;
3587 old << filename <<
".bak" << getpid();
3588 ::rename(filename.c_str(), old.str().c_str());
3589 CSVLeaseFile4 backup(filename);
3591 for (
auto const& lease : storage4_) {
3592 backup.append(*lease);
3598 }
catch (
const std::exception&) {
3609 std::lock_guard<std::mutex> lock(*mutex_);
3610 writeLeases6Internal(filename);
3612 writeLeases6Internal(filename);
3617Memfile_LeaseMgr::writeLeases6Internal(
const std::string& filename) {
3623 std::ostringstream old;
3624 old << filename <<
".bak" << getpid();
3625 ::rename(filename.c_str(), old.str().c_str());
3626 CSVLeaseFile6 backup(filename);
3628 for (
auto const& lease : storage6_) {
3629 backup.append(*lease);
3635 }
catch (
const std::exception&) {
3649 }
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())
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.
static std::string redactedAccessString(const ParameterMap ¶meters)
Redact database access string.
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 DHDP 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.
void addLease(LeasePtr lease)
Increment the counts for all of a lease's classes by one.
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.
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.
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.
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
void prettyPrint(ConstElementPtr element, std::ostream &out, unsigned indent, unsigned step)
Pretty prints the data into stream.
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.
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_ > > > > > Lease4Storage
A multi index container holding DHCPv4 leases.
const isc::log::MessageID DHCPSRV_MEMFILE_GET_SUBID_HWADDR
const isc::log::MessageID DHCPSRV_MEMFILE_WIPE_LEASES6
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 > > > > Lease6Storage
A multi index container holding DHCPv6 leases.
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
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
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.
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.
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 const uint32_t STATE_DEFAULT
A lease in the default state.
static const uint32_t STATE_DECLINED
Declined 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 const uint32_t STATE_REGISTERED
Registered self-generated lease.
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).