8 #include <kea_version.h> 62 #include <boost/algorithm/string.hpp> 63 #include <boost/foreach.hpp> 64 #include <boost/pointer_cast.hpp> 65 #include <boost/shared_ptr.hpp> 82 namespace ph = std::placeholders;
88 int hook_index_buffer4_receive_;
89 int hook_index_pkt4_receive_;
90 int hook_index_subnet4_select_;
91 int hook_index_leases4_committed_;
92 int hook_index_lease4_release_;
93 int hook_index_pkt4_send_;
94 int hook_index_buffer4_send_;
95 int hook_index_lease4_decline_;
96 int hook_index_host4_identifier_;
97 int hook_index_ddns4_update_;
101 hook_index_buffer4_receive_ = HooksManager::registerHook(
"buffer4_receive");
102 hook_index_pkt4_receive_ = HooksManager::registerHook(
"pkt4_receive");
103 hook_index_subnet4_select_ = HooksManager::registerHook(
"subnet4_select");
104 hook_index_leases4_committed_ = HooksManager::registerHook(
"leases4_committed");
105 hook_index_lease4_release_ = HooksManager::registerHook(
"lease4_release");
106 hook_index_pkt4_send_ = HooksManager::registerHook(
"pkt4_send");
107 hook_index_buffer4_send_ = HooksManager::registerHook(
"buffer4_send");
108 hook_index_lease4_decline_ = HooksManager::registerHook(
"lease4_decline");
109 hook_index_host4_identifier_ = HooksManager::registerHook(
"host4_identifier");
110 hook_index_ddns4_update_ = HooksManager::registerHook(
"ddns4_update");
116 std::set<std::string> dhcp4_statistics = {
118 "pkt4-discover-received",
119 "pkt4-offer-received",
120 "pkt4-request-received",
123 "pkt4-release-received",
124 "pkt4-decline-received",
125 "pkt4-inform-received",
126 "pkt4-unknown-received",
133 "v4-allocation-fail",
134 "v4-allocation-fail-shared-network",
135 "v4-allocation-fail-subnet",
136 "v4-allocation-fail-no-pools",
137 "v4-allocation-fail-classes" 156 : alloc_engine_(alloc_engine), query_(query), resp_(),
159 if (!alloc_engine_) {
161 " when creating an instance of the Dhcpv4Exchange");
166 " creating an instance of the Dhcpv4Exchange");
175 context_->subnet_ = subnet;
181 if (subnet && !context_->early_global_reservations_lookup_) {
184 context_->clientid_.reset(
new ClientId(opt_clientid->getData()));
190 if (subnet->getReservationsInSubnet() ||
191 subnet->getReservationsGlobal()) {
194 if (!context_->early_global_reservations_lookup_) {
199 alloc_engine->findReservation(*context_);
202 subnet->getSharedNetwork(sn);
212 auto global_host = context_->globalHost();
213 auto current_host = context_->currentHost();
214 if ((!context_->early_global_reservations_lookup_ &&
215 global_host && !global_host->getClientClasses4().empty()) ||
216 (!sn && current_host && !current_host->getClientClasses4().empty())) {
237 if (!context_->hosts_.empty()) {
238 query->addClass(
"KNOWN");
240 .arg(query->getLabel())
243 query->addClass(
"UNKNOWN");
245 .arg(query->getLabel())
253 if (!classes.
empty()) {
255 .arg(query_->getLabel())
260 if (query_->inClass(
"DROP")) {
262 .arg(query_->toText());
264 static_cast<int64_t>(1));
271 uint8_t resp_type = 0;
285 resp_.reset(
new Pkt4(resp_type,
getQuery()->getTransid()));
287 copyDefaultOptions();
305 if (!query6->relay_info_.empty()) {
306 resp6->copyRelayInfo(query6);
309 resp6->setIface(query6->getIface());
310 resp6->setIndex(query6->getIndex());
311 resp6->setRemoteAddr(query6->getRemoteAddr());
312 resp6->setRemotePort(query6->getRemotePort());
313 resp_.reset(
new Pkt4o6(resp_, resp6));
317 Dhcpv4Exchange::copyDefaultFields() {
318 resp_->setIface(query_->getIface());
319 resp_->setIndex(query_->getIndex());
326 resp_->setCiaddr(query_->getCiaddr());
330 resp_->setHops(query_->getHops());
333 resp_->setHWAddr(query_->getHWAddr());
336 resp_->setGiaddr(query_->getGiaddr());
345 HWAddrPtr src_hw_addr = query_->getLocalHWAddr();
347 resp_->setLocalHWAddr(src_hw_addr);
349 HWAddrPtr dst_hw_addr = query_->getRemoteHWAddr();
351 resp_->setRemoteHWAddr(dst_hw_addr);
355 resp_->setFlags(query_->getFlags());
359 Dhcpv4Exchange::copyDefaultOptions() {
364 if (client_id && echo) {
365 resp_->addOption(client_id);
372 resp_->addOption(rai);
385 resp_->addOption(subnet_sel);
397 cfg->getIdentifierTypes()) {
400 if (context->hwaddr_ && !context->hwaddr_->hwaddr_.empty()) {
401 context->addHostIdentifier(id_type, context->hwaddr_->hwaddr_);
406 if (context->clientid_) {
407 const std::vector<uint8_t>& vec = context->clientid_->getDuid();
412 if ((vec[0] == CLIENT_ID_OPTION_TYPE_DUID) && (vec.size() > 5)) {
414 context->addHostIdentifier(id_type,
415 std::vector<uint8_t>(vec.begin() + 5,
426 OptionPtr circuit_id_opt = rai->getOption(RAI_OPTION_AGENT_CIRCUIT_ID);
427 if (circuit_id_opt) {
428 const OptionBuffer& circuit_id_vec = circuit_id_opt->getData();
429 if (!circuit_id_vec.empty()) {
430 context->addHostIdentifier(id_type, circuit_id_vec);
438 if (context->clientid_) {
439 const std::vector<uint8_t>& vec = context->clientid_->getDuid();
441 context->addHostIdentifier(id_type, vec);
447 if (!HooksManager::calloutsPresent(Hooks.hook_index_host4_identifier_)) {
454 std::vector<uint8_t> id;
463 callout_handle->setArgument(
"query4", context->query_);
464 callout_handle->setArgument(
"id_type", type);
465 callout_handle->setArgument(
"id_value",
id);
468 HooksManager::callCallouts(Hooks.hook_index_host4_identifier_,
471 callout_handle->getArgument(
"id_type", type);
472 callout_handle->getArgument(
"id_value",
id);
474 if ((callout_handle->getStatus() == CalloutHandle::NEXT_STEP_CONTINUE) &&
480 context->addHostIdentifier(type,
id);
495 for (
auto def : *defs_ptr) {
499 if (def->getMatchExpr()) {
500 query->classes_.erase(def->getName());
507 if (context->currentHost() && context->query_) {
508 const ClientClasses& classes = context->currentHost()->getClientClasses4();
510 cclass != classes.
cend(); ++cclass) {
511 context->query_->addClass(*cclass);
518 if (context_->subnet_) {
520 context_->subnet_->getSharedNetwork(shared_network);
521 if (shared_network) {
523 if (host && (host->getIPv4SubnetID() != SUBNET_ID_GLOBAL)) {
535 if (!host->getNextServer().isV4Zero()) {
536 resp_->setSiaddr(host->getNextServer());
539 std::string sname = host->getServerHostname();
540 if (!sname.empty()) {
541 resp_->setSname(reinterpret_cast<const uint8_t*>(sname.c_str()),
545 std::string bootfile = host->getBootFileName();
546 if (!bootfile.empty()) {
547 resp_->setFile(reinterpret_cast<const uint8_t*>(bootfile.c_str()),
555 boost::shared_ptr<OptionString> vendor_class =
567 pkt->addClass(
"ALL");
581 for (ClientClassDefList::const_iterator it = defs_ptr->cbegin();
582 it != defs_ptr->cend(); ++it) {
590 if ((*it)->getRequired()) {
594 if ((*it)->getDependOnKnown() != depend_on_known) {
603 .arg((*it)->getName())
606 pkt->addClass((*it)->getName());
609 .arg((*it)->getName())
614 .arg((*it)->getName())
618 .arg((*it)->getName())
619 .arg(
"get exception?");
627 const bool use_bcast,
const bool direct_response_desired)
628 : io_service_(new
IOService()), server_port_(server_port),
629 client_port_(client_port), shutdown_(true),
630 alloc_engine_(), use_bcast_(use_bcast),
633 test_send_responses_to_source_(false) {
635 const char* env = std::getenv(
"KEA_TEST_SEND_RESPONSES_TO_SOURCE");
638 test_send_responses_to_source_ =
true;
667 }
catch (
const std::exception &e) {
682 for (
auto it = dhcp4_statistics.begin(); it != dhcp4_statistics.end(); ++it) {
684 stats_mgr.
setValue((*it), static_cast<int64_t>(0));
694 }
catch (
const std::exception& ex) {
701 }
catch (
const std::exception& ex) {
713 HooksManager::prepareUnloadLibraries();
714 if (!HooksManager::unloadLibraries()) {
715 auto names = HooksManager::getLibraryNames();
717 if (!names.empty()) {
719 for (
size_t i = 1; i < names.size(); ++i) {
720 msg += std::string(
", ") + names[i];
735 bool sanity_only)
const {
738 if (query->isDhcp4o6()) {
747 subnet = cfgmgr.
getCurrentCfg()->getCfgSubnets4()->selectSubnet(selector);
752 HooksManager::calloutsPresent(Hooks.hook_index_subnet4_select_)) {
765 callout_handle->setArgument(
"query4", query);
766 callout_handle->setArgument(
"subnet4", subnet);
767 callout_handle->setArgument(
"subnet4collection",
769 getCfgSubnets4()->getAll());
772 HooksManager::callCallouts(Hooks.hook_index_subnet4_select_,
778 if (callout_handle->getStatus() == CalloutHandle::NEXT_STEP_SKIP) {
781 .arg(query->getLabel());
787 if (callout_handle->getStatus() == CalloutHandle::NEXT_STEP_DROP) {
790 .arg(query->getLabel());
796 callout_handle->getArgument(
"subnet4", subnet);
802 .arg(query->getLabel())
803 .arg(subnet->getID());
807 .arg(query->getLabel())
808 .arg(subnet->toText());
813 .arg(query->getLabel());
821 bool sanity_only)
const {
826 selector.
ciaddr_ = query->getCiaddr();
827 selector.
giaddr_ = query->getGiaddr();
842 const Pkt6Ptr& query6 = query4o6->getPkt6();
845 if (query6 && !query6->relay_info_.empty()) {
868 subnet = cfgmgr.
getCurrentCfg()->getCfgSubnets4()->selectSubnet4o6(selector);
873 HooksManager::calloutsPresent(Hooks.hook_index_subnet4_select_)) {
883 callout_handle->setArgument(
"query4", query);
884 callout_handle->setArgument(
"subnet4", subnet);
885 callout_handle->setArgument(
"subnet4collection",
887 getCfgSubnets4()->getAll());
890 HooksManager::callCallouts(Hooks.hook_index_subnet4_select_,
896 if (callout_handle->getStatus() == CalloutHandle::NEXT_STEP_SKIP) {
899 .arg(query->getLabel());
905 if (callout_handle->getStatus() == CalloutHandle::NEXT_STEP_DROP) {
908 .arg(query->getLabel());
914 callout_handle->getArgument(
"subnet4", subnet);
920 .arg(query->getLabel())
921 .arg(subnet->getID());
925 .arg(query->getLabel())
926 .arg(subnet->toText());
931 .arg(query->getLabel());
954 ctx->hwaddr_ = query->getHWAddr();
960 ctx->early_global_reservations_lookup_ = egrl->boolValue();
964 if (ctx->early_global_reservations_lookup_) {
968 ctx->clientid_.reset(
new ClientId(opt_clientid->getData()));
977 if (global_host && !global_host->getClientClasses4().empty()) {
982 const ClientClasses& classes = global_host->getClientClasses4();
984 cclass != classes.
cend(); ++cclass) {
985 query->addClass(*cclass);
994 query->addClass(
"KNOWN");
996 .arg(query->getLabel())
1003 if (query->inClass(
"DROP")) {
1006 .arg(query->toText());
1008 static_cast<int64_t>(1));
1013 ctx->hosts_[SUBNET_ID_GLOBAL] = global_host;
1028 while (__AFL_LOOP(fuzzer.maxLoopCount())) {
1034 #endif // ENABLE_AFL 1038 }
catch (
const std::exception& e) {
1055 MultiThreadingMgr::instance().apply(
false, 0, 0);
1069 uint32_t timeout = 1;
1080 .arg(query->getRemoteAddr().toText())
1081 .arg(query->getRemotePort())
1082 .arg(query->getLocalAddr().toText())
1083 .arg(query->getLocalPort())
1084 .arg(query->getIface());
1100 }
catch (
const std::exception& e) {
1115 .arg(query->getLabel());
1118 if (MultiThreadingMgr::instance().getMode()) {
1119 typedef function<void()> CallBack;
1120 boost::shared_ptr<CallBack> call_back =
1123 if (!MultiThreadingMgr::instance().getThreadPool().add(call_back)) {
1136 }
catch (
const std::exception& e) {
1163 static_cast<int64_t>(1));
1165 bool skip_unpack =
false;
1169 if (HooksManager::calloutsPresent(Hooks.hook_index_buffer4_receive_)) {
1182 callout_handle->setArgument(
"query4", query);
1185 HooksManager::callCallouts(Hooks.hook_index_buffer4_receive_,
1191 if (callout_handle->getStatus() == CalloutHandle::NEXT_STEP_DROP) {
1194 .arg(query->getRemoteAddr().toText())
1195 .arg(query->getLocalAddr().toText())
1196 .arg(query->getIface());
1204 if (callout_handle->getStatus() == CalloutHandle::NEXT_STEP_SKIP) {
1207 .arg(query->getRemoteAddr().toText())
1208 .arg(query->getLocalAddr().toText())
1209 .arg(query->getIface());
1213 callout_handle->getArgument(
"query4", query);
1221 .arg(query->getRemoteAddr().toText())
1222 .arg(query->getLocalAddr().toText())
1223 .arg(query->getIface());
1231 }
catch (
const std::exception& e) {
1234 .arg(query->getRemoteAddr().toText())
1235 .arg(query->getLocalAddr().toText())
1236 .arg(query->getIface())
1241 static_cast<int64_t>(1));
1243 static_cast<int64_t>(1));
1264 static_cast<int64_t>(1));
1270 int type = query->getType();
1272 .arg(query->getLabel())
1273 .arg(query->getName())
1275 .arg(query->getRemoteAddr())
1276 .arg(query->getLocalAddr())
1277 .arg(query->getIface());
1279 .arg(query->getLabel())
1280 .arg(query->toText());
1283 if (HooksManager::calloutsPresent(Hooks.hook_index_pkt4_receive_)) {
1296 callout_handle->setArgument(
"query4", query);
1299 HooksManager::callCallouts(Hooks.hook_index_pkt4_receive_,
1305 if ((callout_handle->getStatus() == CalloutHandle::NEXT_STEP_SKIP) ||
1306 (callout_handle->getStatus() == CalloutHandle::NEXT_STEP_DROP)) {
1309 .arg(query->getLabel());
1313 callout_handle->getArgument(
"query4", query);
1317 if (query->inClass(
"DROP")) {
1319 .arg(query->toText());
1321 static_cast<int64_t>(1));
1330 bool allow_packet_park) {
1339 }
catch (
const std::exception& e) {
1349 bool allow_packet_park) {
1354 if (MultiThreadingMgr::instance().getMode() &&
1361 this, query, rsp, allow_packet_park));
1362 if (!client_handler.
tryLock(query, cont)) {
1373 switch (query->getType()) {
1403 }
catch (
const std::exception& e) {
1413 .arg(query->getLabel())
1418 static_cast<int64_t>(1));
1422 if (ctx && HooksManager::calloutsPresent(Hooks.hook_index_leases4_committed_)) {
1432 callout_handle->setArgument(
"query4", query);
1436 if (ctx->new_lease_ && (ctx->new_lease_->reuseable_valid_lft_ == 0)) {
1437 new_leases->push_back(ctx->new_lease_);
1439 callout_handle->setArgument(
"leases4", new_leases);
1442 if (ctx->old_lease_) {
1443 if ((!ctx->new_lease_) || (ctx->new_lease_->addr_ != ctx->old_lease_->addr_)) {
1444 deleted_leases->push_back(ctx->old_lease_);
1447 callout_handle->setArgument(
"deleted_leases4", deleted_leases);
1449 if (allow_packet_park) {
1451 uint32_t parked_packet_limit = 0;
1455 parked_packet_limit = ppl->intValue();
1458 if (parked_packet_limit) {
1459 const auto& parking_lot = ServerHooks::getServerHooks().
1460 getParkingLotPtr(
"leases4_committed");
1462 if (parking_lot && (parking_lot->size() >= parked_packet_limit)) {
1466 .arg(parked_packet_limit)
1467 .arg(query->getLabel());
1469 static_cast<int64_t>(1));
1479 HooksManager::park(
"leases4_committed", query,
1480 [
this, callout_handle, query, rsp]()
mutable {
1481 if (MultiThreadingMgr::instance().getMode()) {
1482 typedef function<void()> CallBack;
1483 boost::shared_ptr<CallBack> call_back =
1485 this, callout_handle, query, rsp));
1486 MultiThreadingMgr::instance().getThreadPool().add(call_back);
1496 HooksManager::callCallouts(Hooks.hook_index_leases4_committed_,
1500 if (allow_packet_park) {
1501 HooksManager::drop(
"leases4_committed", query);
1507 if ((callout_handle->getStatus() == CalloutHandle::NEXT_STEP_PARK)
1508 && allow_packet_park) {
1510 .arg(query->getLabel());
1518 HooksManager::drop(
"leases4_committed", query);
1519 if (callout_handle->getStatus() == CalloutHandle::NEXT_STEP_DROP) {
1521 .arg(query->getLabel());
1539 }
catch (
const std::exception& e) {
1555 bool skip_pack =
false;
1558 if (HooksManager::calloutsPresent(Hooks.hook_index_pkt4_send_)) {
1571 callout_handle->setArgument(
"query4", query);
1574 callout_handle->setArgument(
"response4", rsp);
1577 HooksManager::callCallouts(Hooks.hook_index_pkt4_send_,
1585 if (callout_handle->getStatus() == CalloutHandle::NEXT_STEP_SKIP) {
1587 .arg(query->getLabel());
1592 if (callout_handle->getStatus() == CalloutHandle::NEXT_STEP_DROP) {
1594 .arg(rsp->getLabel());
1603 .arg(rsp->getLabel());
1605 }
catch (
const std::exception& e) {
1607 .arg(rsp->getLabel())
1625 if (HooksManager::calloutsPresent(Hooks.hook_index_buffer4_send_)) {
1637 callout_handle->setArgument(
"response4", rsp);
1640 HooksManager::callCallouts(Hooks.hook_index_buffer4_send_,
1646 if ((callout_handle->getStatus() == CalloutHandle::NEXT_STEP_SKIP) ||
1647 (callout_handle->getStatus() == CalloutHandle::NEXT_STEP_DROP)) {
1650 .arg(rsp->getLabel());
1654 callout_handle->getArgument(
"response4", rsp);
1658 .arg(rsp->getLabel())
1659 .arg(rsp->getName())
1660 .arg(static_cast<int>(rsp->getType()))
1661 .arg(rsp->getLocalAddr().isV4Zero() ?
"*" : rsp->getLocalAddr().toText())
1662 .arg(rsp->getLocalPort())
1663 .arg(rsp->getRemoteAddr())
1664 .arg(rsp->getRemotePort())
1665 .arg(rsp->getIface().empty() ?
"to be determined from routing" :
1670 .arg(rsp->getLabel())
1671 .arg(rsp->getName())
1672 .arg(static_cast<int>(rsp->getType()))
1673 .arg(rsp->toText());
1679 }
catch (
const std::exception& e) {
1681 .arg(rsp->getLabel())
1691 boost::shared_ptr<Option4AddrLst> generated =
1698 if (addrs.size() != 1) {
1700 <<
"Expected to contain a single IPv4 address.");
1703 return (addrs[0].toText());
1721 if (local_addr.
isV4Bcast() || query->isDhcp4o6()) {
1744 if (host && !host->getCfgOption4()->empty()) {
1745 co_list.push_back(host->getCfgOption4());
1752 addr = resp->getYiaddr();
1756 if (pool && !pool->getCfgOption()->empty()) {
1757 co_list.push_back(pool->getCfgOption());
1762 if (!subnet->getCfgOption()->empty()) {
1763 co_list.push_back(subnet->getCfgOption());
1768 subnet->getSharedNetwork(network);
1769 if (network && !network->getCfgOption()->empty()) {
1770 co_list.push_back(network->getCfgOption());
1776 cclass != classes.
cend(); ++cclass) {
1779 getClientClassDictionary()->findClass(*cclass);
1791 if (ccdef->getCfgOption()->empty()) {
1796 co_list.push_back(ccdef->getCfgOption());
1820 if (co_list.empty()) {
1826 std::vector<uint8_t> requested_opts;
1834 requested_opts = option_prl->getValues();
1837 for (CfgOptionList::const_iterator copts = co_list.begin();
1838 copts != co_list.end(); ++copts) {
1846 for (OptionContainerPersistIndex::const_iterator desc = range.first;
1847 desc != range.second; ++desc) {
1849 if (desc->option_) {
1850 uint8_t code =
static_cast<uint8_t
>(desc->option_->getType());
1851 requested_opts.push_back(code);
1858 for (std::vector<uint8_t>::const_iterator opt = requested_opts.begin();
1859 opt != requested_opts.end(); ++opt) {
1861 if (!resp->getOption(*opt)) {
1863 for (CfgOptionList::const_iterator copts = co_list.begin();
1864 copts != co_list.end(); ++copts) {
1868 resp->addOption(desc.
option_);
1891 if (co_list.empty()) {
1895 uint32_t vendor_id = 0;
1900 boost::shared_ptr<OptionVendor> vendor_req = boost::dynamic_pointer_cast<
1910 boost::shared_ptr<OptionVendor> vendor_rsp = boost::dynamic_pointer_cast<
1916 if (!vendor_req && !vendor_rsp) {
1923 std::vector<uint8_t> requested_opts;
1939 requested_opts = oro->getValues();
1945 for (CfgOptionList::const_iterator copts = co_list.begin();
1946 copts != co_list.end(); ++copts) {
1955 for (OptionContainerPersistIndex::const_iterator desc = range.first;
1956 desc != range.second; ++desc) {
1958 if (desc->option_) {
1959 uint8_t code =
static_cast<uint8_t
>(desc->option_->getType());
1960 requested_opts.push_back(code);
1966 if (requested_opts.empty()) {
1978 for (std::vector<uint8_t>::const_iterator code = requested_opts.begin();
1979 code != requested_opts.end(); ++code) {
1980 if (!vendor_rsp->getOption(*code)) {
1981 for (CfgOptionList::const_iterator copts = co_list.begin();
1982 copts != co_list.end(); ++copts) {
1985 vendor_rsp->addOption(desc.
option_);
2004 static const uint16_t required_options[] = {
2010 static size_t required_options_size =
2011 sizeof(required_options) /
sizeof(required_options[0]);
2021 if (co_list.empty()) {
2029 for (
int i = 0; i < required_options_size; ++i) {
2030 OptionPtr opt = resp->getOption(required_options[i]);
2033 for (CfgOptionList::const_iterator copts = co_list.begin();
2034 copts != co_list.end(); ++copts) {
2036 required_options[i]);
2038 resp->addOption(desc.
option_);
2058 .arg(query->getLabel());
2059 processClientFqdnOption(ex);
2064 .arg(query->getLabel());
2065 processHostnameOption(ex);
2071 std::string hostname;
2072 bool fqdn_fwd =
false;
2073 bool fqdn_rev =
false;
2082 opt_hostname = boost::dynamic_pointer_cast<
OptionString>
2086 hostname = opt_hostname->
getValue();
2091 if (hostname ==
".") {
2097 if (ex.
getContext()->getDdnsParams()->getEnableUpdates()) {
2106 if (HooksManager::calloutsPresent(Hooks.hook_index_ddns4_update_)) {
2117 callout_handle->setArgument(
"query4", query);
2118 callout_handle->setArgument(
"response4", resp);
2119 callout_handle->setArgument(
"subnet4", subnet);
2120 callout_handle->setArgument(
"hostname", hostname);
2121 callout_handle->setArgument(
"fwd-update", fqdn_fwd);
2122 callout_handle->setArgument(
"rev-update", fqdn_rev);
2123 callout_handle->setArgument(
"ddns-params", ex.
getContext()->getDdnsParams());
2126 HooksManager::callCallouts(Hooks.hook_index_ddns4_update_, *callout_handle);
2129 string hook_hostname;
2130 bool hook_fqdn_fwd =
false;
2131 bool hook_fqdn_rev =
false;
2132 callout_handle->getArgument(
"hostname", hook_hostname);
2133 callout_handle->getArgument(
"fwd-update", hook_fqdn_fwd);
2134 callout_handle->getArgument(
"rev-update", hook_fqdn_rev);
2138 if ((hostname != hook_hostname) || (fqdn_fwd != hook_fqdn_fwd) ||
2139 (fqdn_rev != hook_fqdn_rev)) {
2141 .arg(hostname).arg(hook_hostname).arg(fqdn_fwd).arg(hook_fqdn_fwd)
2142 .arg(fqdn_rev).arg(hook_fqdn_rev);
2143 hostname = hook_hostname;
2144 fqdn_fwd = hook_fqdn_fwd;
2145 fqdn_rev = hook_fqdn_rev;
2152 hostname_opt->
setValue(hook_hostname);
2167 ctx->fwd_dns_update_ = fqdn_fwd;
2168 ctx->rev_dns_update_ = fqdn_rev;
2169 ctx->hostname_ = hostname;
2194 .arg(fqdn->toText());
2210 !ex.
getContext()->currentHost()->getHostname().empty()) {
2237 .arg(fqdn_resp->
toText());
2253 .arg(opt_hostname->getValue());
2261 if (ctx->currentHost() && !ctx->currentHost()->getHostname().empty()) {
2263 std::string hostname = d2_mgr.
qualifyName(ctx->currentHost()->getHostname(),
2266 boost::algorithm::to_lower(hostname);
2284 ex.
getContext()->getDdnsParams()->getReplaceClientNameMode();
2287 if (!opt_hostname) {
2307 .arg(opt_hostname->getValue());
2310 unsigned int label_count;
2316 }
catch (
const std::exception& exc) {
2327 if (label_count == 0) {
2345 || label_count < 2) {
2359 ex.
getContext()->getDdnsParams()->getHostnameSanitizer();
2362 hostname = sanitizer->scrub(hostname);
2366 boost::algorithm::to_lower(hostname);
2368 if (label_count == 2) {
2376 opt_hostname_resp.reset(
2387 .arg(opt_hostname_resp->getValue());
2397 "NULL lease specified when creating NameChangeRequest");
2405 if (!old_lease || ddns_params.
getUpdateOnRenew() || !lease->hasIdenticalFqdn(*old_lease)) {
2436 .arg(query->getLabel())
2437 .arg(query->getRemoteAddr().toText())
2438 .arg(query->getName());
2454 if (opt_requested_address) {
2455 hint = opt_requested_address->readAddress();
2457 }
else if (!query->getCiaddr().isV4Zero()) {
2458 hint = query->getCiaddr();
2470 bool fake_allocation = (query->getType() ==
DHCPDISCOVER);
2480 if (!fake_allocation && !opt_serverid && opt_requested_address) {
2483 .arg(query->getLabel())
2484 .arg(hint.toText());
2500 if (!leases_client_id.empty()) {
2506 for (
auto l = leases_client_id.begin(); l != leases_client_id.end(); ++l) {
2507 if ((*l)->subnet_id_ == s->getID()) {
2517 s = s->getNextSubnet(original_subnet, query->getClasses());
2525 if (!lease && hwaddr) {
2529 if (!leases_hwaddr.empty()) {
2534 for (
auto l = leases_hwaddr.begin(); l != leases_hwaddr.end(); ++l) {
2535 if ((*l)->subnet_id_ == s->getID()) {
2545 s = s->getNextSubnet(original_subnet, query->getClasses());
2554 bool authoritative = original_subnet->getAuthoritative();
2555 bool known_client = lease && lease->belongsToClient(hwaddr, client_id);
2556 if (!authoritative && !known_client) {
2559 .arg(query->getLabel())
2560 .arg(hint.toText());
2568 if ((known_client && (lease->addr_ != hint)) ||
2569 (!known_client && authoritative)) {
2572 .arg(query->getLabel())
2573 .arg(hint.toText());
2584 ctx->requested_address_ = hint;
2585 ctx->fake_allocation_ = fake_allocation;
2586 ctx->callout_handle_ = callout_handle;
2602 bool client_name_changed =
false;
2606 if (subnet && ctx->subnet_ && subnet->getID() != ctx->subnet_->getID()) {
2608 subnet->getSharedNetwork(network);
2610 .arg(query->getLabel())
2611 .arg(subnet->toText())
2612 .arg(ctx->subnet_->toText())
2613 .arg(network ? network->getName() :
"<no network?>");
2615 subnet = ctx->subnet_;
2630 ctx->hostname_ =
"";
2631 ctx->fwd_dns_update_ =
false;
2632 ctx->rev_dns_update_ =
false;
2639 if ((lease->hostname_ != ctx->hostname_) ||
2640 (lease->fqdn_fwd_ != ctx->fwd_dns_update_) ||
2641 (lease->fqdn_rev_ != ctx->rev_dns_update_)) {
2642 lease->hostname_ = ctx->hostname_;
2643 lease->fqdn_fwd_ = ctx->fwd_dns_update_;
2644 lease->fqdn_rev_ = ctx->rev_dns_update_;
2645 client_name_changed =
true;
2653 if (fake_allocation) {
2655 .arg(query->getLabel())
2656 .arg(lease->addr_.toText());
2659 .arg(query->getLabel())
2660 .arg(lease->addr_.toText())
2668 if (!ctx->subnet_->getMatchClientId()) {
2670 .arg(ctx->query_->getLabel())
2671 .arg(ctx->subnet_->getID());
2674 resp->setYiaddr(lease->addr_);
2680 if (!fake_allocation) {
2685 resp->setCiaddr(query->getCiaddr());
2694 if (lease->reuseable_valid_lft_ > 0) {
2695 lease->valid_lft_ = lease->reuseable_valid_lft_;
2697 .arg(query->getLabel())
2698 .arg(lease->addr_.toText())
2704 lease->valid_lft_));
2705 resp->addOption(opt);
2708 resp->addOption(getNetmaskOption(subnet));
2714 if (!fake_allocation) {
2720 .arg(query->getLabel())
2728 if (ctx->unknown_requested_addr_) {
2740 s = s->getNextSubnet(original_subnet);
2748 .arg(query->getLabel())
2749 .arg(query->getCiaddr().toText())
2750 .arg(opt_requested_address ?
2751 opt_requested_address->readAddress().toText() :
"(no address)");
2759 .arg(query->getLabel())
2760 .arg(query->getCiaddr().toText())
2761 .arg(opt_requested_address ?
2762 opt_requested_address->readAddress().toText() :
"(no address)");
2774 const Pkt4Ptr& query,
const Pkt4Ptr& resp,
bool client_name_changed) {
2784 if (!opt_hostname) {
2791 if (lease->hostname_.empty()) {
2798 .
generateFqdn(lease->addr_, *(ctx->getDdnsParams()), static_cast<bool>(fqdn));
2801 .arg(query->getLabel())
2802 .arg(lease->hostname_);
2804 client_name_changed =
true;
2807 if (client_name_changed) {
2812 if (!ctx->fake_allocation_) {
2814 lease->reuseable_valid_lft_ = 0;
2827 opt_hostname->setValue(lease->hostname_);
2831 .arg(query->getLabel())
2832 .arg(lease->hostname_)
2842 uint32_t t2_time = 0;
2844 if (!subnet->getT2().unspecified()) {
2845 t2_time = subnet->getT2();
2846 }
else if (subnet->getCalculateTeeTimes()) {
2848 t2_time =
static_cast<uint32_t
>(round(subnet->getT2Percent() * (lease->valid_lft_)));
2853 uint32_t timer_ceiling = lease->valid_lft_;
2854 if (t2_time > 0 && t2_time < timer_ceiling) {
2856 resp->addOption(t2);
2858 timer_ceiling = t2_time;
2861 uint32_t t1_time = 0;
2863 if (!subnet->getT1().unspecified()) {
2864 t1_time = subnet->getT1();
2865 }
else if (subnet->getCalculateTeeTimes()) {
2867 t1_time =
static_cast<uint32_t
>(round(subnet->getT1Percent() * (lease->valid_lft_)));
2872 if (t1_time > 0 && t1_time < timer_ceiling) {
2874 resp->addOption(t1);
2884 if (rai && rai->getOption(RAI_OPTION_RELAY_PORT)) {
2886 return (query->getRemotePort());
2914 }
else if (((query->getType() ==
DHCPINFORM) &&
2915 ((!query->getCiaddr().isV4Zero()) ||
2916 (!query->isRelayed() && !query->getRemoteAddr().isV4Zero()))) ||
2917 ((query->getType() !=
DHCPINFORM) && !query->isRelayed())) {
2918 response->setRemotePort(DHCP4_CLIENT_PORT);
2923 response->setRemotePort(relay_port ? relay_port : DHCP4_SERVER_PORT);
2927 if (query->isRelayed() &&
2933 response->resetIndex();
2935 response->setIface(query->getIface());
2939 IOAddress local_addr = query->getLocalAddr();
2948 if (local_addr.
isV4Bcast() || query->isDhcp4o6()) {
2959 response->setLocalAddr(local_addr);
2968 response->setIndex(query->getIndex());
2969 response->setIface(query->getIface());
2975 response->setLocalPort(DHCP4_SERVER_PORT);
2987 if (query->isDhcp4o6()) {
2988 response->setRemoteAddr(query->getRemoteAddr());
3000 if (!query->getCiaddr().isV4Zero()) {
3001 response->setRemoteAddr(query->getCiaddr());
3008 }
else if (query->isRelayed()) {
3009 response->setRemoteAddr(query->getGiaddr());
3010 response->setFlags(response->getFlags() | BOOTP_BROADCAST);
3015 response->setRemoteAddr(query->getRemoteAddr());
3022 if (query->isRelayed()) {
3031 query->getCiaddr().isV4Zero()) {
3032 response->setFlags(BOOTP_BROADCAST);
3034 response->setRemoteAddr(query->getGiaddr());
3038 }
else if (!query->getCiaddr().isV4Zero()) {
3039 response->setRemoteAddr(query->getCiaddr());
3044 }
else if (response->getType() ==
DHCPNAK) {
3048 }
else if (!response->getYiaddr().isV4Zero()) {
3063 response->setRemoteAddr(response ->getYiaddr());
3071 response->setRemoteAddr(query->getRemoteAddr());
3076 response->setRemoteAddr(query->getRemoteAddr());
3088 IOAddress subnet_next_server = subnet->getSiaddr();
3089 if (!subnet_next_server.
isV4Zero()) {
3090 response->setSiaddr(subnet_next_server);
3093 const string& sname = subnet->getSname();
3094 if (!sname.empty()) {
3100 response->setSname(reinterpret_cast<const uint8_t*>(sname.c_str()),
3104 const string& filename = subnet->getFilename();
3105 if (!filename.empty()) {
3111 response->setFile(reinterpret_cast<const uint8_t*>(filename.c_str()),
3119 if (!classes.
empty()) {
3132 size_t found_cnt = 0;
3134 name != classes.
cend() && found_cnt < 3; ++name) {
3146 next_server = cl->getNextServer();
3148 response->setSiaddr(next_server);
3153 if (sname.empty()) {
3154 sname = cl->getSname();
3155 if (!sname.empty()) {
3161 response->setSname(reinterpret_cast<const uint8_t*>(sname.c_str()),
3167 if (filename.empty()) {
3168 filename = cl->getFilename();
3169 if (!filename.empty()) {
3175 response->setFile(reinterpret_cast<const uint8_t*>(filename.c_str()),
3189 Dhcpv4Srv::getNetmaskOption(
const Subnet4Ptr& subnet) {
3190 uint32_t netmask =
getNetmask4(subnet->get().second).toUint32();
3218 if (MultiThreadingMgr::instance().getMode()) {
3292 if (MultiThreadingMgr::instance().getMode()) {
3305 }
else if (request->inClass(
"BOOTP")) {
3307 response->addClass(
"BOOTP");
3311 if (!response->getYiaddr().isV4Zero()) {
3374 .arg(release->getLabel())
3375 .arg(release->getCiaddr().toText());
3379 if (!lease->belongsToClient(release->getHWAddr(), client_id)) {
3381 .arg(release->getLabel())
3382 .arg(release->getCiaddr().toText());
3389 if (HooksManager::calloutsPresent(Hooks.hook_index_lease4_release_)) {
3402 callout_handle->setArgument(
"query4", release);
3405 callout_handle->setArgument(
"lease4", lease);
3408 HooksManager::callCallouts(Hooks.hook_index_lease4_release_,
3414 if ((callout_handle->getStatus() == CalloutHandle::NEXT_STEP_SKIP) ||
3415 (callout_handle->getStatus() == CalloutHandle::NEXT_STEP_DROP)) {
3419 .arg(release->getLabel());
3431 context->old_lease_ = lease;
3435 .arg(release->getLabel())
3436 .arg(lease->addr_.toText());
3439 StatsMgr::instance().addValue(
3440 StatsMgr::generateName(
"subnet", lease->subnet_id_,
"assigned-addresses"),
3441 static_cast<int64_t>(-1));
3449 .arg(release->getLabel())
3450 .arg(lease->addr_.toText());
3455 .arg(release->getLabel())
3456 .arg(release->getCiaddr())
3473 if (!opt_requested_address) {
3476 " in DHCPDECLINE sent from " << decline->getLabel());
3478 IOAddress addr(opt_requested_address->readAddress());
3496 .arg(addr.toText()).arg(decline->getLabel());
3504 client_id.reset(
new ClientId(opt_clientid->getData()));
3508 if (!lease->belongsToClient(decline->getHWAddr(), client_id)) {
3511 string client_hw = decline->getHWAddr() ?
3512 decline->getHWAddr()->toText(
false) :
"(none)";
3513 string lease_hw = lease->hwaddr_ ?
3514 lease->hwaddr_->toText(
false) :
"(none)";
3517 string client_id_txt = client_id ? client_id->toText() :
"(none)";
3518 string lease_id_txt = lease->client_id_ ?
3519 lease->client_id_->toText() :
"(none)";
3523 .arg(addr.toText()).arg(decline->getLabel())
3524 .arg(client_hw).arg(lease_hw).arg(client_id_txt).arg(lease_id_txt);
3541 if (HooksManager::calloutsPresent(Hooks.hook_index_lease4_decline_)) {
3554 callout_handle->setArgument(
"query4", decline);
3557 callout_handle->setArgument(
"lease4", lease);
3560 HooksManager::callCallouts(Hooks.hook_index_lease4_decline_,
3565 if ((callout_handle->getStatus() == CalloutHandle::NEXT_STEP_SKIP) ||
3566 (callout_handle->getStatus() == CalloutHandle::NEXT_STEP_DROP)) {
3568 .arg(decline->getLabel()).arg(lease->addr_.toText());
3573 Lease4Ptr old_values = boost::make_shared<Lease4>(*lease);
3587 .arg(decline->getLabel())
3588 .arg(lease->addr_.toText())
3600 StatsMgr::instance().addValue(
3601 StatsMgr::generateName(
"subnet", lease->subnet_id_,
"declined-addresses"),
3602 static_cast<int64_t>(1));
3605 StatsMgr::instance().addValue(
"declined-addresses", static_cast<int64_t>(1));
3617 context->new_lease_ = lease;
3620 .arg(decline->getLabel()).arg(lease->valid_lft_);
3667 if (ack->getRemoteAddr() != inform->getGiaddr()) {
3669 .arg(inform->getLabel())
3670 .arg(ack->getRemoteAddr())
3671 .arg(ack->getIface());
3694 .arg(query->getLabel())
3695 .arg(query->getIface());
3703 .arg(query->getLabel())
3704 .arg(query->getIface());
3714 if (pkt->isRelayed()) {
3719 if (pkt->isDhcp4o6()) {
3728 if (pkt->getRemoteAddr().isV4Zero() &&
3729 pkt->getCiaddr().isV4Zero()) {
3740 bool result = (!pkt->getLocalAddr().isV4Bcast() ||
3755 type = query->getType();
3759 .arg(query->getLabel())
3760 .arg(query->getIface());
3784 .arg(query->getLabel());
3791 .arg(query->getLabel())
3796 .arg(query->getLabel())
3826 if (!option_custom) {
3834 if (option_custom->getDataFieldsNum() != 1) {
3840 IOAddress server_id = option_custom->readAddress();
3841 if (!server_id.
isV4()) {
3849 OptionPtr rai_suboption = rai_option->getOption(RAI_OPTION_SERVER_ID_OVERRIDE);
3850 if (rai_suboption && (server_id.
toBytes() == rai_suboption->toBinary())) {
3891 if (cfg_subnets->hasSubnetWithServerId(server_id)) {
3898 if (cfg_networks->hasNetworkWithServerId(server_id)) {
3905 cclass != classes.
cend(); ++cclass) {
3908 getClientClassDictionary()->findClass(*cclass);
3913 if (ccdef->getCfgOption()->empty()) {
3920 if (context_opt_server_id && (context_opt_server_id->readAddress() == server_id)) {
3931 return (opt_server_id && (opt_server_id->readAddress() == server_id));
3941 <<
" received in message " 3942 << query->getName());
3949 " received in message " 3950 << query->getName());
3960 if (query->getHWAddr() && !query->getHWAddr()->hwaddr_.empty()) {
3969 if (!client_id || client_id->len() == client_id->getHeaderLen()) {
3971 " provided in message " 3972 << query->getName());
3989 subnet->getSharedNetwork(network);
3991 const ClientClasses& to_add = network->getRequiredClasses();
3993 cclass != to_add.
cend(); ++cclass) {
4001 cclass != to_add.
cend(); ++cclass) {
4009 addr = resp->getYiaddr();
4016 cclass != to_add.
cend(); ++cclass) {
4030 cclass != classes.
cend(); ++cclass) {
4053 query->addClass(*cclass);
4066 .arg(
"get exception?");
4074 BOOST_FOREACH(
const uint16_t& code, query->getDeferredOptions()) {
4079 cclass != classes.
cend(); ++cclass) {
4083 getClientClassDictionary()->findClass(*cclass);
4089 if (!ccdef->getCfgOptionDef()) {
4125 opt = def->optionFactory(
Option::V4, code, buf);
4126 }
catch (
const std::exception& e) {
4134 while (query->delOption(code)) {
4138 query->addOption(opt);
4150 this, ph::_1, ph::_2));
4168 arg(result).arg((ncr ? ncr->toText() :
" NULL "));
4180 std::stringstream tmp;
4184 tmp << endl << EXTENDED_VERSION << endl;
4185 tmp <<
"linked with:" << endl;
4186 tmp << Logger::getVersion() << endl;
4187 tmp << CryptoLink::getVersion() << endl;
4188 tmp <<
"database:" << endl;
4207 string stat_name =
"pkt4-unknown-received";
4209 switch (query->getType()) {
4211 stat_name =
"pkt4-discover-received";
4215 stat_name =
"pkt4-offer-received";
4218 stat_name =
"pkt4-request-received";
4222 stat_name =
"pkt4-ack-received";
4226 stat_name =
"pkt4-nak-received";
4229 stat_name =
"pkt4-release-received";
4232 stat_name =
"pkt4-decline-received";
4235 stat_name =
"pkt4-inform-received";
4249 static_cast<int64_t>(1));
4255 static_cast<int64_t>(1));
4259 switch (response->getType()) {
4261 stat_name =
"pkt4-offer-sent";
4264 stat_name =
"pkt4-ack-sent";
4267 stat_name =
"pkt4-nak-sent";
4275 static_cast<int64_t>(1));
4279 return (Hooks.hook_index_buffer4_receive_);
4283 return (Hooks.hook_index_pkt4_receive_);
4287 return (Hooks.hook_index_subnet4_select_);
4291 return (Hooks.hook_index_lease4_release_);
4295 return (Hooks.hook_index_pkt4_send_);
4299 return (Hooks.hook_index_buffer4_send_);
4303 return (Hooks.hook_index_lease4_decline_);
4308 HooksManager::clearParkingLots();
4312 static std::list<std::list<std::string>>
const list({
4313 {
"config-control",
"config-databases",
"[]"},
4314 {
"hooks-libraries",
"[]",
"parameters",
"*"},
4316 {
"hosts-databases",
"[]"},
const isc::log::MessageID DHCP4_NCR_CREATION_FAILED
RAII class creating a critical section.
static std::string lifetimeToText(uint32_t lifetime)
Print lifetime.
void setPacketStatisticsDefaults()
This function sets statistics related to DHCPv4 packets processing to their initial values...
asiolink::IOAddress ciaddr_
ciaddr from the client's message.
const isc::log::MessageID DHCP4_DECLINE_FAIL
#define LOG_WARN(LOGGER, MESSAGE)
Macro to conveniently test warn output and log it.
static OptionDefinitionPtr getRuntimeOptionDef(const std::string &space, const uint16_t code)
Returns runtime (non-standard) option definition by space and option code.
void run_one()
Main server processing step.
static int getHookIndexBuffer4Send()
Returns the index for "buffer4_send" hook point.
std::string toText(const std::string &separator=", ") const
Returns all class names as text.
virtual void updateLease4(const Lease4Ptr &lease4)=0
Updates IPv4 lease.
const isc::log::MessageID DHCP4_CLASS_UNDEFINED
uint32_t getVendorId() const
Returns enterprise identifier.
void appendRequestedVendorOptions(Dhcpv4Exchange &ex)
Appends requested vendor options as requested by client.
const isc::log::MessageID DHCP4_SUBNET_SELECTION_FAILED
virtual ~Dhcpv4Srv()
Destructor. Used during DHCPv4 service shutdown.
asiolink::IOAddress remote_address_
Source address of the message.
const isc::log::MessageID DHCP4_PACKET_NAK_0002
const isc::log::MessageID DHCP4_CLIENT_HOSTNAME_DATA
uint16_t server_port_
UDP port number on which server listens.
void processPacketPktSend(hooks::CalloutHandlePtr &callout_handle, Pkt4Ptr &query, Pkt4Ptr &rsp)
Executes pkt4_send callout.
Message Type option missing.
bool getFlag(const uint8_t flag) const
Checks if the specified flag of the DHCPv4 Client FQDN Option is set.
const isc::log::MessageID DHCP4_PACKET_SEND
void processPacketBufferSend(hooks::CalloutHandlePtr &callout_handle, Pkt4Ptr &rsp)
Executes buffer4_send callout and sends the response.
static std::string getDBVersion()
Local version of getDBVersion() class method.
const int DBGLVL_TRACE_BASIC
Trace basic operations.
boost::shared_ptr< OptionCustom > OptionCustomPtr
A pointer to the OptionCustom object.
const isc::log::MessageID DHCP4_PACKET_SEND_FAIL
#define LOG_INFO(LOGGER, MESSAGE)
Macro to conveniently test info output and log it.
bool acceptMessageType(const Pkt4Ptr &query) const
Check if received message type is valid for the server to process.
boost::shared_ptr< HWAddr > HWAddrPtr
Shared pointer to a hardware address structure.
static void setHostIdentifiers(AllocEngine::ClientContext4Ptr context)
Set host identifiers within a context.
static int getHookIndexBuffer4Receive()
Returns the index for "buffer4_receive" hook point.
bool acceptDirectRequest(const Pkt4Ptr &query) const
Check if a message sent by directly connected client should be accepted or discarded.
Exception thrown during option unpacking This exception is thrown when an error has occurred...
DHCPv4 Option class for handling list of IPv4 addresses.
static SubnetSelector initSelector(const Pkt4Ptr &query)
Build selector from a client's message.
std::vector< isc::asiolink::IOAddress > AddressContainer
Defines a collection of IPv4 addresses.
const isc::log::MessageID DHCP4_PACKET_PACK
void adjustDomainName(const T &fqdn, T &fqdn_resp, const DdnsParams &ddns_params)
Set server FQDN name based on configuration and a given FQDN.
void buildCfgOptionList(Dhcpv4Exchange &ex)
Build the configured option list.
static void destroy()
Destroy lease manager.
const isc::log::MessageID DHCP4_LEASE_ADVERT
const isc::log::MessageID DHCP4_CLIENTID_IGNORED_FOR_LEASES
const isc::log::MessageID DHCP4_RESPONSE_DATA
const isc::log::MessageID DHCP4_PACKET_QUEUE_FULL
An abstract API for lease database.
boost::shared_ptr< const CfgOption > ConstCfgOptionPtr
Const pointer.
const isc::log::MessageID DHCP4_CLIENT_FQDN_PROCESS
const isc::log::MessageID DHCP4_EMPTY_HOSTNAME
IOAddress getNetmask4(uint8_t len)
Generates an IPv4 netmask of specified length.
void sendResponseNoThrow(hooks::CalloutHandlePtr &callout_handle, Pkt4Ptr &query, Pkt4Ptr &rsp)
Process an unparked DHCPv4 packet and sends the response.
static CfgMgr & instance()
returns a single instance of Configuration Manager
asiolink::IOAddress option_select_
RAI link select or subnet select option.
const isc::log::MessageID DHCP4_PACKET_DROP_0006
void startSender(D2ClientErrorHandler error_handler, isc::asiolink::IOService &io_service)
Enables sending NameChangeRequests to kea-dhcp-ddns.
Result
Defines the outcome of an asynchronous NCR send.
boost::shared_ptr< SrvConfig > SrvConfigPtr
Non-const pointer to the SrvConfig.
const isc::log::MessageID DHCP4_INFORM_DIRECT_REPLY
OptionPtr interface_id_
Interface id option.
boost::shared_ptr< OptionUint8Array > OptionUint8ArrayPtr
std::vector< Lease4Ptr > Lease4Collection
A collection of IPv4 leases.
boost::shared_ptr< Option > OptionPtr
boost::shared_ptr< Subnet4 > Subnet4Ptr
A pointer to a Subnet4 object.
void initResponse()
Initializes the instance of the response message.
static void classifyPacket(const Pkt4Ptr &pkt)
Assigns incoming packet to zero or more classes.
const isc::log::MessageID DHCP4_TESTING_MODE_SEND_TO_SOURCE_ENABLED
const isc::log::MessageID DHCP4_SHUTDOWN_REQUEST
void adjustRemoteAddr(Dhcpv4Exchange &ex)
Sets remote addresses for outgoing packet.
boost::shared_ptr< Option4ClientFqdn > Option4ClientFqdnPtr
A pointer to the Option4ClientFqdn object.
Represents a DHCPv6 packet.
boost::shared_ptr< OptionString > OptionStringPtr
Pointer to the OptionString object.
#define LOG_ERROR(LOGGER, MESSAGE)
Macro to conveniently test error output and log it.
void classifyPacket(const Pkt4Ptr &pkt)
Assigns incoming packet to zero or more classes.
const isc::log::MessageID DHCP4_INIT_REBOOT
isc::log::Logger bad_packet4_logger(DHCP4_BAD_PACKET_LOGGER_NAME)
Logger for rejected packets.
SrvConfigPtr getCurrentCfg()
Returns a pointer to the current configuration.
Holds information about DHCP service enabling status.
const isc::log::MessageID DHCP4_RELEASE_FAIL_WRONG_CLIENT
virtual void sendPacket(const Pkt4Ptr &pkt)
dummy wrapper around IfaceMgr::send()
const isc::log::MessageID DHCP4_POST_ALLOCATION_NAME_UPDATE_FAIL
const isc::log::MessageID DHCP4_SRV_D2STOP_ERROR
boost::shared_ptr< CfgIface > CfgIfacePtr
A pointer to the CfgIface .
asiolink::IOAddress giaddr_
giaddr from the client's message.
const isc::log::MessageID DHCP4_HOOK_DDNS_UPDATE
Represents DHCPv4 Client FQDN Option (code 81).
const isc::log::MessageID DHCP4_BUFFER_WAIT_SIGNAL
const isc::log::MessageID DHCP4_RELEASE_FAIL
Forward declaration to OptionInt.
const isc::log::MessageID DHCP4_HOOK_BUFFER_RCVD_SKIP
boost::shared_ptr< Pool > PoolPtr
a pointer to either IPv4 or IPv6 Pool
std::string getValue() const
Returns the string value held by the option.
static Dhcp4to6Ipc & instance()
Returns pointer to the sole instance of Dhcp4to6Ipc.
boost::shared_ptr< NameChangeRequest > NameChangeRequestPtr
Defines a pointer to a NameChangeRequest.
bool earlyGHRLookup(const Pkt4Ptr &query, AllocEngine::ClientContext4Ptr ctx)
Initialize client context and perform early global reservations lookup.
const int DBG_DHCP4_BASIC_DATA
Debug level used to log the traces with some basic data.
isc::log::Logger options4_logger(DHCP4_OPTIONS_LOGGER_NAME)
Logger for options parser.
const int DBG_DHCP4_START
Debug level used to log information during server startup.
Dhcpv4Srv(uint16_t server_port=DHCP4_SERVER_PORT, uint16_t client_port=0, const bool use_bcast=true, const bool direct_response_desired=true)
Default constructor.
int getExitValue()
Fetches the exit value.
void discardPackets()
Discards parked packets Clears the packet parking lots of all packets.
void setDomainName(const std::string &domain_name, const DomainNameType domain_name_type)
Set new domain-name.
const int DBGLVL_PKT_HANDLING
This debug level is reserved for logging the details of packet handling, such as dropping the packet ...
const_iterator cbegin() const
Iterator to the first element.
void postAllocateNameUpdate(const AllocEngine::ClientContext4Ptr &ctx, const Lease4Ptr &lease, const Pkt4Ptr &query, const Pkt4Ptr &resp, bool client_name_changed)
Update client name and DNS flags in the lease and response.
boost::shared_ptr< OptionUint32 > OptionUint32Ptr
RAII object enabling copying options retrieved from the packet.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
const isc::log::MessageID DHCP4_FLEX_ID
isc::log::Logger packet4_logger(DHCP4_PACKET_LOGGER_NAME)
Logger for processed packets.
void createNameChangeRequests(const Lease4Ptr &lease, const Lease4Ptr &old_lease, const DdnsParams &ddns_params)
Creates NameChangeRequests which correspond to the lease which has been acquired. ...
boost::shared_ptr< AllocEngine > AllocEnginePtr
A pointer to the AllocEngine object.
static int getHookIndexLease4Release()
Returns the index for "lease4_release" hook point.
const isc::log::MessageID DHCP4_CLIENT_HOSTNAME_MALFORMED
static StatsMgr & instance()
Statistics Manager accessor method.
const int DBG_DHCP4_BASIC
Debug level used to trace basic operations within the code.
boost::shared_ptr< const CfgSubnets4 > ConstCfgSubnets4Ptr
Const pointer.
bool isV6LinkLocal() const
checks whether and address is IPv6 and is link-local
std::vector< uint8_t > OptionBuffer
buffer types used in DHCP code.
void processRelease(Pkt4Ptr &release, AllocEngine::ClientContext4Ptr &context)
Processes incoming DHCPRELEASE messages.
Statistics Manager class.
ClientClasses client_classes_
Classes that the client belongs to.
static const size_t OPTION4_HDR_LEN
length of the usual DHCPv4 option header (there are exceptions)
The IOService class is a wrapper for the ASIO io_service class.
const isc::log::MessageID DHCP4_DECLINE_LEASE
const isc::log::MessageID DHCP4_HOOK_BUFFER_RCVD_DROP
Server uses routing to determine the right interface to send response.
Pkt6Ptr getPkt6() const
Returns encapsulating DHCPv6 message.
const isc::log::MessageID DHCP4_PACKET_DROP_0008
const isc::log::MessageID DHCP4_DECLINE_LEASE_MISMATCH
asiolink::IOAddress first_relay_linkaddr_
First relay link address.
const isc::log::MessageID DHCP4_PACKET_PACK_FAIL
void setFixedFields(Dhcpv4Exchange &ex)
Sets fixed fields of the outgoing packet.
bool send(const Pkt6Ptr &pkt)
Sends an IPv6 packet.
void setMatchingPacketFilter(const bool direct_response_desired=false)
Set Packet Filter object to handle send/receive packets.
Subnet selector used to specify parameters used to select a subnet.
OptionInt< uint32_t > OptionUint32
isc::log::Logger dhcp4_logger(DHCP4_APP_LOGGER_NAME)
Base logger for DHCPv4 server.
static std::string getDBVersion()
Class method to return extended version info This class method must be redeclared and redefined in de...
const isc::log::MessageID DHCP4_RELEASE_EXCEPTION
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
boost::shared_ptr< CfgSharedNetworks4 > CfgSharedNetworks4Ptr
Pointer to the configuration of IPv4 shared networks.
void queueNCR(const NameChangeType &chg_type, const Lease4Ptr &lease)
Creates name change request from the DHCPv4 lease.
boost::shared_ptr< Pkt6 > Pkt6Ptr
A pointer to Pkt6 packet.
ClientClassContainer::const_iterator const_iterator
Type of iterators.
asiolink::IOServicePtr & getIOService()
Returns pointer to the IO service used by the server.
Pkt4Ptr processInform(Pkt4Ptr &inform, AllocEngine::ClientContext4Ptr &context)
Processes incoming DHCPINFORM messages.
const isc::log::MessageID DHCP4_CLASS_UNCONFIGURED
virtual void d2ClientErrorHandler(const dhcp_ddns::NameChangeSender::Result result, dhcp_ddns::NameChangeRequestPtr &ncr)
Implements the error handler for DHCP_DDNS IO errors.
structure that describes a single relay information
const isc::log::MessageID DHCP4_SRV_UNLOAD_LIBRARIES_ERROR
Forward declaration to OptionIntArray.
void processDecline(Pkt4Ptr &decline, AllocEngine::ClientContext4Ptr &context)
Process incoming DHCPDECLINE messages.
void setTeeTimes(const Lease4Ptr &lease, const Subnet4Ptr &subnet, Pkt4Ptr resp)
Adds the T1 and T2 timers to the outbound response as appropriate.
const isc::log::MessageID DHCP4_BUFFER_RECEIVE_FAIL
bool acceptServerId(const Pkt4Ptr &pkt) const
Verifies if the server id belongs to our server.
std::list< ConstCfgOptionPtr > CfgOptionList
Const pointer list.
volatile bool shutdown_
Indicates if shutdown is in progress.
Implementation of the mechanisms to control the use of the Configuration Backends by the DHCPv4 serve...
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
static void sanityCheck(const Pkt4Ptr &query, RequirementLevel serverid)
Verifies if specified packet meets RFC requirements.
void processDhcp4QueryAndSendResponse(Pkt4Ptr &query, Pkt4Ptr &rsp, bool allow_packet_park)
Process a single incoming DHCPv4 query.
static void appendServerID(Dhcpv4Exchange &ex)
Adds server identifier option to the server's response.
const isc::log::MessageID DHCP4_PACKET_DROP_0010
bool getEnableUpdates() const
Returns whether or not DHCP DDNS updating is enabled.
std::string getIdentifierAsText() const
Returns host identifier in a textual form.
Pkt4Ptr processRequest(Pkt4Ptr &request, AllocEngine::ClientContext4Ptr &context)
Processes incoming REQUEST and returns REPLY response.
void processPacket(Pkt4Ptr &query, Pkt4Ptr &rsp, bool allow_packet_park=true)
Process a single incoming DHCPv4 packet.
bool isV4Bcast() const
Convenience function to check if it is an IPv4 broadcast address.
bool isV6Zero() const
Convenience function to check if it is an IPv4 zero address.
void appendRequestedOptions(Dhcpv4Exchange &ex)
Appends options requested by client.
boost::shared_ptr< Lease4Collection > Lease4CollectionPtr
A shared pointer to the collection of IPv4 leases.
boost::shared_ptr< ClientContext4 > ClientContext4Ptr
Pointer to the ClientContext4.
static int getHookIndexLease4Decline()
Returns the index for "lease4_decline" hook point.
virtual std::string toText(int indent=0) const
Returns string representation of the option.
static std::string getDBVersion()
Local version of getDBVersion() class method.
bool hasOpenSocket(const uint16_t family) const
Checks if there is at least one socket of the specified family open.
std::pair< OptionContainerPersistIndex::const_iterator, OptionContainerPersistIndex::const_iterator > OptionContainerPersistRange
Pair of iterators to represent the range of options having the same persistency flag.
static int getHookIndexSubnet4Select()
Returns the index for "subnet4_select" hook point.
static int getHookIndexPkt4Send()
Returns the index for "pkt4_send" hook point.
const isc::log::MessageID DHCP4_PACKET_DROP_0002
const int DBG_DHCP4_DETAIL_DATA
This level is used to log the contents of packets received and sent.
A generic exception that is thrown when an unexpected error condition occurs.
boost::shared_ptr< ClientClassDictionary > ClientClassDictionaryPtr
Defines a pointer to a ClientClassDictionary.
const isc::log::MessageID DHCP4_LEASE_REUSE
const isc::log::MessageID DHCP4_PACKET_DROP_0013
Wrapper class around callout handle which automatically resets handle's state.
void stopD2()
Stops DHCP_DDNS client IO if DDNS updates are enabled.
bool isV4Zero() const
Convenience function to check if it is an IPv4 zero address.
static const IOAddress & IPV4_ZERO_ADDRESS()
Returns an address set to all zeros.
const isc::log::MessageID DHCP4_PACKET_DROP_0004
const isc::log::MessageID DHCP4_NO_LEASE_INIT_REBOOT
std::vector< uint8_t > toBytes() const
Return address as set of bytes.
bool ddnsEnabled()
Convenience method for checking if DHCP-DDNS is enabled.
asiolink::IOAddress local_address_
Address on which the message was received.
const isc::log::MessageID DHCP4_PACKET_RECEIVED
boost::shared_ptr< Pkt4 > Pkt4Ptr
A pointer to Pkt4 object.
Flexible host identifier.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< const Host > ConstHostPtr
Const pointer to the Host object.
std::string getDomainName() const
Returns the domain-name in the text format.
const isc::log::MessageID DHCP4_BUFFER_UNPACK
const char *const * dhcp4_config_report
const isc::log::MessageID DHCP4_HOOK_SUBNET4_SELECT_DROP
const isc::log::MessageID DHCP4_BUFFER_RECEIVED
void processDhcp4Query(Pkt4Ptr &query, Pkt4Ptr &rsp, bool allow_packet_park)
Process a single incoming DHCPv4 query.
const isc::log::MessageID DHCP4_HOOK_LEASES4_PARKING_LOT_FULL
const isc::log::MessageID DHCP4_CLASS_UNTESTABLE
static void classifyByVendor(const Pkt4Ptr &pkt)
Assign class using vendor-class-identifier option.
const isc::log::MessageID DHCP4_RELEASE_FAIL_NO_LEASE
static void removeDependentEvaluatedClasses(const Pkt4Ptr &query)
Removed evaluated client classes.
const int DBG_DHCP4_DETAIL
Debug level used to trace detailed errors.
const isc::log::MessageID DHCP4_SRV_DHCP4O6_ERROR
boost::shared_ptr< ClientId > ClientIdPtr
Shared pointer to a Client ID.
const isc::log::MessageID DHCP4_PACKET_DROP_0005
const isc::log::MessageID DHCP4_HOOK_PACKET_SEND_DROP
const isc::log::MessageID DHCP4_PACKET_DROP_0001
bool isV4() const
Convenience function to check for an IPv4 address.
Convenience container for conveying DDNS behavioral parameters It is intended to be created per Packe...
const isc::log::MessageID DHCP4_HOOK_PACKET_SEND_SKIP
static OptionDefinitionPtr getOptionDef(const std::string &space, const uint16_t code)
Return the first option definition matching a particular option code.
bool empty() const
Check if classes is empty.
const int DBG_DHCP4_HOOKS
Debug level used to trace hook related operations.
const isc::log::MessageID DHCP4_CLIENT_FQDN_DATA
boost::shared_ptr< ClientClassDef > ClientClassDefPtr
a pointer to an ClientClassDef
OptionPtr option_
Option instance.
virtual Pkt4Ptr receivePacket(int timeout)
dummy wrapper around IfaceMgr::receive4
const isc::log::MessageID DHCP4_RESPONSE_HOSTNAME_DATA
boost::shared_ptr< SharedNetwork4 > SharedNetwork4Ptr
Pointer to SharedNetwork4 object.
const isc::log::MessageID DHCP4_GENERATE_FQDN
const isc::log::MessageID DHCP4_HOOK_PACKET_RCVD_SKIP
void processPacketAndSendResponse(Pkt4Ptr &query)
Process a single incoming DHCPv4 packet and sends the response.
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 DHCP4_OPEN_SOCKET
static void processStatsSent(const Pkt4Ptr &response)
Updates statistics for transmitted packets.
void addValue(const std::string &name, const int64_t value)
Records incremental integer observation.
const isc::log::MessageID DHCP4_HOOK_BUFFER_SEND_SKIP
boost::shared_ptr< AllocEngine > alloc_engine_
Allocation Engine.
Client race avoidance RAII handler.
const isc::log::MessageID DHCP4_PACKET_DROP_0009
This is a base class for exceptions thrown from the DNS library module.
Defines the logger used by the top-level component of kea-lfc.
NetworkStatePtr network_state_
Holds information about disabled DHCP service and/or disabled subnet/network scopes.
Datagram socket, i.e. IP/UDP socket.
void startD2()
Starts DHCP_DDNS client IO if DDNS updates are enabled.
const isc::log::MessageID DHCP4_SUBNET_DATA
void declineLease(const Lease4Ptr &lease, const Pkt4Ptr &decline, AllocEngine::ClientContext4Ptr &context)
Marks lease as declined.
const char *const config_report[]
Represents DHCPv4 packet.
D2ClientMgr isolates Kea from the details of being a D2 client.
const isc::log::MessageID DHCP4_CLASS_ASSIGNED
void getUpdateDirections(const T &fqdn_resp, bool &forward, bool &reverse)
Get directional update flags based on server FQDN flags.
static const uint8_t FLAG_E
Bit E.
bool getSendResponsesToSource() const
Returns value of the test_send_responses_to_source_ flag.
RequirementLevel
defines if certain option may, must or must not appear
ReplaceClientNameMode
Defines the client name replacement modes.
const isc::log::MessageID DHCP4_CLIENT_HOSTNAME_PROCESS
boost::shared_ptr< ClientClassDefList > ClientClassDefListPtr
Defines a pointer to a ClientClassDefList.
const isc::log::MessageID DHCP4_RELEASE
isc::dhcp::Subnet4Ptr selectSubnet(const Pkt4Ptr &query, bool &drop, bool sanity_only=false) const
Selects a subnet for a given client's packet.
const isc::log::MessageID DHCP4_PACKET_PROCESS_EXCEPTION
Exception thrown when a call to select is interrupted by a signal.
boost::shared_ptr< CalloutHandle > CalloutHandlePtr
A shared pointer to a CalloutHandle object.
static std::string srvidToString(const OptionPtr &opt)
converts server-id to text Converts content of server-id option to a text representation, e.g.
isc::log::Logger hooks_logger("hooks")
Hooks Logger.
const isc::log::MessageID DHCP4_HOOK_LEASE4_RELEASE_SKIP
const isc::log::MessageID DHCP4_QUERY_DATA
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.
const isc::log::MessageID DHCP4_PACKET_DROP_0007
void requiredClassify(Dhcpv4Exchange &ex)
Assigns incoming packet to zero or more classes (required pass).
Pkt4Ptr getQuery() const
Returns the pointer to the query from the client.
const isc::log::MessageID DHCP4_SUBNET_SELECTED
boost::shared_ptr< Pkt4o6 > Pkt4o6Ptr
A pointer to Pkt4o6 object.
void assignLease(Dhcpv4Exchange &ex)
Assigns a lease and appends corresponding options.
static const IOAddress & IPV4_BCAST_ADDRESS()
Returns a "255.255.255.255" broadcast address.
static const std::string VENDOR_CLASS_PREFIX
this is a prefix added to the content of vendor-class option
Pkt4Ptr processDiscover(Pkt4Ptr &discover, AllocEngine::ClientContext4Ptr &context)
Processes incoming DISCOVER and returns response.
const isc::log::MessageID DHCP4_PACKET_PROCESS_STD_EXCEPTION
void closeSockets()
Closes all open sockets.
Holds Client identifier or client IPv4 address.
isc::dhcp::Subnet4Ptr selectSubnet4o6(const Pkt4Ptr &query, bool &drop, bool sanity_only=false) const
Selects a subnet for a given client's DHCP4o6 packet.
const isc::log::MessageID DHCP4_PACKET_OPTIONS_SKIPPED
bool accept(const Pkt4Ptr &query) const
Checks whether received message should be processed or discarded.
const isc::log::MessageID DHCP4_SRV_CONSTRUCT_ERROR
void initResponse4o6()
Initializes the DHCPv6 part of the response message.
static IfaceMgr & instance()
IfaceMgr is a singleton class.
An exception that is thrown if a DHCPv6 protocol violation occurs while processing a message (e...
#define DHCP4_OPTION_SPACE
global std option spaces
const isc::log::MessageID DHCP4_RESPONSE_FQDN_DATA
boost::shared_ptr< OptionContainer > OptionContainerPtr
Pointer to the OptionContainer object.
const isc::log::MessageID DHCP4_UNKNOWN_ADDRESS_REQUESTED
const_iterator cend() const
Iterator to the past the end element.
const isc::log::MessageID DHCP4_LEASE_ALLOC
bool tryLock(Pkt4Ptr query, ContinuationPtr cont=ContinuationPtr())
Tries to acquires a client.
#define LOG_DEBUG(LOGGER, LEVEL, MESSAGE)
Macro to conveniently test debug output and log it.
void deleteResponse()
Removes the response message by resetting the pointer to NULL.
const isc::log::MessageID DHCP4_HOOK_SUBNET4_SELECT_SKIP
void appendBasicOptions(Dhcpv4Exchange &ex)
Append basic options if they are not present.
std::string iface_name_
Name of the interface on which the message was received.
void processClientName(Dhcpv4Exchange &ex)
Processes Client FQDN and Hostname Options sent by a client.
int run()
Main server processing loop.
CfgOptionList & getCfgOptionList()
Returns the configured option list (non-const version)
static OptionDefinitionPtr getLastResortOptionDef(const std::string &space, const uint16_t code)
Returns last resort option definition by space and option code.
isc::log::Logger ddns4_logger(DHCP4_DDNS_LOGGER_NAME)
Logger for Hostname or FQDN processing.
void conditionallySetReservedClientClasses()
Assigns classes retrieved from host reservation database if they haven't been yet set...
static uint16_t checkRelayPort(const Dhcpv4Exchange &ex)
Check if the relay port RAI sub-option was set in the query.
const isc::log::MessageID DHCP4_PACKET_NAK_0004
uint16_t getSocket(const isc::dhcp::Pkt6Ptr &pkt)
Return most suitable socket for transmitting specified IPv6 packet.
bool getUpdateOnRenew() const
Returns whether or not DNS should be updated when leases renew.
boost::shared_ptr< const CfgHostOperations > ConstCfgHostOperationsPtr
Pointer to the const object.
void close()
Close communication socket.
boost::shared_ptr< OptionDefinition > OptionDefinitionPtr
Pointer to option definition object.
const isc::log::MessageID DHCP4_DEFERRED_OPTION_MISSING
void suspendUpdates()
Suspends sending requests.
bool dhcp4o6_
Specifies if the packet is DHCP4o6.
Defines the Dhcp4o6Ipc class.
virtual Lease4Ptr getLease4(const isc::asiolink::IOAddress &addr) const =0
Returns an IPv4 lease for specified IPv4 address.
void setReservedMessageFields()
Sets reserved values of siaddr, sname and file in the server's response.
string trim(const string &instring)
Trim Leading and Trailing Spaces.
D2ClientMgr & getD2ClientMgr()
Fetches the DHCP-DDNS manager.
isc::asiolink::IOAddress linkaddr_
fixed field in relay-forw/relay-reply
virtual bool deleteLease(const Lease4Ptr &lease)=0
Deletes an IPv4 lease.
const isc::log::MessageID DHCP4_DEFERRED_OPTION_UNPACK_FAIL
const isc::log::MessageID DHCP4_PACKET_NAK_0001
bool isDirectResponseSupported() const
Check if packet be sent directly to the client having no address.
bool isClientClassBuiltIn(const ClientClass &client_class)
Check if a client class name is builtin.
isc::log::Logger lease4_logger(DHCP4_LEASE_LOGGER_NAME)
Logger for lease allocation logic.
void insert(const ClientClass &class_name)
Insert an element.
std::list< std::list< std::string > > jsonPathsToRedact() const final override
Return a list of all paths that contain passwords or secrets for kea-dhcp4.
boost::shared_ptr< StringSanitizer > StringSanitizerPtr
void shutdown() override
Instructs the server to shut down.
IdentifierType
Type of the host identifier.
static unsigned int getLabelCount(const std::string &text_name)
Return the number of labels in the Name.
const isc::log::MessageID DHCP4_RESPONSE_HOSTNAME_GENERATE
The IOAddress class represents an IP addresses (version agnostic)
static LeaseMgr & instance()
Return current lease manager.
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.
static const uint16_t FLAG_BROADCAST_MASK
Mask for the value of flags field in the DHCPv4 message to check whether client requested broadcast r...
void deferredUnpack(Pkt4Ptr &query)
Perform deferred option unpacking.
isc::hooks::CalloutHandlePtr getCalloutHandle(const T &pktptr)
CalloutHandle Store.
const isc::log::MessageID DHCP4_CLIENT_NAME_PROC_FAIL
const isc::log::MessageID EVAL_RESULT
Option with defined data fields represented as buffers that can be accessed using data field index...
const isc::log::MessageID DHCP4_DECLINE_LEASE_NOT_FOUND
const isc::log::MessageID DHCP4_SUBNET_DYNAMICALLY_CHANGED
const isc::log::MessageID DHCP4_PACKET_NAK_0003
static void evaluateClasses(const Pkt4Ptr &pkt, bool depend_on_known)
Evaluate classes.
static void setReservedClientClasses(AllocEngine::ClientContext4Ptr context)
Assigns classes retrieved from host reservation database.
static std::string getVersion(bool extended)
returns Kea version on stdout and exit.
uint16_t client_port_
UDP port number to which server sends all responses.
Context information for the DHCPv4 lease allocation.
void processPacketAndSendResponseNoThrow(Pkt4Ptr &query)
Process a single incoming DHCPv4 packet and sends the response.
void adjustIfaceData(Dhcpv4Exchange &ex)
Set IP/UDP and interface parameters for the DHCPv4 response.
const isc::log::MessageID DHCP4_HOOK_LEASES4_COMMITTED_PARK
DHCPv4 and DHCPv6 allocation engine.
static void processStatsReceived(const Pkt4Ptr &query)
Class methods for DHCPv4-over-DHCPv6 handler.
OptionContainer::nth_index< 2 >::type OptionContainerPersistIndex
Type of the index #2 - option persistency flag.
const isc::log::MessageID DHCP4_HOOK_LEASES4_COMMITTED_DROP
const isc::log::MessageID DHCP4_PACKET_DROP_0003
boost::shared_ptr< Continuation > ContinuationPtr
Define the type of shared pointers to continuations.
#define VENDOR_ID_CABLE_LABS
Class which represents an option carrying a single string value.
Pkt4Ptr getResponse() const
Returns the pointer to the server's response.
Container for storing client class names.
Represents DHCPv4-over-DHCPv6 packet.
const isc::log::MessageID DHCP4_HOOK_DECLINE_SKIP
boost::shared_ptr< Expression > ExpressionPtr
Contains declarations for loggers used by the DHCPv4 server component.
This class represents vendor-specific information option.
void setFlag(const uint8_t flag, const bool set)
Modifies the value of the specified DHCPv4 Client Fqdn Option flag.
void setValue(const std::string &name, const int64_t value)
Records absolute integer observation.
static int getHookIndexPkt4Receive()
Returns the index for "pkt4_receive" hook point.
void adjustFqdnFlags(const T &fqdn, T &fqdn_resp, const DdnsParams &ddns_params)
Set server FQDN flags based on configuration and a given FQDN.
AllocEngine::ClientContext4Ptr getContext() const
Returns the copy of the context for the Allocation engine.
void setValue(const std::string &value)
Sets the string value to be held by the option.
const isc::log::MessageID DHCP4_DDNS_REQUEST_SEND_FAILED
const isc::log::MessageID DHCP4_PACKET_DROP_0014
const isc::log::MessageID DHCP4_RESERVED_HOSTNAME_ASSIGNED
void stopSender()
Disables sending NameChangeRequests to kea-dhcp-ddns.
ContinuationPtr makeContinuation(Continuation &&cont)
Continuation factory.