20#include <boost/algorithm/string.hpp>
50 if (
page_size_ > std::numeric_limits<uint32_t>::max()) {
52 << std::numeric_limits<uint32_t>::max());
58 uint32_t iaid,
SubnetID subnet_id)
const {
63 <<
static_cast<int>(type) <<
", duid "
64 << duid.
toText() <<
", iaid " << iaid
65 <<
" and subnet-id " << subnet_id);
70 return (*col.begin());
75 using namespace stats;
77 StatsMgr& stats_mgr = StatsMgr::instance();
90 stats_mgr.setValue(
"assigned-addresses", zero);
92 stats_mgr.setValue(
"declined-addresses", zero);
95 if (!stats_mgr.getObservation(
"reclaimed-declined-addresses")) {
96 stats_mgr.setValue(
"reclaimed-declined-addresses", zero);
100 if (!stats_mgr.getObservation(
"reclaimed-leases")) {
101 stats_mgr.setValue(
"reclaimed-leases", zero);
105 if (!stats_mgr.getObservation(
"cumulative-assigned-addresses")) {
106 stats_mgr.setValue(
"cumulative-assigned-addresses", zero);
114 for (
auto const& subnet : *subnets) {
115 SubnetID subnet_id = subnet->getID();
116 stats_mgr.setValue(StatsMgr::generateName(
"subnet", subnet_id,
117 "assigned-addresses"),
120 stats_mgr.setValue(StatsMgr::generateName(
"subnet", subnet_id,
121 "declined-addresses"),
124 const std::string name_rec_dec(StatsMgr::generateName(
"subnet", subnet_id,
125 "reclaimed-declined-addresses"));
126 if (!stats_mgr.getObservation(name_rec_dec)) {
127 stats_mgr.setValue(name_rec_dec, zero);
130 const std::string name_rec(StatsMgr::generateName(
"subnet", subnet_id,
131 "reclaimed-leases"));
132 if (!stats_mgr.getObservation(name_rec)) {
133 stats_mgr.setValue(name_rec, zero);
137 const std::string name_aa(StatsMgr::generateName(
"subnet", subnet_id,
138 StatsMgr::generateName(
"pool", pool->getID(),
139 "assigned-addresses")));
140 if (!stats_mgr.getObservation(name_aa)) {
141 stats_mgr.setValue(name_aa, zero);
144 const std::string& name_da(StatsMgr::generateName(
"subnet", subnet_id,
145 StatsMgr::generateName(
"pool", pool->getID(),
146 "declined-addresses")));
147 if (!stats_mgr.getObservation(name_da)) {
148 stats_mgr.setValue(name_da, zero);
151 const std::string& pname_rec_dec(StatsMgr::generateName(
"subnet", subnet_id,
152 StatsMgr::generateName(
"pool", pool->getID(),
153 "reclaimed-declined-addresses")));
154 if (!stats_mgr.getObservation(pname_rec_dec)) {
155 stats_mgr.setValue(pname_rec_dec, zero);
158 const std::string& pname_rec(StatsMgr::generateName(
"subnet", subnet_id,
159 StatsMgr::generateName(
"pool", pool->getID(),
160 "reclaimed-leases")));
161 if (!stats_mgr.getObservation(pname_rec)) {
162 stats_mgr.setValue(pname_rec, zero);
170 while (query->getNextRow(row)) {
173 stats_mgr.addValue(
"assigned-addresses", row.
state_count_);
176 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
177 "assigned-addresses"),
181 stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
182 "declined-addresses"),
186 stats_mgr.addValue(
"assigned-addresses", row.
state_count_);
189 stats_mgr.addValue(
"declined-addresses", row.
state_count_);
193 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
194 "assigned-addresses"),
207 while (query->getNextRow(row)) {
210 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
211 StatsMgr::generateName(
"pool", row.
pool_id_,
212 "assigned-addresses")),
216 stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
217 StatsMgr::generateName(
"pool", row.
pool_id_,
218 "declined-addresses")),
223 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
224 StatsMgr::generateName(
"pool", row.
pool_id_,
225 "assigned-addresses")),
234 isc_throw(
BadValue,
"LeaseStatsQuery: mode must be either ALL_SUBNETS or ALL_SUBNET_POOLS");
262 "LeaseStatsQuery: last_subnet_id_must be > first_subnet_id_");
294 using namespace stats;
296 StatsMgr& stats_mgr = StatsMgr::instance();
310 stats_mgr.setValue(
"assigned-nas", zero);
312 stats_mgr.setValue(
"assigned-pds", zero);
314 stats_mgr.setValue(
"declined-addresses", zero);
316 if (!stats_mgr.getObservation(
"reclaimed-declined-addresses")) {
317 stats_mgr.setValue(
"reclaimed-declined-addresses", zero);
320 if (!stats_mgr.getObservation(
"reclaimed-leases")) {
321 stats_mgr.setValue(
"reclaimed-leases", zero);
325 if (!stats_mgr.getObservation(
"cumulative-assigned-nas")) {
326 stats_mgr.setValue(
"cumulative-assigned-nas", zero);
330 if (!stats_mgr.getObservation(
"cumulative-assigned-pds")) {
331 stats_mgr.setValue(
"cumulative-assigned-pds", zero);
335 if (!stats_mgr.getObservation(
"cumulative-registered-nas")) {
336 stats_mgr.setValue(
"cumulative-registered-nas", zero);
344 for (
auto const& subnet : *subnets) {
345 SubnetID subnet_id = subnet->getID();
346 stats_mgr.setValue(StatsMgr::generateName(
"subnet", subnet_id,
350 stats_mgr.setValue(StatsMgr::generateName(
"subnet", subnet_id,
354 stats_mgr.setValue(StatsMgr::generateName(
"subnet", subnet_id,
355 "declined-addresses"),
358 if (!stats_mgr.getObservation(
359 StatsMgr::generateName(
"subnet", subnet_id,
360 "reclaimed-declined-addresses"))) {
362 StatsMgr::generateName(
"subnet", subnet_id,
363 "reclaimed-declined-addresses"),
367 if (!stats_mgr.getObservation(
368 StatsMgr::generateName(
"subnet", subnet_id,
369 "reclaimed-leases"))) {
371 StatsMgr::generateName(
"subnet", subnet_id,
376 if (!stats_mgr.getObservation(
377 StatsMgr::generateName(
"subnet", subnet_id,
378 "registered-nas"))) {
380 StatsMgr::generateName(
"subnet", subnet_id,
386 const std::string& name_anas(StatsMgr::generateName(
"subnet", subnet_id,
387 StatsMgr::generateName(
"pool", pool->getID(),
389 if (!stats_mgr.getObservation(name_anas)) {
390 stats_mgr.setValue(name_anas, zero);
393 const std::string& name_da(StatsMgr::generateName(
"subnet", subnet_id,
394 StatsMgr::generateName(
"pool", pool->getID(),
395 "declined-addresses")));
396 if (!stats_mgr.getObservation(name_da)) {
397 stats_mgr.setValue(name_da, zero);
400 const std::string name_rec_dec(StatsMgr::generateName(
"subnet", subnet_id,
401 StatsMgr::generateName(
"pool", pool->getID(),
402 "reclaimed-declined-addresses")));
403 if (!stats_mgr.getObservation(name_rec_dec)) {
404 stats_mgr.setValue(name_rec_dec, zero);
407 const std::string& name_rec(StatsMgr::generateName(
"subnet", subnet_id,
408 StatsMgr::generateName(
"pool", pool->getID(),
409 "reclaimed-leases")));
410 if (!stats_mgr.getObservation(name_rec)) {
411 stats_mgr.setValue(name_rec, zero);
416 const std::string& name_apds(StatsMgr::generateName(
"subnet", subnet_id,
417 StatsMgr::generateName(
"pd-pool", pool->getID(),
419 if (!stats_mgr.getObservation(name_apds)) {
420 stats_mgr.setValue(name_apds, zero);
423 const std::string& name_rec(StatsMgr::generateName(
"subnet", subnet_id,
424 StatsMgr::generateName(
"pd-pool", pool->getID(),
425 "reclaimed-leases")));
426 if (!stats_mgr.getObservation(name_rec)) {
427 stats_mgr.setValue(name_rec, zero);
435 while (query->getNextRow(row)) {
443 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
448 stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
449 "declined-addresses"),
456 stats_mgr.addValue(
"declined-addresses", row.
state_count_);
460 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
465 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
477 stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
497 while (query->getNextRow(row)) {
502 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
503 StatsMgr::generateName(
"pool", row.
pool_id_,
508 stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
509 StatsMgr::generateName(
"pool", row.
pool_id_,
510 "declined-addresses")),
515 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
516 StatsMgr::generateName(
"pool", row.
pool_id_,
525 stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
526 StatsMgr::generateName(
"pd-pool", row.
pool_id_,
567 std::string extended_info_tables;
569 extended_info_tables = parameters.at(
"extended-info-tables");
570 }
catch (
const exception&) {
571 extended_info_tables =
"false";
574 if (extended_info_tables ==
"true") {
584 bool changed =
false;
602 string verifying =
"";
603 bool removed_extended_info =
false;
606 verifying =
"user context";
610 if (user_context->empty()) {
617 isc = user_context->get(
"ISC");
621 mutable_user_context =
622 boost::const_pointer_cast<Element>(user_context);
623 if (!mutable_user_context) {
625 mutable_user_context =
copy(user_context, 0);
626 lease->setContext(mutable_user_context);
634 mutable_user_context->remove(
"ISC");
635 if (mutable_user_context->empty()) {
641 verifying =
"relay-agent-info";
642 extended_info =
isc->get(
"relay-agent-info");
643 if (!extended_info) {
646 mutable_isc = boost::const_pointer_cast<Element>(
isc);
650 mutable_user_context->set(
"ISC", mutable_isc);
657 upgraded->set(
"sub-options", extended_info);
658 mutable_isc->set(
"relay-agent-info", upgraded);
662 string rai_hex = extended_info->stringValue();
663 vector<uint8_t> rai_data;
672 vector<uint8_t> bytes = remote_id->toBinary();
673 if (bytes.size() > 0) {
674 upgraded->set(
"remote-id",
681 vector<uint8_t> bytes = relay_id->toBinary(
false);
682 if (bytes.size() > 0) {
683 upgraded->set(
"relay-id",
690 .arg(lease->addr_.toText());
693 mutable_isc->remove(
"relay-agent-info");
694 removed_extended_info =
true;
705 verifying =
"sub-options";
707 mutable_isc->remove(
"relay-agent-info");
708 removed_extended_info =
true;
711 string rai_hex = sub_options->stringValue();
712 vector<uint8_t> rai_data;
718 verifying =
"remote-id";
720 mutable_isc->remove(
"relay-agent-info");
721 removed_extended_info =
true;
724 string remote_id_hex = remote_id->stringValue();
725 vector<uint8_t> remote_id_data;
727 if (remote_id_data.empty()) {
728 mutable_isc->remove(
"relay-agent-info");
729 removed_extended_info =
true;
736 verifying =
"relay-id";
738 mutable_isc->remove(
"relay-agent-info");
739 removed_extended_info =
true;
742 string relay_id_hex = relay_id->stringValue();
743 vector<uint8_t> relay_id_data;
745 if (relay_id_data.empty()) {
746 mutable_isc->remove(
"relay-agent-info");
747 removed_extended_info =
true;
756 verifying =
"relay-agent-info";
757 for (
auto const& elem : extended_info->mapValue()) {
758 if ((elem.first !=
"sub-options") &&
759 (elem.first !=
"remote-id") &&
760 (elem.first !=
"relay-id") &&
761 (elem.first !=
"comment")) {
762 mutable_isc->remove(
"relay-agent-info");
763 removed_extended_info =
true;
765 "' entry in relay-agent-info");
770 }
catch (
const exception& ex) {
772 err <<
"in " << verifying <<
" a problem was found: " << ex.what();
774 .arg(lease->addr_.toText())
778 if (verifying ==
"user context") {
780 }
else if (verifying ==
"isc") {
781 mutable_user_context->remove(
"ISC");
782 if (mutable_user_context->empty()) {
786 if (!removed_extended_info) {
787 mutable_isc->remove(
"relay-agent-info");
789 if (mutable_isc->empty()) {
790 mutable_user_context->remove(
"ISC");
791 if (mutable_user_context->empty()) {
803 bool changed =
false;
821 string verifying =
"";
822 bool removed_relay_info =
false;
823 bool upgraded =
false;
824 bool have_both =
false;
828 verifying =
"user context";
832 if (user_context->empty()) {
839 isc = user_context->get(
"ISC");
843 mutable_user_context =
844 boost::const_pointer_cast<Element>(user_context);
845 if (!mutable_user_context) {
847 mutable_user_context =
copy(user_context, 0);
848 lease->setContext(mutable_user_context);
856 mutable_user_context->remove(
"ISC");
857 if (mutable_user_context->empty()) {
862 mutable_isc = boost::const_pointer_cast<Element>(
isc);
866 mutable_user_context->set(
"ISC", mutable_isc);
869 relay_info = mutable_isc->get(
"relays");
870 if (relay_info &&
isc->contains(
"relay-info")) {
872 mutable_isc->remove(
"relays");
880 verifying =
"relays";
881 mutable_isc->set(
"relay-info", relay_info);
882 mutable_isc->remove(
"relays");
885 mutable_isc->remove(
"relay-info");
886 removed_relay_info =
true;
889 if (relay_info->empty()) {
890 mutable_isc->remove(
"relay-info");
891 removed_relay_info =
true;
896 for (i = 0;
static_cast<size_t>(i) < relay_info->size(); ++i) {
897 ElementPtr relay = relay_info->getNonConst(i);
899 mutable_isc->remove(
"relay-info");
900 removed_relay_info =
true;
904 mutable_isc->remove(
"relay-info");
905 removed_relay_info =
true;
915 verifying =
"options";
917 mutable_isc->remove(
"relay-info");
918 removed_relay_info =
true;
921 string options_hex = options->stringValue();
922 vector<uint8_t> options_data;
928 if (remote_id_it != opts.end()) {
929 OptionPtr remote_id = remote_id_it->second;
931 vector<uint8_t> bytes = remote_id->toBinary();
932 if (bytes.size() > 0) {
933 relay->set(
"remote-id",
940 if (relay_id_it != opts.end()) {
941 OptionPtr relay_id = relay_id_it->second;
943 vector<uint8_t> bytes = relay_id->toBinary(
false);
944 if (bytes.size() > 0) {
945 relay->set(
"relay-id",
953 verifying = (upgraded ?
"relays" :
"relay-info");
955 relay_info = mutable_isc->get(
"relay-info");
960 mutable_isc->remove(
"relay-info");
961 removed_relay_info =
true;
964 if (!upgraded && relay_info->empty()) {
965 mutable_isc->remove(
"relay-info");
966 removed_relay_info =
true;
971 for (i = 0;
static_cast<size_t>(i) < relay_info->size(); ++i) {
972 ElementPtr relay = relay_info->getNonConst(i);
973 if (!upgraded && !relay) {
974 mutable_isc->remove(
"relay-info");
975 removed_relay_info =
true;
979 mutable_isc->remove(
"relay-info");
980 removed_relay_info =
true;
985 if (!upgraded && options) {
987 verifying =
"options";
989 mutable_isc->remove(
"relay-info");
990 removed_relay_info =
true;
993 string options_hex = options->stringValue();
994 vector<uint8_t> options_data;
1006 mutable_isc->remove(
"relay-info");
1007 removed_relay_info =
true;
1011 mutable_isc->remove(
"relay-info");
1012 removed_relay_info =
true;
1015 IOAddress laddr(link_addr->stringValue());
1016 if (!laddr.
isV6()) {
1017 mutable_isc->remove(
"relay-info");
1018 removed_relay_info =
true;
1023 if (!upgraded && remote_id) {
1024 verifying =
"remote-id";
1026 mutable_isc->remove(
"relay-info");
1027 removed_relay_info =
true;
1030 string remote_id_hex = remote_id->stringValue();
1031 vector<uint8_t> remote_id_data;
1033 if (remote_id_data.empty()) {
1034 mutable_isc->remove(
"relay-info");
1035 removed_relay_info =
true;
1041 if (!upgraded && relay_id) {
1042 verifying =
"relay-id";
1044 mutable_isc->remove(
"relay-info");
1045 removed_relay_info =
true;
1048 string relay_id_hex = relay_id->stringValue();
1049 vector<uint8_t> relay_id_data;
1051 if (relay_id_data.empty()) {
1052 mutable_isc->remove(
"relay-info");
1053 removed_relay_info =
true;
1065 mutable_isc->remove(
"relay-info");
1066 removed_relay_info =
true;
1070 mutable_isc->remove(
"relay-info");
1071 removed_relay_info =
true;
1074 IOAddress paddr(peer_addr->stringValue());
1075 if (!paddr.
isV6()) {
1076 mutable_isc->remove(
"relay-info");
1077 removed_relay_info =
true;
1084 mutable_isc->remove(
"relay-info");
1085 removed_relay_info =
true;
1089 mutable_isc->remove(
"relay-info");
1090 removed_relay_info =
true;
1094 verifying = (upgraded ?
"relays" :
"relay-info");
1095 for (
auto const& elem : relay->mapValue()) {
1096 if ((elem.first !=
"hop") &&
1097 (elem.first !=
"link") &&
1098 (elem.first !=
"peer") &&
1099 (elem.first !=
"options") &&
1100 (elem.first !=
"remote-id") &&
1101 (elem.first !=
"relay-id") &&
1102 (elem.first !=
"comment")) {
1103 mutable_isc->remove(
"relay-info");
1104 removed_relay_info =
true;
1113 .arg(lease->addr_.toText());
1117 }
catch (
const exception& ex) {
1119 err <<
"in " << verifying;
1121 err <<
" [relay#" << i <<
"]";
1123 err <<
" a problem was found: " << ex.what();
1125 .arg(lease->addr_.toText())
1129 have_both = !have_both;
1130 if (verifying ==
"user context") {
1132 }
else if (verifying ==
"isc") {
1133 mutable_user_context->remove(
"ISC");
1134 if (mutable_user_context->empty()) {
1138 if (!removed_relay_info) {
1139 mutable_isc->remove(
"relay-info");
1141 if (mutable_isc->empty()) {
1142 mutable_user_context->remove(
"ISC");
1143 if (mutable_user_context->empty()) {
1154 bool ignore_errors) {
1160 if (!user_context) {
1164 if (ignore_errors) {
1169 if (user_context->empty()) {
1178 if (ignore_errors) {
1188 if (!extended_info) {
1192 if (ignore_errors) {
1197 if (extended_info->empty()) {
1204 vector<uint8_t> bytes;
1209 if (!ignore_errors) {
1213 lease->relay_id_ = bytes;
1214 }
else if (!ignore_errors) {
1222 vector<uint8_t> bytes;
1227 if (!ignore_errors) {
1231 lease->remote_id_ = bytes;
1232 }
else if (!ignore_errors) {
1247 if (!user_context || (user_context->getType() !=
Element::map) ||
1248 user_context->empty()) {
1258 if (!relay_info || (relay_info->getType() !=
Element::list) ||
1259 relay_info->empty()) {
1263 for (
unsigned i = 0; i < relay_info->size(); ++i) {
1265 if (!relay || (relay->getType() !=
Element::map) || relay->empty()) {
1271 string relay_id_hex = relay_id->stringValue();
1272 vector<uint8_t> relay_id_data;
1274 if (relay_id_data.empty()) {
1283 string remote_id_hex = remote_id->stringValue();
1284 vector<uint8_t> remote_id_data;
1286 if (remote_id_data.empty()) {
1292 }
catch (
const exception&) {
1317 msg <<
"lease backend '" <<
getName() <<
"' is not 'memfile'";
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
A generic exception that is thrown when a function is not implemented.
A generic exception that is thrown if a parameter given to a method would refer to or modify out-of-r...
The IOAddress class represents an IP addresses (version agnostic)
bool isV6() const
Convenience function to check for an IPv6 address.
static ElementPtr create(const Position &pos=ZERO_POSITION())
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
std::map< std::string, std::string > ParameterMap
Database configuration parameter map.
Multiple lease records found where one expected.
ExtendedInfoSanity
Values for extended info sanity checks done for leases.
@ EXTENDED_INFO_CHECK_PEDANTIC
@ EXTENDED_INFO_CHECK_FIX
@ EXTENDED_INFO_CHECK_NONE
static CfgMgr & instance()
returns a single instance of Configuration Manager
SrvConfigPtr getCurrentCfg()
Returns a pointer to the current configuration.
Holds DUID (DHCPv6 Unique Identifier)
std::string toText() const
Returns textual representation of the identifier (e.g.
virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery6(const SubnetID &subnet_id)
Creates and runs the IPv6 lease stats query for a single subnet.
virtual LeaseStatsQueryPtr startPoolLeaseStatsQuery6()
Creates and runs the IPv6 lease stats query for all subnets and pools.
virtual Lease6Collection getLeases6() const =0
Returns all IPv6 leases.
void recountLeaseStats6()
Recalculates per-subnet and global stats for IPv6 leases.
virtual data::ElementPtr getStatus() const
Return status information.
void setExtendedInfoTablesEnabled(const bool enabled)
Modifies the setting whether the lease6 extended info tables are enabled.
virtual size_t byRelayId6size() const
Return the by-relay-id table size.
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.
virtual size_t byRemoteId6size() const
Return the by-remote-id table size.
virtual void addRelayId6(const isc::asiolink::IOAddress &lease_addr, const std::vector< uint8_t > &relay_id)=0
Add lease6 extended info into by-relay-id table.
virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery4(const SubnetID &first_subnet_id, const SubnetID &last_subnet_id)
Creates and runs the IPv4 lease stats query for a single subnet.
virtual std::string getName() const =0
Returns backend name.
void recountLeaseStats4()
Recalculates per-subnet and global stats for IPv4 leases.
static std::string getDBVersion()
Class method to return extended version info This class method must be redeclared and redefined in de...
virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery6(const SubnetID &first_subnet_id, const SubnetID &last_subnet_id)
Creates and runs the IPv6 lease stats query for a single subnet.
virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery4(const SubnetID &subnet_id)
Creates and runs the IPv4 lease stats query for a single subnet.
virtual Lease6Ptr getLease6(Lease::Type type, const isc::asiolink::IOAddress &addr) const =0
Returns existing IPv6 lease for a given IPv6 address.
virtual isc::data::ConstElementPtr lfcStartHandler()
Handler for kea-lfc-start command.
virtual LeaseStatsQueryPtr startLeaseStatsQuery4()
Creates and runs the IPv4 lease stats query for all subnets.
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 void addRemoteId6(const isc::asiolink::IOAddress &lease_addr, const std::vector< uint8_t > &remote_id)=0
Add lease6 extended info into by-remote-id table.
virtual LeaseStatsQueryPtr startPoolLeaseStatsQuery4()
Creates and runs the IPv4 lease stats query for all subnets and pools.
virtual bool addExtendedInfo6(const Lease6Ptr &lease)
Extract extended info from a lease6 and add it into tables.
virtual LeaseStatsQueryPtr startLeaseStatsQuery6()
Creates and runs the IPv6 lease stats query for all subnets.
const size_t page_size_
Holds page size.
LeasePageSize(const size_t page_size)
Constructor.
LeaseStatsQuery(const SelectMode &select_mode=ALL_SUBNETS)
Constructor to query statistics for all subnets.
SubnetID first_subnet_id_
First (or only) subnet_id in the selection criteria.
SubnetID last_subnet_id_
Last subnet_id in the selection criteria when a range is given.
virtual bool getNextRow(LeaseStatsRow &row)
Fetches the next row of data.
SelectMode
Defines the types of selection criteria supported.
static const OptionDefinition & DHO_DHCP_AGENT_OPTIONS_DEF()
Get definition of DHO_DHCP_AGENT_OPTIONS option.
static size_t unpackOptions6(const OptionBuffer &buf, const std::string &option_space, isc::dhcp::OptionCollection &options, size_t *relay_msg_offset=0, size_t *relay_msg_len=0)
Parses provided buffer as DHCPv6 options and creates Option objects.
Option with defined data fields represented as buffers that can be accessed using data field index.
Base class representing a DHCP option definition.
This file contains several functions and constants that are used for handling commands and responses ...
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
An abstract API for lease database.
#define LOG_ERROR(LOGGER, MESSAGE)
Macro to conveniently test error output and log it.
#define LOG_DEBUG(LOGGER, LEVEL, MESSAGE)
Macro to conveniently test debug output and log it.
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.
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< Element > ElementPtr
isc::log::Logger dhcpsrv_logger("dhcpsrv")
DHCP server library Logger.
const isc::log::MessageID DHCPSRV_LEASE6_EXTENDED_INFO_UPGRADED
boost::shared_ptr< OptionCustom > OptionCustomPtr
A pointer to the OptionCustom object.
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.
boost::multi_index_container< Subnet6Ptr, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetSubnetIdIndexTag >, boost::multi_index::const_mem_fun< Subnet, SubnetID, &Subnet::getID > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetPrefixIndexTag >, boost::multi_index::const_mem_fun< Subnet, std::string, &Subnet::toText > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetModificationTimeIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime, &data::BaseStampedElement::getModificationTime > > > > Subnet6Collection
A collection of Subnet6 objects.
std::multimap< unsigned int, OptionPtr > OptionCollection
A collection of DHCP (v4 or v6) options.
boost::multi_index_container< Subnet4Ptr, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetSubnetIdIndexTag >, boost::multi_index::const_mem_fun< Subnet, SubnetID, &Subnet::getID > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetPrefixIndexTag >, boost::multi_index::const_mem_fun< Subnet, std::string, &Subnet::toText > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetServerIdIndexTag >, boost::multi_index::const_mem_fun< Network4, asiolink::IOAddress, &Network4::getServerId > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetModificationTimeIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime, &data::BaseStampedElement::getModificationTime > > > > Subnet4Collection
A collection of Subnet4 objects.
uint32_t SubnetID
Defines unique IPv4 or IPv6 subnet identifier.
const isc::log::MessageID DHCPSRV_LEASE4_EXTENDED_INFO_SANITY_FAIL
const isc::log::MessageID DHCPSRV_LEASE4_EXTENDED_INFO_UPGRADED
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
const int DHCPSRV_DBG_TRACE
DHCP server library logging levels.
boost::shared_ptr< Option > OptionPtr
const isc::log::MessageID DHCPSRV_LEASE6_EXTENDED_INFO_SANITY_FAIL
void decodeHex(const string &encoded_str, vector< uint8_t > &output)
Decode a base16 encoded string into binary data.
string encodeHex(const vector< uint8_t > &binary)
Encode binary data in the base16 format.
void decodeFormattedHexString(const string &hex_string, vector< uint8_t > &binary)
Converts a formatted string of hexadecimal digits into a vector.
Defines the logger used by the top-level component of kea-lfc.
#define DHCP6_OPTION_SPACE
Contains a single row of lease statistical data.
uint32_t pool_id_
The pool ID to which this data applies.
int64_t state_count_
state_count The count of leases in the lease state
uint32_t lease_state_
The lease_state to which the count applies.
SubnetID subnet_id_
The subnet ID to which this data applies.
Lease::Type lease_type_
The lease_type to which the count applies.
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.