24#include <boost/algorithm/string.hpp>
25#include <boost/foreach.hpp>
26#include <boost/lexical_cast.hpp>
27#include <boost/make_shared.hpp>
28#include <boost/scoped_ptr.hpp>
55 for (
auto const& source_elem : value->listValue()) {
56 std::string source_str = source_elem->stringValue();
59 mac_sources.add(source);
63 <<
"' was specified twice (" << value->getPosition() <<
")");
64 }
catch (
const std::exception& ex) {
66 << source_str <<
"' to any recognized MAC source:"
67 << ex.
what() <<
" (" << value->getPosition() <<
")");
81 "Specified control-sockets is expected to be a list");
83 bool seen_unix(
false);
84 bool seen_http(
false);
89 "Specified control-sockets is expected to be a list of maps");
94 "'socket-type' parameter is mandatory in control-sockets items");
99 "'socket-type' parameter is expected to be a string");
101 string type = socket_type->stringValue();
102 if (type ==
"unix") {
105 "control socket of type 'unix' already configured");
108 srv_cfg.setControlSocketInfo(socket);
109 }
else if ((type ==
"http") || (type ==
"https")) {
112 "control socket of type 'http' or 'https'"
113 " already configured");
118 srv_cfg.setHttpControlSocketInfo(http_config);
122 "unsupported 'socket-type': '" << type
123 <<
"' not 'unix', 'http' or 'https'");
131 : address_family_(address_family) {
138 if (address_family_ == AF_INET) {
145 std::string name =
getString(option_def,
"name");
146 int64_t code64 =
getInteger(option_def,
"code");
147 std::string type =
getString(option_def,
"type");
151 bool array_type =
getBoolean(option_def,
"array");
152 std::string record_types =
getString(option_def,
"record-types");
153 std::string space =
getString(option_def,
"space");
154 std::string encapsulates =
getString(option_def,
"encapsulate");
161 }
else if (address_family_ == AF_INET &&
162 code64 > std::numeric_limits<uint8_t>::max()) {
164 <<
"', it must not be greater than '"
165 <<
static_cast<int>(std::numeric_limits<uint8_t>::max())
166 <<
"' (" <<
getPosition(
"code", option_def) <<
")");
167 }
else if (address_family_ == AF_INET6 &&
168 code64 > std::numeric_limits<uint16_t>::max()) {
170 <<
"', it must not be greater than '"
171 << std::numeric_limits<uint16_t>::max()
172 <<
"' (" <<
getPosition(
"code", option_def) <<
")");
174 uint32_t code =
static_cast<uint32_t
>(code64);
188 <<
"reserved for PAD ("
192 <<
"reserved for END ("
201 <<
"reserved value ("
210 if (!encapsulates.empty()) {
214 << name <<
"', comprising an array of data"
215 <<
" fields may not encapsulate any option space ("
216 << option_def->getPosition() <<
")");
218 }
else if (encapsulates == space) {
220 <<
" an option space it belongs to: '"
221 << space <<
"." << name <<
"' is set to"
222 <<
" encapsulate '" << space <<
"' ("
223 << option_def->getPosition() <<
")");
227 encapsulates.c_str()));
236 def->setContext(user_context);
240 std::vector<std::string> record_tokens =
244 for (
auto const& record_type : record_tokens) {
246 auto const trim_rec = boost::trim_copy(record_type);
247 if (!trim_rec.empty()) {
248 def->addRecordField(trim_rec);
252 <<
" specified for the option definition: "
254 <<
getPosition(
"record-types", option_def) <<
")");
261 }
catch (
const std::exception& ex) {
263 <<
" (" << option_def->getPosition() <<
")");
273 : address_family_(address_family) {
278 if (!option_def_list) {
281 <<
" option definitions is NULL ("
282 << option_def_list->getPosition() <<
")");
286 for (
auto const& option_def : option_def_list->listValue()) {
290 }
catch (
const std::exception& ex) {
293 << option_def->getPosition() <<
")");
325 "(" <<
getPosition(
"ip-addresses", relay_elem) <<
")");
328 for (
auto const& address_element : addresses->listValue()) {
329 addAddress(
"ip-addresses", address_element->stringValue(),
330 relay_elem, relay_info);
336 const std::string& address_str,
339 boost::scoped_ptr<isc::asiolink::IOAddress> ip;
342 }
catch (
const std::exception& ex) {
344 <<
" is not a valid: "
361 relay_info->addAddress(*ip);
362 }
catch (
const std::exception& ex) {
364 <<
" to relay info: " << ex.
what()
374 const uint16_t address_family,
375 bool encapsulate_options) {
377 if (address_family == AF_INET) {
387 "definition: (" << pool_structure->getPosition() <<
")");
393 string txt = text_pool->stringValue();
396 boost::erase_all(txt,
" ");
397 boost::erase_all(txt,
"\t");
402 size_t pos = txt.find(
"/");
403 if (pos != string::npos) {
410 string prefix_len = txt.substr(pos + 1);
422 int val_len = boost::lexical_cast<int>(prefix_len);
423 if ((val_len < std::numeric_limits<uint8_t>::min()) ||
424 (val_len > std::numeric_limits<uint8_t>::max())) {
428 len =
static_cast<uint8_t
>(val_len);
431 "definition: " << txt <<
" ("
432 << text_pool->getPosition() <<
")");
437 pools->push_back(pool);
438 }
catch (
const std::exception& ex) {
440 << txt <<
" (" << text_pool->getPosition() <<
")");
449 if (pos != string::npos) {
456 "definition: " << txt <<
" ("
457 << text_pool->getPosition() <<
")");
462 pools->push_back(pool);
463 }
catch (
const std::exception& ex) {
465 << txt <<
" (" << text_pool->getPosition() <<
")");
472 << text_pool->stringValue() <<
473 ". There are two acceptable formats <min address-max address>"
475 << text_pool->getPosition() <<
")");
481 if (pool_id->intValue() <= 0) {
483 <<
" a positive integer greater than 0");
484 }
else if (pool_id->intValue() > numeric_limits<uint32_t>::max()) {
486 <<
" a 32 bit unsigned integer");
489 pool->setID(pool_id->intValue());
498 << user_context->getPosition() <<
")");
500 pool->setContext(user_context);
509 option_parser->parse(cfg, option_data, encapsulate_options);
510 }
catch (
const std::exception& ex) {
512 <<
" (" << option_data->getPosition() <<
")");
519 string cclass = client_class->stringValue();
520 if (!cclass.empty()) {
521 pool->allowClientClass(cclass);
526 ConstElementPtr class_list = pool_structure->get(
"require-client-classes");
528 const std::vector<data::ElementPtr>& classes = class_list->listValue();
529 for (
auto const& cclass : classes) {
531 cclass->stringValue().empty()) {
533 << cclass->getPosition() <<
")");
535 pool->requireClientClass(cclass->stringValue());
540boost::shared_ptr<OptionDataListParser>
542 return (boost::make_shared<OptionDataListParser>(address_family));
561 bool encapsulate_options) {
562 for (
auto const& pool : pools_list->listValue()) {
564 parser->parse(pools, pool, AF_INET, encapsulate_options);
568boost::shared_ptr<PoolParser>
570 return (boost::make_shared<Pool4Parser>());
577 address_family_(family),
578 check_iface_(check_iface) {
595 }
catch (
const std::exception& ex) {
597 "subnet configuration failed: " << ex.
what());
607 if (options_params) {
609 opt_parser->parse(
subnet_->getCfgOption(), options_params, encapsulate_options);
617 std::string subnet_txt;
619 subnet_txt =
getString(params,
"subnet");
623 "mandatory 'subnet' parameter is missing for a subnet being"
624 " configured (" << params->getPosition() <<
")");
628 boost::erase_all(subnet_txt,
" ");
629 boost::erase_all(subnet_txt,
"\t");
636 size_t pos = subnet_txt.find(
"/");
637 if (pos == string::npos) {
640 "Invalid subnet syntax (prefix/len expected):" << subnet_txt
641 <<
" (" << elem->getPosition() <<
")");
651 len = boost::lexical_cast<unsigned int>(subnet_txt.substr(pos + 1));
652 }
catch (
const boost::bad_lexical_cast&) {
655 subnet_txt.substr(pos+1) <<
"' is not an integer ("
656 << elem->getPosition() <<
")");
660 if ((addr.
isV6() && len > 128) ||
661 (addr.
isV4() && len > 32)) {
664 "Invalid prefix length specified for subnet: " << len
665 <<
" (" << elem->getPosition() <<
")");
672 for (
auto const& pool : *
pools_) {
679 ex.
what() <<
" (" << params->getPosition() <<
")");
688 << user_context->getPosition() <<
")");
690 subnet_->setContext(user_context);
701boost::shared_ptr<OptionDataListParser>
721 parser->parse(
pools_, pools, encapsulate_options);
729 "Failed to create an IPv4 subnet (" <<
730 subnet->getPosition() <<
")");
737 "Invalid Subnet4 cast in Subnet4ConfigParser::parse");
749 HostReservationsListParser<HostReservationParser4> parser;
750 parser.parse(
subnet_->getID(), reservations, hosts);
751 for (
auto const& h : hosts) {
758 auto network4 = boost::dynamic_pointer_cast<Network>(sn4ptr);
762 sn4ptr->createAllocators();
771 int64_t subnet_id_max =
static_cast<int64_t
>(SUBNET_ID_MAX);
776 Triplet<uint32_t>(), Triplet<uint32_t>(),
781 mutable_params = boost::const_pointer_cast<Element>(params);
784 NetworkPtr network = boost::dynamic_pointer_cast<Network>(subnet4);
787 std::ostringstream output;
788 output << addr <<
"/" <<
static_cast<int>(len) <<
" with params: ";
790 bool has_renew = !subnet4->getT1().unspecified();
791 bool has_rebind = !subnet4->getT2().unspecified();
797 renew = subnet4->getT1().get();
798 output <<
"t1=" << renew <<
", ";
801 rebind = subnet4->getT2().get();
802 output <<
"t2=" << rebind <<
", ";
805 if (!subnet4->getValid().unspecified()) {
806 output <<
"valid-lifetime=" << subnet4->getValid().get();
812 if (params->contains(
"match-client-id")) {
813 bool match_client_id =
getBoolean(params,
"match-client-id");
814 subnet4->setMatchClientId(match_client_id);
818 if (params->contains(
"authoritative")) {
819 bool authoritative =
getBoolean(params,
"authoritative");
820 subnet4->setAuthoritative(authoritative);
826 if (params->contains(
"next-server")) {
829 next_server =
getString(params,
"next-server");
830 if (!next_server.empty()) {
831 subnet4->setSiaddr(
IOAddress(next_server));
837 pos = next->getPosition().str();
839 pos = params->getPosition().str();
842 << next_server <<
"(" << pos <<
")");
847 if (params->contains(
"server-hostname")) {
848 std::string sname =
getString(params,
"server-hostname");
849 if (!sname.empty()) {
854 << sname.length() <<
" ("
855 <<
error->getPosition() <<
")");
857 subnet4->setSname(sname);
862 if (params->contains(
"boot-file-name")) {
863 std::string filename =
getString(params,
"boot-file-name");
864 if (!filename.empty()) {
869 << filename.length() <<
" ("
870 <<
error->getPosition() <<
")");
872 subnet4->setFilename(filename);
878 if (params->contains(
"interface")) {
879 std::string iface =
getString(params,
"interface");
880 if (!iface.empty()) {
884 <<
" for subnet " << subnet4->toText()
885 <<
" is not present in the system ("
886 <<
error->getPosition() <<
")");
889 subnet4->setIface(iface);
894 if (params->contains(
"client-class")) {
895 string client_class =
getString(params,
"client-class");
896 if (!client_class.empty()) {
897 subnet4->allowClientClass(client_class);
904 const std::vector<data::ElementPtr>& classes = class_list->listValue();
905 for (
auto const& cclass : classes) {
907 cclass->stringValue().empty()) {
909 << cclass->getPosition() <<
")");
911 subnet4->requireClientClass(cclass->stringValue());
916 if (params->contains(
"4o6-interface")) {
917 string iface4o6 =
getString(params,
"4o6-interface");
918 if (!iface4o6.empty()) {
919 subnet4->get4o6().setIface4o6(iface4o6);
920 subnet4->get4o6().enabled(
true);
925 if (params->contains(
"4o6-subnet")) {
926 string subnet4o6 =
getString(params,
"4o6-subnet");
927 if (!subnet4o6.empty()) {
928 size_t slash = subnet4o6.find(
"/");
929 if (slash == std::string::npos) {
931 << subnet4o6 <<
", expected format: prefix6/length");
933 string prefix = subnet4o6.substr(0, slash);
934 string lenstr = subnet4o6.substr(slash + 1);
938 len = boost::lexical_cast<unsigned int>(lenstr.c_str());
939 }
catch (
const boost::bad_lexical_cast &) {
941 "4o6-subnet parameter: " << subnet4o6 <<
", expected 0..128 value");
943 subnet4->get4o6().setSubnet4o6(
IOAddress(prefix), len);
944 subnet4->get4o6().enabled(
true);
949 if (params->contains(
"4o6-interface-id")) {
950 std::string ifaceid =
getString(params,
"4o6-interface-id");
951 if (!ifaceid.empty()) {
954 subnet4->get4o6().setInterfaceId(opt);
955 subnet4->get4o6().enabled(
true);
976 if (params->contains(
"offer-lifetime")) {
977 uint32_t offer_lft =
getInteger(params,
"offer-lifetime");
978 subnet4->setOfferLft(offer_lft);
982 Network4Ptr network4 = boost::dynamic_pointer_cast<Network4>(subnet4);
989 const IOAddress& address = host->getIPv4Reservation();
990 if (!address.isV4Zero() && !subnet->inRange(address)) {
992 <<
"' is not within the IPv4 subnet '"
993 << subnet->toText() <<
"'");
997boost::shared_ptr<PoolsListParser>
999 return (boost::make_shared<Pools4ListParser>());
1005 : check_iface_(check_iface) {
1011 bool encapsulate_options) {
1013 for (
auto const& subnet_json : subnets_list->listValue()) {
1016 Subnet4Ptr subnet = parser->parse(subnet_json, encapsulate_options);
1023 cfg->getCfgSubnets4()->add(subnet);
1025 }
catch (
const std::exception& ex) {
1027 << subnet_json->getPosition() <<
")");
1037 bool encapsulate_options) {
1039 for (
auto const& subnet_json : subnets_list->listValue()) {
1042 Subnet4Ptr subnet = parser->parse(subnet_json, encapsulate_options);
1045 auto ret = subnets.insert(subnet);
1048 "can't store subnet because of conflict");
1051 }
catch (
const std::exception& ex) {
1053 << subnet_json->getPosition() <<
")");
1060boost::shared_ptr<Subnet4ConfigParser>
1062 return (boost::make_shared<Subnet4ConfigParser>(
check_iface_));
1071 (ptype), addr, len)));
1078 (ptype), min, max)));
1086 bool encapsulate_options) {
1087 for (
auto const& pool : pools_list->listValue()) {
1089 parser->parse(pools, pool, AF_INET6, encapsulate_options);
1093boost::shared_ptr<PoolParser>
1095 return (boost::make_shared<Pool6Parser>());
1105 bool encapsulate_options) {
1108 std::string addr_str =
getString(pd_pool,
"prefix");
1110 uint8_t prefix_len =
getUint8(pd_pool,
"prefix-len");
1112 uint8_t delegated_len =
getUint8(pd_pool,
"delegated-len");
1114 std::string excluded_prefix_str =
"::";
1115 if (pd_pool->contains(
"excluded-prefix")) {
1116 excluded_prefix_str =
getString(pd_pool,
"excluded-prefix");
1119 uint8_t excluded_prefix_len = 0;
1120 if (pd_pool->contains(
"excluded-prefix-len")) {
1121 excluded_prefix_len =
getUint8(pd_pool,
"excluded-prefix-len");
1144 excluded_prefix_len));
1145 }
catch (
const std::exception& ex) {
1150 <<
" (" << pd_pool->getPosition() <<
")");
1156 if (pool_id->intValue() <= 0) {
1158 <<
" a positive integer greater than 0");
1159 }
else if (pool_id->intValue() > numeric_limits<uint32_t>::max()) {
1161 <<
" a 32 bit unsigned integer");
1164 pool_->setID(pool_id->intValue());
1176 opts_parser->parse(
pool_->getCfgOption(), option_data, encapsulate_options);
1185 if (!cclass.empty()) {
1186 pool_->allowClientClass(cclass);
1191 const std::vector<data::ElementPtr>& classes = class_list->listValue();
1192 for (
auto const& cclass : classes) {
1194 cclass->stringValue().empty()) {
1196 << cclass->getPosition() <<
")");
1198 pool_->requireClientClass(cclass->stringValue());
1203 pools->push_back(
pool_);
1206boost::shared_ptr<OptionDataListParser>
1208 return (boost::make_shared<OptionDataListParser>(AF_INET6));
1216 for (
auto const& pd_pool : pd_pool_list->listValue()) {
1218 parser->parse(pools, pd_pool);
1222boost::shared_ptr<PdPoolParser>
1224 return (boost::make_shared<PdPoolParser>());
1242 parser->parse(
pools_, pools, encapsulate_options);
1247 parser->parse(
pools_, pd_pools);
1255 "Failed to create an IPv6 subnet (" <<
1256 subnet->getPosition() <<
")");
1263 "Invalid Subnet6 cast in Subnet6ConfigParser::parse");
1275 HostReservationsListParser<HostReservationParser6> parser;
1276 parser.parse(
subnet_->getID(), reservations, hosts);
1277 for (
auto const& h : hosts) {
1284 auto network = boost::dynamic_pointer_cast<Network>(sn6ptr);
1288 auto network6 = boost::dynamic_pointer_cast<Network6>(sn6ptr);
1292 sn6ptr->createAllocators();
1302 .arg(code).arg(addr.
toText());
1309 int64_t subnet_id_max =
static_cast<int64_t
>(SUBNET_ID_MAX);
1315 Optional<bool> rapid_commit;
1316 if (params->contains(
"rapid-commit")) {
1317 rapid_commit =
getBoolean(params,
"rapid-commit");
1321 Triplet<uint32_t> pref =
parseIntTriplet(params,
"preferred-lifetime");
1325 Triplet<uint32_t>(),
1327 Triplet<uint32_t>(),
1332 mutable_params = boost::const_pointer_cast<Element>(params);
1339 if (!rapid_commit.unspecified()) {
1340 subnet6->setRapidCommit(rapid_commit);
1343 std::ostringstream output;
1344 output << addr <<
"/" <<
static_cast<int>(len) <<
" with params: ";
1347 bool has_renew = !subnet6->getT1().unspecified();
1348 bool has_rebind = !subnet6->getT2().unspecified();
1350 int64_t rebind = -1;
1353 renew = subnet6->getT1().get();
1354 output <<
"t1=" << renew <<
", ";
1357 rebind = subnet6->getT2().get();
1358 output <<
"t2=" << rebind <<
", ";
1361 if (!subnet6->getPreferred().unspecified()) {
1362 output <<
"preferred-lifetime=" << subnet6->getPreferred().get() <<
", ";
1364 if (!subnet6->getValid().unspecified()) {
1365 output <<
"valid-lifetime=" << subnet6->getValid().get();
1367 if (!subnet6->getRapidCommit().unspecified()) {
1368 output <<
", rapid-commit is "
1369 << boolalpha << subnet6->getRapidCommit().get();
1376 Optional<std::string> ifaceid;
1377 if (params->contains(
"interface-id")) {
1378 ifaceid =
getString(params,
"interface-id");
1381 Optional<std::string> iface;
1382 if (params->contains(
"interface")) {
1389 if (!ifaceid.unspecified() && !iface.unspecified() && !ifaceid.empty() &&
1392 "parser error: interface (defined for locally reachable "
1393 "subnets) and interface-id (defined for subnets reachable"
1394 " via relays) cannot be defined at the same time for "
1395 "subnet " << addr <<
"/" << (
int)len <<
"("
1396 << params->getPosition() <<
")");
1400 if (!ifaceid.unspecified() && !ifaceid.empty()) {
1401 std::string ifaceid_value = ifaceid.get();
1402 OptionBuffer tmp(ifaceid_value.begin(), ifaceid_value.end());
1404 subnet6->setInterfaceId(opt);
1409 if (!iface.unspecified() && !iface.empty()) {
1413 <<
" for subnet " << subnet6->toText()
1414 <<
" is not present in the system ("
1415 <<
error->getPosition() <<
")");
1418 subnet6->setIface(iface);
1422 if (params->contains(
"client-class")) {
1423 string client_class =
getString(params,
"client-class");
1424 if (!client_class.empty()) {
1425 subnet6->allowClientClass(client_class);
1429 if (params->contains(
"require-client-classes")) {
1433 const std::vector<data::ElementPtr>& classes = class_list->listValue();
1434 for (
auto const& cclass : classes) {
1436 cclass->stringValue().empty()) {
1438 << cclass->getPosition() <<
")");
1440 subnet6->requireClientClass(cclass->stringValue());
1461 BOOST_FOREACH(
auto const& it, range) {
1462 const IOAddress& address = it.second.getPrefix();
1463 if (!subnet->inRange(address)) {
1465 <<
"' is not within the IPv6 subnet '"
1466 << subnet->toText() <<
"'");
1471boost::shared_ptr<PoolsListParser>
1473 return (boost::make_shared<Pools6ListParser>());
1476boost::shared_ptr<PdPoolsListParser>
1478 return (boost::make_shared<PdPoolsListParser>());
1484 : check_iface_(check_iface) {
1490 bool encapsulate_options) {
1492 for (
auto const& subnet_json : subnets_list->listValue()) {
1495 Subnet6Ptr subnet = parser->parse(subnet_json, encapsulate_options);
1501 cfg->getCfgSubnets6()->add(subnet);
1503 }
catch (
const std::exception& ex) {
1505 << subnet_json->getPosition() <<
")");
1514 bool encapsulate_options) {
1516 for (
auto const& subnet_json : subnets_list->listValue()) {
1519 Subnet6Ptr subnet = parser->parse(subnet_json, encapsulate_options);
1522 auto ret = subnets.insert(subnet);
1525 "can't store subnet because of conflict");
1528 }
catch (
const std::exception& ex) {
1530 << subnet_json->getPosition() <<
")");
1537boost::shared_ptr<Subnet6ConfigParser>
1539 return (boost::make_shared<Subnet6ConfigParser>(
check_iface_));
1546 const std::string& name) {
1549 (scope, name,
"NameChangeRequest protocol"));
1554 const std::string& name) {
1557 (scope, name,
"NameChangeRequest format"));
1562 const std::string& name) {
1565 (scope, name,
"ReplaceClientName mode"));
1573 bool enable_updates =
getBoolean(client_config,
"enable-updates");
1577 uint32_t server_port =
getUint32(client_config,
"server-port");
1579 std::string sender_ip_str =
getString(client_config,
"sender-ip");
1581 uint32_t sender_port =
getUint32(client_config,
"sender-port");
1583 uint32_t max_queue_size =
getUint32(client_config,
"max-queue-size");
1586 getProtocol(client_config,
"ncr-protocol");
1589 getFormat(client_config,
"ncr-format");
1592 if (sender_ip_str.empty()) {
1599 }
catch (
const std::exception& ex) {
1601 <<
") specified for parameter 'sender-ip' ("
1602 <<
getPosition(
"sender-ip", client_config) <<
")");
1612 <<
" is not supported. ("
1613 <<
getPosition(
"ncr-format", client_config) <<
")");
1619 <<
" is not supported. ("
1620 <<
getPosition(
"ncr-protocol", client_config) <<
")");
1623 if (sender_ip.getFamily() != server_ip.getFamily()) {
1625 "D2ClientConfig error: address family mismatch: "
1626 <<
"server-ip: " << server_ip.toText()
1627 <<
" is: " << (server_ip.isV4() ?
"IPv4" :
"IPv6")
1628 <<
" while sender-ip: " << sender_ip.toText()
1629 <<
" is: " << (sender_ip.isV4() ?
"IPv4" :
"IPv6")
1630 <<
" (" <<
getPosition(
"sender-ip", client_config) <<
")");
1633 if (server_ip == sender_ip && server_port == sender_port) {
1635 "D2ClientConfig error: server and sender cannot"
1636 " share the exact same IP address/port: "
1637 << server_ip.toText() <<
"/" << server_port
1638 <<
" (" <<
getPosition(
"sender-ip", client_config) <<
")");
1651 }
catch (
const std::exception& ex) {
1653 << client_config->getPosition() <<
")");
1659 new_config->setContext(user_context);
1662 return (new_config);
1681 ElementPtr mutable_d2 = boost::const_pointer_cast<Element>(d2_config);
1687 if (compatibility) {
1689 for (
auto const& kv : compatibility->mapValue()) {
1692 "compatibility parameter values must be "
1693 <<
"boolean (" << kv.first <<
" at "
1694 << kv.second->getPosition() <<
")");
1696 if (kv.first ==
"lenient-option-parsing") {
1697 srv_cfg.setLenientOptionParsing(kv.second->boolValue());
1698 }
else if (family == AF_INET) {
1699 if (kv.first ==
"ignore-dhcp-server-identifier") {
1700 srv_cfg.setIgnoreServerIdentifier(kv.second->boolValue());
1701 }
else if (kv.first ==
"ignore-rai-link-selection") {
1702 srv_cfg.setIgnoreRAILinkSelection(kv.second->boolValue());
1703 }
else if (kv.first ==
"exclude-first-last-24") {
1704 srv_cfg.setExcludeFirstLast24(kv.second->boolValue());
1707 "unsupported compatibility parameter: "
1708 << kv.first <<
" (" << kv.second->getPosition()
1713 "unsupported compatibility parameter: "
1714 << kv.first <<
" (" << kv.second->getPosition()
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
A generic exception that is thrown if a parameter given to a method or function is considered invalid...
A generic exception that is thrown if a parameter given to a method would refer to or modify out-of-r...
A generic exception that is thrown when an unexpected error condition occurs.
The IOAddress class represents an IP addresses (version agnostic)
static const IOAddress & IPV4_ZERO_ADDRESS()
Returns an address set to all zeros.
std::string toText() const
Convert the address to a string.
bool isV6() const
Convenience function to check for an IPv6 address.
bool isV4() const
Convenience function to check for an IPv4 address.
static const IOAddress & IPV6_ZERO_ADDRESS()
Returns an IPv6 zero address.
HTTP command config aka HTTP control socket info class.
static void checkKeywords(const SimpleKeywords &keywords, isc::data::ConstElementPtr scope)
Checks acceptable keywords with their expected type.
target_type getAndConvert(isc::data::ConstElementPtr scope, const std::string &name, const std::string &type_name)
Returns a converted value from a scope.
static const data::Element::Position & getPosition(const std::string &name, const data::ConstElementPtr parent)
Utility method that returns position of an element.
uint8_t getUint8(ConstElementPtr scope, const std::string &name)
Get an uint8_t value.
static isc::asiolink::IOAddress getAddress(const ConstElementPtr &scope, const std::string &name)
Returns a IOAddress parameter from a scope.
static std::string getString(isc::data::ConstElementPtr scope, const std::string &name)
Returns a string parameter from a scope.
uint32_t getUint32(isc::data::ConstElementPtr scope, const std::string &name)
Returns a value converted to uint32_t.
const isc::util::Triplet< uint32_t > parseIntTriplet(const data::ConstElementPtr &scope, const std::string &name)
Parses an integer triplet.
static bool getBoolean(isc::data::ConstElementPtr scope, const std::string &name)
Returns a boolean parameter from a scope.
static int64_t getInteger(isc::data::ConstElementPtr scope, const std::string &name)
Returns an integer parameter from a scope.
static size_t setDefaults(isc::data::ElementPtr scope, const SimpleDefaults &default_values)
Sets the default values.
void parseCacheParams(const data::ConstElementPtr &network_data, NetworkPtr &network)
Parses parameters related to lease cache settings.
void parseAllocatorParams(const data::ConstElementPtr &network_data, NetworkPtr &network)
Parses parameters pertaining to allocator selection.
void parseDdnsParams(const data::ConstElementPtr &network_data, NetworkPtr &network)
Parses parameters pertaining to DDNS behavior.
void parseCommon(const data::ConstElementPtr &network_data, NetworkPtr &network)
Parses common parameters.
void parseTeePercents(const data::ConstElementPtr &network_data, NetworkPtr &network)
Parses parameters related to "percent" timers settings.
void parsePdAllocatorParams(const data::ConstElementPtr &network_data, Network6Ptr &network)
Parses parameters pertaining to prefix delegation allocator selection.
void parseOfferLft(const data::ConstElementPtr &network_data, Network4Ptr &network)
Parses offer-lifetime parameter (v4 only)
Wrapper class that holds MAC/hardware address sources.
static uint32_t MACSourceFromText(const std::string &name)
Attempts to convert known hardware address sources to uint32_t.
static CfgMgr & instance()
returns a single instance of Configuration Manager
void parse(isc::data::ConstElementPtr cfg, isc::dhcp::SrvConfig &srv_cfg)
Parse compatibility flags.
void parse(SrvConfig &srv_cfg, isc::data::ConstElementPtr value)
"Parses" control-sockets structure
D2ClientConfigPtr parse(isc::data::ConstElementPtr d2_client_cfg)
Parses a given dhcp-ddns element into D2ClientConfig.
static const isc::data::SimpleDefaults D2_CLIENT_CONFIG_DEFAULTS
Defaults for the D2 client configuration.
static size_t setAllDefaults(isc::data::ConstElementPtr d2_config)
Sets all defaults for D2 client configuration.
Acts as a storage vault for D2 client configuration.
static ReplaceClientNameMode stringToReplaceClientNameMode(const std::string &mode_str)
Converts labels to ReplaceClientNameMode enum values.
ReplaceClientNameMode
Defines the client name replacement modes.
An exception that is thrown if an error occurs while configuring the D2 DHCP DDNS client.
To be removed. Please use ConfigError instead.
static IfaceMgr & instance()
IfaceMgr is a singleton class.
static void setRuntimeOptionDefs(const OptionDefSpaceContainer &defs)
Copies option definitions created at runtime.
void parse(CfgMACSource &mac_sources, isc::data::ConstElementPtr value)
parses parameters value
Holds optional information about relay.
boost::shared_ptr< Network::RelayInfo > RelayInfoPtr
Pointer to the RelayInfo structure.
OptionDefListParser(const uint16_t address_family)
Constructor.
void parse(CfgOptionDefPtr cfg, isc::data::ConstElementPtr def_list)
Parses a list of option definitions, create them and store in cfg.
Parser for a single option definition.
OptionDefinitionPtr parse(isc::data::ConstElementPtr option_def)
Parses an entry that describes single option definition.
OptionDefParser(const uint16_t address_family)
Constructor.
Base class representing a DHCP option definition.
static bool validateName(const std::string &name)
Checks that the provided option space name is valid.
Universe
defines option universe DHCPv4 or DHCPv6
PdPoolParser()
Constructor.
virtual boost::shared_ptr< OptionDataListParser > createOptionDataListParser() const
Returns an instance of the OptionDataListParser to be used in parsing the option-data structure.
isc::data::ConstElementPtr user_context_
User context (optional, may be null)
void parse(PoolStoragePtr pools, data::ConstElementPtr pd_pool_, bool encapsulate_options=true)
Builds a prefix delegation pool from the given configuration.
isc::dhcp::Pool6Ptr pool_
Pointer to the created pool object.
isc::data::ConstElementPtr client_class_
Client class (a client has to belong to to use this pd-pool)
virtual boost::shared_ptr< PdPoolParser > createPdPoolConfigParser() const
Returns an instance of the PdPoolParser to be used in parsing the prefix delegation pools.
void parse(PoolStoragePtr pools, data::ConstElementPtr pd_pool_list)
Parse configuration entries.
static const size_t MAX_SNAME_LEN
length of the SNAME field in DHCPv4 message
static const size_t MAX_FILE_LEN
length of the FILE field in DHCPv4 message
PoolPtr poolMaker(asiolink::IOAddress &addr, uint32_t len, int32_t ignored)
Creates a Pool4 object given a IPv4 prefix and the prefix length.
Pool information for IPv4 addresses.
PoolPtr poolMaker(asiolink::IOAddress &addr, uint32_t len, int32_t ptype)
Creates a Pool6 object given a IPv6 prefix and the prefix length.
Pool information for IPv6 addresses and prefixes.
virtual PoolPtr poolMaker(isc::asiolink::IOAddress &addr, uint32_t len, int32_t ptype=0)=0
Creates a Pool object given a IPv4 prefix and the prefix length.
virtual void parse(PoolStoragePtr pools, isc::data::ConstElementPtr pool_structure, const uint16_t address_family, bool encapsulate_options=true)
parses the actual structure
virtual boost::shared_ptr< OptionDataListParser > createOptionDataListParser(const uint16_t address_family) const
Returns an instance of the OptionDataListParser to be used in parsing the option-data structure.
void parse(PoolStoragePtr pools, data::ConstElementPtr pools_list, bool encapsulate_options=true)
parses the actual structure
virtual boost::shared_ptr< PoolParser > createPoolConfigParser() const
Returns an instance of the Pool4Parser to be used in parsing the address pools.
void parse(PoolStoragePtr pools, data::ConstElementPtr pools_list, bool encapsulate_options=true)
parses the actual structure
virtual boost::shared_ptr< PoolParser > createPoolConfigParser() const
Returns an instance of the Pool6Parser to be used in parsing the address pools.
parser for additional relay information
RelayInfoParser(const isc::dhcp::Option::Universe &family)
constructor
void addAddress(const std::string &name, const std::string &address_str, isc::data::ConstElementPtr relay_elem, const isc::dhcp::Network::RelayInfoPtr &relay_info)
Attempts to add an IP address to list of relay addresses.
void parse(const isc::dhcp::Network::RelayInfoPtr &relay_info, isc::data::ConstElementPtr relay_elem)
parses the actual relay parameters
static const isc::data::SimpleKeywords SUBNET4_PARAMETERS
This table defines all subnet parameters for DHCPv4.
static const isc::data::SimpleKeywords OPTION4_DEF_PARAMETERS
This table defines all option definition parameters.
static const isc::data::SimpleKeywords POOL4_PARAMETERS
This table defines all pool parameters.
static const isc::data::SimpleKeywords POOL6_PARAMETERS
This table defines all pool parameters.
static const isc::data::SimpleKeywords SUBNET6_PARAMETERS
This table defines all subnet parameters for DHCPv6.
static const isc::data::SimpleKeywords OPTION6_DEF_PARAMETERS
This table defines all option definition parameters.
static const isc::data::SimpleKeywords PD_POOL6_PARAMETERS
This table defines all prefix delegation pool parameters.
Specifies current DHCP configuration.
Subnet4ConfigParser(bool check_iface=true)
Constructor.
virtual boost::shared_ptr< PoolsListParser > createPoolsListParser() const
Returns an instance of the Pools4ListParser to be used in parsing the address pools.
void validateResv(const Subnet4Ptr &subnet, ConstHostPtr host)
Verifies the host reservation address is in the subnet range.
void initSubnet(data::ConstElementPtr params, asiolink::IOAddress addr, uint8_t len)
Instantiates the IPv4 Subnet based on a given IPv4 address and prefix length.
Subnet4Ptr parse(data::ConstElementPtr subnet, bool encapsulate_options=true)
Parses a single IPv4 subnet configuration and adds to the Configuration Manager.
static Subnet4Ptr create(const isc::asiolink::IOAddress &prefix, uint8_t length, const util::Triplet< uint32_t > &t1, const util::Triplet< uint32_t > &t2, const util::Triplet< uint32_t > &valid_lifetime, const SubnetID id)
Factory function creating an instance of the Subnet4.
virtual boost::shared_ptr< PoolsListParser > createPoolsListParser() const
Returns an instance of the Pools6ListParser to be used in parsing the address pools.
virtual boost::shared_ptr< PdPoolsListParser > createPdPoolsListParser() const
Returns an instance of the PdPools6ListParser to be used in parsing the prefix delegation pools.
Subnet6Ptr parse(data::ConstElementPtr subnet, bool encapsulate_options=true)
Parses a single IPv6 subnet configuration and adds to the Configuration Manager.
void initSubnet(isc::data::ConstElementPtr params, isc::asiolink::IOAddress addr, uint8_t len)
Instantiates the IPv6 Subnet based on a given IPv6 address and prefix length.
virtual void duplicateOptionWarning(uint32_t code, asiolink::IOAddress &addr)
Issues a DHCP6 server specific warning regarding duplicate subnet options.
void validateResvs(const Subnet6Ptr &subnet, ConstHostPtr host)
Verifies host reservation addresses are in the subnet range.
Subnet6ConfigParser(bool check_iface=true)
Constructor.
static Subnet6Ptr create(const isc::asiolink::IOAddress &prefix, uint8_t length, const util::Triplet< uint32_t > &t1, const util::Triplet< uint32_t > &t2, const util::Triplet< uint32_t > &preferred_lifetime, const util::Triplet< uint32_t > &valid_lifetime, const SubnetID id)
Factory function creating an instance of the Subnet4.
this class parses a single subnet
SubnetConfigParser(uint16_t family, bool check_iface=true)
constructor
isc::dhcp::SubnetPtr subnet_
Pointer to the created subnet object.
void createSubnet(isc::data::ConstElementPtr data)
Create a new subnet using a data from child parsers.
virtual void initSubnet(isc::data::ConstElementPtr params, isc::asiolink::IOAddress addr, uint8_t len)=0
Instantiates the subnet based on a given IP prefix and prefix length.
isc::dhcp::Network::RelayInfoPtr relay_info_
Pointer to relay information.
uint16_t address_family_
Address family: AF_INET or AF_INET6.
SubnetPtr parse(isc::data::ConstElementPtr subnet, bool encapsulate_options)
parses a subnet description and returns Subnet{4,6} structure
bool check_iface_
Check if the specified interface exists in the system.
virtual boost::shared_ptr< OptionDataListParser > createOptionDataListParser() const
Returns an instance of the OptionDataListParser to be used in parsing the option-data structure.
PoolStoragePtr pools_
Storage for pools belonging to this subnet.
bool check_iface_
Check if the specified interface exists in the system.
size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list, bool encapsulate_options=true)
parses contents of the list
Subnets4ListConfigParser(bool check_iface=true)
constructor
virtual boost::shared_ptr< Subnet4ConfigParser > createSubnetConfigParser() const
Returns an instance of the Subnet4ConfigParser to be used in parsing the subnets.
virtual boost::shared_ptr< Subnet6ConfigParser > createSubnetConfigParser() const
Returns an instance of the Subnet6ConfigParser to be used in parsing the subnets.
Subnets6ListConfigParser(bool check_iface=true)
constructor
bool check_iface_
Check if the specified interface exists in the system.
size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list, bool encapsulate_options=true)
parses contents of the list
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
#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.
boost::shared_ptr< HttpCommandConfig > HttpCommandConfigPtr
Pointer to a HttpCommandConfig object.
boost::shared_ptr< const Element > ConstElementPtr
std::vector< SimpleDefault > SimpleDefaults
This specifies all default values in a given scope (e.g. a subnet).
boost::shared_ptr< Element > ElementPtr
NameChangeProtocol stringToNcrProtocol(const std::string &protocol_str)
Function which converts text labels to NameChangeProtocol enums.
NameChangeFormat
Defines the list of data wire formats supported.
NameChangeProtocol
Defines the list of socket protocols supported.
std::string ncrProtocolToString(NameChangeProtocol protocol)
Function which converts NameChangeProtocol enums to text labels.
NameChangeFormat stringToNcrFormat(const std::string &fmt_str)
Function which converts labels to NameChangeFormat enum values.
std::string ncrFormatToString(NameChangeFormat format)
Function which converts NameChangeFormat enums to text labels.
isc::log::Logger dhcpsrv_logger("dhcpsrv")
DHCP server library Logger.
boost::shared_ptr< const CfgGlobals > ConstCfgGlobalsPtr
Const shared pointer to a CfgGlobals instance.
boost::shared_ptr< Subnet > SubnetPtr
A generic pointer to either Subnet4 or Subnet6 object.
const isc::log::MessageID DHCPSRV_CFGMGR_NEW_SUBNET6
boost::shared_ptr< Subnet4 > Subnet4Ptr
A pointer to a Subnet4 object.
boost::shared_ptr< Network4 > Network4Ptr
Pointer to the Network4 object.
std::vector< PoolPtr > PoolStorage
a collection of pools
boost::shared_ptr< D2ClientConfig > D2ClientConfigPtr
Defines a pointer for D2ClientConfig instances.
boost::shared_ptr< CfgOption > CfgOptionPtr
Non-const pointer.
boost::shared_ptr< CfgOptionDef > CfgOptionDefPtr
Non-const pointer.
const isc::log::MessageID DHCPSRV_CFGMGR_OPTION_DUPLICATE
boost::shared_ptr< Subnet6 > Subnet6Ptr
A pointer to a Subnet6 object.
boost::multi_index_container< Subnet6Ptr, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetSubnetIdIndexTag >, boost::multi_index::const_mem_fun< Subnet, SubnetID, &Subnet::getID > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetPrefixIndexTag >, boost::multi_index::const_mem_fun< Subnet, std::string, &Subnet::toText > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetModificationTimeIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime, &data::BaseStampedElement::getModificationTime > > > > Subnet6Collection
A collection of Subnet6 objects.
boost::shared_ptr< SrvConfig > SrvConfigPtr
Non-const pointer to the SrvConfig.
std::pair< IPv6ResrvIterator, IPv6ResrvIterator > IPv6ResrvRange
std::vector< HostPtr > HostCollection
Collection of the Host objects.
boost::shared_ptr< OptionDefinition > OptionDefinitionPtr
Pointer to option definition object.
boost::shared_ptr< PoolStorage > PoolStoragePtr
boost::shared_ptr< Pool > PoolPtr
a pointer to either IPv4 or IPv6 Pool
boost::multi_index_container< Subnet4Ptr, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetSubnetIdIndexTag >, boost::multi_index::const_mem_fun< Subnet, SubnetID, &Subnet::getID > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetPrefixIndexTag >, boost::multi_index::const_mem_fun< Subnet, std::string, &Subnet::toText > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetServerIdIndexTag >, boost::multi_index::const_mem_fun< Network4, asiolink::IOAddress, &Network4::getServerId > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetModificationTimeIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime, &data::BaseStampedElement::getModificationTime > > > > Subnet4Collection
A collection of Subnet4 objects.
uint32_t SubnetID
Defines unique IPv4 or IPv6 subnet identifier.
const isc::log::MessageID DHCPSRV_CFGMGR_NEW_SUBNET4
boost::shared_ptr< const Host > ConstHostPtr
Const pointer to the Host object.
boost::shared_ptr< Network > NetworkPtr
Pointer to the Network object.
std::vector< uint8_t > OptionBuffer
buffer types used in DHCP code.
boost::shared_ptr< Option > OptionPtr
vector< string > tokens(const string &text, const string &delim, bool escape)
Split string into tokens.
Defines the logger used by the top-level component of kea-lfc.
#define DHCP4_OPTION_SPACE
global std option spaces
#define DHCP6_OPTION_SPACE
Type
Type of lease or pool.