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 std::string source_str = source_elem->stringValue();
57 source = CfgMACSource::MACSourceFromText(source_str);
58 mac_sources.
add(source);
62 <<
"' was specified twice (" << value->getPosition() <<
")");
63 }
catch (
const std::exception& ex) {
65 << source_str <<
"' to any recognized MAC source:" 66 << ex.
what() <<
" (" << value->getPosition() <<
")");
82 if (value->getType() != Element::map) {
85 ", i.e. a structure defined within { }");
92 OptionDefParser::OptionDefParser(
const uint16_t address_family)
93 : address_family_(address_family) {
100 if (address_family_ == AF_INET) {
107 std::string name =
getString(option_def,
"name");
108 int64_t code64 =
getInteger(option_def,
"code");
109 std::string type =
getString(option_def,
"type");
113 bool array_type =
getBoolean(option_def,
"array");
114 std::string record_types =
getString(option_def,
"record-types");
115 std::string space =
getString(option_def,
"space");
116 std::string encapsulates =
getString(option_def,
"encapsulate");
123 }
else if (address_family_ == AF_INET &&
124 code64 > std::numeric_limits<uint8_t>::max()) {
126 <<
"', it must not be greater than '" 127 << static_cast<int>(std::numeric_limits<uint8_t>::max())
128 <<
"' (" <<
getPosition(
"code", option_def) <<
")");
129 }
else if (address_family_ == AF_INET6 &&
130 code64 > std::numeric_limits<uint16_t>::max()) {
132 <<
"', it must not be greater than '" 133 << std::numeric_limits<uint16_t>::max()
134 <<
"' (" <<
getPosition(
"code", option_def) <<
")");
136 uint32_t code =
static_cast<uint32_t
>(code64);
150 <<
"reserved for PAD (" 154 <<
"reserved for END (" 163 <<
"reserved value (" 172 if (!encapsulates.empty()) {
176 << name <<
"', comprising an array of data" 177 <<
" fields may not encapsulate any option space (" 178 << option_def->getPosition() <<
")");
180 }
else if (encapsulates == space) {
182 <<
" an option space it belongs to: '" 183 << space <<
"." << name <<
"' is set to" 184 <<
" encapsulate '" << space <<
"' (" 185 << option_def->getPosition() <<
")");
189 encapsulates.c_str()));
198 def->setContext(user_context);
202 std::vector<std::string> record_tokens =
206 BOOST_FOREACH(std::string record_type, record_tokens) {
209 if (!record_type.empty()) {
210 def->addRecordField(record_type);
214 <<
" specified for the option definition: " 216 <<
getPosition(
"record-types", option_def) <<
")");
223 }
catch (
const std::exception& ex) {
225 <<
" (" << option_def->getPosition() <<
")");
235 : address_family_(address_family) {
240 if (!option_def_list) {
243 <<
" option definitions is NULL (" 244 << option_def_list->getPosition() <<
")");
248 BOOST_FOREACH(
ConstElementPtr option_def, option_def_list->listValue()) {
252 }
catch (
const std::exception& ex) {
255 << option_def->getPosition() <<
")");
273 if (relay_elem->getType() != Element::map) {
280 if (address && addresses) {
282 "specify either ip-address or ip-addresses, not both");
285 if (!address && !addresses) {
294 relay_elem, relay_info);
301 if (addresses->getType() != Element::list) {
303 "(" <<
getPosition(
"ip-addresses", relay_elem) <<
")");
306 BOOST_FOREACH(
ConstElementPtr address_element, addresses->listValue()) {
307 addAddress(
"ip-addresses", address_element->stringValue(),
308 relay_elem, relay_info);
314 const std::string& address_str,
317 boost::scoped_ptr<isc::asiolink::IOAddress> ip;
320 }
catch (
const std::exception& ex) {
322 <<
" is not a valid: " 339 relay_info->addAddress(*ip);
340 }
catch (
const std::exception& ex) {
342 <<
"to relay info: " << ex.
what()
352 const uint16_t address_family) {
354 if (address_family == AF_INET) {
364 "definition: (" << pool_structure->getPosition() <<
")");
370 string txt = text_pool->stringValue();
373 boost::erase_all(txt,
" ");
374 boost::erase_all(txt,
"\t");
379 size_t pos = txt.find(
"/");
380 if (pos != string::npos) {
387 string prefix_len = txt.substr(pos + 1);
399 int val_len = boost::lexical_cast<
int>(prefix_len);
400 if ((val_len < std::numeric_limits<uint8_t>::min()) ||
401 (val_len > std::numeric_limits<uint8_t>::max())) {
405 len =
static_cast<uint8_t
>(val_len);
408 "definition: " << txt <<
" (" 409 << text_pool->getPosition() <<
")");
413 pool = poolMaker(addr, len);
414 pools->push_back(pool);
415 }
catch (
const std::exception& ex) {
417 << txt <<
" (" << text_pool->getPosition() <<
")");
426 if (pos != string::npos) {
433 "definition: " << txt <<
" (" 434 << text_pool->getPosition() <<
")");
438 pool = poolMaker(min, max);
439 pools->push_back(pool);
440 }
catch (
const std::exception& ex) {
442 << txt <<
" (" << text_pool->getPosition() <<
")");
449 << text_pool->stringValue() <<
450 ". There are two acceptable formats <min address-max address>" 452 << text_pool->getPosition() <<
")");
459 if (user_context->getType() != Element::map) {
461 << user_context->getPosition() <<
")");
463 pool->setContext(user_context);
471 auto option_parser = createOptionDataListParser(address_family);
472 option_parser->parse(cfg, option_data);
473 }
catch (
const std::exception& ex) {
475 <<
" (" << option_data->getPosition() <<
")");
482 string cclass = client_class->stringValue();
483 if (!cclass.empty()) {
484 pool->allowClientClass(cclass);
489 ConstElementPtr class_list = pool_structure->get(
"require-client-classes");
491 const std::vector<data::ElementPtr>& classes = class_list->listValue();
492 for (
auto cclass = classes.cbegin();
493 cclass != classes.cend(); ++cclass) {
494 if (((*cclass)->getType() != Element::string) ||
495 (*cclass)->stringValue().empty()) {
497 << (*cclass)->getPosition() <<
")");
499 pool->requireClientClass((*cclass)->stringValue());
504 boost::shared_ptr<OptionDataListParser>
506 auto parser = boost::make_shared<OptionDataListParser>(address_family);
527 auto parser = createPoolConfigParser();
528 parser->parse(pools, pool, AF_INET);
532 boost::shared_ptr<PoolParser>
534 auto parser = boost::make_shared<Pool4Parser>();
542 address_family_(family),
544 check_iface_(check_iface) {
552 if (options_params) {
554 opt_parser->parse(
options_, options_params);
567 }
catch (
const std::exception& ex) {
569 "subnet configuration failed: " << ex.
what());
577 std::string subnet_txt;
579 subnet_txt =
getString(params,
"subnet");
583 "mandatory 'subnet' parameter is missing for a subnet being" 584 " configured (" << params->getPosition() <<
")");
588 boost::erase_all(subnet_txt,
" ");
589 boost::erase_all(subnet_txt,
"\t");
596 size_t pos = subnet_txt.find(
"/");
597 if (pos == string::npos) {
600 "Invalid subnet syntax (prefix/len expected):" << subnet_txt
601 <<
" (" << elem->getPosition() <<
")");
611 len = boost::lexical_cast<
unsigned int>(subnet_txt.substr(pos + 1));
612 }
catch (
const boost::bad_lexical_cast&) {
615 subnet_txt.substr(pos+1) <<
"' is not an integer (" 616 << elem->getPosition() <<
")");
620 if ((addr.isV6() && len > 128) ||
621 (addr.isV4() && len > 32)) {
624 "Invalid prefix length specified for subnet: " << len
625 <<
" (" << elem->getPosition() <<
")");
632 for (PoolStorage::iterator it =
pools_->begin(); it !=
pools_->end();
640 ex.
what() <<
" (" << params->getPosition() <<
")");
647 if (user_context->getType() != Element::map) {
649 << user_context->getPosition() <<
")");
651 subnet_->setContext(user_context);
662 boost::shared_ptr<OptionDataListParser>
664 auto parser = boost::make_shared<OptionDataListParser>(
address_family_);
683 parser->parse(
pools_, pools);
691 "Failed to create an IPv4 subnet (" <<
692 subnet->getPosition() <<
")");
699 "Invalid Subnet4 cast in Subnet4ConfigParser::parse");
713 for (
auto h = hosts.begin(); h != hosts.end(); ++h) {
737 mutable_params = boost::const_pointer_cast<
Element>(params);
745 std::ostringstream output;
746 output << addr <<
"/" <<
static_cast<int>(len) <<
" with params: ";
748 bool has_renew = !subnet4->getT1().unspecified();
749 bool has_rebind = !subnet4->getT2().unspecified();
755 renew = subnet4->getT1().get();
756 output <<
"t1=" << renew <<
", ";
759 rebind = subnet4->getT2().get();
760 output <<
"t2=" << rebind <<
", ";
763 if (has_renew && has_rebind && (renew > rebind)) {
765 <<
") is greater than the value of rebind-timer (" 769 if (!subnet4->getValid().unspecified()) {
770 output <<
"valid-lifetime=" << subnet4->getValid().get();
776 if (params->contains(
"match-client-id")) {
777 bool match_client_id =
getBoolean(params,
"match-client-id");
778 subnet4->setMatchClientId(match_client_id);
782 if (params->contains(
"authoritative")) {
783 bool authoritative =
getBoolean(params,
"authoritative");
784 subnet4->setAuthoritative(authoritative);
790 if (params->contains(
"next-server")) {
793 next_server =
getString(params,
"next-server");
794 if (!next_server.empty()) {
795 subnet4->setSiaddr(
IOAddress(next_server));
801 pos = next->getPosition().str();
803 pos = params->getPosition().str();
806 << next_server <<
"(" << pos <<
")");
811 if (params->contains(
"server-hostname")) {
812 std::string sname =
getString(params,
"server-hostname");
813 if (!sname.empty()) {
818 << sname.length() <<
" (" 819 << error->getPosition() <<
")");
821 subnet4->setSname(sname);
826 if (params->contains(
"boot-file-name")) {
827 std::string filename =
getString(params,
"boot-file-name");
828 if (!filename.empty()) {
833 << filename.length() <<
" (" 834 << error->getPosition() <<
")");
836 subnet4->setFilename(filename);
842 if (params->contains(
"interface")) {
843 std::string iface =
getString(params,
"interface");
844 if (!iface.empty()) {
848 <<
" for subnet " << subnet4->toText()
849 <<
" is not present in the system (" 850 << error->getPosition() <<
")");
853 subnet4->setIface(iface);
858 if (params->contains(
"client-class")) {
859 string client_class =
getString(params,
"client-class");
860 if (!client_class.empty()) {
861 subnet4->allowClientClass(client_class);
868 const std::vector<data::ElementPtr>& classes = class_list->listValue();
869 for (
auto cclass = classes.cbegin();
870 cclass != classes.cend(); ++cclass) {
871 if (((*cclass)->getType() != Element::string) ||
872 (*cclass)->stringValue().empty()) {
874 << (*cclass)->getPosition() <<
")");
876 subnet4->requireClientClass((*cclass)->stringValue());
881 if (params->contains(
"4o6-interface")) {
882 string iface4o6 =
getString(params,
"4o6-interface");
883 if (!iface4o6.empty()) {
884 subnet4->get4o6().setIface4o6(iface4o6);
885 subnet4->get4o6().enabled(
true);
890 if (params->contains(
"4o6-subnet")) {
891 string subnet4o6 =
getString(params,
"4o6-subnet");
892 if (!subnet4o6.empty()) {
893 size_t slash = subnet4o6.find(
"/");
894 if (slash == std::string::npos) {
896 << subnet4o6 <<
", expected format: prefix6/length");
898 string prefix = subnet4o6.substr(0, slash);
899 string lenstr = subnet4o6.substr(slash + 1);
903 len = boost::lexical_cast<
unsigned int>(lenstr.c_str());
904 }
catch (
const boost::bad_lexical_cast &) {
906 "4o6-subnet parameter: " << subnet4o6 <<
", expected 0..128 value");
908 subnet4->get4o6().setSubnet4o6(
IOAddress(prefix), len);
909 subnet4->get4o6().enabled(
true);
914 if (params->contains(
"4o6-interface-id")) {
915 std::string ifaceid =
getString(params,
"4o6-interface-id");
916 if (!ifaceid.empty()) {
919 subnet4->get4o6().setInterfaceId(opt);
920 subnet4->get4o6().enabled(
true);
932 options_->copyTo(*subnet4->getCfgOption());
946 const IOAddress& address = host->getIPv4Reservation();
947 if (!address.
isV4Zero() && !subnet->inRange(address)) {
949 <<
"' is not within the IPv4 subnet '" 950 << subnet->
toText() <<
"'");
954 boost::shared_ptr<PoolsListParser>
956 auto parser = boost::make_shared<Pools4ListParser>();
970 BOOST_FOREACH(
ConstElementPtr subnet_json, subnets_list->listValue()) {
973 Subnet4Ptr subnet = parser->parse(subnet_json);
980 cfg->getCfgSubnets4()->add(subnet);
982 }
catch (
const std::exception& ex) {
984 << subnet_json->getPosition() <<
")");
995 BOOST_FOREACH(
ConstElementPtr subnet_json, subnets_list->listValue()) {
998 Subnet4Ptr subnet = parser->parse(subnet_json);
1001 auto ret = subnets.insert(subnet);
1004 "can't store subnet because of conflict");
1007 }
catch (
const std::exception& ex) {
1009 << subnet_json->getPosition() <<
")");
1016 boost::shared_ptr<Subnet4ConfigParser>
1018 auto parser = boost::make_shared<Subnet4ConfigParser>(
check_iface_);
1027 return (
PoolPtr(
new Pool6(static_cast<isc::dhcp::Lease::Type>
1028 (ptype), addr, len)));
1034 return (
PoolPtr(
new Pool6(static_cast<isc::dhcp::Lease::Type>
1035 (ptype), min, max)));
1044 auto parser = createPoolConfigParser();
1045 parser->parse(pools, pool, AF_INET6);
1049 boost::shared_ptr<PoolParser>
1051 auto parser = boost::make_shared<Pool6Parser>();
1064 std::string addr_str =
getString(pd_pool_,
"prefix");
1066 uint8_t prefix_len =
getUint8(pd_pool_,
"prefix-len");
1068 uint8_t delegated_len =
getUint8(pd_pool_,
"delegated-len");
1070 std::string excluded_prefix_str =
"::";
1071 if (pd_pool_->contains(
"excluded-prefix")) {
1072 excluded_prefix_str =
getString(pd_pool_,
"excluded-prefix");
1075 uint8_t excluded_prefix_len = 0;
1076 if (pd_pool_->contains(
"excluded-prefix-len")) {
1077 excluded_prefix_len =
getUint8(pd_pool_,
"excluded-prefix-len");
1083 opts_parser->parse(
options_, option_data);
1106 excluded_prefix_len));
1109 }
catch (
const std::exception& ex) {
1114 <<
" (" << pd_pool_->getPosition() <<
")");
1123 if (!cclass.empty()) {
1124 pool_->allowClientClass(cclass);
1129 const std::vector<data::ElementPtr>& classes = class_list->listValue();
1130 for (
auto cclass = classes.cbegin();
1131 cclass != classes.cend(); ++cclass) {
1132 if (((*cclass)->getType() != Element::string) ||
1133 (*cclass)->stringValue().empty()) {
1135 << (*cclass)->getPosition() <<
")");
1137 pool_->requireClientClass((*cclass)->stringValue());
1142 pools->push_back(
pool_);
1145 boost::shared_ptr<OptionDataListParser>
1147 auto parser = boost::make_shared<OptionDataListParser>(AF_INET6);
1157 auto parser = createPdPoolConfigParser();
1158 parser->parse(pools, pd_pool);
1162 boost::shared_ptr<PdPoolParser>
1164 auto parser = boost::make_shared<PdPoolParser>();
1183 parser->parse(
pools_, pools);
1188 parser->parse(
pools_, pd_pools);
1196 "Failed to create an IPv6 subnet (" <<
1197 subnet->getPosition() <<
")");
1204 "Invalid Subnet6 cast in Subnet6ConfigParser::parse");
1218 for (
auto h = hosts.begin(); h != hosts.end(); ++h) {
1232 .arg(code).arg(addr.
toText());
1246 if (params->contains(
"rapid-commit")) {
1247 rapid_commit =
getBoolean(params,
"rapid-commit");
1263 mutable_params = boost::const_pointer_cast<
Element>(params);
1276 std::ostringstream output;
1277 output << addr <<
"/" <<
static_cast<int>(len) <<
" with params: ";
1283 int64_t rebind = -1;
1287 output <<
"t1=" << renew <<
", ";
1291 output <<
"t2=" << rebind <<
", ";
1294 if (has_renew && has_rebind && (renew > rebind)) {
1296 <<
") is greater than the value of rebind-timer (" 1301 output <<
"preferred-lifetime=" << subnet6->
getPreferred().
get() <<
", ";
1304 output <<
"valid-lifetime=" << subnet6->
getValid().
get();
1307 output <<
", rapid-commit is " 1316 if (params->contains(
"interface-id")) {
1317 ifaceid =
getString(params,
"interface-id");
1321 if (params->contains(
"interface")) {
1331 "parser error: interface (defined for locally reachable " 1332 "subnets) and interface-id (defined for subnets reachable" 1333 " via relays) cannot be defined at the same time for " 1334 "subnet " << addr <<
"/" << (
int)len <<
"(" 1335 << params->getPosition() <<
")");
1340 std::string ifaceid_value = ifaceid.
get();
1341 OptionBuffer tmp(ifaceid_value.begin(), ifaceid_value.end());
1352 <<
" for subnet " << subnet6->
toText()
1353 <<
" is not present in the system (" 1354 << error->getPosition() <<
")");
1361 if (params->contains(
"client-class")) {
1362 string client_class =
getString(params,
"client-class");
1363 if (!client_class.empty()) {
1368 if (params->contains(
"require-client-classes")) {
1372 const std::vector<data::ElementPtr>& classes = class_list->listValue();
1373 for (
auto cclass = classes.cbegin();
1374 cclass != classes.cend(); ++cclass) {
1375 if (((*cclass)->getType() != Element::string) ||
1376 (*cclass)->stringValue().empty()) {
1378 << (*cclass)->getPosition() <<
")");
1404 for (
auto it = range.first; it != range.second; ++it) {
1405 const IOAddress& address = it->second.getPrefix();
1406 if (!subnet->inRange(address)) {
1408 <<
"' is not within the IPv6 subnet '" 1409 << subnet->
toText() <<
"'");
1414 boost::shared_ptr<PoolsListParser>
1416 auto parser = boost::make_shared<Pools6ListParser>();
1420 boost::shared_ptr<PdPoolsListParser>
1422 auto parser = boost::make_shared<PdPoolsListParser>();
1436 BOOST_FOREACH(
ConstElementPtr subnet_json, subnets_list->listValue()) {
1439 Subnet6Ptr subnet = parser->parse(subnet_json);
1445 cfg->getCfgSubnets6()->add(subnet);
1447 }
catch (
const std::exception& ex) {
1449 << subnet_json->getPosition() <<
")");
1459 BOOST_FOREACH(
ConstElementPtr subnet_json, subnets_list->listValue()) {
1462 Subnet6Ptr subnet = parser->parse(subnet_json);
1465 auto ret = subnets.insert(subnet);
1468 "can't store subnet because of conflict");
1471 }
catch (
const std::exception& ex) {
1473 << subnet_json->getPosition() <<
")");
1480 boost::shared_ptr<Subnet6ConfigParser>
1482 auto parser = boost::make_shared<Subnet6ConfigParser>(
check_iface_);
1490 const std::string& name) {
1493 (scope, name,
"NameChangeRequest protocol"));
1498 const std::string& name) {
1501 (scope, name,
"NameChangeRequest format"));
1506 const std::string& name) {
1509 (scope, name,
"ReplaceClientName mode"));
1517 bool enable_updates =
getBoolean(client_config,
"enable-updates");
1521 uint32_t server_port =
getUint32(client_config,
"server-port");
1523 std::string sender_ip_str =
getString(client_config,
"sender-ip");
1525 uint32_t sender_port =
getUint32(client_config,
"sender-port");
1527 uint32_t max_queue_size =
getUint32(client_config,
"max-queue-size");
1530 getProtocol(client_config,
"ncr-protocol");
1533 getFormat(client_config,
"ncr-format");
1536 if (sender_ip_str.empty()) {
1543 }
catch (
const std::exception& ex) {
1545 <<
") specified for parameter 'sender-ip' (" 1546 <<
getPosition(
"sender-ip", client_config) <<
")");
1556 <<
" is not supported. (" 1557 <<
getPosition(
"ncr-format", client_config) <<
")");
1563 <<
" is not supported. (" 1564 <<
getPosition(
"ncr-protocol", client_config) <<
")");
1569 "D2ClientConfig error: address family mismatch: " 1570 <<
"server-ip: " << server_ip.
toText()
1571 <<
" is: " << (server_ip.
isV4() ?
"IPv4" :
"IPv6")
1572 <<
" while sender-ip: " << sender_ip.
toText()
1573 <<
" is: " << (sender_ip.
isV4() ?
"IPv4" :
"IPv6")
1574 <<
" (" <<
getPosition(
"sender-ip", client_config) <<
")");
1577 if (server_ip == sender_ip && server_port == sender_port) {
1579 "D2ClientConfig error: server and sender cannot" 1580 " share the exact same IP address/port: " 1581 << server_ip.
toText() <<
"/" << server_port
1582 <<
" (" <<
getPosition(
"sender-ip", client_config) <<
")");
1595 }
catch (
const std::exception& ex) {
1597 << client_config->getPosition() <<
")");
1603 new_config->setContext(user_context);
1612 {
"server-ip", Element::string,
"127.0.0.1" },
1613 {
"server-port", Element::integer,
"53001" },
1616 {
"sender-ip", Element::string,
"" },
1617 {
"sender-port", Element::integer,
"0" },
1618 {
"max-queue-size", Element::integer,
"1024" },
1619 {
"ncr-protocol", Element::string,
"UDP" },
1620 {
"ncr-format", Element::string,
"JSON" }
1626 return (SimpleParser::setDefaults(mutable_d2, D2_CLIENT_CONFIG_DEFAULTS));
void parseDdnsParams(const data::ConstElementPtr &network_data, NetworkPtr &network)
Parses parameters pertaining to DDNS behavior.
static const size_t MAX_SNAME_LEN
length of the SNAME field in DHCPv4 message
IfacePtr getIface(int ifindex)
Returns interface specified interface index.
#define LOG_WARN(LOGGER, MESSAGE)
Macro to conveniently test warn output and log it.
static bool getBoolean(isc::data::ConstElementPtr scope, const std::string &name)
Returns a boolean parameter from a scope.
virtual boost::shared_ptr< PoolsListParser > createPoolsListParser() const
Returns an instance of the Pools4ListParser 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...
void unspecified(bool unspecified)
Modifies the flag that indicates whether the value is specified or unspecified.
static int64_t getInteger(isc::data::ConstElementPtr scope, const std::string &name)
Returns an integer parameter from a scope.
D2ClientConfigPtr parse(isc::data::ConstElementPtr d2_client_cfg)
Parses a given dhcp-ddns element into D2ClientConfig.
void validateResvs(const Subnet6Ptr &subnet, ConstHostPtr host)
Verifies host reservation addresses are in the subnet range.
virtual void duplicate_option_warning(uint32_t code, asiolink::IOAddress &addr)
Issues a DHCP6 server specific warning regarding duplicate subnet options.
boost::shared_ptr< CfgOption > CfgOptionPtr
Non-const pointer.
isc::dhcp::Pool6Ptr pool_
Pointer to the created pool object.
size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list)
parses contents of the list
boost::shared_ptr< Network > NetworkPtr
Pointer to the Network object.
Base class representing a DHCP option definition.
NameChangeProtocol stringToNcrProtocol(const std::string &protocol_str)
Function which converts text labels to NameChangeProtocol enums.
static const isc::data::SimpleKeywords OPTION4_DEF_PARAMETERS
This table defines all option definition parameters.
this class parses a single subnet
#define LOG_INFO(LOGGER, MESSAGE)
Macro to conveniently test info output and log it.
A generic exception that is thrown if a parameter given to a method or function is considered invalid...
isc::util::Triplet< uint32_t > getPreferred(const Inheritance &inheritance=Inheritance::ALL) const
Returns preferred lifetime (in seconds)
static const isc::data::SimpleDefaults D2_CLIENT_CONFIG_DEFAULTS
Defaults for the D2 client configuration.
std::vector< SimpleDefault > SimpleDefaults
This specifies all default values in a given scope (e.g. a subnet).
boost::shared_ptr< Network::RelayInfo > RelayInfoPtr
Pointer to the RelayInfo structure.
void parseCommon(const data::ConstElementPtr &network_data, NetworkPtr &network)
Parses common parameters.
static const size_t MAX_FILE_LEN
length of the FILE field in DHCPv4 message
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...
static bool validateName(const std::string &name)
Checks that the provided option space name is valid.
static CfgMgr & instance()
returns a single instance of Configuration Manager
Subnets6ListConfigParser(bool check_iface=true)
constructor
boost::shared_ptr< SrvConfig > SrvConfigPtr
Non-const pointer to the SrvConfig.
virtual boost::shared_ptr< OptionDataListParser > createOptionDataListParser() const
Returns an instance of the OptionDataListParser to be used in parsing the option-data structure...
boost::shared_ptr< Option > OptionPtr
boost::shared_ptr< Subnet4 > Subnet4Ptr
A pointer to a Subnet4 object.
virtual boost::shared_ptr< PoolsListParser > createPoolsListParser() const
Returns an instance of the Pools6ListParser to be used in parsing the address pools.
boost::shared_ptr< const CfgGlobals > ConstCfgGlobalsPtr
Const shared pointer to a CfgGlobals instance.
void setControlSocketInfo(const isc::data::ConstElementPtr &control_socket)
Sets information about the control socket.
const isc::log::MessageID DHCPSRV_CFGMGR_RELAY_IP_ADDRESS_DEPRECATED
void clear()
Removes any configured MAC/Hardware address sources.
Universe
defines option universe DHCPv4 or DHCPv6
T get() const
Retrieves the encapsulated value.
void add(uint32_t source)
Adds additional MAC/hardware address acquisition.
void parseCacheParams(const data::ConstElementPtr &network_data, NetworkPtr &network)
Parses parameters related to lease cache settings.
boost::shared_ptr< Element > ElementPtr
virtual boost::shared_ptr< Subnet4ConfigParser > createSubnetConfigParser() const
Returns an instance of the Subnet4ConfigParser to be used in parsing the subnets. ...
std::vector< HostPtr > HostCollection
Collection of the Host objects.
CfgOptionPtr options_
Pointer to the options configuration.
static void setRuntimeOptionDefs(const OptionDefSpaceContainer &defs)
Copies option definitions created at runtime.
Subnet4Ptr parse(data::ConstElementPtr subnet)
Parses a single IPv4 subnet configuration and adds to the Configuration Manager.
NameChangeFormat
Defines the list of data wire formats supported.
A configuration holder for IPv4 subnet.
void setInterfaceId(const OptionPtr &ifaceid)
sets interface-id option (if defined)
boost::shared_ptr< CfgOptionDef > CfgOptionDefPtr
Non-const pointer.
CfgOptionPtr getCfgOption()
Returns pointer to the option data configuration for this network.
boost::shared_ptr< Pool > PoolPtr
a pointer to either IPv4 or IPv6 Pool
OptionDefinitionPtr parse(isc::data::ConstElementPtr option_def)
Parses an entry that describes single option definition.
virtual boost::shared_ptr< OptionDataListParser > createOptionDataListParser() const
Returns an instance of the OptionDataListParser to be used in parsing the option-data structure...
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
PdPoolParser()
Constructor.
const isc::log::MessageID DHCPSRV_CFGMGR_NEW_SUBNET6
std::vector< uint8_t > OptionBuffer
buffer types used in DHCP code.
PoolStoragePtr pools_
Storage for pools belonging to this subnet.
static const isc::data::SimpleKeywords SUBNET4_PARAMETERS
This table defines all subnet parameters for DHCPv4.
static const IOAddress & IPV6_ZERO_ADDRESS()
Returns an IPv6 zero address.
void parse(const SubnetID &subnet_id, isc::data::ConstElementPtr hr_list, HostCollection &hosts_list)
Parses a list of host reservation entries for a subnet.
Holds optional information about relay.
OptionDefListParser(const uint16_t address_family)
Constructor.
#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...
std::string ncrProtocolToString(NameChangeProtocol protocol)
Function which converts NameChangeProtocol enums to text labels.
static const isc::data::SimpleKeywords PD_POOL6_PARAMETERS
This table defines all prefix delegation pool parameters.
static const isc::data::SimpleKeywords SUBNET6_PARAMETERS
This table defines all subnet parameters for DHCPv6.
Subnets4ListConfigParser(bool check_iface=true)
constructor
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.
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 createSubnet(isc::data::ConstElementPtr data)
Create a new subnet using a data from child parsers.
std::pair< IPv6ResrvIterator, IPv6ResrvIterator > IPv6ResrvRange
Pool information for IPv6 addresses and prefixes.
Represents option data configuration for the DHCP server.
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.
vector< string > tokens(const std::string &text, const std::string &delim, bool escape)
Split String into Tokens.
An exception that is thrown if an error occurs while configuring the D2 DHCP DDNS client...
Wrapper class that holds MAC/hardware address sources.
const int DHCPSRV_DBG_TRACE_DETAIL
Additional information.
parser for additional relay information
To be removed. Please use ConfigError instead.
Acts as a storage vault for D2 client configuration.
uint8_t getUint8(ConstElementPtr scope, const std::string &name)
Get an uint8_t value.
void allowClientClass(const isc::dhcp::ClientClass &class_name)
Sets the supported class to class class_name.
void parseTeePercents(const data::ConstElementPtr &network_data, NetworkPtr &network)
Parses parameters related to "percent" timers settings.
void setRapidCommit(const util::Optional< bool > &rapid_commit)
Enables or disables Rapid Commit option support for the subnet.
Parser for a single option definition.
A generic exception that is thrown when an unexpected error condition occurs.
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.
Common interface representing a network to which the DHCP clients are connected.
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.
T get(T hint) const
Returns value with a hint.
static void moveReservationMode(isc::data::ElementPtr config)
Moves deprecated reservation-mode parameter to new reservations flags.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< const Host > ConstHostPtr
Const pointer to the Host object.
static std::string getString(isc::data::ConstElementPtr scope, const std::string &name)
Returns a string parameter from a scope.
const isc::log::MessageID DHCPSRV_CFGMGR_NEW_SUBNET4
static const isc::data::SimpleKeywords POOL6_PARAMETERS
This table defines all pool parameters.
void initSubnet(data::ConstElementPtr params, asiolink::IOAddress addr, uint8_t len)
Instantiates the IPv4 Subnet based on a given IPv4 address and prefix length.
bool isV4() const
Convenience function to check for an IPv4 address.
uint32_t getUint32(isc::data::ConstElementPtr scope, const std::string &name)
Returns a value converted to uint32_t.
size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list)
parses contents of the list
isc::data::ConstElementPtr client_class_
Client class (a client has to belong to to use this pd-pool)
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.
Specifies current DHCP configuration.
SubnetConfigParser(uint16_t family, bool check_iface=true)
constructor
isc::util::Triplet< uint32_t > getT1(const Inheritance &inheritance=Inheritance::ALL) const
Returns T1 (renew timer), expressed in seconds.
static const data::Element::Position & getPosition(const std::string &name, const data::ConstElementPtr parent)
Utility method that returns position of an element.
CfgOptionPtr options_
A storage for pool specific option values.
This is a base class for exceptions thrown from the DNS library module.
static isc::asiolink::IOAddress getAddress(const ConstElementPtr &scope, const std::string &name)
Returns a IOAddress parameter from a scope.
Defines the logger used by the top-level component of kea-lfc.
virtual boost::shared_ptr< PoolParser > createPoolConfigParser() const
Returns an instance of the Pool6Parser to be used in parsing the address pools.
virtual boost::shared_ptr< PoolParser > createPoolConfigParser() const
Returns an instance of the Pool4Parser to be used in parsing the address pools.
std::string toText() const
Convert the address to a string.
bool check_iface_
Check if the specified interface exists in the system.
static const isc::data::SimpleKeywords POOL4_PARAMETERS
This table defines all pool parameters.
ReplaceClientNameMode
Defines the client name replacement modes.
A configuration holder for IPv6 subnet.
uint16_t address_family_
Address family: AF_INET or AF_INET6.
PoolPtr poolMaker(asiolink::IOAddress &addr, uint32_t len, int32_t ignored)
Creates a Pool4 object given a IPv4 prefix and the prefix length.
target_type getAndConvert(isc::data::ConstElementPtr scope, const std::string &name, const std::string &type_name)
Returns a converted value from a scope.
SubnetPtr parse(isc::data::ConstElementPtr subnet)
parses a subnet description and returns Subnet{4,6} structure
void requireClientClass(const isc::dhcp::ClientClass &class_name)
Adds class class_name to classes required to be evaluated.
bool check_iface_
Check if the specified interface exists in the system.
isc::util::Triplet< uint32_t > getValid(const Inheritance &inheritance=Inheritance::ALL) const
Return valid-lifetime for addresses in that prefix.
#define DHCP6_OPTION_SPACE
std::string ncrFormatToString(NameChangeFormat format)
Function which converts NameChangeFormat enums to text labels.
Subnet6Ptr parse(data::ConstElementPtr subnet)
Parses a single IPv6 subnet configuration and adds to the Configuration Manager.
void parse(const isc::dhcp::Network::RelayInfoPtr &relay_info, isc::data::ConstElementPtr relay_elem)
parses the actual relay parameters
static IfaceMgr & instance()
IfaceMgr is a singleton class.
isc::dhcp::SubnetPtr subnet_
Pointer to the created subnet object.
#define DHCP4_OPTION_SPACE
global std option spaces
PoolPtr poolMaker(asiolink::IOAddress &addr, uint32_t len, int32_t ptype)
Creates a Pool6 object given a IPv6 prefix and the prefix length.
static void checkKeywords(const SimpleKeywords &keywords, isc::data::ConstElementPtr scope)
Checks acceptable keywords with their expected type.
The Element class represents a piece of data, used by the command channel and configuration parts...
static const isc::data::SimpleKeywords OPTION6_DEF_PARAMETERS
This table defines all option definition parameters.
#define LOG_DEBUG(LOGGER, LEVEL, MESSAGE)
Macro to conveniently test debug output and log it.
isc::dhcp::Network::RelayInfoPtr relay_info_
Pointer to relay information.
void parse(PoolStoragePtr pools, data::ConstElementPtr pools_list)
parses the actual structure
const isc::util::Triplet< uint32_t > parseIntTriplet(const data::ConstElementPtr &scope, const std::string &name)
Parses an integer triplet.
NameChangeProtocol
Defines the list of socket protocols supported.
boost::shared_ptr< PoolStorage > PoolStoragePtr
A generic exception that is thrown if a parameter given to a method would refer to or modify out-of-r...
void setIface(const util::Optional< std::string > &iface_name)
Sets local name of the interface for which this network is selected.
static size_t setAllDefaults(isc::data::ConstElementPtr d2_config)
Sets all defaults for D2 client configuration.
boost::shared_ptr< OptionDefinition > OptionDefinitionPtr
Pointer to option definition object.
NameChangeFormat stringToNcrFormat(const std::string &fmt_str)
Function which converts labels to NameChangeFormat enum values.
isc::data::ConstElementPtr user_context_
User context (optional, may be null)
string trim(const string &instring)
Trim Leading and Trailing Spaces.
isc::util::Triplet< uint32_t > getT2(const Inheritance &inheritance=Inheritance::ALL) const
Returns T2 (rebind timer), expressed in seconds.
isc::log::Logger dhcpsrv_logger("dhcpsrv")
DHCP server library Logger.
virtual boost::shared_ptr< Subnet6ConfigParser > createSubnetConfigParser() const
Returns an instance of the Subnet6ConfigParser to be used in parsing the subnets. ...
Subnet4ConfigParser(bool check_iface=true)
Constructor.
Parser for a list of host reservations for a subnet.
boost::shared_ptr< Subnet6 > Subnet6Ptr
A pointer to a Subnet6 object.
util::Optional< bool > getRapidCommit(const Inheritance &inheritance=Inheritance::ALL) const
Returns boolean value indicating that the Rapid Commit option is supported or unsupported for the sub...
void parse(CfgOptionDefPtr cfg, isc::data::ConstElementPtr def_list)
Parses a list of option definitions, create them and store in cfg.
const isc::log::MessageID DHCPSRV_CFGMGR_OPTION_DUPLICATE
virtual void parse(PoolStoragePtr pools, isc::data::ConstElementPtr pool_structure, const uint16_t address_family)
parses the actual structure
The IOAddress class represents an IP addresses (version agnostic)
Subnet6ConfigParser(bool check_iface=true)
Constructor.
bool empty() const
Checks if the encapsulated value is empty.
boost::shared_ptr< D2ClientConfig > D2ClientConfigPtr
Defines a pointer for D2ClientConfig instances.
virtual boost::shared_ptr< PdPoolParser > createPdPoolConfigParser() const
Returns an instance of the PdPoolParser to be used in parsing the prefix delegation pools...
bool check_iface_
Check if the specified interface exists in the system.
void parse(PoolStoragePtr pools, data::ConstElementPtr pd_pool_list)
Parse configuration entries.
void validateResv(const Subnet4Ptr &subnet, ConstHostPtr host)
Verifies the host reservation address is in the subnet range.
void parse(PoolStoragePtr pools, data::ConstElementPtr pd_pool_)
Builds a prefix delegation pool from the given configuration.
std::vector< PoolPtr > PoolStorage
a collection of pools
virtual std::string toText() const
Returns textual representation of the subnet (e.g.
boost::shared_ptr< Subnet > SubnetPtr
A generic pointer to either Subnet4 or Subnet6 object.
RelayInfoParser(const isc::dhcp::Option::Universe &family)
constructor
static ReplaceClientNameMode stringToReplaceClientNameMode(const std::string &mode_str)
Converts labels to ReplaceClientNameMode enum values.
uint32_t SubnetID
Unique identifier for a subnet (both v4 and v6)
Pool information for IPv4 addresses.
void parse(PoolStoragePtr pools, data::ConstElementPtr pools_list)
parses the actual structure
short getFamily() const
Returns the address family.
SrvConfigPtr getStagingCfg()
Returns a pointer to the staging configuration.