19#include <boost/algorithm/string.hpp> 
   48    if (
page_size_ > std::numeric_limits<uint32_t>::max()) {
 
   50                  << std::numeric_limits<uint32_t>::max());
 
 
   56                    uint32_t iaid, 
SubnetID subnet_id)
 const {
 
   61                  << 
static_cast<int>(type) << 
", duid " 
   62                  << duid.
toText() << 
", iaid " << iaid
 
   63                  << 
" and subnet-id " << subnet_id);
 
   68    return (*col.begin());
 
 
   73    using namespace stats;
 
   75    StatsMgr& stats_mgr = StatsMgr::instance();
 
   87    stats_mgr.setValue(
"declined-addresses", zero);
 
   90    if (!stats_mgr.getObservation(
"reclaimed-declined-addresses")) {
 
   91        stats_mgr.setValue(
"reclaimed-declined-addresses", zero);
 
   95    if (!stats_mgr.getObservation(
"reclaimed-leases")) {
 
   96        stats_mgr.setValue(
"reclaimed-leases", zero);
 
  100    if (!stats_mgr.getObservation(
"cumulative-assigned-addresses")) {
 
  101        stats_mgr.setValue(
"cumulative-assigned-addresses", zero);
 
  109    for (
auto const& subnet : *subnets) {
 
  110        SubnetID subnet_id = subnet->getID();
 
  111        stats_mgr.setValue(StatsMgr::generateName(
"subnet", subnet_id,
 
  112                                                  "assigned-addresses"),
 
  115        stats_mgr.setValue(StatsMgr::generateName(
"subnet", subnet_id,
 
  116                                                  "declined-addresses"),
 
  119        const std::string name_rec_dec(StatsMgr::generateName(
"subnet", subnet_id,
 
  120                                                              "reclaimed-declined-addresses"));
 
  121        if (!stats_mgr.getObservation(name_rec_dec)) {
 
  122            stats_mgr.setValue(name_rec_dec, zero);
 
  125        const std::string name_rec(StatsMgr::generateName(
"subnet", subnet_id,
 
  126                                                          "reclaimed-leases"));
 
  127        if (!stats_mgr.getObservation(name_rec)) {
 
  128            stats_mgr.setValue(name_rec, zero);
 
  132            const std::string name_aa(StatsMgr::generateName(
"subnet", subnet_id,
 
  133                                                             StatsMgr::generateName(
"pool", pool->getID(),
 
  134                                                                                    "assigned-addresses")));
 
  135            if (!stats_mgr.getObservation(name_aa)) {
 
  136                stats_mgr.setValue(name_aa, zero);
 
  139            const std::string& name_da(StatsMgr::generateName(
"subnet", subnet_id,
 
  140                                                              StatsMgr::generateName(
"pool", pool->getID(),
 
  141                                                                                     "declined-addresses")));
 
  142            if (!stats_mgr.getObservation(name_da)) {
 
  143                stats_mgr.setValue(name_da, zero);
 
  146            const std::string& pname_rec_dec(StatsMgr::generateName(
"subnet", subnet_id,
 
  147                                                                    StatsMgr::generateName(
"pool", pool->getID(),
 
  148                                                                                          "reclaimed-declined-addresses")));
 
  149            if (!stats_mgr.getObservation(pname_rec_dec)) {
 
  150                stats_mgr.setValue(pname_rec_dec, zero);
 
  153            const std::string& pname_rec(StatsMgr::generateName(
"subnet", subnet_id,
 
  154                                                                StatsMgr::generateName(
"pool", pool->getID(),
 
  155                                                                                      "reclaimed-leases")));
 
  156            if (!stats_mgr.getObservation(pname_rec)) {
 
  157                stats_mgr.setValue(pname_rec, zero);
 
  165    while (query->getNextRow(row)) {
 
  168            stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
 
  169                                                      "assigned-addresses"),
 
  173            stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
 
  174                                                      "declined-addresses"),
 
  178            stats_mgr.addValue(
"declined-addresses", row.
state_count_);
 
  182            stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
 
  183                                                      "assigned-addresses"),
 
  196    while (query->getNextRow(row)) {
 
  199            stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
 
  200                                                      StatsMgr::generateName(
"pool", row.
pool_id_,
 
  201                                                      "assigned-addresses")),
 
  205            stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
 
  206                                                      StatsMgr::generateName(
"pool", row.
pool_id_,
 
  207                                                      "declined-addresses")),
 
  212            stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
 
  213                                                      StatsMgr::generateName(
"pool", row.
pool_id_,
 
  214                                                      "assigned-addresses")),
 
 
  223        isc_throw(
BadValue, 
"LeaseStatsQuery: mode must be either ALL_SUBNETS or ALL_SUBNET_POOLS");
 
 
  251                  "LeaseStatsQuery: last_subnet_id_must be > first_subnet_id_");
 
 
  283    using namespace stats;
 
  285    StatsMgr& stats_mgr = StatsMgr::instance();
 
  298    stats_mgr.setValue(
"declined-addresses", zero);
 
  300    if (!stats_mgr.getObservation(
"reclaimed-declined-addresses")) {
 
  301        stats_mgr.setValue(
"reclaimed-declined-addresses", zero);
 
  304    if (!stats_mgr.getObservation(
"reclaimed-leases")) {
 
  305        stats_mgr.setValue(
"reclaimed-leases", zero);
 
  309    if (!stats_mgr.getObservation(
"cumulative-assigned-nas")) {
 
  310        stats_mgr.setValue(
"cumulative-assigned-nas", zero);
 
  314    if (!stats_mgr.getObservation(
"cumulative-assigned-pds")) {
 
  315        stats_mgr.setValue(
"cumulative-assigned-pds", zero);
 
  319    if (!stats_mgr.getObservation(
"cumulative-registered-nas")) {
 
  320        stats_mgr.setValue(
"cumulative-registered-nas", zero);
 
  328    for (
auto const& subnet : *subnets) {
 
  329        SubnetID subnet_id = subnet->getID();
 
  330        stats_mgr.setValue(StatsMgr::generateName(
"subnet", subnet_id,
 
  334        stats_mgr.setValue(StatsMgr::generateName(
"subnet", subnet_id,
 
  338        stats_mgr.setValue(StatsMgr::generateName(
"subnet", subnet_id,
 
  339                                                  "declined-addresses"),
 
  342        if (!stats_mgr.getObservation(
 
  343                StatsMgr::generateName(
"subnet", subnet_id,
 
  344                                       "reclaimed-declined-addresses"))) {
 
  346                StatsMgr::generateName(
"subnet", subnet_id,
 
  347                                       "reclaimed-declined-addresses"),
 
  351        if (!stats_mgr.getObservation(
 
  352                StatsMgr::generateName(
"subnet", subnet_id,
 
  353                                       "reclaimed-leases"))) {
 
  355                StatsMgr::generateName(
"subnet", subnet_id,
 
  360        if (!stats_mgr.getObservation(
 
  361                StatsMgr::generateName(
"subnet", subnet_id,
 
  362                                       "registered-nas"))) {
 
  364                StatsMgr::generateName(
"subnet", subnet_id,
 
  370            const std::string& name_anas(StatsMgr::generateName(
"subnet", subnet_id,
 
  371                                                                StatsMgr::generateName(
"pool", pool->getID(),
 
  373            if (!stats_mgr.getObservation(name_anas)) {
 
  374                stats_mgr.setValue(name_anas, zero);
 
  377            const std::string& name_da(StatsMgr::generateName(
"subnet", subnet_id,
 
  378                                                              StatsMgr::generateName(
"pool", pool->getID(),
 
  379                                                                                     "declined-addresses")));
 
  380            if (!stats_mgr.getObservation(name_da)) {
 
  381                stats_mgr.setValue(name_da, zero);
 
  384            const std::string name_rec_dec(StatsMgr::generateName(
"subnet", subnet_id,
 
  385                                                                  StatsMgr::generateName(
"pool", pool->getID(),
 
  386                                                                                         "reclaimed-declined-addresses")));
 
  387            if (!stats_mgr.getObservation(name_rec_dec)) {
 
  388                stats_mgr.setValue(name_rec_dec, zero);
 
  391            const std::string& name_rec(StatsMgr::generateName(
"subnet", subnet_id,
 
  392                                                               StatsMgr::generateName(
"pool", pool->getID(),
 
  393                                                                                      "reclaimed-leases")));
 
  394            if (!stats_mgr.getObservation(name_rec)) {
 
  395                stats_mgr.setValue(name_rec, zero);
 
  400            const std::string& name_apds(StatsMgr::generateName(
"subnet", subnet_id,
 
  401                                                                StatsMgr::generateName(
"pd-pool", pool->getID(),
 
  403            if (!stats_mgr.getObservation(name_apds)) {
 
  404                stats_mgr.setValue(name_apds, zero);
 
  407            const std::string& name_rec(StatsMgr::generateName(
"subnet", subnet_id,
 
  408                                                               StatsMgr::generateName(
"pd-pool", pool->getID(),
 
  409                                                                                      "reclaimed-leases")));
 
  410            if (!stats_mgr.getObservation(name_rec)) {
 
  411                stats_mgr.setValue(name_rec, zero);
 
  419    while (query->getNextRow(row)) {
 
  424                    stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
 
  429                    stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
 
  430                                                              "declined-addresses"),
 
  434                    stats_mgr.addValue(
"declined-addresses", row.
state_count_);
 
  438                    stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
 
  443                    stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
 
  452                    stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
 
  472    while (query->getNextRow(row)) {
 
  477                    stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
 
  478                                                              StatsMgr::generateName(
"pool", row.
pool_id_,
 
  483                    stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
 
  484                                                              StatsMgr::generateName(
"pool", row.
pool_id_,
 
  485                                                              "declined-addresses")),
 
  490                    stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
 
  491                                                              StatsMgr::generateName(
"pool", row.
pool_id_,
 
  500                    stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
 
  501                                                              StatsMgr::generateName(
"pd-pool", row.
pool_id_,
 
 
  542    std::string extended_info_tables;
 
  544        extended_info_tables = parameters.at(
"extended-info-tables");
 
  545    } 
catch (
const exception&) {
 
  546        extended_info_tables = 
"false";
 
  549    if (extended_info_tables == 
"true") {
 
 
  559    bool changed = 
false;
 
  577    string verifying = 
"";
 
  578    bool removed_extended_info = 
false;
 
  581        verifying = 
"user context";
 
  585        if (user_context->empty()) {
 
  592        isc = user_context->get(
"ISC");
 
  596        mutable_user_context =
 
  597            boost::const_pointer_cast<Element>(user_context);
 
  598        if (!mutable_user_context) {
 
  600            mutable_user_context = 
copy(user_context, 0);
 
  601            lease->setContext(mutable_user_context);
 
  609            mutable_user_context->remove(
"ISC");
 
  610            if (mutable_user_context->empty()) {
 
  616        verifying = 
"relay-agent-info";
 
  617        extended_info = 
isc->get(
"relay-agent-info");
 
  618        if (!extended_info) {
 
  621        mutable_isc = boost::const_pointer_cast<Element>(
isc);
 
  625            mutable_user_context->set(
"ISC", mutable_isc);
 
  632            upgraded->set(
"sub-options", extended_info);
 
  633            mutable_isc->set(
"relay-agent-info", upgraded);
 
  637            string rai_hex = extended_info->stringValue();
 
  638            vector<uint8_t> rai_data;
 
  647                vector<uint8_t> bytes = remote_id->toBinary();
 
  648                if (bytes.size() > 0) {
 
  649                    upgraded->set(
"remote-id",
 
  656                vector<uint8_t> bytes = relay_id->toBinary(
false);
 
  657                if (bytes.size() > 0) {
 
  658                    upgraded->set(
"relay-id",
 
  665                .arg(lease->addr_.toText());
 
  668            mutable_isc->remove(
"relay-agent-info");
 
  669            removed_extended_info = 
true;
 
  680            verifying = 
"sub-options";
 
  682                mutable_isc->remove(
"relay-agent-info");
 
  683                removed_extended_info = 
true;
 
  686            string rai_hex = sub_options->stringValue();
 
  687            vector<uint8_t> rai_data;
 
  693            verifying = 
"remote-id";
 
  695                mutable_isc->remove(
"relay-agent-info");
 
  696                removed_extended_info = 
true;
 
  699            string remote_id_hex = remote_id->stringValue();
 
  700            vector<uint8_t> remote_id_data;
 
  702            if (remote_id_data.empty()) {
 
  703                mutable_isc->remove(
"relay-agent-info");
 
  704                removed_extended_info = 
true;
 
  711            verifying = 
"relay-id";
 
  713                mutable_isc->remove(
"relay-agent-info");
 
  714                removed_extended_info = 
true;
 
  717            string relay_id_hex = relay_id->stringValue();
 
  718            vector<uint8_t> relay_id_data;
 
  720            if (relay_id_data.empty()) {
 
  721                mutable_isc->remove(
"relay-agent-info");
 
  722                removed_extended_info = 
true;
 
  731        verifying = 
"relay-agent-info";
 
  732        for (
auto const& elem : extended_info->mapValue()) {
 
  733            if ((elem.first != 
"sub-options") &&
 
  734                (elem.first != 
"remote-id") &&
 
  735                (elem.first != 
"relay-id") &&
 
  736                (elem.first != 
"comment")) {
 
  737                mutable_isc->remove(
"relay-agent-info");
 
  738                removed_extended_info = 
true;
 
  740                          "' entry in relay-agent-info");
 
  745    } 
catch (
const exception& ex) {
 
  747        err << 
"in " << verifying << 
" a problem was found: " << ex.what();
 
  749            .arg(lease->addr_.toText())
 
  753        if (verifying == 
"user context") {
 
  755        } 
else if (verifying == 
"isc") {
 
  756            mutable_user_context->remove(
"ISC");
 
  757            if (mutable_user_context->empty()) {
 
  761            if (!removed_extended_info) {
 
  762                mutable_isc->remove(
"relay-agent-info");
 
  764            if (mutable_isc->empty()) {
 
  765                mutable_user_context->remove(
"ISC");
 
  766                if (mutable_user_context->empty()) {
 
 
  778    bool changed = 
false;
 
  796    string verifying = 
"";
 
  797    bool removed_relay_info = 
false;
 
  798    bool upgraded = 
false;
 
  799    bool have_both = 
false;
 
  803        verifying = 
"user context";
 
  807        if (user_context->empty()) {
 
  814        isc = user_context->get(
"ISC");
 
  818        mutable_user_context =
 
  819            boost::const_pointer_cast<Element>(user_context);
 
  820        if (!mutable_user_context) {
 
  822            mutable_user_context = 
copy(user_context, 0);
 
  823            lease->setContext(mutable_user_context);
 
  831            mutable_user_context->remove(
"ISC");
 
  832            if (mutable_user_context->empty()) {
 
  837        mutable_isc = boost::const_pointer_cast<Element>(
isc);
 
  841            mutable_user_context->set(
"ISC", mutable_isc);
 
  844        relay_info = mutable_isc->get(
"relays");
 
  845        if (relay_info && 
isc->contains(
"relay-info")) {
 
  847            mutable_isc->remove(
"relays");
 
  855            verifying = 
"relays";
 
  856            mutable_isc->set(
"relay-info", relay_info);
 
  857            mutable_isc->remove(
"relays");
 
  860                mutable_isc->remove(
"relay-info");
 
  861                removed_relay_info = 
true;
 
  864            if (relay_info->empty()) {
 
  865                mutable_isc->remove(
"relay-info");
 
  866                removed_relay_info = 
true;
 
  871            for (i = 0; 
static_cast<size_t>(i) < relay_info->size(); ++i) {
 
  872                ElementPtr relay = relay_info->getNonConst(i);
 
  874                    mutable_isc->remove(
"relay-info");
 
  875                    removed_relay_info = 
true;
 
  879                    mutable_isc->remove(
"relay-info");
 
  880                    removed_relay_info = 
true;
 
  890                verifying = 
"options";
 
  892                    mutable_isc->remove(
"relay-info");
 
  893                    removed_relay_info = 
true;
 
  896                string options_hex = options->stringValue();
 
  897                vector<uint8_t> options_data;
 
  903                if (remote_id_it != opts.end()) {
 
  904                    OptionPtr remote_id = remote_id_it->second;
 
  906                        vector<uint8_t> bytes = remote_id->toBinary();
 
  907                        if (bytes.size() > 0) {
 
  908                            relay->set(
"remote-id",
 
  915                if (relay_id_it != opts.end()) {
 
  916                    OptionPtr relay_id = relay_id_it->second;
 
  918                        vector<uint8_t> bytes = relay_id->toBinary(
false);
 
  919                        if (bytes.size() > 0) {
 
  920                            relay->set(
"relay-id",
 
  928        verifying = (upgraded ? 
"relays" : 
"relay-info");
 
  930        relay_info = mutable_isc->get(
"relay-info");
 
  935            mutable_isc->remove(
"relay-info");
 
  936            removed_relay_info = 
true;
 
  939        if (!upgraded && relay_info->empty()) {
 
  940            mutable_isc->remove(
"relay-info");
 
  941            removed_relay_info = 
true;
 
  946        for (i = 0; 
static_cast<size_t>(i) < relay_info->size(); ++i) {
 
  947            ElementPtr relay = relay_info->getNonConst(i);
 
  948            if (!upgraded && !relay) {
 
  949                mutable_isc->remove(
"relay-info");
 
  950                removed_relay_info = 
true;
 
  954                mutable_isc->remove(
"relay-info");
 
  955                removed_relay_info = 
true;
 
  960            if (!upgraded && options) {
 
  962                verifying = 
"options";
 
  964                    mutable_isc->remove(
"relay-info");
 
  965                    removed_relay_info = 
true;
 
  968                string options_hex = options->stringValue();
 
  969                vector<uint8_t> options_data;
 
  981                mutable_isc->remove(
"relay-info");
 
  982                removed_relay_info = 
true;
 
  986                mutable_isc->remove(
"relay-info");
 
  987                removed_relay_info = 
true;
 
  990            IOAddress laddr(link_addr->stringValue());
 
  992                mutable_isc->remove(
"relay-info");
 
  993                removed_relay_info = 
true;
 
  998            if (!upgraded && remote_id) {
 
  999                verifying = 
"remote-id";
 
 1001                    mutable_isc->remove(
"relay-info");
 
 1002                    removed_relay_info = 
true;
 
 1005                string remote_id_hex = remote_id->stringValue();
 
 1006                vector<uint8_t> remote_id_data;
 
 1008                if (remote_id_data.empty()) {
 
 1009                    mutable_isc->remove(
"relay-info");
 
 1010                    removed_relay_info = 
true;
 
 1016            if (!upgraded && relay_id) {
 
 1017                verifying = 
"relay-id";
 
 1019                    mutable_isc->remove(
"relay-info");
 
 1020                    removed_relay_info = 
true;
 
 1023                string relay_id_hex = relay_id->stringValue();
 
 1024                vector<uint8_t> relay_id_data;
 
 1026                if (relay_id_data.empty()) {
 
 1027                    mutable_isc->remove(
"relay-info");
 
 1028                    removed_relay_info = 
true;
 
 1040                mutable_isc->remove(
"relay-info");
 
 1041                removed_relay_info = 
true;
 
 1045                mutable_isc->remove(
"relay-info");
 
 1046                removed_relay_info = 
true;
 
 1049            IOAddress paddr(peer_addr->stringValue());
 
 1050            if (!paddr.
isV6()) {
 
 1051                mutable_isc->remove(
"relay-info");
 
 1052                removed_relay_info = 
true;
 
 1059                mutable_isc->remove(
"relay-info");
 
 1060                removed_relay_info = 
true;
 
 1064                mutable_isc->remove(
"relay-info");
 
 1065                removed_relay_info = 
true;
 
 1069            verifying = (upgraded ? 
"relays" : 
"relay-info");
 
 1070            for (
auto const& elem : relay->mapValue()) {
 
 1071                if ((elem.first != 
"hop") &&
 
 1072                    (elem.first != 
"link") &&
 
 1073                    (elem.first != 
"peer") &&
 
 1074                    (elem.first != 
"options") &&
 
 1075                    (elem.first != 
"remote-id") &&
 
 1076                    (elem.first != 
"relay-id") &&
 
 1077                    (elem.first != 
"comment")) {
 
 1078                    mutable_isc->remove(
"relay-info");
 
 1079                    removed_relay_info = 
true;
 
 1088                .arg(lease->addr_.toText());
 
 1092    } 
catch (
const exception& ex) {
 
 1094        err << 
"in " << verifying;
 
 1096            err << 
" [relay#" << i << 
"]";
 
 1098        err << 
" a problem was found: " << ex.what();
 
 1100            .arg(lease->addr_.toText())
 
 1104        have_both = !have_both;
 
 1105        if (verifying == 
"user context") {
 
 1107        } 
else if (verifying == 
"isc") {
 
 1108            mutable_user_context->remove(
"ISC");
 
 1109            if (mutable_user_context->empty()) {
 
 1113            if (!removed_relay_info) {
 
 1114                mutable_isc->remove(
"relay-info");
 
 1116            if (mutable_isc->empty()) {
 
 1117                mutable_user_context->remove(
"ISC");
 
 1118                if (mutable_user_context->empty()) {
 
 
 1129                                    bool ignore_errors) {
 
 1135    if (!user_context) {
 
 1139        if (ignore_errors) {
 
 1144    if (user_context->empty()) {
 
 1153        if (ignore_errors) {
 
 1163    if (!extended_info) {
 
 1167        if (ignore_errors) {
 
 1172    if (extended_info->empty()) {
 
 1179            vector<uint8_t> bytes;
 
 1184                if (!ignore_errors) {
 
 1188            lease->relay_id_ = bytes;
 
 1189        } 
else if (!ignore_errors) {
 
 1197            vector<uint8_t> bytes;
 
 1202                if (!ignore_errors) {
 
 1206            lease->remote_id_ = bytes;
 
 1207        } 
else if (!ignore_errors) {
 
 
 1222    if (!user_context || (user_context->getType() != 
Element::map) ||
 
 1223        user_context->empty()) {
 
 1233    if (!relay_info || (relay_info->getType() != 
Element::list) ||
 
 1234        relay_info->empty()) {
 
 1238    for (
unsigned i = 0; i < relay_info->size(); ++i) {
 
 1240        if (!relay || (relay->getType() != 
Element::map) || relay->empty()) {
 
 1246                string relay_id_hex = relay_id->stringValue();
 
 1247                vector<uint8_t> relay_id_data;
 
 1249                if (relay_id_data.empty()) {
 
 1258                string remote_id_hex = remote_id->stringValue();
 
 1259                vector<uint8_t> remote_id_data;
 
 1261                if (remote_id_data.empty()) {
 
 1267        } 
catch (
const exception&) {
 
 
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.
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.
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 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.
#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.
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.