37const char* KEA_LFC_EXECUTABLE_ENV_NAME =
"KEA_LFC_EXECUTABLE";
92 void setup(
const uint32_t lfc_interval,
93 const boost::shared_ptr<CSVLeaseFile4>& lease_file4,
94 const boost::shared_ptr<CSVLeaseFile6>& lease_file6,
95 bool run_once_now =
false);
112 boost::scoped_ptr<ProcessSpawn> process_;
128 : process_(), callback_(callback), pid_(0),
144 timer_mgr_->unregisterTimer(
"memfile-lfc");
146 }
catch (
const std::exception& ex) {
157 const boost::shared_ptr<CSVLeaseFile4>& lease_file4,
158 const boost::shared_ptr<CSVLeaseFile6>& lease_file6,
162 if (lfc_interval == 0 && !run_once_now) {
167 std::string executable;
168 char* c_executable = getenv(KEA_LFC_EXECUTABLE_ENV_NAME);
169 if (c_executable == NULL) {
170 executable = KEA_LFC_EXECUTABLE;
172 executable = c_executable;
176 std::string lease_file = lease_file4 ? lease_file4->getFilename() :
177 lease_file6->getFilename();
182 args.push_back(lease_file4 ?
"-4" :
"-6");
185 args.push_back(
"-x");
189 args.push_back(
"-i");
193 args.push_back(
"-o");
197 args.push_back(
"-f");
201 args.push_back(
"-p");
206 args.push_back(
"-c");
207 args.push_back(
"ignored-path");
218 if (lfc_interval > 0) {
225 timer_mgr_->registerTimer(
"memfile-lfc", callback_, lfc_interval * 1000,
227 timer_mgr_->setup(
"memfile-lfc");
235 .arg(process_->getCommandLine());
236 pid_ = process_->spawn();
245 return (process_ && process_->isRunning(pid_));
252 " the process is NULL");
254 return (process_->getExitStatus(pid_));
311 return (
rows_.size());
380 Lease4StorageSubnetIdIndex::const_iterator lower;
381 Lease4StorageSubnetIdIndex::const_iterator upper;
400 if (lower == upper) {
408 int64_t assigned = 0;
409 int64_t declined = 0;
410 for (Lease4StorageSubnetIdIndex::const_iterator lease = lower;
411 lease != upper; ++lease) {
414 if ((*lease)->subnet_id_ != cur_id) {
432 cur_id = (*lease)->subnet_id_;
522 Lease6StorageSubnetIdIndex::const_iterator lower;
523 Lease6StorageSubnetIdIndex::const_iterator upper;
542 if (lower == upper) {
550 int64_t assigned = 0;
551 int64_t declined = 0;
552 int64_t assigned_pds = 0;
553 for (Lease6StorageSubnetIdIndex::const_iterator lease = lower;
554 lease != upper; ++lease) {
557 if ((*lease)->subnet_id_ != cur_id) {
573 if (assigned_pds > 0) {
582 cur_id = (*lease)->subnet_id_;
587 switch((*lease)->type_) {
616 if (assigned_pds > 0) {
638 :
LeaseMgr(), lfc_setup_(), conn_(parameters), mutex_(new std::mutex) {
639 bool conversion_needed =
false;
643 if (universe ==
"4") {
644 std::string file4 = initLeaseFilePath(
V4);
645 if (!file4.empty()) {
646 conversion_needed = loadLeasesFromFiles<
Lease4,
652 std::string file6 = initLeaseFilePath(
V6);
653 if (!file6.empty()) {
654 conversion_needed = loadLeasesFromFiles<
Lease6,
668 if (conversion_needed) {
673 lfcSetup(conversion_needed);
679 lease_file4_->close();
680 lease_file4_.reset();
683 lease_file6_->close();
684 lease_file6_.reset();
690 std::stringstream tmp;
691 tmp <<
"Memfile backend ";
694 }
else if (u ==
V6) {
701Memfile_LeaseMgr::addLeaseInternal(
const Lease4Ptr& lease) {
702 if (getLease4Internal(lease->addr_)) {
711 lease_file4_->append(*lease);
714 storage4_.insert(lease);
718 lease->updateCurrentExpirationTime();
721 class_lease_counter_.
addLease(lease);
731 if (MultiThreadingMgr::instance().getMode()) {
732 std::lock_guard<std::mutex> lock(*mutex_);
733 return (addLeaseInternal(lease));
735 return (addLeaseInternal(lease));
740Memfile_LeaseMgr::addLeaseInternal(
const Lease6Ptr& lease) {
741 if (getLease6Internal(lease->type_, lease->addr_)) {
750 lease_file6_->append(*lease);
753 storage6_.insert(lease);
757 lease->updateCurrentExpirationTime();
760 class_lease_counter_.
addLease(lease);
770 if (MultiThreadingMgr::instance().getMode()) {
771 std::lock_guard<std::mutex> lock(*mutex_);
772 return (addLeaseInternal(lease));
774 return (addLeaseInternal(lease));
781 Lease4StorageAddressIndex::iterator l = idx.find(addr);
782 if (l == idx.end()) {
794 if (MultiThreadingMgr::instance().getMode()) {
795 std::lock_guard<std::mutex> lock(*mutex_);
796 return (getLease4Internal(addr));
798 return (getLease4Internal(addr));
803Memfile_LeaseMgr::getLease4Internal(
const HWAddr& hwaddr,
809 std::pair<Lease4StorageHWAddressSubnetIdIndex::const_iterator,
810 Lease4StorageHWAddressSubnetIdIndex::const_iterator> l
811 = idx.equal_range(boost::make_tuple(hwaddr.
hwaddr_));
813 for (
auto lease = l.first; lease != l.second; ++lease) {
824 if (MultiThreadingMgr::instance().getMode()) {
825 std::lock_guard<std::mutex> lock(*mutex_);
826 getLease4Internal(hwaddr, collection);
828 getLease4Internal(hwaddr, collection);
835Memfile_LeaseMgr::getLease4Internal(
const HWAddr& hwaddr,
841 Lease4StorageHWAddressSubnetIdIndex::const_iterator lease =
842 idx.find(boost::make_tuple(hwaddr.
hwaddr_, subnet_id));
844 if (lease == idx.end()) {
859 if (MultiThreadingMgr::instance().getMode()) {
860 std::lock_guard<std::mutex> lock(*mutex_);
861 return (getLease4Internal(hwaddr, subnet_id));
863 return (getLease4Internal(hwaddr, subnet_id));
868Memfile_LeaseMgr::getLease4Internal(
const ClientId& client_id,
874 std::pair<Lease4StorageClientIdSubnetIdIndex::const_iterator,
875 Lease4StorageClientIdSubnetIdIndex::const_iterator> l
876 = idx.equal_range(boost::make_tuple(client_id.
getClientId()));
878 for (
auto lease = l.first; lease != l.second; ++lease) {
889 if (MultiThreadingMgr::instance().getMode()) {
890 std::lock_guard<std::mutex> lock(*mutex_);
891 getLease4Internal(client_id, collection);
893 getLease4Internal(client_id, collection);
900Memfile_LeaseMgr::getLease4Internal(
const ClientId& client_id,
906 Lease4StorageClientIdSubnetIdIndex::const_iterator lease =
907 idx.find(boost::make_tuple(client_id.
getClientId(), subnet_id));
909 if (lease == idx.end()) {
923 if (MultiThreadingMgr::instance().getMode()) {
924 std::lock_guard<std::mutex> lock(*mutex_);
925 return (getLease4Internal(client_id, subnet_id));
927 return (getLease4Internal(client_id, subnet_id));
932Memfile_LeaseMgr::getLeases4Internal(
SubnetID subnet_id,
935 std::pair<Lease4StorageSubnetIdIndex::const_iterator,
936 Lease4StorageSubnetIdIndex::const_iterator> l =
937 idx.equal_range(subnet_id);
939 for (
auto lease = l.first; lease != l.second; ++lease) {
950 if (MultiThreadingMgr::instance().getMode()) {
951 std::lock_guard<std::mutex> lock(*mutex_);
952 getLeases4Internal(subnet_id, collection);
954 getLeases4Internal(subnet_id, collection);
961Memfile_LeaseMgr::getLeases4Internal(
const std::string& hostname,
964 std::pair<Lease4StorageHostnameIndex::const_iterator,
965 Lease4StorageHostnameIndex::const_iterator> l =
966 idx.equal_range(hostname);
968 for (
auto lease = l.first; lease != l.second; ++lease) {
979 if (MultiThreadingMgr::instance().getMode()) {
980 std::lock_guard<std::mutex> lock(*mutex_);
981 getLeases4Internal(hostname, collection);
983 getLeases4Internal(hostname, collection);
991 for (
auto lease = storage4_.begin(); lease != storage4_.end(); ++lease) {
1001 if (MultiThreadingMgr::instance().getMode()) {
1002 std::lock_guard<std::mutex> lock(*mutex_);
1003 getLeases4Internal(collection);
1005 getLeases4Internal(collection);
1008 return (collection);
1016 Lease4StorageAddressIndex::const_iterator lb = idx.lower_bound(lower_bound_address);
1019 if ((lb != idx.end()) && ((*lb)->addr_ == lower_bound_address)) {
1024 for (
auto lease = lb;
1025 (lease != idx.end()) && (std::distance(lb, lease) < page_size.
page_size_);
1027 collection.push_back(
Lease4Ptr(
new Lease4(**lease)));
1035 if (!lower_bound_address.
isV4()) {
1037 "retrieving leases from the lease database, got "
1038 << lower_bound_address);
1043 .arg(lower_bound_address.
toText());
1046 if (MultiThreadingMgr::instance().getMode()) {
1047 std::lock_guard<std::mutex> lock(*mutex_);
1048 getLeases4Internal(lower_bound_address, page_size, collection);
1050 getLeases4Internal(lower_bound_address, page_size, collection);
1053 return (collection);
1057Memfile_LeaseMgr::getLease6Internal(
Lease::Type type,
1059 Lease6Storage::iterator l = storage6_.find(addr);
1060 if (l == storage6_.end() || !(*l) || ((*l)->type_ != type)) {
1075 if (MultiThreadingMgr::instance().getMode()) {
1076 std::lock_guard<std::mutex> lock(*mutex_);
1077 return (getLease6Internal(type, addr));
1079 return (getLease6Internal(type, addr));
1084Memfile_LeaseMgr::getLeases6Internal(
Lease::Type type,
1091 std::pair<Lease6StorageDuidIaidTypeIndex::const_iterator,
1092 Lease6StorageDuidIaidTypeIndex::const_iterator> l =
1093 idx.equal_range(boost::make_tuple(duid.
getDuid(), iaid, type));
1095 for (Lease6StorageDuidIaidTypeIndex::const_iterator lease =
1096 l.first; lease != l.second; ++lease) {
1104 uint32_t iaid)
const {
1112 if (MultiThreadingMgr::instance().getMode()) {
1113 std::lock_guard<std::mutex> lock(*mutex_);
1114 getLeases6Internal(type, duid, iaid, collection);
1116 getLeases6Internal(type, duid, iaid, collection);
1119 return (collection);
1123Memfile_LeaseMgr::getLeases6Internal(
Lease::Type type,
1131 std::pair<Lease6StorageDuidIaidTypeIndex::const_iterator,
1132 Lease6StorageDuidIaidTypeIndex::const_iterator> l =
1133 idx.equal_range(boost::make_tuple(duid.
getDuid(), iaid, type));
1135 for (Lease6StorageDuidIaidTypeIndex::const_iterator lease =
1136 l.first; lease != l.second; ++lease) {
1138 if ((*lease)->subnet_id_ == subnet_id) {
1157 if (MultiThreadingMgr::instance().getMode()) {
1158 std::lock_guard<std::mutex> lock(*mutex_);
1159 getLeases6Internal(type, duid, iaid, subnet_id, collection);
1161 getLeases6Internal(type, duid, iaid, subnet_id, collection);
1164 return (collection);
1168Memfile_LeaseMgr::getLeases6Internal(
SubnetID subnet_id,
1171 std::pair<Lease6StorageSubnetIdIndex::const_iterator,
1172 Lease6StorageSubnetIdIndex::const_iterator> l =
1173 idx.equal_range(subnet_id);
1175 for (
auto lease = l.first; lease != l.second; ++lease) {
1186 if (MultiThreadingMgr::instance().getMode()) {
1187 std::lock_guard<std::mutex> lock(*mutex_);
1188 getLeases6Internal(subnet_id, collection);
1190 getLeases6Internal(subnet_id, collection);
1193 return (collection);
1197Memfile_LeaseMgr::getLeases6Internal(
const std::string& hostname,
1200 std::pair<Lease6StorageHostnameIndex::const_iterator,
1201 Lease6StorageHostnameIndex::const_iterator> l =
1202 idx.equal_range(hostname);
1204 for (
auto lease = l.first; lease != l.second; ++lease) {
1215 if (MultiThreadingMgr::instance().getMode()) {
1216 std::lock_guard<std::mutex> lock(*mutex_);
1217 getLeases6Internal(hostname, collection);
1219 getLeases6Internal(hostname, collection);
1222 return (collection);
1227 for (
auto lease = storage6_.begin(); lease != storage6_.end(); ++lease) {
1237 if (MultiThreadingMgr::instance().getMode()) {
1238 std::lock_guard<std::mutex> lock(*mutex_);
1239 getLeases6Internal(collection);
1241 getLeases6Internal(collection);
1244 return (collection);
1248Memfile_LeaseMgr::getLeases6Internal(
const DUID& duid,
1251 std::pair<Lease6StorageDuidIndex::const_iterator,
1252 Lease6StorageDuidIndex::const_iterator> l =
1253 idx.equal_range(duid.
getDuid());
1255 for (
auto lease = l.first; lease != l.second; ++lease) {
1266 if (MultiThreadingMgr::instance().getMode()) {
1267 std::lock_guard<std::mutex> lock(*mutex_);
1268 getLeases6Internal(duid, collection);
1270 getLeases6Internal(duid, collection);
1273 return (collection);
1281 Lease6StorageAddressIndex::const_iterator lb = idx.lower_bound(lower_bound_address);
1284 if ((lb != idx.end()) && ((*lb)->addr_ == lower_bound_address)) {
1289 for (
auto lease = lb;
1290 (lease != idx.end()) && (std::distance(lb, lease) < page_size.
page_size_);
1292 collection.push_back(
Lease6Ptr(
new Lease6(**lease)));
1300 if (!lower_bound_address.
isV6()) {
1302 "retrieving leases from the lease database, got "
1303 << lower_bound_address);
1308 .arg(lower_bound_address.
toText());
1311 if (MultiThreadingMgr::instance().getMode()) {
1312 std::lock_guard<std::mutex> lock(*mutex_);
1313 getLeases6Internal(lower_bound_address, page_size, collection);
1315 getLeases6Internal(lower_bound_address, page_size, collection);
1318 return (collection);
1322Memfile_LeaseMgr::getExpiredLeases4Internal(
Lease4Collection& expired_leases,
1323 const size_t max_leases)
const {
1331 Lease4StorageExpirationIndex::const_iterator ub =
1332 index.upper_bound(boost::make_tuple(
false, time(NULL)));
1335 for (Lease4StorageExpirationIndex::const_iterator lease = index.begin();
1336 (lease != ub) && ((max_leases == 0) || (std::distance(index.begin(), lease) <
1345 const size_t max_leases)
const {
1349 if (MultiThreadingMgr::instance().getMode()) {
1350 std::lock_guard<std::mutex> lock(*mutex_);
1351 getExpiredLeases4Internal(expired_leases, max_leases);
1353 getExpiredLeases4Internal(expired_leases, max_leases);
1358Memfile_LeaseMgr::getExpiredLeases6Internal(
Lease6Collection& expired_leases,
1359 const size_t max_leases)
const {
1367 Lease6StorageExpirationIndex::const_iterator ub =
1368 index.upper_bound(boost::make_tuple(
false, time(NULL)));
1371 for (Lease6StorageExpirationIndex::const_iterator lease = index.begin();
1372 (lease != ub) && ((max_leases == 0) || (std::distance(index.begin(), lease) <
1381 const size_t max_leases)
const {
1385 if (MultiThreadingMgr::instance().getMode()) {
1386 std::lock_guard<std::mutex> lock(*mutex_);
1387 getExpiredLeases6Internal(expired_leases, max_leases);
1389 getExpiredLeases6Internal(expired_leases, max_leases);
1394Memfile_LeaseMgr::updateLease4Internal(
const Lease4Ptr& lease) {
1401 Lease4StorageAddressIndex::const_iterator lease_it = index.find(lease->addr_);
1402 if (lease_it == index.end()) {
1404 << lease->addr_ <<
" - no such lease");
1405 }
else if ((!persist) && (((*lease_it)->cltt_ != lease->current_cltt_) ||
1406 ((*lease_it)->valid_lft_ != lease->current_valid_lft_))) {
1409 isc_throw(NoSuchLease,
"failed to update the lease with address "
1410 << lease->addr_ <<
" - lease has changed in database");
1417 lease_file4_->append(*lease);
1421 lease->updateCurrentExpirationTime();
1428 index.replace(lease_it,
Lease4Ptr(
new Lease4(*lease)));
1431 class_lease_counter_.
updateLease(lease, old_lease);
1439 if (MultiThreadingMgr::instance().getMode()) {
1440 std::lock_guard<std::mutex> lock(*mutex_);
1441 updateLease4Internal(lease);
1443 updateLease4Internal(lease);
1448Memfile_LeaseMgr::updateLease6Internal(
const Lease6Ptr& lease) {
1455 Lease6StorageAddressIndex::const_iterator lease_it = index.find(lease->addr_);
1456 if (lease_it == index.end()) {
1458 << lease->addr_ <<
" - no such lease");
1459 }
else if ((!persist) && (((*lease_it)->cltt_ != lease->current_cltt_) ||
1460 ((*lease_it)->valid_lft_ != lease->current_valid_lft_))) {
1463 isc_throw(NoSuchLease,
"failed to update the lease with address "
1464 << lease->addr_ <<
" - lease has changed in database");
1471 lease_file6_->append(*lease);
1475 lease->updateCurrentExpirationTime();
1482 index.replace(lease_it,
Lease6Ptr(
new Lease6(*lease)));
1485 class_lease_counter_.
updateLease(lease, old_lease);
1493 if (MultiThreadingMgr::instance().getMode()) {
1494 std::lock_guard<std::mutex> lock(*mutex_);
1495 updateLease6Internal(lease);
1497 updateLease6Internal(lease);
1502Memfile_LeaseMgr::deleteLeaseInternal(
const Lease4Ptr& lease) {
1504 Lease4Storage::iterator l = storage4_.find(addr);
1505 if (l == storage4_.end()) {
1512 Lease4 lease_copy = **l;
1515 lease_copy.valid_lft_ = 0;
1516 lease_file4_->append(lease_copy);
1520 if (((*l)->cltt_ != lease->current_cltt_) ||
1521 ((*l)->valid_lft_ != lease->current_valid_lft_)) {
1540 if (MultiThreadingMgr::instance().getMode()) {
1541 std::lock_guard<std::mutex> lock(*mutex_);
1542 return (deleteLeaseInternal(lease));
1544 return (deleteLeaseInternal(lease));
1549Memfile_LeaseMgr::deleteLeaseInternal(
const Lease6Ptr& lease) {
1551 Lease6Storage::iterator l = storage6_.find(addr);
1552 if (l == storage6_.end()) {
1559 Lease6 lease_copy = **l;
1561 lease_copy.valid_lft_ = 0;
1562 lease_copy.preferred_lft_ = 0;
1563 lease_file6_->append(lease_copy);
1567 if (((*l)->cltt_ != lease->current_cltt_) ||
1568 ((*l)->valid_lft_ != lease->current_valid_lft_)) {
1587 if (MultiThreadingMgr::instance().getMode()) {
1588 std::lock_guard<std::mutex> lock(*mutex_);
1589 return (deleteLeaseInternal(lease));
1591 return (deleteLeaseInternal(lease));
1601 if (MultiThreadingMgr::instance().getMode()) {
1602 std::lock_guard<std::mutex> lock(*mutex_);
1603 return (deleteExpiredReclaimedLeases<
1605 >(secs,
V4, storage4_, lease_file4_));
1607 return (deleteExpiredReclaimedLeases<
1609 >(secs,
V4, storage4_, lease_file4_));
1619 if (MultiThreadingMgr::instance().getMode()) {
1620 std::lock_guard<std::mutex> lock(*mutex_);
1621 return (deleteExpiredReclaimedLeases<
1623 >(secs,
V6, storage6_, lease_file6_));
1625 return (deleteExpiredReclaimedLeases<
1627 >(secs,
V6, storage6_, lease_file6_));
1631template<
typename IndexType,
typename LeaseType,
typename StorageType,
1632 typename LeaseFileType>
1634Memfile_LeaseMgr::deleteExpiredReclaimedLeases(
const uint32_t secs,
1635 const Universe& universe,
1636 StorageType& storage,
1637 LeaseFileType& lease_file)
const {
1639 IndexType& index = storage.template get<ExpirationIndexTag>();
1650 typename IndexType::const_iterator upper_limit =
1651 index.upper_bound(boost::make_tuple(
true, time(NULL) - secs));
1660 typename IndexType::const_iterator lower_limit =
1661 index.upper_bound(boost::make_tuple(
true, std::numeric_limits<int64_t>::min()));
1664 uint64_t num_leases =
static_cast<uint64_t
>(std::distance(lower_limit, upper_limit));
1665 if (num_leases > 0) {
1675 for (
typename IndexType::const_iterator lease = lower_limit;
1676 lease != upper_limit; ++lease) {
1678 LeaseType lease_copy(**lease);
1681 lease_copy.valid_lft_ = 0;
1682 lease_file->append(lease_copy);
1687 index.erase(lower_limit, upper_limit);
1690 return (num_leases);
1696 return (std::string(
"In memory database with leases stored in a CSV file."));
1699std::pair<uint32_t, uint32_t>
1701 std::string
const& universe(conn_.
getParameter(
"universe"));
1702 if (universe ==
"4") {
1704 }
else if (universe ==
"6") {
1724 std::string name(file_name);
1725 switch (file_type) {
1736 name +=
".completed";
1751 std::ostringstream s;
1753 s << (u ==
V4 ?
"4" :
"6");
1761 return (lease_file4_ ? lease_file4_->getFilename() :
"");
1764 return (lease_file6_ ? lease_file6_->getFilename() :
"");
1772 if (u ==
V4 && lease_file4_) {
1776 return (u ==
V6 && lease_file6_);
1780Memfile_LeaseMgr::initLeaseFilePath(Universe u) {
1781 std::string persist_val;
1787 persist_val =
"true";
1791 if (persist_val ==
"false") {
1794 }
else if (persist_val !=
"true") {
1796 << persist_val <<
"'");
1799 std::string lease_file;
1802 }
catch (
const Exception&) {
1805 return (lease_file);
1808template<
typename LeaseObjectType,
typename LeaseFileType,
typename StorageType>
1810Memfile_LeaseMgr::loadLeasesFromFiles(
const std::string& filename,
1811 boost::shared_ptr<LeaseFileType>& lease_file,
1812 StorageType& storage) {
1820 if (pid_file.check()) {
1822 "lease file cleanup is in progress");
1827 std::string max_row_errors_str =
"0";
1829 max_row_errors_str = conn_.
getParameter(
"max-row-errors");
1830 }
catch (
const std::exception&) {
1834 uint32_t max_row_errors = 0;
1836 max_row_errors = boost::lexical_cast<uint32_t>(max_row_errors_str);
1837 }
catch (
const boost::bad_lexical_cast&) {
1839 << max_row_errors_str <<
" specified");
1843 bool conversion_needed =
false;
1844 lease_file.reset(
new LeaseFileType(std::string(filename +
".completed")));
1845 if (lease_file->exists()) {
1846 LeaseFileLoader::load<LeaseObjectType>(*lease_file, storage,
1848 conversion_needed = conversion_needed || lease_file->needsConversion();
1853 if (lease_file->exists()) {
1854 LeaseFileLoader::load<LeaseObjectType>(*lease_file, storage,
1856 conversion_needed = conversion_needed || lease_file->needsConversion();
1860 if (lease_file->exists()) {
1861 LeaseFileLoader::load<LeaseObjectType>(*lease_file, storage,
1863 conversion_needed = conversion_needed || lease_file->needsConversion();
1873 lease_file.reset(
new LeaseFileType(filename));
1874 LeaseFileLoader::load<LeaseObjectType>(*lease_file, storage,
1875 max_row_errors,
false);
1876 conversion_needed = conversion_needed || lease_file->needsConversion();
1878 return (conversion_needed);
1884 return (lfc_setup_->isRunning());
1889 return (lfc_setup_->getExitStatus());
1899 lfcExecute(lease_file4_);
1900 }
else if (lease_file6_) {
1902 lfcExecute(lease_file6_);
1907Memfile_LeaseMgr::lfcSetup(
bool conversion_needed) {
1908 std::string lfc_interval_str =
"3600";
1911 }
catch (
const std::exception&) {
1915 uint32_t lfc_interval = 0;
1917 lfc_interval = boost::lexical_cast<uint32_t>(lfc_interval_str);
1918 }
catch (
const boost::bad_lexical_cast&) {
1920 << lfc_interval_str <<
" specified");
1923 if (lfc_interval > 0 || conversion_needed) {
1925 lfc_setup_->setup(lfc_interval, lease_file4_, lease_file6_, conversion_needed);
1929template<
typename LeaseFileType>
1931Memfile_LeaseMgr::lfcExecute(boost::shared_ptr<LeaseFileType>& lease_file) {
1941 if (!lease_file_finish.exists() && !lease_file_copy.exists()) {
1943 lease_file->close();
1946 do_lfc = (rename(lease_file->getFilename().c_str(),
1947 lease_file_copy.getFilename().c_str()) == 0);
1951 .arg(lease_file->getFilename())
1952 .arg(lease_file_copy.getFilename())
1953 .arg(strerror(errno));
1962 lease_file->open(
true);
1975 .arg(lease_file->getFilename())
1986 lfc_setup_->execute();
2045 std::pair<Lease4StorageSubnetIdIndex::const_iterator,
2046 Lease4StorageSubnetIdIndex::const_iterator> l =
2047 idx.equal_range(subnet_id);
2051 for (
auto lease = l.first; lease != l.second; ++lease) {
2052 leases.push_back(*lease);
2055 size_t num = leases.size();
2056 for (
auto l = leases.begin(); l != leases.end(); ++l) {
2060 .arg(subnet_id).arg(num);
2074 std::pair<Lease6StorageSubnetIdIndex::const_iterator,
2075 Lease6StorageSubnetIdIndex::const_iterator> l =
2076 idx.equal_range(subnet_id);
2080 for (
auto lease = l.first; lease != l.second; ++lease) {
2081 leases.push_back(*lease);
2084 size_t num = leases.size();
2085 for (
auto l = leases.begin(); l != leases.end(); ++l) {
2089 .arg(subnet_id).arg(num);
2096 class_lease_counter_.
clear();
2097 for (
auto lease = storage4_.begin(); lease != storage4_.end(); ++lease) {
2100 class_lease_counter_.
addLease(*lease);
2107 class_lease_counter_.
clear();
2108 for (
auto lease = storage6_.begin(); lease != storage6_.end(); ++lease) {
2111 class_lease_counter_.
addLease(*lease);
2119 if (MultiThreadingMgr::instance().getMode()) {
2120 std::lock_guard<std::mutex> lock(*mutex_);
2121 return(class_lease_counter_.
getClassCount(client_class, ltype));
2123 return(class_lease_counter_.
getClassCount(client_class, ltype));
2129 return(class_lease_counter_.
clear());
2134 if (!user_context) {
2147 for (
int i = 0; i < classes->size(); ++i) {
2156 std::string name = name_elem->stringValue();
2167 size_t lease_count = 0;
2173 if (lease_count >= limit) {
2174 std::ostringstream ss;
2175 ss <<
"address limit " << limit <<
" for client class \""
2176 << name <<
"\", current lease count " << lease_count;
2192 SubnetID subnet_id = id_elem->intValue();
2199 int64_t lease_count = 0;
2201 lease_count = getSubnetStat(subnet_id,
"assigned-addresses");
2205 if (lease_count >= limit) {
2206 std::ostringstream ss;
2207 ss <<
"address limit " << limit <<
" for subnet ID " << subnet_id
2208 <<
", current lease count " << lease_count;
2220 if (!user_context) {
2234 for (
int i = 0; i < classes->size(); ++i) {
2243 std::string name = name_elem->stringValue();
2248 if (!getLeaseLimit(class_elem, ltype, limit)) {
2250 if (!getLeaseLimit(class_elem, ltype, limit)) {
2258 size_t lease_count = 0;
2264 if (lease_count >= limit) {
2265 std::ostringstream ss;
2267 <<
" limit " << limit <<
" for client class \""
2268 << name <<
"\", current lease count " << lease_count;
2284 SubnetID subnet_id = id_elem->intValue();
2289 if (!getLeaseLimit(subnet_elem, ltype, limit)) {
2291 if (!getLeaseLimit(subnet_elem, ltype, limit)) {
2299 int64_t lease_count = 0;
2301 lease_count = getSubnetStat(subnet_id, (ltype ==
Lease::TYPE_NA ?
2302 "assigned-nas" :
"assigned-pds"));
2306 if (lease_count >= limit) {
2307 std::ostringstream ss;
2309 <<
" limit " << limit <<
" for subnet ID " << subnet_id
2310 <<
", current lease count " << lease_count;
2325Memfile_LeaseMgr::getSubnetStat(
const SubnetID& subnet_id,
const std::string& stat_label)
const {
2328 std::string stat_name = StatsMgr::generateName(
"subnet", subnet_id, stat_label);
2331 if (samples && samples->size()) {
2332 auto sample = samples->get(0);
2333 if (sample->size()) {
2334 auto count_elem = sample->get(0);
2335 return (count_elem->intValue());
2345 "prefix-limit" :
"address-limit");
2347 limit = limit_elem->intValue();
int version()
returns Kea hooks version.
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.
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.
std::string getParameter(const std::string &name) const
Returns value of a connection parameter.
std::map< std::string, std::string > ParameterMap
Database configuration parameter map.
Exception thrown on failure to open database.
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.
util::Optional< std::string > getDataDir() const
returns path do the data directory
static CfgMgr & instance()
returns a single instance of Configuration Manager
void addLease(LeasePtr lease)
Increment the counts for all of a lease's classes by one.
void clear()
Remove all entries.
void removeLease(LeasePtr lease)
Decrement the counts for all of a lease's classes by one.
void updateLease(LeasePtr new_lease, LeasePtr old_lease)
Adjust class lease counts given a new and old version of a lease.
size_t getClassCount(const ClientClass &client_class, const Lease::Type <ype=Lease::TYPE_V4) const
Fetches the lease count for the given class and lease type.
Holds Client identifier or client IPv4 address.
const std::vector< uint8_t > & getClientId() const
Returns reference to the client-id data.
std::string toText() const
Returns textual representation of a DUID (e.g. 00:01:02:03:ff)
Holds DUID (DHCPv6 Unique Identifier)
std::string toText() const
Returns textual representation of a DUID (e.g. 00:01:02:03:ff)
const std::vector< uint8_t > & getDuid() const
Returns a const reference to the actual DUID value.
Represents a configuration for Lease File Cleanup.
void execute()
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.
static isc::asiolink::IOServicePtr & getIOService()
Returns pointer to the IO service.
static std::string getDBVersion()
Class method to return extended version info This class method must be redeclared and redefined in de...
Wraps value holding size of the page with leases.
const size_t page_size_
Holds page size.
Base class for fulfilling a statistical lease data query.
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...
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.
virtual ~MemfileLeaseStatsQuery4()
Destructor.
void start()
Creates the IPv4 lease statistical data result set.
MemfileLeaseStatsQuery4(Lease4Storage &storage4)
Constructor for an all subnets query.
MemfileLeaseStatsQuery4(Lease4Storage &storage4, const SubnetID &subnet_id)
Constructor for a single subnet query.
Memfile derivation of the IPv6 statistical lease data query.
MemfileLeaseStatsQuery6(Lease6Storage &storage6)
Constructor.
virtual 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 SubnetID &subnet_id)
Constructor for a single subnet query.
Base Memfile derivation of the statistical lease data query.
std::vector< LeaseStatsRow >::iterator next_pos_
An iterator for accessing the next row within the result set.
MemfileLeaseStatsQuery()
Constructor for all subnets query.
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".
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.
virtual void rollback() override
Rollback Transactions.
virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery6(const SubnetID &first_subnet_id, const SubnetID &last_subnet_id) override
Creates and runs the IPv6 lease stats query for a single subnet.
virtual void clearClassLeaseCounts() override
Clears the class-lease count map.
Memfile_LeaseMgr(const db::DatabaseConnection::ParameterMap ¶meters)
The sole lease manager constructor.
bool isLFCRunning() const
Checks if the process performing lease file cleanup is running.
virtual void updateLease4(const Lease4Ptr &lease4) override
Updates IPv4 lease.
virtual size_t wipeLeases4(const SubnetID &subnet_id) override
Removes specified IPv4 leases.
virtual bool isJsonSupported() const override
Checks if JSON support is enabled in the database.
Universe
Specifies universe (V4, V6)
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.
int getLFCExitStatus() const
Returns the status code returned by the last executed LFC process.
bool persistLeases(Universe u) const
Specifies whether or not leases are written to disk.
virtual 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 void getExpiredLeases6(Lease6Collection &expired_leases, const size_t max_leases) const override
Returns a collection of expired DHCPv6 leases.
virtual bool addLease(const Lease4Ptr &lease) override
Adds an IPv4 lease.
virtual void recountClassLeases6() override
Recount the leases per class for V6 leases.
virtual std::pair< uint32_t, uint32_t > getVersion() const override
Returns backend version.
std::string getLeaseFilePath(Universe u) const
Returns an absolute path to the lease file.
virtual Lease6Collection getLeases6() const override
Returns all IPv6 leases.
virtual void lfcCallback()
A callback function triggering Lease File Cleanup (LFC).
virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery4(const SubnetID &subnet_id) override
Creates and runs the IPv4 lease stats query for a single subnet.
virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery6(const SubnetID &subnet_id) override
Creates and runs the IPv6 lease stats query for a single subnet.
virtual std::string getDescription() const override
Returns description of the backend.
static std::string appendSuffix(const std::string &file_name, const LFCFileType &file_type)
Appends appropriate suffix to the file name.
virtual LeaseStatsQueryPtr startLeaseStatsQuery4() override
Creates and runs the IPv4 lease stats query.
virtual Lease6Ptr getLease6(Lease::Type type, const isc::asiolink::IOAddress &addr) const override
Returns existing IPv6 lease for a given IPv6 address.
virtual void recountClassLeases4() override
Recount the leases per class for V4 leases.
virtual void updateLease6(const Lease6Ptr &lease6) override
Updates IPv6 lease.
virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery4(const SubnetID &first_subnet_id, const SubnetID &last_subnet_id) override
Creates and runs the IPv4 lease stats query for a single subnet.
virtual uint64_t deleteExpiredReclaimedLeases4(const uint32_t secs) override
Deletes all expired-reclaimed DHCPv4 leases.
virtual std::string checkLimits6(isc::data::ConstElementPtr const &user_context) const override
Checks if the IPv6 lease limits set in the given user context are exceeded.
virtual LeaseStatsQueryPtr startLeaseStatsQuery6() override
Creates and runs the IPv6 lease stats query.
virtual Lease4Ptr getLease4(const isc::asiolink::IOAddress &addr) const override
Returns existing IPv4 lease for specified IPv4 address.
virtual ~Memfile_LeaseMgr()
Destructor (closes file)
virtual std::string checkLimits4(isc::data::ConstElementPtr const &user_context) const override
Checks if the IPv4 lease limits set in the given user context are exceeded.
std::string getDefaultLeaseFilePath(Universe u) const
Returns default path to the lease file.
virtual uint64_t deleteExpiredReclaimedLeases6(const uint32_t secs) override
Deletes all expired-reclaimed DHCPv6 leases.
virtual void getExpiredLeases4(Lease4Collection &expired_leases, const size_t max_leases) const override
Returns a collection of expired DHCPv4 leases.
Attempt to update lease that was not there.
Manages a pool of asynchronous interval timers.
Exception thrown when an error occurs during CSV file processing.
Provides input/output access to CSV files.
RAII class creating a critical section.
Class to help with processing PID files.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
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
#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.
void prettyPrint(ConstElementPtr element, std::ostream &out, unsigned indent, unsigned step)
Pretty prints the data into stream.
boost::shared_ptr< const Element > ConstElementPtr
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
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_GET4
const isc::log::MessageID DHCPSRV_MEMFILE_LFC_UNREGISTER_TIMER_FAILED
const isc::log::MessageID DHCPSRV_MEMFILE_LFC_SPAWN_FAIL
boost::multi_index_container< Lease4Ptr, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< AddressIndexTag >, boost::multi_index::member< Lease, isc::asiolink::IOAddress, &Lease::addr_ > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< HWAddressSubnetIdIndexTag >, boost::multi_index::composite_key< Lease4, boost::multi_index::const_mem_fun< Lease, const std::vector< uint8_t > &, &Lease::getHWAddrVector >, boost::multi_index::member< Lease, SubnetID, &Lease::subnet_id_ > > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< ClientIdSubnetIdIndexTag >, boost::multi_index::composite_key< Lease4, boost::multi_index::const_mem_fun< Lease4, const std::vector< uint8_t > &, &Lease4::getClientIdVector >, boost::multi_index::member< Lease, uint32_t, &Lease::subnet_id_ > > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< ExpirationIndexTag >, boost::multi_index::composite_key< Lease4, boost::multi_index::const_mem_fun< Lease, bool, &Lease::stateExpiredReclaimed >, boost::multi_index::const_mem_fun< Lease, int64_t, &Lease::getExpirationTime > > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetIdIndexTag >, boost::multi_index::member< Lease, isc::dhcp::SubnetID, &Lease::subnet_id_ > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< HostnameIndexTag >, boost::multi_index::member< Lease, std::string, &Lease::hostname_ > > > > Lease4Storage
A multi index container holding DHCPv4 leases.
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< 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_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_DELETE_ADDR
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 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_UPDATE_ADDR6
Lease4Storage::index< HostnameIndexTag >::type Lease4StorageHostnameIndex
DHCPv4 lease storage index by hostname.
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 and subnet identifier.
Lease4Storage::index< HWAddressSubnetIdIndexTag >::type Lease4StorageHWAddressSubnetIdIndex
DHCPv4 lease storage index by HW address and subnet identifier.
const isc::log::MessageID DHCPSRV_MEMFILE_ADD_ADDR6
uint32_t SubnetID
Defines unique IPv4 or IPv6 subnet identifier.
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::multi_index_container< Lease6Ptr, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< AddressIndexTag >, boost::multi_index::member< Lease, isc::asiolink::IOAddress, &Lease::addr_ > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< DuidIaidTypeIndexTag >, boost::multi_index::composite_key< Lease6, boost::multi_index::const_mem_fun< Lease6, const std::vector< uint8_t > &, &Lease6::getDuidVector >, boost::multi_index::member< Lease6, uint32_t, &Lease6::iaid_ >, boost::multi_index::member< Lease6, Lease::Type, &Lease6::type_ > > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< ExpirationIndexTag >, boost::multi_index::composite_key< Lease6, boost::multi_index::const_mem_fun< Lease, bool, &Lease::stateExpiredReclaimed >, boost::multi_index::const_mem_fun< Lease, int64_t, &Lease::getExpirationTime > > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetIdIndexTag >, boost::multi_index::member< Lease, isc::dhcp::SubnetID, &Lease::subnet_id_ > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< DuidIndexTag >, boost::multi_index::const_mem_fun< Lease6, const std::vector< uint8_t > &, &Lease6::getDuidVector > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< HostnameIndexTag >, boost::multi_index::member< Lease, std::string, &Lease::hostname_ > > > > Lease6Storage
A multi index container holding DHCPv6 leases.
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
const isc::log::MessageID DHCPSRV_MEMFILE_NO_STORAGE
const isc::log::MessageID DHCPSRV_MEMFILE_GET_PAGE4
const isc::log::MessageID DHCPSRV_MEMFILE_GET_HWADDR
const isc::log::MessageID DHCPSRV_MEMFILE_GET6_DUID
Lease4Storage::index< SubnetIdIndexTag >::type Lease4StorageSubnetIdIndex
DHCPv4 lease storage index subnet identifier.
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
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
const int DHCPSRV_DBG_TRACE
DHCP server library logging levels.
Lease6Storage::index< SubnetIdIndexTag >::type Lease6StorageSubnetIdIndex
DHCPv6 lease storage index by Subnet-id.
const isc::log::MessageID DHCPSRV_MEMFILE_GET_IAID_SUBID_DUID
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 and subnet identifiers.
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 identifier 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.
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 std::string typeToText(Type type)
returns text representation of a lease type
Tag for indexes by subnet-id.