18#include <boost/make_shared.hpp>
19#include <boost/pointer_cast.hpp>
30 : check_iface_(check_iface) {
35 bool encapsulate_options) {
45 std::string name =
getString(shared_network_data,
"name");
49 mutable_params = boost::const_pointer_cast<Element>(shared_network_data);
52 NetworkPtr network = boost::dynamic_pointer_cast<Network>(shared_network);
56 if (shared_network_data->contains(
"interface")) {
57 std::string iface =
getString(shared_network_data,
"interface");
61 shared_network_data->get(
"interface");
63 "Specified network interface name " << iface
64 <<
" for shared network " << name
65 <<
" is not present in the system ("
66 <<
error->getPosition() <<
")");
68 shared_network->setIface(iface);
72 if (shared_network_data->contains(
"option-data")) {
73 auto json = shared_network_data->get(
"option-data");
75 CfgOptionPtr cfg_option = shared_network->getCfgOption();
77 parser->parse(cfg_option, json, encapsulate_options);
80 if (shared_network_data->contains(
"subnet4")) {
81 auto json = shared_network_data->get(
"subnet4");
86 parser->parse(subnets, json);
89 for (
auto const& subnet : subnets) {
90 shared_network->add(subnet);
94 if (shared_network_data->contains(
"match-client-id")) {
95 shared_network->setMatchClientId(
getBoolean(shared_network_data,
99 if (shared_network_data->contains(
"authoritative")) {
100 shared_network->setAuthoritative(
getBoolean(shared_network_data,
105 if (shared_network_data->contains(
"next-server")) {
106 std::string next_server;
108 next_server =
getString(shared_network_data,
"next-server");
109 if (!next_server.empty()) {
110 shared_network->setSiaddr(
IOAddress(next_server));
116 pos = next->getPosition().str();
118 pos = shared_network_data->getPosition().str();
121 << next_server <<
"(" << pos <<
")");
126 if (shared_network_data->contains(
"server-hostname")) {
127 std::string sname =
getString(shared_network_data,
"server-hostname");
128 if (!sname.empty()) {
133 << sname.length() <<
" ("
134 <<
error->getPosition() <<
")");
136 shared_network->setSname(sname);
141 if (shared_network_data->contains(
"boot-file-name")) {
142 std::string filename =
getString(shared_network_data,
"boot-file-name");
143 if (!filename.empty()) {
148 << filename.length() <<
" ("
149 <<
error->getPosition() <<
")");
151 shared_network->setFilename(filename);
155 if (shared_network_data->contains(
"client-class")) {
156 std::string client_class =
getString(shared_network_data,
"client-class");
157 if (!client_class.empty()) {
158 shared_network->allowClientClass(client_class);
162 ConstElementPtr user_context = shared_network_data->get(
"user-context");
164 shared_network->setContext(user_context);
167 if (shared_network_data->contains(
"require-client-classes")) {
168 const std::vector<data::ElementPtr>& class_list =
169 shared_network_data->get(
"require-client-classes")->listValue();
170 for (
auto const& cclass : class_list) {
172 cclass->stringValue().empty()) {
174 << cclass->getPosition() <<
")");
176 shared_network->requireClientClass(cclass->stringValue());
180 if (shared_network_data->contains(
"relay")) {
181 auto relay_parms = shared_network_data->get(
"relay");
185 parser.
parse(relay_info, relay_parms);
186 shared_network->setRelayInfo(*relay_info);
202 Network4Ptr network4 = boost::dynamic_pointer_cast<Network4>(shared_network);
208 }
catch (
const std::exception& ex) {
210 << shared_network_data->getPosition() <<
")");
220 return (shared_network);
223boost::shared_ptr<OptionDataListParser>
225 auto parser = boost::make_shared<OptionDataListParser>(AF_INET);
229boost::shared_ptr<Subnets4ListConfigParser>
231 auto parser = boost::make_shared<Subnets4ListConfigParser>(
check_iface_);
236 : check_iface_(check_iface) {
241 bool encapsulate_options) {
247 shared_network_data);
251 name =
getString(shared_network_data,
"name");
255 mutable_params = boost::const_pointer_cast<Element>(shared_network_data);
258 NetworkPtr network = boost::dynamic_pointer_cast<Network>(shared_network);
263 "preferred-lifetime"));
267 Optional<std::string> ifaceid;
268 if (shared_network_data->contains(
"interface-id")) {
269 ifaceid =
getString(shared_network_data,
"interface-id");
273 Optional<std::string> iface;
274 if (shared_network_data->contains(
"interface")) {
275 iface =
getString(shared_network_data,
"interface");
281 if (!ifaceid.unspecified() && !iface.unspecified() && !ifaceid.empty() &&
284 "parser error: interface (defined for locally reachable "
285 "subnets) and interface-id (defined for subnets reachable"
286 " via relays) cannot be defined at the same time for "
287 "shared network " << name <<
"("
288 << shared_network_data->getPosition() <<
")");
292 if (!ifaceid.unspecified() && !ifaceid.empty()) {
293 std::string ifaceid_value = ifaceid.get();
294 OptionBuffer tmp(ifaceid_value.begin(), ifaceid_value.end());
296 shared_network->setInterfaceId(opt);
301 if (!iface.unspecified() && !iface.empty()) {
305 "Specified network interface name " << iface
306 <<
" for shared network " << name
307 <<
" is not present in the system ("
308 <<
error->getPosition() <<
")");
310 shared_network->setIface(iface);
313 if (shared_network_data->contains(
"rapid-commit")) {
314 shared_network->setRapidCommit(
getBoolean(shared_network_data,
318 if (shared_network_data->contains(
"option-data")) {
319 auto json = shared_network_data->get(
"option-data");
321 CfgOptionPtr cfg_option = shared_network->getCfgOption();
323 parser->parse(cfg_option, json, encapsulate_options);
326 if (shared_network_data->contains(
"client-class")) {
327 std::string client_class =
getString(shared_network_data,
"client-class");
328 if (!client_class.empty()) {
329 shared_network->allowClientClass(client_class);
333 ConstElementPtr user_context = shared_network_data->get(
"user-context");
335 shared_network->setContext(user_context);
338 if (shared_network_data->contains(
"require-client-classes")) {
339 const std::vector<data::ElementPtr>& class_list =
340 shared_network_data->get(
"require-client-classes")->listValue();
341 for (
auto const& cclass : class_list) {
343 cclass->stringValue().empty()) {
345 << cclass->getPosition() <<
")");
347 shared_network->requireClientClass(cclass->stringValue());
351 if (shared_network_data->contains(
"subnet6")) {
352 auto json = shared_network_data->get(
"subnet6");
357 parser->parse(subnets, json);
360 for (
auto const& subnet : subnets) {
361 shared_network->add(subnet);
365 if (shared_network_data->contains(
"relay")) {
366 auto relay_parms = shared_network_data->get(
"relay");
370 parser.
parse(relay_info, relay_parms);
371 shared_network->setRelayInfo(*relay_info);
385 if (network->getAllocatorType() ==
"flq") {
386 isc_throw(
BadValue,
"Free Lease Queue allocator is not supported for IPv6 address pools");
390 auto network6 = boost::dynamic_pointer_cast<Network6>(shared_network);
393 }
catch (
const std::exception& ex) {
395 << shared_network_data->getPosition() <<
")");
405 return (shared_network);
408boost::shared_ptr<OptionDataListParser>
410 auto parser = boost::make_shared<OptionDataListParser>(AF_INET6);
414boost::shared_ptr<Subnets6ListConfigParser>
416 auto parser = boost::make_shared<Subnets6ListConfigParser>(
check_iface_);
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
The IOAddress class represents an IP addresses (version agnostic)
static void checkKeywords(const SimpleKeywords &keywords, isc::data::ConstElementPtr scope)
Checks acceptable keywords with their expected type.
static std::string getString(isc::data::ConstElementPtr scope, const std::string &name)
Returns a string parameter from a scope.
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.
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)
static CfgMgr & instance()
returns a single instance of Configuration Manager
To be removed. Please use ConfigError instead.
static IfaceMgr & instance()
IfaceMgr is a singleton class.
Holds optional information about relay.
boost::shared_ptr< Network::RelayInfo > RelayInfoPtr
Pointer to the RelayInfo structure.
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
parser for additional relay information
void parse(const isc::dhcp::Network::RelayInfoPtr &relay_info, isc::data::ConstElementPtr relay_elem)
parses the actual relay parameters
virtual boost::shared_ptr< Subnets4ListConfigParser > createSubnetsListParser() const
Returns an instance of the Subnets4ListConfigParser to be used for parsing the subnets within the sha...
SharedNetwork4Parser(bool check_iface=true)
Constructor.
virtual boost::shared_ptr< OptionDataListParser > createOptionDataListParser() const
Returns an instance of the OptionDataListParser to be used in parsing the option-data structure.
bool check_iface_
Check if the specified interface exists in the system.
SharedNetwork4Ptr parse(const data::ConstElementPtr &shared_network_data, bool encapsulate_options=true)
Parses shared configuration information for IPv4 shared network.
Shared network holding IPv4 subnets.
SharedNetwork6Parser(bool check_iface=true)
Constructor.
virtual boost::shared_ptr< Subnets6ListConfigParser > createSubnetsListParser() const
Returns an instance of the Subnets6ListConfigParser to be used for parsing the subnets within the sha...
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.
SharedNetwork6Ptr parse(const data::ConstElementPtr &shared_network_data, bool encapsulate_options=true)
Parses shared configuration information for IPv6 shared network.
Shared network holding IPv6 subnets.
static const isc::data::SimpleKeywords SHARED_NETWORK4_PARAMETERS
This table defines all shared network parameters for DHCPv4.
static const isc::data::SimpleKeywords SHARED_NETWORK6_PARAMETERS
This table defines all shared network parameters for DHCPv6.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< Element > ElementPtr
boost::shared_ptr< const CfgGlobals > ConstCfgGlobalsPtr
Const shared pointer to a CfgGlobals instance.
boost::shared_ptr< Network4 > Network4Ptr
Pointer to the Network4 object.
boost::shared_ptr< CfgOption > CfgOptionPtr
Non-const pointer.
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< SharedNetwork6 > SharedNetwork6Ptr
Pointer to SharedNetwork6 object.
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.
boost::shared_ptr< Network > NetworkPtr
Pointer to the Network object.
std::vector< uint8_t > OptionBuffer
buffer types used in DHCP code.
boost::shared_ptr< SharedNetwork4 > SharedNetwork4Ptr
Pointer to SharedNetwork4 object.
boost::shared_ptr< Option > OptionPtr
Defines the logger used by the top-level component of kea-lfc.