8#include <kea_version.h> 
  115#include <boost/algorithm/string/erase.hpp> 
  116#include <boost/algorithm/string/join.hpp> 
  117#include <boost/algorithm/string/split.hpp> 
  118#include <boost/foreach.hpp> 
  119#include <boost/tokenizer.hpp> 
  133namespace ph = std::placeholders;
 
  139    int hook_index_buffer6_receive_;  
 
  140    int hook_index_pkt6_receive_;     
 
  141    int hook_index_subnet6_select_;   
 
  142    int hook_index_leases6_committed_;
 
  143    int hook_index_lease6_release_;   
 
  144    int hook_index_pkt6_send_;        
 
  145    int hook_index_buffer6_send_;     
 
  146    int hook_index_lease6_decline_;   
 
  147    int hook_index_host6_identifier_; 
 
  148    int hook_index_ddns6_update_;     
 
  149    int hook_index_addr6_register_;   
 
  185createStatusCode(
const Pkt6& pkt, 
const uint16_t status_code,
 
  186                 const std::string& status_message) {
 
  191        .arg(option_status->dataToText());
 
  192    return (option_status);
 
  210createStatusCode(
const Pkt6& pkt, 
const Option6IA& ia, 
const uint16_t status_code,
 
  211                 const std::string& status_message) {
 
  217        .arg(option_status->dataToText());
 
  218    return (option_status);
 
  223std::set<std::string> dhcp6_statistics = {
 
  225    "pkt6-solicit-received",
 
  226    "pkt6-advertise-received",
 
  227    "pkt6-request-received",
 
  228    "pkt6-reply-received",
 
  229    "pkt6-renew-received",
 
  230    "pkt6-rebind-received",
 
  231    "pkt6-decline-received",
 
  232    "pkt6-release-received",
 
  233    "pkt6-infrequest-received",
 
  234    "pkt6-dhcpv4-query-received",
 
  235    "pkt6-dhcpv4-response-received",
 
  236    "pkt6-addr-reg-inform-received",
 
  237    "pkt6-addr-reg-reply-received",
 
  238    "pkt6-unknown-received",
 
  240    "pkt6-advertise-sent",
 
  242    "pkt6-dhcpv4-response-sent",
 
  243    "pkt6-addr-reg-reply-sent",
 
  246    "v6-allocation-fail",
 
  247    "v6-allocation-fail-shared-network",
 
  248    "v6-allocation-fail-subnet",
 
  249    "v6-allocation-fail-no-pools",
 
  250    "v6-allocation-fail-classes",
 
  251    "v6-ia-na-lease-reuses",
 
  252    "v6-ia-pd-lease-reuses",
 
  295    } 
catch (
const std::exception &e) {
 
 
  311    for (
auto const& it : dhcp6_statistics) {
 
  313        stats_mgr.
setValue(it, 
static_cast<int64_t
>(0));
 
 
  323    } 
catch (
const std::exception& ex) {
 
  330    } 
catch (
const std::exception& ex) {
 
  349        if (!names.empty()) {
 
  351            for (
size_t i = 1; i < names.size(); ++i) {
 
  352                msg += std::string(
", ") + names[i];
 
  358    io_service_->stopAndPoll();
 
 
  384        if (
getServerID()->getData() != server_id->getData()){
 
  386                .arg(pkt->getLabel())
 
 
  398    switch (pkt->getType()) {
 
  403        if (pkt->relay_info_.empty() && !pkt->getLocalAddr().isV6Multicast()) {
 
  405                .arg(pkt->getLabel())
 
  406                .arg(pkt->getName());
 
 
  421    for (
auto const& id_type : cfg->getIdentifierTypes()) {
 
  442                std::vector<uint8_t> id;
 
  451                callout_handle->setArgument(
"query6", ctx.
query_);
 
  452                callout_handle->setArgument(
"id_type", type);
 
  453                callout_handle->setArgument(
"id_value", 
id);
 
  459                callout_handle->getArgument(
"id_type", type);
 
  460                callout_handle->getArgument(
"id_value", 
id);
 
  466                        .arg(ctx.
query_->getLabel())
 
 
  486    ctx.
duid_ = query->getClientId();
 
 
  513        if (global_host && !global_host->getClientClasses6().empty()) {
 
  518            const ClientClasses& classes = global_host->getClientClasses6();
 
  519            for (
auto const& cclass : classes) {
 
  520                query->addClass(cclass);
 
  529            query->addClass(
"KNOWN");
 
  531                .arg(query->getLabel())
 
  538            if (query->inClass(
"DROP")) {
 
  541                    .arg(query->makeLabel(query->getClientId(), 
nullptr))
 
  542                    .arg(query->toText());
 
  544                                              static_cast<int64_t
>(1));
 
  549            ctx.
hosts_[SUBNET_ID_GLOBAL] = global_host;
 
 
  583        ctx.
subnet_->getSharedNetwork(sn);
 
  595         global_host && !global_host->getClientClasses6().empty()) ||
 
  596        (!sn && current_host && !current_host->getClientClasses6().empty())) {
 
  617    if (!ctx.
hosts_.empty()) {
 
  618        ctx.
query_->addClass(
"KNOWN");
 
  620          .arg(ctx.
query_->getLabel())
 
  623        ctx.
query_->addClass(
"UNKNOWN");
 
  625          .arg(ctx.
query_->getLabel())
 
  634        .arg(ctx.
query_->getLabel())
 
  638    if (ctx.
query_->inClass(
"DROP")) {
 
  640            .arg(ctx.
query_->makeLabel(ctx.
query_->getClientId(), 0))
 
  641            .arg(ctx.
query_->toText());
 
  643                                      static_cast<int64_t
>(1));
 
 
  655    const char* 
interface = getenv(
"KEA_AFL_INTERFACE");
 
  657        isc_throw(FuzzInitFail, 
"no fuzzing interface has been set");
 
  661    const char* address = getenv(
"KEA_AFL_ADDRESS");
 
  663        isc_throw(FuzzInitFail, 
"no fuzzing address has been set");
 
  671    while (__AFL_LOOP(fuzzer.maxLoopCount())) {
 
  683        } 
catch (
const std::exception& e) {
 
 
  714        uint32_t timeout = 1;
 
  725                .arg(query->getRemoteAddr().toText())
 
  726                .arg(query->getRemotePort())
 
  727                .arg(query->getLocalAddr().toText())
 
  728                .arg(query->getLocalPort())
 
  729                .arg(query->getIface());
 
  751    } 
catch (
const std::exception& e) {
 
  765            .arg(query->getLabel());
 
  769            query->addPktEvent(
"mt_queued");
 
  770            typedef function<void()> CallBack;
 
  771            boost::shared_ptr<CallBack> call_back =
 
 
  787    } 
catch (
const std::exception& e) {
 
  789            .arg(query->getLabel())
 
  793            .arg(query->getLabel());
 
 
  810    query->addPktEvent(
"process_started");
 
  813    query->addClass(
"ALL");
 
  815    bool skip_unpack = 
false;
 
  832        callout_handle->setArgument(
"query6", query);
 
  843                .arg(query->getRemoteAddr().toText())
 
  844                .arg(query->getLocalAddr().toText())
 
  845                .arg(query->getIface());
 
  854                .arg(query->getRemoteAddr().toText())
 
  855                .arg(query->getLocalAddr().toText())
 
  856                .arg(query->getIface());
 
  866        callout_handle->getArgument(
"query6", query);
 
  878                .arg(query->getRemoteAddr().toText())
 
  879                .arg(query->getLocalAddr().toText())
 
  880                .arg(query->getIface());
 
  887                .arg(query->getLabel())
 
  889        } 
catch (
const std::exception &e) {
 
  892                .arg(query->getLabel())
 
  893                .arg(query->getRemoteAddr().toText())
 
  894                .arg(query->getLocalAddr().toText())
 
  895                .arg(query->getIface())
 
  897                .arg(query->makeLabel(query->getClientId(), 
nullptr));
 
  901                                          static_cast<int64_t
>(1));
 
  903                                          static_cast<int64_t
>(1));
 
  910        .arg(query->getLabel());
 
  913    processStatsReceived(query);
 
  938        .arg(query->getLabel())
 
  939        .arg(query->getName())
 
  940        .arg(
static_cast<int>(query->getType()))
 
  941        .arg(query->getRemoteAddr())
 
  942        .arg(query->getLocalAddr())
 
  943        .arg(query->getIface());
 
  945        .arg(query->getLabel())
 
  946        .arg(query->toText());
 
  964        callout_handle->setArgument(
"query6", query);
 
  975                .arg(query->getLabel());
 
  984        callout_handle->getArgument(
"query6", query);
 
  997    if (query->inClass(
"DROP")) {
 
  999            .arg(query->makeLabel(query->getClientId(), 
nullptr))
 
 1000            .arg(query->toText());
 
 1002                                      static_cast<int64_t
>(1));
 
 
 1019    } 
catch (
const std::exception& e) {
 
 1021            .arg(query->getLabel())
 
 1025            .arg(query->getLabel());
 
 
 1046        if (!client_handler.
tryLock(query, cont)) {
 
 
 1087    } 
catch (
const std::exception& e) {
 
 1089            .arg(query->getLabel())
 
 1093            .arg(query->getLabel());
 
 
 1106        callout_handle->getContext(
"subnet6", ctx.
subnet_);
 
 
 1126        switch (query->getType()) {
 
 1167    } 
catch (
const std::exception& e) {
 
 1177            .arg(query->getLabel())
 
 1178            .arg(query->getName())
 
 1179            .arg(query->getRemoteAddr().toText())
 
 1202    rsp->setRemoteAddr(query->getRemoteAddr());
 
 1203    rsp->setLocalAddr(query->getLocalAddr());
 
 1208    } 
else if (rsp->relay_info_.empty()) {
 
 1210        rsp->setRemotePort(DHCP6_CLIENT_PORT);
 
 1214        rsp->setRemotePort(relay_port ? relay_port : DHCP6_SERVER_PORT);
 
 1220        rsp->setLocalPort(DHCP6_SERVER_PORT);
 
 1222    rsp->setIndex(query->getIndex());
 
 1223    rsp->setIface(query->getIface());
 
 1252        std::shared_ptr<ScopedCalloutHandleState> callout_handle_state =
 
 1253                std::make_shared<ScopedCalloutHandleState>(callout_handle);
 
 1258        callout_handle->setArgument(
"query6", query);
 
 1262        callout_handle->setArgument(
"response6", rsp);
 
 1268                if (new_lease->reuseable_valid_lft_ == 0) {
 
 1269                    new_leases->push_back(new_lease);
 
 1273        callout_handle->setArgument(
"leases6", new_leases);
 
 1278        for (
auto const& iac : ctx.
ias_) {
 
 1279            if (!iac.old_leases_.empty()) {
 
 1280                for (
auto const& old_lease : iac.old_leases_) {
 
 1282                        deleted_leases->push_back(old_lease);
 
 1285                    bool in_new = 
false;
 
 1287                        if ((new_lease->addr_ == old_lease->addr_) &&
 
 1289                             (new_lease->prefixlen_ == old_lease->prefixlen_))) {
 
 1295                        deleted_leases->push_back(old_lease);
 
 1300        callout_handle->setArgument(
"deleted_leases6", deleted_leases);
 
 1303        uint32_t parked_packet_limit = 0;
 
 1307            parked_packet_limit = ppl->intValue();
 
 1310        if (parked_packet_limit) {
 
 1312                getParkingLotPtr(
"leases6_committed");
 
 1313            if (parking_lot && (parking_lot->size() >= parked_packet_limit)) {
 
 1317                          .arg(parked_packet_limit)
 
 1318                          .arg(query->getLabel());
 
 1320                                                          static_cast<int64_t
>(1));
 
 1332        [
this, callout_handle, query, rsp, callout_handle_state, subnet]() 
mutable {
 
 1334                typedef function<void()> CallBack;
 
 1335                boost::shared_ptr<CallBack> call_back =
 
 1337                                                           this, callout_handle, query, rsp, subnet));
 
 1338                callout_handle_state->on_completion_ = [call_back]() {
 
 1359                      .arg(query->getLabel());
 
 1370                          .arg(query->getLabel());
 
 
 1391        } 
catch (
const std::exception& e) {
 
 1393                .arg(query->getLabel())
 
 1397            .arg(query->getLabel());
 
 
 1405    query->addPktEvent(
"process_completed");
 
 1411    bool skip_pack = 
false;
 
 1429        callout_handle->setArgument(
"query6", query);
 
 1432        callout_handle->setArgument(
"response6", rsp);
 
 1435        callout_handle->setArgument(
"subnet6", subnet);
 
 1447                .arg(rsp->getLabel());
 
 1454                .arg(rsp->getLabel());
 
 1464        } 
catch (
const std::exception& e) {
 
 1466                .arg(query->getLabel())
 
 
 1498            callout_handle->setArgument(
"response6", rsp);
 
 1511                    .arg(rsp->getLabel());
 
 1515            callout_handle->getArgument(
"response6", rsp);
 
 1519            .arg(rsp->getLabel())
 
 1520            .arg(rsp->getName())
 
 1521            .arg(
static_cast<int>(rsp->getType()))
 
 1522            .arg(rsp->getLocalAddr().isV6Zero() ? 
"*" : rsp->getLocalAddr().toText())
 
 1523            .arg(rsp->getLocalPort())
 
 1524            .arg(rsp->getRemoteAddr())
 
 1525            .arg(rsp->getRemotePort())
 
 1526            .arg(rsp->getIface());
 
 1529            .arg(rsp->getLabel())
 
 1530            .arg(rsp->getName())
 
 1531            .arg(
static_cast<int>(rsp->getType()))
 
 1532            .arg(rsp->toText());
 
 1538    } 
catch (
const std::exception& e) {
 
 1540            .arg(rsp->getLabel())
 
 
 1552    for (
auto const& it : 
data) {
 
 1556        tmp << hex << setw(2) << setfill('0') << static_cast<uint16_t>(it);
 
 
 1570        answer->addOption(clientid);
 
 1575    if (!question->relay_info_.empty()) {
 
 1576        answer->copyRelayInfo(question);
 
 
 1594        co_list.push_back(ctx.
currentHost()->getCfgOption6());
 
 1602                ctx.
subnet_->getPool(resource.getPrefixLength() == 128 ?
 
 1604                                     resource.getAddress(),
 
 1606            if (pool && !pool->getCfgOption()->empty()) {
 
 1607                co_list.push_back(pool->getCfgOption());
 
 1612        if (!ctx.
subnet_->getCfgOption()->empty()) {
 
 1613            co_list.push_back(ctx.
subnet_->getCfgOption());
 
 1618        ctx.
subnet_->getSharedNetwork(network);
 
 1619        if (network && !network->getCfgOption()->empty()) {
 
 1620            co_list.push_back(network->getCfgOption());
 
 1626    for (
auto const& cclass : classes) {
 
 1629            getClientClassDictionary()->findClass(cclass);
 
 1634                    .arg(question->getLabel())
 
 1641        if (ccdef->getCfgOption()->empty()) {
 
 1646        co_list.push_back(ccdef->getCfgOption());
 
 
 1659    if (co_list.empty()) {
 
 1663    set<uint16_t> requested_opts;
 
 1672        for (uint16_t code : option_oro->getValues()) {
 
 1673            static_cast<void>(requested_opts.insert(code));
 
 1677    set<uint16_t> cancelled_opts;
 
 1681    for (
auto const& copts : co_list) {
 
 1689        BOOST_FOREACH(
auto const& desc, prange) {
 
 1692                uint16_t code = desc.option_->getType();
 
 1693                static_cast<void>(requested_opts.insert(code));
 
 1699        BOOST_FOREACH(
auto const& desc, crange) {
 
 1702                uint16_t code = desc.option_->getType();
 
 1703                static_cast<void>(cancelled_opts.insert(code));
 
 1708    const auto& cclasses = question->getClasses();
 
 1711    for (uint16_t opt : requested_opts) {
 
 1713        if (cancelled_opts.count(opt) > 0) {
 
 1721        if (!answer->getOption(opt)) {
 
 1723            for (
auto const& copts : co_list) {
 
 1728                    answer->addOption(desc.
option_);
 
 1741        set<uint32_t> vendor_ids;
 
 1745            vendor_class = boost::dynamic_pointer_cast<OptionVendorClass>(opt.second);
 
 1747                uint32_t vendor_id = vendor_class->getVendorId();
 
 1748                static_cast<void>(vendor_ids.insert(vendor_id));
 
 1752        for (
auto const& copts : co_list) {
 
 1755                if (!desc.option_ || !desc.allowedForClientClasses(cclasses)) {
 
 1759                    boost::dynamic_pointer_cast<OptionVendorClass>(desc.option_);
 
 1760                if (!vendor_class) {
 
 1764                uint32_t vendor_id = vendor_class->getVendorId();
 
 1765                if (vendor_ids.count(vendor_id) > 0) {
 
 1769                answer->addOption(desc.option_);
 
 1770                static_cast<void>(vendor_ids.insert(vendor_id));
 
 1779        set<uint32_t> vendor_ids;
 
 1783            vendor_opts = boost::dynamic_pointer_cast<OptionVendor>(opt.second);
 
 1785                uint32_t vendor_id = vendor_opts->getVendorId();
 
 1786                static_cast<void>(vendor_ids.insert(vendor_id));
 
 1790        for (
auto const& copts : co_list) {
 
 1793                if (!desc.option_ || !desc.allowedForClientClasses(cclasses)) {
 
 1797                    boost::dynamic_pointer_cast<OptionVendor>(desc.option_);
 
 1802                uint32_t vendor_id = vendor_opts->getVendorId();
 
 1803                if (vendor_ids.count(vendor_id) > 0) {
 
 1809                answer->addOption(vendor_opts);
 
 1810                static_cast<void>(vendor_ids.insert(vendor_id));
 
 
 1829    if (!ctx.
subnet_ || co_list.empty()) {
 
 1833    set<uint32_t> vendor_ids;
 
 1837    map<uint32_t, OptionVendorPtr> vendor_rsps;
 
 1840        vendor_rsp = boost::dynamic_pointer_cast<OptionVendor>(opt.second);
 
 1842            uint32_t vendor_id = vendor_rsp->getVendorId();
 
 1843            vendor_rsps[vendor_id] = vendor_rsp;
 
 1844            static_cast<void>(vendor_ids.insert(vendor_id));
 
 1850    map<uint32_t, OptionVendorPtr> vendor_reqs;
 
 1853        vendor_req = boost::dynamic_pointer_cast<OptionVendor>(opt.second);
 
 1855            uint32_t vendor_id = vendor_req->getVendorId();
 
 1856            vendor_reqs[vendor_id] = vendor_req;
 
 1857            static_cast<void>(vendor_ids.insert(vendor_id));
 
 1865        vendor_class = boost::dynamic_pointer_cast<OptionVendorClass>(opt.second);
 
 1867            uint32_t vendor_id = vendor_class->getVendorId();
 
 1868            static_cast<void>(vendor_ids.insert(vendor_id));
 
 1874    if (vendor_ids.empty()) {
 
 1878    map<uint32_t, set<uint16_t> > requested_opts;
 
 1892            oro = boost::dynamic_pointer_cast<OptionUint16Array>(oro_generic);
 
 1895            set<uint16_t> oro_req_opts;
 
 1896            for (uint16_t code : oro->getValues()) {
 
 1897                static_cast<void>(oro_req_opts.insert(code));
 
 1903    map<uint32_t, set<uint16_t> > cancelled_opts;
 
 1904    const auto& cclasses = question->getClasses();
 
 1908    for (uint32_t vendor_id : vendor_ids) {
 
 1909        for (
auto const& copts : co_list) {
 
 1917            BOOST_FOREACH(
auto const& desc, prange) {
 
 1918                if (!desc.option_) {
 
 1922                uint16_t code = desc.option_->getType();
 
 1923                static_cast<void>(requested_opts[vendor_id].insert(code));
 
 1928            BOOST_FOREACH(
auto const& desc, crange) {
 
 1929                if (!desc.option_) {
 
 1933                uint16_t code = desc.option_->getType();
 
 1934                static_cast<void>(cancelled_opts[vendor_id].insert(code));
 
 1943        if (requested_opts[vendor_id].empty()) {
 
 1950        if (vendor_rsps.count(vendor_id) > 0) {
 
 1951            vendor_rsp = vendor_rsps[vendor_id];
 
 1959        for (uint16_t opt : requested_opts[vendor_id]) {
 
 1960            if (cancelled_opts[vendor_id].count(opt) > 0) {
 
 1963            if (!vendor_rsp->getOption(opt)) {
 
 1964                for (
auto const& copts : co_list) {
 
 1969                        vendor_rsp->addOption(desc.
option_);
 
 1979        if (added && (vendor_rsps.count(vendor_id) == 0)) {
 
 1980            answer->addOption(vendor_rsp);
 
 
 1988        switch (pkt->getType()) {
 
 2011                .arg(pkt->getLabel())
 
 2012                .arg(
static_cast<int>(pkt->getType()))
 
 2013                .arg(pkt->getIface());
 
 2018            .arg(pkt->getLabel())
 
 2019            .arg(pkt->getName())
 
 2020            .arg(pkt->getRemoteAddr().toText())
 
 
 2035        if (client_ids.size() != 1) {
 
 2037                      << pkt->getName() << 
", but " << client_ids.size()
 
 2044        if (client_ids.size() > 1) {
 
 2046                      << 
") client-id options received in " << pkt->getName());
 
 2048        if (!client_ids.empty()) {
 
 2061        if (!server_ids.empty()) {
 
 2063                      << server_ids.size() << 
" received in " << pkt->getName());
 
 2068        if (server_ids.size() != 1) {
 
 2070                      << server_ids.size() << 
"), exactly 1 expected in message " 
 2077        if (server_ids.size() > 1) {
 
 2079                      << 
") server-id options received in " << pkt->getName());
 
 2081        if (!server_ids.empty()) {
 
 
 2094    uint16_t len = opt->len() - opt->getHeaderLen();
 
 
 2107        getCfgSubnets6()->selectSubnet(selector);
 
 2117        shared_ptr<ScopedCalloutHandleState> callout_handle_state(
 
 2118            std::make_shared<ScopedCalloutHandleState>(callout_handle));
 
 2124        callout_handle->setArgument(
"query6", question);
 
 2125        callout_handle->setArgument(
"subnet6", subnet);
 
 2130        callout_handle->setArgument(
"subnet6collection",
 
 2132                                    getCfgSubnets6()->getAll());
 
 2134        auto const tpl(parkingLimitExceeded(
"subnet6_select"));
 
 2135        bool const exceeded(
get<0>(tpl));
 
 2137            uint32_t 
const limit(
get<1>(tpl));
 
 2142                .arg(question->getLabel());
 
 2149        HooksManager::park(
"subnet6_select", question, [
this, question, callout_handle_state]() {
 
 2151                boost::shared_ptr<function<void()>> callback(
 
 2152                    boost::make_shared<function<
void()>>([
this, question]() 
mutable {
 
 2155                callout_handle_state->on_completion_ = [callback]() {
 
 2177                .arg(question->getLabel());
 
 2190                .arg(question->getLabel());
 
 2198                .arg(question->getLabel());
 
 2204        callout_handle->getArgument(
"subnet6", subnet);
 
 2210            .arg(question->getLabel())
 
 2211            .arg(subnet->getID());
 
 2215            .arg(question->getLabel())
 
 2216            .arg(subnet->toText());
 
 2220            .arg(question->getLabel());
 
 
 2245    for (
auto const& opt : question->options_) {
 
 2246        switch (opt.second->getType()) {
 
 2249                                               boost::dynamic_pointer_cast<
 
 2252                answer->addOption(answer_opt);
 
 2258                                               boost::dynamic_pointer_cast<
 
 2261                answer->addOption(answer_opt);
 
 
 2287        if (ddns_params->getEnableUpdates() &&
 
 2297                .arg(question->getLabel());
 
 2310        .arg(question->getLabel())
 
 2311        .arg(fqdn->toText());
 
 2330                                                    *ddns_params, 
true),
 
 2340    ctx.
hostname_ = fqdn_resp->getDomainName();
 
 2347        .arg(question->getLabel())
 
 2348        .arg(fqdn_resp->toText());
 
 2349    answer->addOption(fqdn_resp);
 
 2364        callout_handle->setArgument(
"query6", question);
 
 2365        callout_handle->setArgument(
"response6", answer);
 
 2366        callout_handle->setArgument(
"subnet6", subnet);
 
 2367        callout_handle->setArgument(
"hostname", ctx.
hostname_);
 
 2370        callout_handle->setArgument(
"ddns-params", ddns_params);
 
 2376        string hook_hostname;
 
 2377        bool hook_fwd_dns_update;
 
 2378        bool hook_rev_dns_update;
 
 2379        callout_handle->getArgument(
"hostname", hook_hostname);
 
 2380        callout_handle->getArgument(
"fwd-update", hook_fwd_dns_update);
 
 2381        callout_handle->getArgument(
"rev-update", hook_rev_dns_update);
 
 2392            fqdn_resp = boost::dynamic_pointer_cast<Option6ClientFqdn>(answer->getOption(
D6O_CLIENT_FQDN));
 
 2395                if (!(hook_fwd_dns_update || hook_rev_dns_update)) {
 
 
 2422                  << 
" encapsulating server's message must not be" 
 2423                  << 
" NULL when creating DNS NameChangeRequest");
 
 2436    bool do_fwd = 
false;
 
 2437    bool do_rev = 
false;
 
 2447                  "client identifier is required when creating a new" 
 2448                  " DNS NameChangeRequest");
 
 2455    opt_fqdn->packDomainName(name_buf);
 
 2456    const std::vector<uint8_t>& buf_vec = name_buf.
getVector();
 
 2480        bool extended_only = 
false;
 
 2482        IOAddress ia_address = iaaddr->getAddress();
 
 2483        for (
auto const& l : ia_ctx.reused_leases_) {
 
 2484            if (l->addr_ == ia_address) {
 
 2485                extended_only = 
true;
 
 2490        if (extended_only) {
 
 2497        for (
auto const& l : ia_ctx.changed_leases_) {
 
 2499            if (l->addr_ == ia_address) {
 
 2503                if ((l->reuseable_valid_lft_ > 0) ||
 
 2505                    (l->hostname_ == opt_fqdn->getDomainName() &&
 
 2506                     l->fqdn_fwd_ == do_fwd && l->fqdn_rev_ == do_rev))) {
 
 2507                    extended_only = 
true;
 
 2519        if (!(do_fwd || do_rev) || (extended_only)) {
 
 2535                                        opt_fqdn->getDomainName(),
 
 2536                                        iaaddr->getAddress().toText(),
 
 2545            .arg(answer->getLabel())
 
 2546            .arg(ncr->toText());
 
 
 2562        getMACSources().get();
 
 2564    for (
auto const& it : mac_sources) {
 
 2565        hwaddr = pkt->getMAC(it);
 
 
 2581        BOOST_FOREACH(
auto const& resv, resvs) {
 
 2582            if ((resv.second.getPrefix() == lease->addr_) &&
 
 2583                (resv.second.getPrefixLen() == lease->prefixlen_)) {
 
 2584                return (resv.second.getPDExclude());
 
 2591    Pool6Ptr pool = boost::dynamic_pointer_cast<Pool6>(
 
 2594        return (pool->getPrefixExcludeOption());
 
 
 2602                       boost::shared_ptr<Option6IA> ia) {
 
 2608        boost::dynamic_pointer_cast<Option6IAAddr>(ia->getOption(
D6O_IAADDR));
 
 2611        hint = hint_opt->getAddress();
 
 2616            .arg(query->getLabel())
 
 2618            .arg(hint_opt ? hint.
toText() : 
"(no hint)");
 
 2621            .arg(query->getLabel())
 
 2623            .arg(hint_opt ? hint.
toText() : 
"(no hint)");
 
 2643                                           "Server could not select subnet for" 
 2666    if (!leases.empty()) {
 
 2667        lease = *leases.begin();
 
 2681                .arg(query->getLabel())
 
 2682                .arg(lease->addr_.toText())
 
 2683                .arg(ia->getIAID());
 
 2684        } 
else if (lease->reuseable_valid_lft_ == 0) {
 
 2686                .arg(query->getLabel())
 
 2687                .arg(lease->addr_.toText())
 
 2691            lease->valid_lft_ = lease->reuseable_valid_lft_;
 
 2692            lease->preferred_lft_ = lease->reuseable_preferred_lft_;
 
 2695                .arg(query->getLabel())
 
 2696                .arg(lease->addr_.toText())
 
 2703                                                                 "v6-ia-na-lease-reuses"),
 
 2707            .arg(query->getLabel())
 
 2709            .arg(lease->toText());
 
 2712        setTeeTimes(lease->preferred_lft_, subnet, ia_rsp);
 
 2715                                                lease->preferred_lft_,
 
 2716                                                lease->valid_lft_));
 
 2717        ia_rsp->addOption(addr);
 
 2730            .arg(query->getLabel())
 
 2731            .arg(ia->getIAID());
 
 2733        ia_rsp->addOption(createStatusCode(*query, *ia_rsp,
 
 2735                                           "Sorry, no address could be" 
 
 2744                       boost::shared_ptr<Option6IA> ia) {
 
 2751        boost::dynamic_pointer_cast<Option6IAPrefix>(ia->getOption(
D6O_IAPREFIX));
 
 2754        hint = hint_opt->getAddress();
 
 2759            .arg(query->getLabel())
 
 2761            .arg(hint_opt ? hint.
toText() : 
"(no hint)");
 
 2764            .arg(query->getLabel())
 
 2766            .arg(hint_opt ? hint.
toText() : 
"(no hint)");
 
 2784                                           "Sorry, no subnet available."));
 
 2805    if (!leases.empty()) {
 
 2809        uint32_t min_preferred_lft = (*leases.begin())->preferred_lft_;
 
 2811        const bool pd_exclude_requested = requestedInORO(query, 
D6O_PD_EXCLUDE);
 
 2812        for (
auto const& l : leases) {
 
 2818                    .arg(query->getLabel())
 
 2819                    .arg(l->addr_.toText())
 
 2820                    .arg(
static_cast<int>(l->prefixlen_))
 
 2821                    .arg(ia->getIAID());
 
 2822            } 
else if (l->reuseable_valid_lft_ == 0) {
 
 2824                    .arg(query->getLabel())
 
 2825                    .arg(l->addr_.toText())
 
 2826                    .arg(
static_cast<int>(l->prefixlen_))
 
 2830                l->valid_lft_ = l->reuseable_valid_lft_;
 
 2831                l->preferred_lft_ = l->reuseable_preferred_lft_;
 
 2833                    .arg(query->getLabel())
 
 2834                    .arg(l->addr_.toText())
 
 2835                    .arg(
static_cast<int>(l->prefixlen_))
 
 2842                                                                    "v6-ia-pd-lease-reuses"),
 
 2847            if ((l->preferred_lft_ > 0) && (min_preferred_lft > l->preferred_lft_)) {
 
 2848                min_preferred_lft = l->preferred_lft_;
 
 2851            boost::shared_ptr<Option6IAPrefix>
 
 2853                                         l->prefixlen_, l->preferred_lft_,
 
 2855            ia_rsp->addOption(addr);
 
 2857            if (pd_exclude_requested) {
 
 2859                if (pd_exclude_option) {
 
 2860                    addr->addOption(pd_exclude_option);
 
 2879            .arg(query->getLabel())
 
 2880            .arg(ia->getIAID());
 
 2882        ia_rsp->addOption(createStatusCode(*query, *ia_rsp,
 
 2884                                           "Sorry, no prefixes could" 
 
 2893                       boost::shared_ptr<Option6IA> ia) {
 
 2896        .arg(query->getLabel())
 
 2897        .arg(ia->getIAID());
 
 2916                          "Sorry, no known leases for this duid/iaid."));
 
 2928    for (
auto const& it : addrs) {
 
 2932        Option6IAAddrPtr iaaddr = boost::dynamic_pointer_cast<Option6IAAddr>(it.second);
 
 2959    uint32_t min_preferred_lft = std::numeric_limits<uint32_t>::max();
 
 2962    for (
auto const& l : leases) {
 
 2963        if (l->reuseable_valid_lft_ == 0) {
 
 2965                .arg(query->getLabel())
 
 2966                .arg(l->addr_.toText())
 
 2967                .arg(ia->getIAID());
 
 2969            l->valid_lft_ = l->reuseable_valid_lft_;
 
 2970            l->preferred_lft_ = l->reuseable_preferred_lft_;
 
 2972                .arg(query->getLabel())
 
 2973                .arg(l->addr_.toText())
 
 2980                                                                 "v6-ia-na-lease-reuses"),
 
 2985                                l->addr_, l->preferred_lft_, l->valid_lft_));
 
 2986        ia_rsp->addOption(iaaddr);
 
 2989        if ((l->preferred_lft_ > 0) && (min_preferred_lft > l->preferred_lft_)) {
 
 2990            min_preferred_lft = l->preferred_lft_;
 
 2995        hints.erase(std::remove(hints.begin(), hints.end(), hint_type),
 
 3005        if (
equalValues(query->getClientId(), l->duid_)) {
 
 3008            ia_rsp->addOption(iaaddr);
 
 3013        hints.erase(std::remove(hints.begin(), hints.end(), hint_type), hints.end());
 
 3021                .arg(query->getLabel())
 
 3033    for (
auto const& hint : hints) {
 
 3035                                                  hint.getAddress(), 0, 0));
 
 3036        ia_rsp->addOption(iaaddr);
 
 3039    if (!leases.empty()) {
 
 3045        ia_rsp->addOption(createStatusCode(*query, *ia_rsp,
 
 3047                                           "Sorry, no addresses could be" 
 3048                                           " assigned at this time."));
 
 
 3057                       boost::shared_ptr<Option6IA> ia) {
 
 3060        .arg(query->getLabel())
 
 3061        .arg(ia->getIAID());
 
 3078                                               "Sorry, no known PD leases" 
 3079                                               " for this duid/iaid."));
 
 3099                      " client sending Rebind to extend lifetime of the" 
 3100                      " prefix (DUID=" << duid->toText() << 
", IAID=" 
 3101                      << ia->getIAID() << 
")");
 
 3113    for (
auto const& it : addrs) {
 
 3147    const bool pd_exclude_requested = requestedInORO(query, 
D6O_PD_EXCLUDE);
 
 3151    uint32_t min_preferred_lft = std::numeric_limits<uint32_t>::max();
 
 3153    for (
auto const& l : leases) {
 
 3154        if (l->reuseable_valid_lft_ == 0) {
 
 3156                .arg(query->getLabel())
 
 3157                .arg(l->addr_.toText())
 
 3158                .arg(
static_cast<int>(l->prefixlen_))
 
 3159                .arg(ia->getIAID());
 
 3161            l->valid_lft_ = l->reuseable_valid_lft_;
 
 3162            l->preferred_lft_ = l->reuseable_preferred_lft_;
 
 3164                .arg(query->getLabel())
 
 3165                .arg(l->addr_.toText())
 
 3166                .arg(
static_cast<int>(l->prefixlen_))
 
 3173                                                                 "v6-ia-pd-lease-reuses"),
 
 3178                               l->addr_, l->prefixlen_,
 
 3179                               l->preferred_lft_, l->valid_lft_));
 
 3180        ia_rsp->addOption(prf);
 
 3182        if (pd_exclude_requested) {
 
 3184            if (pd_exclude_option) {
 
 3185                prf->addOption(pd_exclude_option);
 
 3190        if ((l->preferred_lft_ > 0) && (l->preferred_lft_ < min_preferred_lft)) {
 
 3191            min_preferred_lft = l->preferred_lft_;
 
 3196        hints.erase(std::remove(hints.begin(), hints.end(), hint_type),
 
 3206        if (
equalValues(query->getClientId(), l->duid_)) {
 
 3208                                                          l->prefixlen_, 0, 0));
 
 3209            ia_rsp->addOption(prefix);
 
 3214        hints.erase(std::remove(hints.begin(), hints.end(), hint_type), hints.end());
 
 3219    for (
auto const& prefix : hints) {
 
 3224        if (!prefix.getAddress().isV6Zero()) {
 
 3226                                                     prefix.getAddress(),
 
 3227                                                     prefix.getPrefixLength(),
 
 3229            ia_rsp->addOption(prefix_opt);
 
 3233    if (!leases.empty()) {
 
 3240        ia_rsp->addOption(createStatusCode(*query, *ia_rsp,
 
 3242                                           "Sorry, no prefixes could be" 
 3243                                           " assigned at this time."));
 
 
 3264    for (
auto const& opt : query->options_) {
 
 3265        switch (opt.second->getType()) {
 
 3268                                               boost::dynamic_pointer_cast<
 
 3271                reply->addOption(answer_opt);
 
 3278                                               boost::dynamic_pointer_cast<
 
 3281                reply->addOption(answer_opt);
 
 
 3317    for (
auto const& opt : release->options_) {
 
 3319        switch (opt.second->getType()) {
 
 3322                                                boost::dynamic_pointer_cast<Option6IA>(opt.second),
 
 3325                reply->addOption(answer_opt);
 
 3331                                                boost::dynamic_pointer_cast<Option6IA>(opt.second),
 
 3334                reply->addOption(answer_opt);
 
 3351    reply->addOption(createStatusCode(*release, general_status,
 
 3352                     "Summary status for all processed IA_NAs"));
 
 
 3357                        int& general_status, boost::shared_ptr<Option6IA> ia,
 
 3361        .arg(query->getLabel())
 
 3362        .arg(ia->getIAID());
 
 3378    if (!release_addr) {
 
 3380                                           "You did not include an address in your RELEASE"));
 
 3386                                                            release_addr->getAddress());
 
 3393                          "Sorry, no known leases for this duid/iaid, can't release."));
 
 3399    if (!lease->duid_) {
 
 3405            .arg(query->getLabel())
 
 3406            .arg(release_addr->getAddress().toText());
 
 3410                          "Database consistency check failed when trying to RELEASE"));
 
 3414    if (*duid != *(lease->duid_)) {
 
 3418            .arg(query->getLabel())
 
 3419            .arg(release_addr->getAddress().toText())
 
 3420            .arg(lease->duid_->toText());
 
 3424                          "This address does not belong to you, you can't release it"));
 
 3428    if (ia->getIAID() != lease->iaid_) {
 
 3431            .arg(query->getLabel())
 
 3432            .arg(release_addr->getAddress().toText())
 
 3434            .arg(ia->getIAID());
 
 3436                          "This is your address, but you used wrong IAID"));
 
 3459        callout_handle->deleteAllArguments();
 
 3462        callout_handle->setArgument(
"query6", query);
 
 3465        callout_handle->setArgument(
"lease6", lease);
 
 3477                .arg(query->getLabel());
 
 3482    bool success = 
false; 
 
 3483    bool expired = 
false; 
 
 3490        if (expiration_cfg->getFlushReclaimedTimerWaitTime() &&
 
 3491            expiration_cfg->getHoldReclaimedTime() &&
 
 3494            lease->valid_lft_ = 0;
 
 3495            lease->preferred_lft_ = 0;
 
 3515                          "Server failed to release a lease"));
 
 3518            .arg(query->getLabel())
 
 3519            .arg(lease->addr_.toText())
 
 3528            .arg(query->getLabel())
 
 3529            .arg(lease->addr_.toText())
 
 3532        ia_rsp->addOption(createStatusCode(*query, *ia_rsp, 
STATUS_Success,
 
 3533                          "Lease released. Thank you, please come again."));
 
 3537                .arg(query->getLabel())
 
 3538                .arg(lease->addr_.toText())
 
 3542                .arg(query->getLabel())
 
 3543                .arg(lease->addr_.toText())
 
 3555            static_cast<int64_t
>(-1));
 
 3559            auto const& pool = subnet->getPool(
Lease::TYPE_NA, lease->addr_, 
false);
 
 3564                    static_cast<int64_t
>(-1));
 
 
 3574                        int& general_status, boost::shared_ptr<Option6IA> ia,
 
 3589    boost::shared_ptr<Option6IAPrefix> release_prefix =
 
 3590        boost::dynamic_pointer_cast<Option6IAPrefix>(ia->getOption(
D6O_IAPREFIX));
 
 3591    if (!release_prefix) {
 
 3593                          "You did not include a prefix in your RELEASE"));
 
 3599                                                            release_prefix->getAddress());
 
 3606                          "Sorry, no known leases for this duid/iaid, can't release."));
 
 3612    if (!lease->duid_) {
 
 3617            .arg(query->getLabel())
 
 3618            .arg(release_prefix->getAddress().toText())
 
 3619            .arg(
static_cast<int>(release_prefix->getLength()));
 
 3623                          "Database consistency check failed when trying to RELEASE"));
 
 3627    if (*duid != *(lease->duid_)) {
 
 3630            .arg(query->getLabel())
 
 3631            .arg(release_prefix->getAddress().toText())
 
 3632            .arg(
static_cast<int>(release_prefix->getLength()))
 
 3633            .arg(lease->duid_->toText());
 
 3637                          "This address does not belong to you, you can't release it"));
 
 3641    if (ia->getIAID() != lease->iaid_) {
 
 3644            .arg(query->getLabel())
 
 3645            .arg(release_prefix->getAddress().toText())
 
 3646            .arg(
static_cast<int>(release_prefix->getLength()))
 
 3648            .arg(ia->getIAID());
 
 3650                          "This is your address, but you used wrong IAID"));
 
 3673        callout_handle->setArgument(
"query6", query);
 
 3676        callout_handle->setArgument(
"lease6", lease);
 
 3688                .arg(query->getLabel());
 
 3693    bool success = 
false; 
 
 3694    bool expired = 
false; 
 
 3701        if (expiration_cfg->getFlushReclaimedTimerWaitTime() &&
 
 3702            expiration_cfg->getHoldReclaimedTime() &&
 
 3705            lease->valid_lft_ = 0;
 
 3706            lease->preferred_lft_ = 0;
 
 3726                          "Server failed to release a lease"));
 
 3729            .arg(query->getLabel())
 
 3730            .arg(lease->addr_.toText())
 
 3731            .arg(
static_cast<int>(lease->prefixlen_))
 
 3739            .arg(query->getLabel())
 
 3740            .arg(lease->addr_.toText())
 
 3741            .arg(
static_cast<int>(lease->prefixlen_))
 
 3744        ia_rsp->addOption(createStatusCode(*query, *ia_rsp, 
STATUS_Success,
 
 3745                          "Lease released. Thank you, please come again."));
 
 3749                .arg(query->getLabel())
 
 3750                .arg(lease->addr_.toText())
 
 3751                .arg(
static_cast<int>(lease->prefixlen_))
 
 3755                .arg(query->getLabel())
 
 3756                .arg(lease->addr_.toText())
 
 3757                .arg(
static_cast<int>(lease->prefixlen_))
 
 3764            static_cast<int64_t
>(-1));
 
 3768            auto const& pool = subnet->getPool(
Lease::TYPE_PD, lease->addr_, 
false);
 
 3773                    static_cast<int64_t
>(-1));
 
 
 3790        if (opt_rapid_commit) {
 
 3793                .arg(solicit->getLabel());
 
 3798            response->addOption(opt_rapid_commit);
 
 3831        .arg(solicit->getLabel())
 
 3832        .arg(solicit->getName())
 
 3833        .arg(solicit->getClasses().toText());
 
 3842    updateReservedFqdn(ctx, response);
 
 
 3875        .arg(request->getLabel())
 
 3876        .arg(request->getName())
 
 3877        .arg(request->getClasses().toText());
 
 3886    updateReservedFqdn(ctx, reply);
 
 3887    generateFqdn(reply, ctx);
 
 
 3915        .arg(renew->getLabel())
 
 3916        .arg(renew->getName())
 
 3917        .arg(renew->getClasses().toText());
 
 3926    updateReservedFqdn(ctx, reply);
 
 3927    generateFqdn(reply, ctx);
 
 
 3955        .arg(rebind->getLabel())
 
 3956        .arg(rebind->getName())
 
 3957        .arg(rebind->getClasses().toText());
 
 3966    updateReservedFqdn(ctx, reply);
 
 3967    generateFqdn(reply, ctx);
 
 
 3982        .arg(confirm->getLabel())
 
 3983        .arg(confirm->getName())
 
 3984        .arg(confirm->getClasses().toText());
 
 4005    bool verified = 
false;
 
 4014    for (
auto const& ia : ias) {
 
 4016        for (
auto const& opt : opts) {
 
 4028                    if (subnet && !subnet->inRange(iaaddr->getAddress())) {
 
 4029                        std::ostringstream status_msg;
 
 4030                        status_msg << 
"Address " << iaaddr->getAddress()
 
 4031                                   << 
" is not on link.";
 
 4032                        reply->addOption(createStatusCode(*confirm,
 
 4040                              " to the Option6IAAddrPtr. This is programming" 
 4041                              " error and should be reported");
 
 4058                                          "All addresses are on-link"));
 
 4061                                          "No subnet selected"));
 
 
 4076        .arg(release->getLabel())
 
 4077        .arg(release->getName())
 
 4078        .arg(release->getClasses().toText());
 
 
 4108        .arg(decline->getLabel())
 
 4109        .arg(decline->getName())
 
 4110        .arg(decline->getClasses().toText());
 
 
 4149    for (
auto const& opt : decline->options_) {
 
 4150        switch (opt.second->getType()) {
 
 4153                                             boost::dynamic_pointer_cast<Option6IA>(opt.second),
 
 4158                reply->addOption(answer_opt);
 
 
 4179                     int& general_status, boost::shared_ptr<Option6IA> ia,
 
 4183        .arg(decline->getLabel())
 
 4184        .arg(ia->getIAID());
 
 4199    int total_addrs = 0; 
 
 4200    for (
auto const& opt : opts) {
 
 4209        if (!decline_addr) {
 
 4216                                                                decline_addr->getAddress());
 
 4221                .arg(decline->getLabel()).arg(decline_addr->getAddress().toText());
 
 4229                                  "Server does not know about such an address."));
 
 4237        if (!lease->duid_) {
 
 4243                .arg(decline->getLabel())
 
 4244                .arg(decline_addr->getAddress().toText());
 
 4247                    "Database consistency check failed when attempting Decline."));
 
 4253        if (*duid != *(lease->duid_)) {
 
 4257                .arg(decline->getLabel())
 
 4258                .arg(decline_addr->getAddress().toText())
 
 4259                .arg(lease->duid_->toText());
 
 4262                     "This address does not belong to you, you can't decline it"));
 
 4268        if (ia->getIAID() != lease->iaid_) {
 
 4271                .arg(decline->getLabel())
 
 4272                .arg(lease->addr_.toText())
 
 4276                              "This is your address, but you used wrong IAID"));
 
 4288            new_leases.push_back(lease);
 
 4292    if (total_addrs == 0) {
 
 4294                                               "No addresses sent in IA_NA"));
 
 
 4307    container->addOption(status);
 
 
 4312                        boost::shared_ptr<Option6IA> ia_rsp) {
 
 4336        callout_handle->setArgument(
"query6", decline);
 
 4339        callout_handle->setArgument(
"lease6", lease);
 
 4350                .arg(decline->getLabel())
 
 4351                .arg(decline->getIface())
 
 4352                .arg(lease->addr_.toText());
 
 4360                .arg(decline->getLabel())
 
 4361                .arg(decline->getIface())
 
 4362                .arg(lease->addr_.toText());
 
 4367    Lease6Ptr old_values = boost::make_shared<Lease6>(*lease);
 
 4381            .arg(decline->getLabel())
 
 4382            .arg(lease->addr_.toText())
 
 4395        static_cast<int64_t
>(1));
 
 4399        auto const& pool = subnet->getPool(
Lease::TYPE_NA, lease->addr_, 
false);
 
 4404                static_cast<int64_t
>(1));
 
 4412        .arg(lease->addr_.toText()).arg(lease->valid_lft_);
 
 4414    ia_rsp->addOption(createStatusCode(*decline, *ia_rsp, 
STATUS_Success,
 
 4415                      "Lease declined. Hopefully the next one will be better."));
 
 
 4429        .arg(inf_request->getLabel())
 
 4430        .arg(inf_request->getName())
 
 4431        .arg(inf_request->getClasses().toText());
 
 
 4492    IOAddress addr = addr_reg_inf->getRemoteAddr();
 
 4495    size_t relay_level = addr_reg_inf->relay_info_.size();
 
 4496    if (relay_level > 0) {
 
 4497        addr = addr_reg_inf->getRelay6LinkAddress(relay_level - 1);
 
 4502    const uint32_t no_iaid = 0; 
 
 4507        if (addr_reg_inf->getOption(
D6O_IA_NA)) {
 
 4512        if (addr_reg_inf->getOption(
D6O_IA_TA)) {
 
 4517        if (addr_reg_inf->getOption(
D6O_IA_PD)) {
 
 4524        if (addrs.size() != 1) {
 
 4526                      << addrs.size() << 
" received");
 
 4528        iaaddr = boost::dynamic_pointer_cast<Option6IAAddr>(addrs.begin()->second);
 
 4534        if (addr != iaaddr->getAddress()) {
 
 4536                      << 
" wants to register " << iaaddr->getAddress());
 
 4540        if (!subnet->inRange(addr)) {
 
 4542                      << subnet->
toText() << 
" (id " << subnet->getID() << 
")");
 
 4557        if (!hosts.empty()) {
 
 4560    } 
catch (
const std::exception &ex) {
 
 4570        if (old_lease->duid_ && (*ctx.
duid_ != *(old_lease->duid_))) {
 
 4573                .arg(ctx.
duid_->toText())
 
 4574                .arg(old_lease->duid_->toText());
 
 4580                                  addr_reg_inf->getTransid()));
 
 4581    addr_reg_rep->addOption(iaaddr);
 
 4589    ia->addOption(iaaddr);
 
 4596                               no_iaid, iaaddr->getPreferred(),
 
 4597                               iaaddr->getValid(), subnet->getID(),
 
 4609        .arg(addr_reg_inf->getLabel())
 
 4610        .arg(addr_reg_inf->getName())
 
 4611        .arg(addr_reg_inf->getClasses().toText());
 
 4629        callout_handle->setArgument(
"query6", addr_reg_inf);
 
 4633        callout_handle->setArgument(
"response6", addr_reg_rep);
 
 4636        callout_handle->setArgument(
"address6", addr);
 
 4639        callout_handle->setArgument(
"old_lease6", old_lease);
 
 4642        callout_handle->setArgument(
"new_lease6", lease);
 
 4652                .arg(addr_reg_inf->getLabel())
 
 4653                .arg(old_lease ? 
"update" : 
"add")
 
 4662                .arg(addr_reg_inf->getLabel())
 
 4673            } 
catch (
const std::exception& ex) {
 
 4683            if (old_lease->subnet_id_ != lease->subnet_id_) {
 
 4687                    static_cast<int64_t
>(-1));
 
 4691                    static_cast<int64_t
>(1));
 
 4694                                           "cumulative-registered-nas"),
 
 4695                    static_cast<int64_t
>(1));
 
 4708                static_cast<int64_t
>(1));
 
 4711                                       "cumulative-registered-nas"),
 
 4712                static_cast<int64_t
>(1));
 
 4714                                          static_cast<int64_t
>(1));
 
 4721    updateReservedFqdn(ctx, addr_reg_rep);
 
 4722    generateFqdn(addr_reg_rep, ctx);
 
 4725    return (addr_reg_rep);
 
 
 4728void Dhcpv6Srv::classifyByVendor(
const Pkt6Ptr& pkt) {
 
 4731        vclass = boost::dynamic_pointer_cast<OptionVendorClass>(opt.second);
 
 4732        if (!vclass || vclass->getTuplesNum() == 0) {
 
 4750    pkt->addClass(
"ALL");
 
 4753    classifyByVendor(pkt);
 
 
 4764    for (
auto const& it : *defs_ptr) {
 
 4772        if (it->getAdditional()) {
 
 4776        if (it->getDependOnKnown() != depend_on_known) {
 
 4779        it->test(pkt, expr_ptr);
 
 
 4788    for (
auto const& def : *defs_ptr) {
 
 4792        if (def->getMatchExpr()) {
 
 4793            pkt->classes_.erase(def->getName());
 
 
 4803        for (
auto const& cclass : classes) {
 
 4804            pkt->addClass(cclass);
 
 
 4814        ctx.
subnet_->getSharedNetwork(shared_network);
 
 4815        if (shared_network) {
 
 4817            if (host && (host->getIPv6SubnetID() != SUBNET_ID_GLOBAL)) {
 
 
 4836                ctx.
subnet_->getPool(resource.getPrefixLength() == 128 ?
 
 4838                                     resource.getAddress(),
 
 4841                const ClientClasses& pool_to_add = pool->getAdditionalClasses();
 
 4842                for (
auto const& cclass : pool_to_add) {
 
 4849        const ClientClasses& to_add = subnet->getAdditionalClasses();
 
 4850        for (
auto const& cclass : to_add) {
 
 4856        subnet->getSharedNetwork(network);
 
 4858            const ClientClasses& net_to_add = network->getAdditionalClasses();
 
 4859            for (
auto const& cclass : net_to_add) {
 
 4869    for (
auto const& cclass : classes) {
 
 4884            pkt->addClass(cclass);
 
 4892                .arg(pkt->getLabel())
 
 4894                .arg(status ? 
"true" : 
"false");
 
 4897                pkt->addClass(cclass);
 
 4901                .arg(pkt->getLabel())
 
 
 4913                  " a message must not be NULL when updating reserved FQDN");
 
 4924   std::string name = fqdn->getDomainName();
 
 4936       if (new_name != name) {
 
 4941           answer->addOption(fqdn);
 
 4947Dhcpv6Srv::generateFqdn(
const Pkt6Ptr& answer,
 
 4948                        AllocEngine::ClientContext6& ctx) {
 
 4950        isc_throw(isc::Unexpected, 
"an instance of the object encapsulating" 
 4951                  " a message must not be NULL when generating FQDN");
 
 4962    if (!fqdn || !fqdn->getDomainName().empty()) {
 
 4976    if (!iaaddr || iaaddr->getValid() == 0) {
 
 4981    IOAddress addr = iaaddr->getAddress();
 
 4982    std::string generated_name =
 
 4986        .arg(answer->getLabel())
 
 4987        .arg(generated_name);
 
 5004                lease->hostname_ = generated_name;
 
 5005                lease->reuseable_valid_lft_ = 0;
 
 5009                isc_throw(isc::Unexpected, 
"there is no lease in the database " 
 5010                          " for address " << addr << 
", so as it is impossible" 
 5011                          " to update FQDN data. This is a programmatic error" 
 5012                          " as the given address is now being handed to the" 
 5020        answer->addOption(fqdn);
 
 5022    } 
catch (
const Exception& ex) {
 
 5024            .arg(answer->getLabel())
 
 5038                                     this, ph::_1, ph::_2));
 
 
 5057              arg(result).arg((ncr ? ncr->toText() : 
" NULL "));
 
 
 5066    std::stringstream tmp;
 
 5070        tmp << 
" (" << EXTENDED_VERSION << 
")" << endl;
 
 5071        tmp << 
"premium: " << PREMIUM_EXTENDED_VERSION << endl;
 
 5072        tmp << 
"linked with:" << endl;
 
 5077            tmp << endl << 
"lease backends:";
 
 5079                tmp << endl << 
"- " << 
version;
 
 5084            tmp << endl << 
"host backends:";
 
 5086                tmp << endl << 
"- " << 
version;
 
 5091            tmp << endl << 
"forensic backends:";
 
 5093                tmp << endl << 
"- " << 
version;
 
 
 5104    if (query->relay_info_.empty()) {
 
 5115    for (
int i = query->relay_info_.size(); i > 0 ; --i) {
 
 5117        if (rsoo_container) {
 
 5122            for (
auto const& opt : rsoo) {
 
 5126                if (cfg_rsoo->enabled(opt.second->getType()) &&
 
 5127                    !rsp->getOption(opt.second->getType())) {
 
 5128                    rsp->addOption(opt.second);
 
 
 5137    if (query->relay_info_.empty()) {
 
 5145        return (query->getRemotePort());
 
 
 5151void Dhcpv6Srv::processStatsReceived(
const Pkt6Ptr& query) {
 
 5155    string stat_name = 
"pkt6-unknown-received";
 
 5156    switch (query->getType()) {
 
 5158        stat_name = 
"pkt6-solicit-received";
 
 5162        stat_name = 
"pkt6-advertise-received";
 
 5165        stat_name = 
"pkt6-request-received";
 
 5168        stat_name = 
"pkt6-confirm-received";
 
 5171        stat_name = 
"pkt6-renew-received";
 
 5174        stat_name = 
"pkt6-rebind-received";
 
 5178        stat_name = 
"pkt6-reply-received";
 
 5181        stat_name = 
"pkt6-release-received";
 
 5184        stat_name = 
"pkt6-decline-received";
 
 5187        stat_name = 
"pkt6-reconfigure-received";
 
 5190        stat_name = 
"pkt6-infrequest-received";
 
 5193        stat_name = 
"pkt6-dhcpv4-query-received";
 
 5197        stat_name = 
"pkt6-dhcpv4-response-received";
 
 5200        stat_name = 
"pkt6-addr-reg-inform-received";
 
 5204        stat_name = 
"pkt6-addr-reg-reply-received";
 
 5219    switch (response->getType()) {
 
 5221        stat_name = 
"pkt6-advertise-sent";
 
 5224        stat_name = 
"pkt6-reply-sent";
 
 5227        stat_name = 
"pkt6-dhcpv4-response-sent";
 
 5230        stat_name = 
"pkt6-addr-reg-reply-sent";
 
 
 5241    return (
Hooks.hook_index_buffer6_send_);
 
 
 5245Dhcpv6Srv::requestedInORO(
const Pkt6Ptr& query, 
const uint16_t code)
 const {
 
 5247        boost::dynamic_pointer_cast<OptionUint16Array>(query->getOption(
D6O_ORO));
 
 5250        const std::vector<uint16_t>& codes = oro->getValues();
 
 5251        return (std::find(codes.begin(), codes.end(), code) != codes.end());
 
 5257tuple<bool, uint32_t>
 
 5258Dhcpv6Srv::parkingLimitExceeded(
string const& hook_label) {
 
 5260    uint32_t parked_packet_limit(0);
 
 5264        parked_packet_limit = ppl->intValue();
 
 5267    if (parked_packet_limit) {
 
 5271        if (parking_lot && parked_packet_limit <= parking_lot->size()) {
 
 5272            return make_tuple(
true, parked_packet_limit);
 
 5275    return make_tuple(
false, parked_packet_limit);
 
 5286    char const* 
const rotate(getenv(
"KEA_DHCP6_FUZZING_ROTATE_PORT"));
 
 5290        while (!locker.
lock()) {
 
 5291            this_thread::sleep_for(1s);
 
 5294        port_file.open(
"/tmp/port6.txt", ios::in);
 
 5297        getline(port_file, line);
 
 5309        port_file.open(
"/tmp/port6.txt", ios::out | ios::trunc);
 
 5310        port_file << to_string(port) << endl;
 
 
 5325    uint32_t t2_time = 0;
 
 5328    if (!subnet->getT2().unspecified()) {
 
 5329        t2_time = subnet->getT2();
 
 5330    } 
else if (subnet->getCalculateTeeTimes()) {
 
 5332        t2_time = 
static_cast<uint32_t
>(round(subnet->getT2Percent() * preferred_lft));
 
 5336    resp->setT2(t2_time);
 
 5339    uint32_t t1_time = 0;
 
 5342    if (!subnet->getT1().unspecified()) {
 
 5343        t1_time = subnet->getT1();
 
 5344    } 
else if (subnet->getCalculateTeeTimes()) {
 
 5346        t1_time = 
static_cast<uint32_t
>(round(subnet->getT1Percent() * preferred_lft));
 
 5350    if (t1_time < t2_time) {
 
 5351        resp->setT1(t1_time);
 
 
 5362    bool reprocess_client_name = 
false;
 
 5369        if (iaaddr && (iaaddr->getValid() > 0)) {
 
 5371            auto pool = ddns_params->setPoolFromAddress(iaaddr->getAddress());
 
 5374                reprocess_client_name = pool->hasDdnsParameters();
 
 5380    if (ctx.
subnet_ && orig_subnet && (orig_subnet->getID() != ctx.
subnet_->getID())) {
 
 5385        orig_subnet->getSharedNetwork(network);
 
 5387                 .arg(question->getLabel())
 
 5388                 .arg(orig_subnet->toText())
 
 5390                 .arg(network ? network->getName() : 
"<no network?>");
 
 5393        reprocess_client_name = 
true;
 
 5398    if (reprocess_client_name) {
 
 5400        std::string prev_hostname = ctx.
hostname_;
 
 5421                l->reuseable_valid_lft_ = 0;
 
 
 5429    static std::list<std::list<std::string>> 
const list({
 
 5430        {
"config-control", 
"config-databases", 
"[]"},
 
 5431        {
"hooks-libraries", 
"[]", 
"parameters", 
"*"},
 
 5433        {
"hosts-databases", 
"[]"},
 
 
Defines elements for storing the names of client classes.
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 when an unexpected error condition occurs.
The IOAddress class represents an IP addresses (version agnostic)
std::string toText() const
Convert the address to a string.
static const IOAddress & IPV6_ZERO_ADDRESS()
Returns an IPv6 zero address.
void clearIOServices()
Clear the list of IOService objects.
static IOServiceMgr & instance()
Access the IOServiceMgr singleton instance.
void pollIOServices()
Poll IOService objects.
The IOService class is a wrapper for the ASIO io_context class.
static std::string getVersion()
Get version string.
DHCPv4 and DHCPv6 allocation engine.
std::vector< Resource > HintContainer
Container for client's hints.
Implementation of the mechanisms to control the use of the Configuration Backends by the DHCPv6 serve...
@ EARLY_GLOBAL_RESERVATIONS_LOOKUP
D2ClientMgr & getD2ClientMgr()
Fetches the DHCP-DDNS manager.
static CfgMgr & instance()
returns a single instance of Configuration Manager
SrvConfigPtr getCurrentCfg()
Returns a pointer to the current configuration.
static SubnetSelector initSelector(const Pkt6Ptr &query)
Build selector from a client's message.
Container for storing client class names.
void insert(const ClientClass &class_name)
Insert an element.
std::string toText(const std::string &separator=", ") const
Returns all class names as text.
Client race avoidance RAII handler.
bool tryLock(Pkt4Ptr query, ContinuationPtr cont=ContinuationPtr())
Tries to acquires a client.
D2ClientMgr isolates Kea from the details of being a D2 client.
std::string generateFqdn(const asiolink::IOAddress &address, const DdnsParams &ddns_params, const bool trailing_dot=true) const
Builds a FQDN based on the configuration and given IP address.
bool ddnsEnabled()
Convenience method for checking if DHCP-DDNS is enabled.
void getUpdateDirections(const T &fqdn_resp, bool &forward, bool &reverse)
Get directional update flags based on server FQDN flags.
void stop()
Stop the sender.
void suspendUpdates()
Suspends sending requests.
void adjustDomainName(const T &fqdn, T &fqdn_resp, const DdnsParams &ddns_params)
Set server FQDN name based on configuration and a given FQDN.
void sendRequest(dhcp_ddns::NameChangeRequestPtr &ncr)
Send the given NameChangeRequests to kea-dhcp-ddns.
void stopSender()
Disables sending NameChangeRequests to kea-dhcp-ddns.
void adjustFqdnFlags(const T &fqdn, T &fqdn_resp, const DdnsParams &ddns_params)
Set server FQDN flags based on configuration and a given FQDN.
std::string qualifyName(const std::string &partial_name, const DdnsParams &ddns_params, const bool trailing_dot) const
Adds a qualifying suffix to a given domain name.
void startSender(D2ClientErrorHandler error_handler, const isc::asiolink::IOServicePtr &io_service)
Enables sending NameChangeRequests to kea-dhcp-ddns.
This exception is thrown when DHCP server hits the error which should result in discarding the messag...
Factory for generating DUIDs (DHCP Unique Identifiers).
DuidPtr get()
Returns current DUID.
Holds DUID (DHCPv6 Unique Identifier)
static constexpr size_t MIN_DUID_LEN
minimum duid size
static constexpr size_t MAX_DUID_LEN
maximum duid size
void send(const Pkt6Ptr &pkt)
Send message over IPC.
void close()
Close communication socket.
static Dhcp6to4Ipc & instance()
Returns pointer to the sole instance of Dhcp6to4Ipc.
static uint16_t client_port
std::queue< isc::dhcp_ddns::NameChangeRequest > name_change_reqs_
Holds a list of isc::dhcp_ddns::NameChangeRequest objects, which are waiting for sending to kea-dhcp-...
void shutdown() override
Instructs the server to shut down.
RequirementLevel
defines if certain option may, must or must not appear
OptionPtr getServerID()
Returns server-identifier option.
Pkt6Ptr processPacket(Pkt6Ptr query)
Process a single incoming DHCPv6 packet.
Pkt6Ptr processLocalizedQuery6(AllocEngine::ClientContext6 &ctx)
Process a localized incoming DHCPv6 query.
void processPacketAndSendResponseNoThrow(Pkt6Ptr query)
Process a single incoming DHCPv6 packet and sends the response.
OptionPtr extendIA_PD(const Pkt6Ptr &query, AllocEngine::ClientContext6 &ctx, Option6IAPtr ia)
Extends lifetime of the prefix.
void setReservedClientClasses(const Pkt6Ptr &pkt, const AllocEngine::ClientContext6 &ctx)
Assigns classes retrieved from host reservation database.
Pkt6Ptr processDecline(AllocEngine::ClientContext6 &ctx)
Process incoming Decline message.
void evaluateClasses(const Pkt6Ptr &pkt, bool depend_on_known)
Evaluate classes.
Pkt6Ptr processRenew(AllocEngine::ClientContext6 &ctx)
Processes incoming Renew message.
static void processStatsSent(const Pkt6Ptr &response)
Updates statistics for transmitted packets.
void evaluateAdditionalClasses(const Pkt6Ptr &pkt, AllocEngine::ClientContext6 &ctx)
Evaluates classes in the additional classes lists.
void processLocalizedQuery6AndSendResponse(Pkt6Ptr query, AllocEngine::ClientContext6 &ctx)
Process a localized incoming DHCPv6 query.
int run()
Main server processing loop.
void setPacketStatisticsDefaults()
This function sets statistics related to DHCPv6 packets processing to their initial values.
bool sanityCheck(const Pkt6Ptr &pkt)
Verifies if specified packet meets RFC requirements.
static uint16_t checkRelaySourcePort(const Pkt6Ptr &query)
Used for DHCPv4-over-DHCPv6 too.
void assignLeases(const Pkt6Ptr &question, Pkt6Ptr &answer, AllocEngine::ClientContext6 &ctx)
Assigns leases.
void stopD2()
Stops DHCP_DDNS client IO if DDNS updates are enabled.
void copyClientOptions(const Pkt6Ptr &question, Pkt6Ptr &answer)
Copies required options from client message to server answer.
boost::shared_ptr< AllocEngine > alloc_engine_
Allocation Engine.
virtual void sendPacket(const Pkt6Ptr &pkt)
dummy wrapper around IfaceMgr::send()
bool testServerID(const Pkt6Ptr &pkt)
Compare received server id with our server id.
virtual void d2ClientErrorHandler(const dhcp_ddns::NameChangeSender::Result result, dhcp_ddns::NameChangeRequestPtr &ncr)
Implements the error handler for DHCP_DDNS IO errors.
OptionPtr declineIA(const Pkt6Ptr &decline, const DuidPtr &duid, int &general_status, boost::shared_ptr< Option6IA > ia, Lease6Collection &new_leases)
Declines leases in a single IA_NA option.
uint16_t getServerPort() const
Get UDP port on which server should listen.
void runOne()
Main server processing step.
virtual Pkt6Ptr receivePacket(int timeout)
dummy wrapper around IfaceMgr::receive6
void processPacketBufferSend(hooks::CalloutHandlePtr &callout_handle, Pkt6Ptr &rsp)
Executes buffer6_send callout and sends the response.
OptionPtr releaseIA_NA(const DuidPtr &duid, const Pkt6Ptr &query, int &general_status, boost::shared_ptr< Option6IA > ia, Lease6Ptr &old_lease)
Releases specific IA_NA option.
void buildCfgOptionList(const Pkt6Ptr &question, AllocEngine::ClientContext6 &ctx, CfgOptionList &co_list)
Build the configured option list.
void appendDefaultOptions(const Pkt6Ptr &question, Pkt6Ptr &answer, const CfgOptionList &co_list)
Appends default options to server's answer.
OptionPtr assignIA_NA(const isc::dhcp::Pkt6Ptr &query, AllocEngine::ClientContext6 &ctx, Option6IAPtr ia)
Processes IA_NA option (and assigns addresses if necessary).
static const std::string VENDOR_CLASS_PREFIX
this is a prefix added to the content of vendor-class option
OptionPtr serverid_
Server DUID (to be sent in server-identifier option)
void setTeeTimes(uint32_t preferred_lft, const ConstSubnet6Ptr &subnet, Option6IAPtr &resp)
Sets the T1 and T2 timers in the outbound IA.
void conditionallySetReservedClientClasses(const Pkt6Ptr &pkt, const AllocEngine::ClientContext6 &ctx)
Assigns classes retrieved from host reservation database if they haven't been yet set.
void processPacketAndSendResponse(Pkt6Ptr query)
Process a single incoming DHCPv6 packet and sends the response.
OptionPtr releaseIA_PD(const DuidPtr &duid, const Pkt6Ptr &query, int &general_status, boost::shared_ptr< Option6IA > ia, Lease6Ptr &old_lease)
Releases specific IA_PD option.
void processDhcp4Query(const Pkt6Ptr &dhcp4_query)
Processes incoming DHCPv4-query message.
Pkt6Ptr processRebind(AllocEngine::ClientContext6 &ctx)
Processes incoming Rebind message.
bool earlyGHRLookup(const Pkt6Ptr &query, AllocEngine::ClientContext6 &ctx)
Initialize client context and perform early global reservations lookup.
void initContext0(const Pkt6Ptr &query, AllocEngine::ClientContext6 &ctx)
Initialize client context (first part).
virtual ~Dhcpv6Srv()
Destructor. Used during DHCPv6 service shutdown.
void initContext(AllocEngine::ClientContext6 &ctx, bool &drop)
Initializes client context for specified packet.
Pkt6Ptr processRequest(AllocEngine::ClientContext6 &ctx)
Processes incoming Request and returns Reply response.
void sendResponseNoThrow(hooks::CalloutHandlePtr &callout_handle, Pkt6Ptr query, Pkt6Ptr &rsp, ConstSubnet6Ptr &subnet)
Process an unparked DHCPv6 packet and sends the response.
NetworkStatePtr network_state_
Holds information about disabled DHCP service and/or disabled subnet/network scopes.
std::list< std::list< std::string > > jsonPathsToRedact() const final override
Return a list of all paths that contain passwords or secrets for kea-dhcp6.
OptionPtr assignIA_PD(const Pkt6Ptr &query, AllocEngine::ClientContext6 &ctx, boost::shared_ptr< Option6IA > ia)
Processes IA_PD option (and assigns prefixes if necessary).
bool testUnicast(const Pkt6Ptr &pkt) const
Check if the message can be sent to unicast.
Pkt6Ptr processRelease(AllocEngine::ClientContext6 &ctx)
Process incoming Release message.
void processClientFqdn(const Pkt6Ptr &question, const Pkt6Ptr &answer, AllocEngine::ClientContext6 &ctx)
Processes Client FQDN Option.
void setStatusCode(boost::shared_ptr< Option6IA > &container, const OptionPtr &status)
A simple utility method that sets the status code.
static int getHookIndexBuffer6Send()
Returns the index of the buffer6_send hook.
void classifyPacket(const Pkt6Ptr &pkt)
Assigns incoming packet to zero or more classes.
static HWAddrPtr getMAC(const Pkt6Ptr &pkt)
Attempts to get a MAC/hardware address using configured sources.
Dhcpv6Srv(uint16_t server_port=DHCP6_SERVER_PORT, uint16_t client_port=0)
Default constructor.
bool declineLeases(const Pkt6Ptr &decline, Pkt6Ptr &reply, AllocEngine::ClientContext6 &ctx)
Attempts to decline all leases in specified Decline message.
void releaseLeases(const Pkt6Ptr &release, Pkt6Ptr &reply, AllocEngine::ClientContext6 &ctx)
Attempts to release received addresses.
void extendLeases(const Pkt6Ptr &query, Pkt6Ptr &reply, AllocEngine::ClientContext6 &ctx)
Attempts to extend the lifetime of IAs.
void processRSOO(const Pkt6Ptr &query, const Pkt6Ptr &rsp)
Processes Relay-supplied options, if present.
static std::string getVersion(bool extended)
returns Kea version on stdout and exit.
Pkt6Ptr processAddrRegInform(AllocEngine::ClientContext6 &ctx)
Processes incoming Addr-reg-inform message.
OptionPtr extendIA_NA(const Pkt6Ptr &query, AllocEngine::ClientContext6 &ctx, Option6IAPtr ia)
Extends lifetime of the specific IA_NA option.
Pkt6Ptr processConfirm(AllocEngine::ClientContext6 &ctx)
Processes incoming Confirm message and returns Reply.
void sanityCheckDUID(const OptionPtr &opt, const std::string &opt_name)
verifies if received DUID option (client-id or server-id) is sane
static void setHostIdentifiers(AllocEngine::ClientContext6 &ctx)
Set host identifiers within a context.
void processPacketPktSend(hooks::CalloutHandlePtr &callout_handle, Pkt6Ptr &query, Pkt6Ptr &rsp, ConstSubnet6Ptr &subnet)
Executes pkt6_send callout.
Pkt6Ptr processDhcp6Query(Pkt6Ptr query)
Process a single incoming DHCPv6 query.
void processDhcp6QueryAndSendResponse(Pkt6Ptr query)
Process a single incoming DHCPv6 query.
asiolink::IOServicePtr & getIOService()
Returns pointer to the IO service used by the server.
void appendRequestedOptions(const Pkt6Ptr &question, Pkt6Ptr &answer, const CfgOptionList &co_list)
Appends requested options to server's answer.
uint16_t client_port_
UDP port number to which server sends all responses.
CBControlDHCPv6Ptr cb_control_
Controls access to the configuration backends.
isc::dhcp::ConstSubnet6Ptr selectSubnet(const Pkt6Ptr &question, bool &drop)
Selects a subnet for a given client's packet.
volatile bool shutdown_
Indicates if shutdown is in progress.
void checkPostAssignmentChanges(const Pkt6Ptr &question, Pkt6Ptr &answer, AllocEngine::ClientContext6 &ctx, const ConstSubnet6Ptr orig_subnet)
Iterates over new leases, update stale DNS entries.
Pkt6Ptr processSolicit(AllocEngine::ClientContext6 &ctx)
Processes incoming Solicit and returns response.
void startD2()
Starts DHCP_DDNS client IO if DDNS updates are enabled.
static std::string duidToString(const OptionPtr &opt)
converts DUID to text Converts content of DUID option to a text representation, e....
OptionPtr getPDExclude(const AllocEngine::ClientContext6 &ctx, const Lease6Ptr &lease)
Return the PD exclude option to include.
static void removeDependentEvaluatedClasses(const Pkt6Ptr &pkt)
Removed evaluated client classes.
void createNameChangeRequests(const Pkt6Ptr &answer, AllocEngine::ClientContext6 &ctx)
Creates a number of isc::dhcp_ddns::NameChangeRequest objects based on the DHCPv6 Client FQDN Option.
Pkt6Ptr processInfRequest(AllocEngine::ClientContext6 &ctx)
Processes incoming Information-request message.
uint16_t server_port_
UDP port number on which server listens.
void appendRequestedVendorOptions(const Pkt6Ptr &question, Pkt6Ptr &answer, AllocEngine::ClientContext6 &ctx, const CfgOptionList &co_list)
Appends requested vendor options to server's answer.
bool declineLease(const Pkt6Ptr &decline, const Lease6Ptr lease, boost::shared_ptr< Option6IA > ia_rsp)
Declines specific IPv6 lease.
void discardPackets()
Discards parked packets Clears the packet parking lots of all packets.
static std::list< std::string > getDBVersions()
Return extended version info for registered backends.
ConstHostCollection getAll6(const SubnetID &subnet_id, const HostMgrOperationTarget target) const
Return all hosts in a DHCPv6 subnet.
static void create()
Creates new instance of the HostMgr.
static HostMgr & instance()
Returns a sole instance of the HostMgr.
IdentifierType
Type of the host identifier.
@ IDENT_FLEX
Flexible host identifier.
std::string getIdentifierAsText() const
Returns host identifier in a textual form.
static IfaceMgr & instance()
IfaceMgr is a singleton class.
bool send(const Pkt6Ptr &pkt)
Sends an IPv6 packet.
void closeSockets()
Closes all open sockets.
static TrackingLeaseMgr & instance()
Return current lease manager.
static std::list< std::string > getDBVersions()
Return extended version info for registered backends.
static void destroy()
Destroy lease manager.
virtual bool deleteLease(const Lease4Ptr &lease)=0
Deletes an IPv4 lease.
virtual Lease6Ptr getLease6(Lease::Type type, const isc::asiolink::IOAddress &addr) const =0
Returns existing IPv6 lease for a given IPv6 address.
virtual void updateLease6(const Lease6Ptr &lease6)=0
Updates IPv6 lease.
static std::list< std::string > getDBVersions()
Return extended version info for registered backends.
static void splitNtpServerOptions6(isc::dhcp::OptionCollection &options)
Split NTP server option to one suboption per instance.
Controls the DHCP service enabling status.
Represents DHCPv6 Client FQDN Option (code 39).
static const uint8_t FLAG_S
S bit.
static const uint8_t FLAG_N
N bit.
Class that represents IAPREFIX option in DHCPv6.
uint32_t getIAID() const
Returns IA identifier.
OptionPtr option_
Option instance.
bool allowedForClientClasses(const ClientClasses &cclasses) const
Validates an OptionDescriptor's client-classes against a list of classes.
This class represents vendor-specific information option.
const OptionCollection & getOptions() const
Returns all encapsulated options.
OptionPtr getOption(uint16_t type) const
Returns shared_ptr to suboption of specific type.
Represents a DHCPv6 packet.
virtual std::string getLabel() const
Returns text representation of the primary packet identifiers.
An exception that is thrown if a DHCPv6 protocol violation occurs while processing a message (e....
RAII object enabling copying options retrieved from the packet.
Exception thrown when a call to select is interrupted by a signal.
Exception thrown during option unpacking This exception is thrown when an error has occurred,...
Container class for handling the DHCID value within a NameChangeRequest.
Represents a DHCP-DDNS client request.
Result
Defines the outcome of an asynchronous NCR send.
@ NEXT_STEP_PARK
park the packet
@ NEXT_STEP_CONTINUE
continue normally
@ NEXT_STEP_DROP
drop the packet
@ NEXT_STEP_SKIP
skip the next processing step
static int registerHook(const std::string &name)
Register Hook.
static bool calloutsPresent(int index)
Are callouts present?
static std::vector< std::string > getLibraryNames()
Return list of loaded libraries.
static bool unloadLibraries()
Unload libraries.
static void park(const std::string &hook_name, T parked_object, std::function< void()> unpark_callback)
Park an object (packet).
static void callCallouts(int index, CalloutHandle &handle)
Calls the callouts for a given hook.
static void prepareUnloadLibraries()
Prepare the unloading of libraries.
static bool drop(const std::string &hook_name, T parked_object)
Removes parked object without calling a callback.
static void clearParkingLots()
Clears any parking packets.
Wrapper class around callout handle which automatically resets handle's state.
static ServerHooks & getServerHooks()
Return ServerHooks object.
static std::string getVersion()
Version.
File-based Interprocess Sync Class.
Interprocess Sync Locker Class.
bool unlock()
Release the lock.
bool lock()
Acquire the lock (blocks if something else has acquired a lock on the same task name)
int getExitValue()
Fetches the exit value.
Statistics Manager class.
static StatsMgr & instance()
Statistics Manager accessor method.
static std::string generateName(const std::string &context, Type index, const std::string &stat_name)
Generates statistic name in a given context.
RAII class creating a critical section.
static MultiThreadingMgr & instance()
Returns a single instance of Multi Threading Manager.
ThreadPool< std::function< void()> > & getThreadPool()
Get the dhcp thread pool.
void apply(bool enabled, uint32_t thread_count, uint32_t queue_size)
Apply the multi-threading related settings.
The OutputBuffer class is a buffer abstraction for manipulating mutable data.
const std::vector< uint8_t > & getVector() const
Return the buffer.
Defines classes for storing client class definitions.
int version()
returns Kea hooks version.
Defines the D2ClientConfig class.
Defines the D2ClientMgr class.
@ DHCPV6_INFORMATION_REQUEST
Defines the Dhcp6to4Ipc class.
#define VENDOR_ID_CABLE_LABS
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
boost::shared_ptr< OptionUint16Array > OptionUint16ArrayPtr
OptionIntArray< uint16_t > OptionUint16Array
void setValue(const std::string &name, const int64_t value)
Records absolute integer observation.
void addValue(const std::string &name, const int64_t value)
Records incremental integer observation.
int get(CalloutHandle &handle)
The gss-tsig-get command.
When a message is logged with DEBUG severity, the debug level associated with the message is also spe...
#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.
boost::shared_ptr< const Element > ConstElementPtr
ConflictResolutionMode StringToConflictResolutionMode(const std::string &mode_str)
Function which converts string to ConflictResolutionMode enum values.
boost::shared_ptr< NameChangeRequest > NameChangeRequestPtr
Defines a pointer to a NameChangeRequest.
const isc::log::MessageID DHCP6_DDNS_REQUEST_SEND_FAILED
boost::shared_ptr< OptionVendor > OptionVendorPtr
Pointer to a vendor option.
const isc::log::MessageID DHCP6_PD_LEASE_ADVERT
const isc::log::MessageID DHCP6_BUFFER_RECEIVED
const isc::log::MessageID DHCP6_RELEASE_NA_DELETED
isc::log::Logger bad_packet6_logger(DHCP6_BAD_PACKET_LOGGER_NAME)
Logger for rejected packets.
const isc::log::MessageID DHCP6_PACKET_DROP_PARSE_FAIL
const isc::log::MessageID DHCP6_ADDITIONAL_CLASS_NO_TEST
const isc::log::MessageID DHCP6_ADDITIONAL_CLASS_EVAL_RESULT
const isc::log::MessageID DHCP6_RELEASE_PD_DELETED
const isc::log::MessageID DHCP6_LEASE_ALLOC
const isc::log::MessageID DHCP6_FLEX_ID
const isc::log::MessageID DHCP6_REGISTERED_LEASE_ADD_FAIL
uint32_t calculateDdnsTtl(uint32_t lease_lft, const util::Optional< double > &ddns_ttl_percent, const util::Optional< uint32_t > &ddns_ttl, const util::Optional< uint32_t > &ddns_ttl_min, const util::Optional< uint32_t > &ddns_ttl_max)
Calculates TTL for a DNS resource record based on lease life time.
const isc::log::MessageID DHCP6_PACKET_PROCESS_EXCEPTION_MAIN
const isc::log::MessageID DHCP6_HOOK_PACKET_SEND_SKIP
const isc::log::MessageID DHCP6_ADDR_REG_INFORM_CLIENT_CHANGE
const isc::log::MessageID DHCP6_SUBNET_SELECTION_FAILED
const isc::log::MessageID DHCP6_PACKET_DROP_SERVERID_MISMATCH
const isc::log::MessageID DHCP6_HOOK_DECLINE_SKIP
const isc::log::MessageID DHCP6_PD_LEASE_REUSE
const isc::log::MessageID DHCP6_PACKET_DROP_UNICAST
const isc::log::MessageID DHCP6_LEASE_PD_WITHOUT_DUID
const isc::log::MessageID DHCP6_LEASE_ALLOC_FAIL
const isc::log::MessageID DHCP6_ADDITIONAL_CLASS_UNDEFINED
const isc::log::MessageID DHCP6_PACKET_SEND_FAIL
const isc::log::MessageID DHCP6_PACKET_PROCESS_EXCEPTION
void queueNCR(const NameChangeType &chg_type, const Lease4Ptr &lease)
Creates name change request from the DHCPv4 lease.
const isc::log::MessageID DHCP6_QUERY_LABEL
const isc::log::MessageID DHCP6_BUFFER_UNPACK
boost::shared_ptr< const Subnet6 > ConstSubnet6Ptr
A const pointer to a Subnet6 object.
std::vector< uint32_t > CfgMACSources
Container for defined MAC/hardware address sources.
const isc::log::MessageID DHCP6_SRV_D2STOP_ERROR
const isc::log::MessageID DHCP6_REGISTERED_LEASE_UPDATE_FAIL
const isc::log::MessageID DHCP6_PACKET_SEND
const isc::log::MessageID DHCP6_DECLINE_FAIL_LEASE_WITHOUT_DUID
const int DBG_DHCP6_BASIC_DATA
Debug level used to log the traces with some basic data.
const isc::log::MessageID DHCP6_HOOK_PACKET_RCVD_SKIP
const isc::log::MessageID DHCP6_ADDITIONAL_CLASS_EVAL_ERROR
boost::shared_ptr< DUID > DuidPtr
const isc::log::MessageID DHCP6_OPEN_SOCKET
const isc::log::MessageID DHCP6_PACK_FAIL
const isc::log::MessageID DHCP6_RELEASE_PD_FAIL_WRONG_IAID
const isc::log::MessageID DHCP6_HOOK_DDNS_UPDATE
boost::shared_ptr< Lease6 > Lease6Ptr
Pointer to a Lease6 structure.
std::vector< Lease6Ptr > Lease6Collection
A collection of IPv6 leases.
const int DBG_DHCP6_HOOKS
Debug level used to trace hook related operations.
const isc::log::MessageID DHCP6_HOOK_LEASE6_RELEASE_NA_SKIP
ContinuationPtr makeContinuation(Continuation &&cont)
Continuation factory.
const int DBG_DHCP6_START
Debug level used to log information during server startup.
const isc::log::MessageID DHCP6_PD_LEASE_ALLOC
const isc::log::MessageID DHCP6_DDNS_GENERATE_FQDN
const isc::log::MessageID DHCP6_RELEASE_PD_EXPIRED
boost::shared_ptr< Option6IA > Option6IAPtr
A pointer to the Option6IA object.
const isc::log::MessageID DHCP6_DDNS_REMOVE_OLD_LEASE_FQDN
boost::shared_ptr< const CfgRSOO > ConstCfgRSOOPtr
Pointer to the const object.
boost::shared_ptr< const CfgHostOperations > ConstCfgHostOperationsPtr
Pointer to the const object.
std::multimap< unsigned int, OptionPtr > OptionCollection
A collection of DHCP (v4 or v6) options.
const isc::log::MessageID DHCP6_SUBNET_DATA
const isc::log::MessageID DHCP6_UNKNOWN_MSG_RECEIVED
boost::shared_ptr< ClientClassDef > ClientClassDefPtr
a pointer to an ClientClassDef
boost::shared_ptr< DdnsParams > DdnsParamsPtr
Defines a pointer for DdnsParams instances.
const isc::log::MessageID DHCP6_HOOK_SUBNET6_SELECT_DROP
const isc::log::MessageID DHCP6_ADD_GLOBAL_STATUS_CODE
boost::shared_ptr< Option6IAPrefix > Option6IAPrefixPtr
Pointer to the Option6IAPrefix object.
const isc::log::MessageID DHCP6_DDNS_RESPONSE_FQDN_DATA
const isc::log::MessageID DHCP6_RELEASE_NA
const isc::log::MessageID DHCP6_CLASSES_ASSIGNED
const isc::log::MessageID DHCP6_REQUIRED_OPTIONS_CHECK_FAIL
const isc::log::MessageID DHCP6_PROCESS_IA_NA_EXTEND
std::pair< IPv6ResrvIterator, IPv6ResrvIterator > IPv6ResrvRange
const isc::log::MessageID DHCP6_RELEASE_PD_FAIL
const isc::log::MessageID DHCP6_SRV_CONSTRUCT_ERROR
const isc::log::MessageID DHCP6_LEASE_RENEW
const char * DOCSIS3_CLASS_EROUTER
The class as specified in vendor-class option by the devices.
const isc::log::MessageID DHCP6_RELEASE_NA_FAIL
boost::shared_ptr< HWAddr > HWAddrPtr
Shared pointer to a hardware address structure.
const isc::log::MessageID DHCP6_PACKET_PROCESS_STD_EXCEPTION
const isc::log::MessageID DHCP6_PACKET_RECEIVE_FAIL
const isc::log::MessageID DHCP6_PROCESS_IA_NA_SOLICIT
const isc::log::MessageID DHCP6_ADDR_REG_INFORM_FAIL
const isc::log::MessageID DHCP6_DECLINE_FAIL_IAID_MISMATCH
const isc::log::MessageID DHCP6_HOOK_SUBNET6_SELECT_PARK
OptionContainer::nth_index< 5 >::type OptionContainerCancelIndex
Type of the index #5 - option cancellation flag.
boost::shared_ptr< Option6StatusCode > Option6StatusCodePtr
Pointer to the isc::dhcp::Option6StatusCode.
std::pair< OptionContainerPersistIndex::const_iterator, OptionContainerPersistIndex::const_iterator > OptionContainerPersistRange
Pair of iterators to represent the range of options having the same persistency flag.
boost::shared_ptr< SharedNetwork6 > SharedNetwork6Ptr
Pointer to SharedNetwork6 object.
const isc::log::MessageID DHCP4_HOOK_SUBNET6_SELECT_PARKING_LOT_FULL
isc::log::Logger packet6_logger(DHCP6_PACKET_LOGGER_NAME)
Logger for processed packets.
const isc::log::MessageID DHCP6_DECLINE_LEASE
boost::shared_ptr< Expression > ExpressionPtr
const isc::log::MessageID DHCP6_LEASE_ADVERT_FAIL
const isc::log::MessageID DHCP6_HOOK_LEASES6_PARKING_LOT_FULL
const isc::log::MessageID DHCP6_PD_LEASE_ADVERT_FAIL
boost::shared_ptr< Pool > PoolPtr
a pointer to either IPv4 or IPv6 Pool
isc::hooks::CalloutHandlePtr getCalloutHandle(const T &pktptr)
CalloutHandle Store.
const isc::log::MessageID DHCP6_PACKET_PROCESS_FAIL
const isc::log::MessageID DHCP6_RELEASE_NA_EXPIRED
boost::shared_ptr< ClientClassDictionary > ClientClassDictionaryPtr
Defines a pointer to a ClientClassDictionary.
const isc::log::MessageID DHCP6_PACKET_RECEIVED
const isc::log::MessageID DHCP6_RESPONSE_DATA
const isc::log::MessageID DHCP6_DDNS_RECEIVE_FQDN
const isc::log::MessageID DHCP6_PACKET_OPTIONS_SKIPPED
const isc::log::MessageID DHCP6_NO_INTERFACES
const isc::log::MessageID DHCP6_RELEASE_PD_FAIL_WRONG_DUID
const isc::log::MessageID DHCP6_LEASE_REUSE
isc::log::Logger ddns6_logger(DHCP6_DDNS_LOGGER_NAME)
Logger for Hostname or FQDN processing.
const isc::log::MessageID DHCP6_HOOK_ADDR6_REGISTER_SKIP
boost::shared_ptr< Continuation > ContinuationPtr
Define the type of shared pointers to continuations.
boost::shared_ptr< OptionContainer > OptionContainerPtr
Pointer to the OptionContainer object.
boost::shared_ptr< ClientClassDefList > ClientClassDefListPtr
Defines a pointer to a ClientClassDefList.
const isc::log::MessageID DHCP6_HOOK_LEASES6_COMMITTED_DROP
const isc::log::MessageID DHCP6_HOOK_PACKET_SEND_DROP
const isc::log::MessageID DHCP6_DDNS_GENERATED_FQDN_UPDATE_FAIL
const isc::log::MessageID DHCP6_PACKET_DROP_DROP_CLASS2
boost::shared_ptr< Option6IAAddr > Option6IAAddrPtr
A pointer to the isc::dhcp::Option6IAAddr object.
const char * DOCSIS3_CLASS_MODEM
DOCSIS3.0 compatible cable modem.
const isc::log::MessageID DHCP6_SHUTDOWN_REQUEST
const isc::log::MessageID DHCP6_HOOK_BUFFER_RCVD_SKIP
const isc::log::MessageID DHCP6_DECLINE_FAIL
bool evaluateBool(const Expression &expr, Pkt &pkt)
Evaluate a RPN expression for a v4 or v6 packet and return a true or false decision.
const isc::log::MessageID DHCP6_QUERY_DATA
const int DBG_DHCP6_DETAIL_DATA
This level is used to log the contents of packets received and sent.
boost::shared_ptr< const Host > ConstHostPtr
Const pointer to the Host object.
const isc::log::MessageID DHCP6_PROCESS_IA_PD_SOLICIT
const isc::log::MessageID DHCP6_PACKET_DROP_DROP_CLASS
boost::shared_ptr< Lease6Collection > Lease6CollectionPtr
A shared pointer to the collection of IPv6 leases.
const isc::log::MessageID DHCP6_DECLINE_PROCESS_IA
const isc::log::MessageID DHCP6_PROCESS_IA_NA_REQUEST
OptionContainer::nth_index< 2 >::type OptionContainerPersistIndex
Type of the index #2 - option persistency flag.
isc::log::Logger lease6_logger(DHCP6_LEASE_LOGGER_NAME)
Logger for lease allocation logic.
const isc::log::MessageID DHCP6_CLASS_UNCONFIGURED
boost::shared_ptr< OptionVendorClass > OptionVendorClassPtr
Defines a pointer to the OptionVendorClass.
const isc::log::MessageID DHCP6_LEASE_NA_WITHOUT_DUID
const isc::log::MessageID DHCP6_HOOK_DECLINE_DROP
const isc::log::MessageID DHCP6_PROCESS_IA_PD_REQUEST
const isc::log::MessageID DHCP6_HOOK_SUBNET6_SELECT_SKIP
const isc::log::MessageID DHCP6_PD_LEASE_RENEW
const isc::log::MessageID DHCP6_CLASS_ASSIGNED
boost::shared_ptr< const Subnet > ConstSubnetPtr
A generic pointer to either const Subnet4 or const Subnet6 object.
boost::shared_ptr< Pkt6 > Pkt6Ptr
A pointer to Pkt6 packet.
const isc::log::MessageID DHCP6_PROCESS_IA_NA_RELEASE
const isc::log::MessageID DHCP6_PACKET_DROP_DROP_CLASS_EARLY
const isc::log::MessageID DHCP6_LEASE_ADVERT
std::vector< uint8_t > OptionBuffer
buffer types used in DHCP code.
const isc::log::MessageID DHCP6_DECLINE_FAIL_DUID_MISMATCH
const isc::log::MessageID DHCP6_SRV_UNLOAD_LIBRARIES_ERROR
const isc::log::MessageID DHCP6_HOOK_LEASES6_COMMITTED_PARK
const isc::log::MessageID DHCP6_DECLINE_FAIL_NO_LEASE
const isc::log::MessageID DHCP6_RAPID_COMMIT
const isc::log::MessageID DHCP6_BUFFER_WAIT_SIGNAL
bool isClientClassBuiltIn(const ClientClass &client_class)
Check if a client class name is builtin.
boost::shared_ptr< Option6ClientFqdn > Option6ClientFqdnPtr
A pointer to the Option6ClientFqdn object.
const isc::log::MessageID DHCP6_PROCESS_IA_PD_EXTEND
std::pair< OptionContainerCancelIndex::const_iterator, OptionContainerCancelIndex::const_iterator > OptionContainerCancelRange
Pair of iterators to represent the range of options having the same cancellation flag.
const isc::log::MessageID DHCP6_CLASSES_ASSIGNED_AFTER_SUBNET_SELECTION
const isc::log::MessageID DHCP6_PACKET_PROCESS_STD_EXCEPTION_MAIN
const int DBG_DHCP6_BASIC
Debug level used to trace basic operations within the code.
const isc::log::MessageID DHCP6_HOOK_ADDR6_REGISTER_DROP
isc::log::Logger dhcp6_logger(DHCP6_APP_LOGGER_NAME)
Base logger for DHCPv6 server.
const isc::log::MessageID DHCP6_SUBNET_SELECTED
const isc::log::MessageID DHCP6_RELEASE_NA_FAIL_WRONG_IAID
const isc::log::MessageID DHCP6_HOOK_BUFFER_RCVD_DROP
boost::shared_ptr< Option > OptionPtr
const isc::log::MessageID DHCP6_DDNS_CREATE_ADD_NAME_CHANGE_REQUEST
const isc::log::MessageID DHCP6_RELEASE_NA_FAIL_WRONG_DUID
const isc::log::MessageID DHCP6_ADD_STATUS_CODE_FOR_IA
isc::log::Logger options6_logger(DHCP6_OPTIONS_LOGGER_NAME)
Logger for options parser.
const isc::log::MessageID DHCP6_LEASE_DATA
const isc::log::MessageID DHCP6_HOOK_BUFFER_SEND_SKIP
const int DBG_DHCP6_DETAIL
Debug level used to trace detailed errors.
const isc::log::MessageID DHCP6_SUBNET_DYNAMICALLY_CHANGED
const isc::log::MessageID DHCP6_PACKET_QUEUE_FULL
const isc::log::MessageID DHCP6_PD_LEASE_ALLOC_FAIL
const isc::log::MessageID DHCP6_HOOK_LEASE6_RELEASE_PD_SKIP
const isc::log::MessageID DHCP6_RELEASE_PD
std::list< ConstCfgOptionPtr > CfgOptionList
Const pointer list.
const isc::log::MessageID DHCP6_DDNS_FQDN_GENERATED
const isc::log::MessageID DHCP6_PACKET_DROP_DHCP_DISABLED
boost::shared_ptr< Pool6 > Pool6Ptr
a pointer an IPv6 Pool
isc::log::Logger hooks_logger("hooks")
Hooks Logger.
boost::shared_ptr< CalloutHandle > CalloutHandlePtr
A shared pointer to a CalloutHandle object.
boost::shared_ptr< ParkingLot > ParkingLotPtr
Type of the pointer to the parking lot.
const int DBGLVL_TRACE_BASIC
Trace basic operations.
const int DBGLVL_PKT_HANDLING
This debug level is reserved for logging the details of packet handling, such as dropping the packet ...
bool equalValues(const T &ptr1, const T &ptr2)
This function checks if two pointers are non-null and values are equal.
Defines the logger used by the top-level component of kea-lfc.
This file defines abstract classes for exchanging NameChangeRequests.
This file provides the classes needed to embody, compose, and decompose DNS update requests that are ...
Standard implementation of read-write mutexes with writer preference using C++11 mutex and condition ...
#define DHCP6_OPTION_SPACE
Lease6Collection old_leases_
A pointer to any old leases that the client had before update but are no longer valid after the updat...
Option6IAPtr ia_rsp_
A pointer to the IA_NA/IA_PD option to be sent in response.
Lease::Type type_
Lease type (IA or PD)
Lease6Collection changed_leases_
A pointer to any leases that have changed FQDN information.
void addHint(const asiolink::IOAddress &prefix, const uint8_t prefix_len=128, const uint32_t preferred=0, const uint32_t valid=0)
Convenience method adding new hint.
Lease6Collection reused_leases_
Set of leases marked for reuse by lease caching.
HintContainer hints_
Client's hints.
uint32_t iaid_
The IAID field from IA_NA or IA_PD that is being processed.
Context information for the DHCPv6 leases allocation.
IAContext & currentIA()
Returns IA specific context for the currently processed IA.
std::vector< IAContext > ias_
Container holding IA specific contexts.
void addHostIdentifier(const Host::IdentifierType &id_type, const std::vector< uint8_t > &identifier)
Convenience function adding host identifier into host_identifiers_ list.
bool fake_allocation_
Indicates if this is a real or fake allocation.
ConstHostPtr currentHost() const
Returns host from the most preferred subnet.
DuidPtr duid_
Client identifier.
Lease6Collection new_leases_
A collection of newly allocated leases.
std::vector< IAContext > & getIAContexts()
HWAddrPtr hwaddr_
Hardware/MAC address (if available, may be NULL)
hooks::CalloutHandlePtr callout_handle_
Callout handle associated with the client's message.
ResourceContainer allocated_resources_
Holds addresses and prefixes allocated for all IAs.
bool rev_dns_update_
A boolean value which indicates that server takes responsibility for the reverse DNS Update for this ...
DdnsParamsPtr getDdnsParams()
Returns the set of DDNS behavioral parameters based on the selected subnet.
ConstHostPtr globalHost() const
Returns global host reservation if there is one.
Pkt6Ptr query_
A pointer to the client's message.
bool early_global_reservations_lookup_
Indicates if early global reservation is enabled.
std::string hostname_
Hostname.
void createIAContext()
Creates new IA context.
ConstSubnet6Ptr subnet_
Subnet selected for the client by the server.
std::map< SubnetID, ConstHostPtr > hosts_
Holds a map of hosts belonging to the client within different subnets.
bool fwd_dns_update_
A boolean value which indicates that server takes responsibility for the forward DNS Update for this ...
Structure that holds a lease for IPv6 address and/or prefix.
static const uint32_t INFINITY_LFT
Infinity (means static, i.e. never expire)
static std::string lifetimeToText(uint32_t lifetime)
Print lifetime.
static const uint32_t STATE_DEFAULT
A lease in the default state.
static const uint32_t STATE_RELEASED
Released lease held in the database for lease affinity.
@ 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.
Subnet selector used to specify parameters used to select a subnet.
bool add(const WorkItemPtr &item)
add a work item to the thread pool