Kea  1.9.9-git
dhcp_parsers.h
Go to the documentation of this file.
1 // Copyright (C) 2013-2021 Internet Systems Consortium, Inc. ("ISC")
2 //
3 // This Source Code Form is subject to the terms of the Mozilla Public
4 // License, v. 2.0. If a copy of the MPL was not distributed with this
5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 
7 #ifndef DHCP_PARSERS_H
8 #define DHCP_PARSERS_H
9 
10 #include <asiolink/io_address.h>
11 #include <cc/data.h>
12 #include <dhcp/option_definition.h>
14 #include <dhcpsrv/d2_client_cfg.h>
15 #include <dhcpsrv/cfg_iface.h>
16 #include <dhcpsrv/cfg_option.h>
17 #include <dhcpsrv/network.h>
18 #include <dhcpsrv/subnet.h>
19 #include <dhcpsrv/cfg_option_def.h>
20 #include <dhcpsrv/cfg_mac_source.h>
21 #include <dhcpsrv/srv_config.h>
23 #include <cc/simple_parser.h>
24 #include <exceptions/exceptions.h>
25 #include <util/optional.h>
26 
27 #include <boost/shared_ptr.hpp>
28 
29 #include <stdint.h>
30 #include <string>
31 #include <vector>
32 
33 namespace isc {
34 namespace dhcp {
35 
38 typedef OptionSpaceContainer<OptionContainer, OptionDescriptor,
39  std::string> OptionStorage;
41 typedef boost::shared_ptr<OptionStorage> OptionStoragePtr;
42 
54 template<typename ValueType>
55 class ValueStorage {
56 public:
68  void setParam(const std::string& name, const ValueType& value,
69  const data::Element::Position& position) {
70  values_[name] = value;
71  positions_[name] = position;
72  }
73 
82  ValueType getParam(const std::string& name) const {
83  typename std::map<std::string, ValueType>::const_iterator param
84  = values_.find(name);
85 
86  if (param == values_.end()) {
87  isc_throw(DhcpConfigError, "Missing parameter '"
88  << name << "'");
89  }
90 
91  return (param->second);
92  }
93 
108  getPosition(const std::string& name, const data::ConstElementPtr parent =
109  data::ConstElementPtr()) const {
110  typename std::map<std::string, data::Element::Position>::const_iterator
111  pos = positions_.find(name);
112  if (pos == positions_.end()) {
113  return (parent ? parent->getPosition() :
115  }
116 
117  return (pos->second);
118  }
119 
130  ValueType getOptionalParam(const std::string& name,
131  const ValueType& default_value) const {
132  typename std::map<std::string, ValueType>::const_iterator param
133  = values_.find(name);
134 
135  if (param == values_.end()) {
136  return (default_value);
137  }
138 
139  return (param->second);
140  }
141 
148  void delParam(const std::string& name) {
149  values_.erase(name);
150  positions_.erase(name);
151  }
152 
155  void clear() {
156  values_.clear();
157  positions_.clear();
158  }
159 
160 private:
162  std::map<std::string, ValueType> values_;
163 
169  std::map<std::string, data::Element::Position> positions_;
170 
171 };
172 
174 typedef std::pair<std::string, isc::data::ConstElementPtr> ConfigPair;
175 
178 typedef boost::shared_ptr<Uint32Storage> Uint32StoragePtr;
179 
182 typedef boost::shared_ptr<StringStorage> StringStoragePtr;
183 
186 typedef boost::shared_ptr<BooleanStorage> BooleanStoragePtr;
187 
195 public:
203  void parse(CfgMACSource& mac_sources, isc::data::ConstElementPtr value);
204 };
205 
211 public:
221  void parse(SrvConfig& srv_cfg, isc::data::ConstElementPtr value);
222 };
223 
228 public:
232  OptionDefParser(const uint16_t address_family);
233 
241 
242 private:
244  uint16_t address_family_;
245 };
246 
254 public:
258  OptionDefListParser(const uint16_t address_family);
259 
269 
270 private:
272  uint16_t address_family_;
273 };
274 
279 typedef std::vector<PoolPtr> PoolStorage;
280 typedef boost::shared_ptr<PoolStorage> PoolStoragePtr;
281 
290 public:
291 
293  virtual ~PoolParser() {
294  }
295 
305  virtual void parse(PoolStoragePtr pools,
306  isc::data::ConstElementPtr pool_structure,
307  const uint16_t address_family);
308 
309 protected:
316  virtual PoolPtr poolMaker(isc::asiolink::IOAddress &addr, uint32_t len,
317  int32_t ptype = 0) = 0;
318 
327  int32_t ptype = 0) = 0;
328 };
329 
338 class Pool4Parser : public PoolParser {
339 protected:
347  PoolPtr poolMaker (asiolink::IOAddress &addr, uint32_t len,
348  int32_t ignored);
349 
358  int32_t ignored);
359 };
360 
367 public:
368 
370  virtual ~PoolsListParser() {
371  }
372 
380  virtual void parse(PoolStoragePtr pools,
381  isc::data::ConstElementPtr pools_list) = 0;
382 };
383 
386 public:
387 
395  void parse(PoolStoragePtr pools, data::ConstElementPtr pools_list);
396 };
397 
406 public:
407 
410  explicit RelayInfoParser(const isc::dhcp::Option::Universe& family);
411 
426  void parse(const isc::dhcp::Network::RelayInfoPtr& relay_info,
427  isc::data::ConstElementPtr relay_elem);
428 
439  void addAddress(const std::string& name, const std::string& address_str,
440  isc::data::ConstElementPtr relay_elem,
441  const isc::dhcp::Network::RelayInfoPtr& relay_info);
442 private:
443 
445  Option::Universe family_;
446 };
447 
469 public:
470 
476  explicit SubnetConfigParser(uint16_t family, bool check_iface = true);
477 
479  virtual ~SubnetConfigParser() { }
480 
481 protected:
492 
499  virtual void initSubnet(isc::data::ConstElementPtr params,
500  isc::asiolink::IOAddress addr, uint8_t len) = 0;
501 
502 private:
503 
509  void createSubnet(isc::data::ConstElementPtr data);
510 
511 protected:
512 
514  PoolStoragePtr pools_;
515 
518 
520  uint16_t address_family_;
521 
524 
527 
530 };
531 
539 public:
546  Subnet4ConfigParser(bool check_iface = true);
547 
554 
555 protected:
556 
563  void initSubnet(data::ConstElementPtr params,
564  asiolink::IOAddress addr, uint8_t len);
565 
571  void validateResv(const Subnet4Ptr& subnet, ConstHostPtr host);
572 };
573 
580 public:
581 
586  Subnets4ListConfigParser(bool check_iface = true);
587 
597  size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list);
598 
604  size_t parse(Subnet4Collection& subnets,
605  data::ConstElementPtr subnets_list);
606 
607 protected:
608 
611 };
612 
621 class Pool6Parser : public PoolParser {
622 protected:
631  PoolPtr poolMaker (asiolink::IOAddress &addr, uint32_t len, int32_t ptype);
632 
642  int32_t ptype);
643 };
644 
647 public:
648 
656  void parse(PoolStoragePtr pools, data::ConstElementPtr pools_list);
657 };
658 
677 public:
678 
681  PdPoolParser();
682 
693  void parse(PoolStoragePtr pools, data::ConstElementPtr pd_pool_);
694 
695 private:
696 
698  isc::dhcp::Pool6Ptr pool_;
699 
701  CfgOptionPtr options_;
702 
706  isc::data::ConstElementPtr user_context_;
707 
711  isc::data::ConstElementPtr client_class_;
712 };
713 
720 public:
721 
732  void parse(PoolStoragePtr pools, data::ConstElementPtr pd_pool_list);
733 };
734 
742 public:
743 
750  Subnet6ConfigParser(bool check_iface = true);
751 
758 
759 protected:
767  virtual void duplicate_option_warning(uint32_t code,
768  asiolink::IOAddress& addr);
769 
777  isc::asiolink::IOAddress addr, uint8_t len);
778 
784  void validateResvs(const Subnet6Ptr& subnet, ConstHostPtr host);
785 };
786 
787 
794 public:
795 
800  Subnets6ListConfigParser(bool check_iface = true);
801 
811  size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list);
812 
818  size_t parse(Subnet6Collection& subnets,
819  data::ConstElementPtr subnets_list);
820 
821 protected:
822 
825 };
826 
833 public:
834 
852 
855 
862  // to ElementPtr)
864  static size_t setAllDefaults(isc::data::ConstElementPtr d2_config);
865 
866 private:
867 
876  getProtocol(isc::data::ConstElementPtr scope, const std::string& name);
877 
886  getFormat(isc::data::ConstElementPtr scope, const std::string& name);
887 
896  getMode(isc::data::ConstElementPtr scope, const std::string& name);
897 };
898 
899 } // end of isc::dhcp namespace
900 } // end of isc namespace
901 
902 #endif // DHCP_PARSERS_H
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.
std::pair< std::string, isc::data::ConstElementPtr > ConfigPair
Combination of parameter name and configuration contents.
Definition: dhcp_parsers.h:174
Defines the D2ClientConfig class.
const data::Element::Position & getPosition(const std::string &name, const data::ConstElementPtr parent=data::ConstElementPtr()) const
Returns position of the data element in the configuration string.
Definition: dhcp_parsers.h:108
D2ClientConfigPtr parse(isc::data::ConstElementPtr d2_client_cfg)
Parses a given dhcp-ddns element into D2ClientConfig.
void setParam(const std::string &name, const ValueType &value, const data::Element::Position &position)
Stores the parameter, its value and the position in the store.
Definition: dhcp_parsers.h:68
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.
Definition: cfg_option.h:706
size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list)
parses contents of the list
OptionSpaceContainer< OptionContainer, OptionDescriptor, std::string > OptionStorage
Collection of containers holding option spaces.
Definition: dhcp_parsers.h:39
this class parses a list of DHCP6 subnets
Definition: dhcp_parsers.h:793
static const Position & ZERO_POSITION()
Returns Position object with line_ and pos_ set to 0, and with an empty file name.
Definition: data.h:120
boost::shared_ptr< OptionStorage > OptionStoragePtr
Shared pointer to option storage.
Definition: dhcp_parsers.h:41
this class parses a single subnet
Definition: dhcp_parsers.h:468
ValueType getParam(const std::string &name) const
Returns the data value for the given parameter.
Definition: dhcp_parsers.h:82
Parser for IPv4 pool definitions.
Definition: dhcp_parsers.h:338
virtual ~PoolsListParser()
destructor.
Definition: dhcp_parsers.h:370
boost::shared_ptr< StringStorage > StringStoragePtr
Definition: dhcp_parsers.h:182
boost::shared_ptr< Pool6 > Pool6Ptr
a pointer an IPv6 Pool
Definition: pool.h:312
Specialization of the pool list parser for DHCPv6.
Definition: dhcp_parsers.h:646
static const isc::data::SimpleDefaults D2_CLIENT_CONFIG_DEFAULTS
Defaults for the D2 client configuration.
Definition: dhcp_parsers.h:854
std::vector< SimpleDefault > SimpleDefaults
This specifies all default values in a given scope (e.g. a subnet).
Common configuration parser for shared networks and subnets.
boost::shared_ptr< Network::RelayInfo > RelayInfoPtr
Pointer to the RelayInfo structure.
Definition: network.h:180
boost::shared_ptr< Uint32Storage > Uint32StoragePtr
Definition: dhcp_parsers.h:178
Subnets6ListConfigParser(bool check_iface=true)
constructor
boost::shared_ptr< SrvConfig > SrvConfigPtr
Non-const pointer to the SrvConfig.
Definition: srv_config.h:1036
boost::shared_ptr< Subnet4 > Subnet4Ptr
A pointer to a Subnet4 object.
Definition: subnet.h:522
This class parses a single IPv4 subnet.
Definition: dhcp_parsers.h:538
Universe
defines option universe DHCPv4 or DHCPv6
Definition: option.h:82
CfgOptionPtr options_
Pointer to the options configuration.
Definition: dhcp_parsers.h:526
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.
Definition: ncr_msg.h:60
void clear()
Deletes all of the entries from the store.
Definition: dhcp_parsers.h:155
this class parses list of DHCP4 subnets
Definition: dhcp_parsers.h:579
virtual void parse(PoolStoragePtr pools, isc::data::ConstElementPtr pools_list)=0
parses the actual structure
boost::shared_ptr< CfgOptionDef > CfgOptionDefPtr
Non-const pointer.
virtual ~SubnetConfigParser()
virtual destructor (does nothing)
Definition: dhcp_parsers.h:479
boost::shared_ptr< Pool > PoolPtr
a pointer to either IPv4 or IPv6 Pool
Definition: pool.h:505
OptionDefinitionPtr parse(isc::data::ConstElementPtr option_def)
Parses an entry that describes single option definition.
Parser for D2ClientConfig.
Definition: dhcp_parsers.h:832
ValueStorage< bool > BooleanStorage
Storage for parsed boolean values.
Definition: dhcp_parsers.h:185
PdPoolParser()
Constructor.
Specialization of the pool list parser for DHCPv4.
Definition: dhcp_parsers.h:385
PoolStoragePtr pools_
Storage for pools belonging to this subnet.
Definition: dhcp_parsers.h:514
Parser for IPv6 prefix delegation definitions.
Definition: dhcp_parsers.h:676
parser for MAC/hardware acquisition sources
Definition: dhcp_parsers.h:194
OptionDefListParser(const uint16_t address_family)
Constructor.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
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.
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.
Definition: subnet.h:867
Wrapper class that holds MAC/hardware address sources.
parser for additional relay information
Definition: dhcp_parsers.h:405
To be removed. Please use ConfigError instead.
Parser for a single option definition.
Definition: dhcp_parsers.h:227
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.
parser for a single pool definition
Definition: dhcp_parsers.h:289
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:23
boost::shared_ptr< const Host > ConstHostPtr
Const pointer to the Host object.
Definition: host.h:788
Parser for a list of option definitions.
Definition: dhcp_parsers.h:253
void parse(CfgMACSource &mac_sources, isc::data::ConstElementPtr value)
parses parameters value
Definition: dhcp_parsers.cc:45
void initSubnet(data::ConstElementPtr params, asiolink::IOAddress addr, uint8_t len)
Instantiates the IPv4 Subnet based on a given IPv4 address and prefix length.
A template class that stores named elements of a given data type.
Definition: dhcp_parsers.h:55
size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list)
parses contents of the list
Represents the position of the data element within a configuration string.
Definition: data.h:88
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.
Definition: subnet.h:914
Specifies current DHCP configuration.
Definition: srv_config.h:167
SubnetConfigParser(uint16_t family, bool check_iface=true)
constructor
Defines the logger used by the top-level component of kea-dhcp-ddns.
void parse(SrvConfig &srv_cfg, isc::data::ConstElementPtr value)
"Parses" control-socket structure
Definition: dhcp_parsers.cc:76
bool check_iface_
Check if the specified interface exists in the system.
Definition: dhcp_parsers.h:824
Parser for a list of prefix delegation pools.
Definition: dhcp_parsers.h:719
Parser for IPv6 pool definitions.
Definition: dhcp_parsers.h:621
ReplaceClientNameMode
Defines the client name replacement modes.
Definition: d2_client_cfg.h:75
uint16_t address_family_
Address family: AF_INET or AF_INET6.
Definition: dhcp_parsers.h:520
PoolPtr poolMaker(asiolink::IOAddress &addr, uint32_t len, int32_t ignored)
Creates a Pool4 object given a IPv4 prefix and the prefix length.
Parser for a list of pools.
Definition: dhcp_parsers.h:366
SubnetPtr parse(isc::data::ConstElementPtr subnet)
parses a subnet description and returns Subnet{4,6} structure
void delParam(const std::string &name)
Remove the parameter from the store.
Definition: dhcp_parsers.h:148
bool check_iface_
Check if the specified interface exists in the system.
Definition: dhcp_parsers.h:610
OptionDefParser(const uint16_t address_family)
Constructor.
Subnet6Ptr parse(data::ConstElementPtr subnet)
Parses a single IPv6 subnet configuration and adds to the Configuration Manager.
boost::multi_index_container< OptionDescriptor, boost::multi_index::indexed_by< boost::multi_index::sequenced<>, boost::multi_index::hashed_non_unique< KeyFromKeyExtractor< boost::multi_index::const_mem_fun< Option, uint16_t,&Option::getType >, boost::multi_index::member< OptionDescriptor, OptionPtr,&OptionDescriptor::option_ > > >, boost::multi_index::hashed_non_unique< boost::multi_index::member< OptionDescriptor, bool,&OptionDescriptor::persistent_ > >, boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime,&data::BaseStampedElement::getModificationTime > >, boost::multi_index::hashed_non_unique< boost::multi_index::tag< OptionIdIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, uint64_t,&data::BaseStampedElement::getId > > >> OptionContainer
Multi index container for DHCP option descriptors.
Definition: cfg_option.h:269
void parse(const isc::dhcp::Network::RelayInfoPtr &relay_info, isc::data::ConstElementPtr relay_elem)
parses the actual relay parameters
isc::dhcp::SubnetPtr subnet_
Pointer to the created subnet object.
Definition: dhcp_parsers.h:517
PoolPtr poolMaker(asiolink::IOAddress &addr, uint32_t len, int32_t ptype)
Creates a Pool6 object given a IPv6 prefix and the prefix length.
ValueStorage< std::string > StringStorage
a collection of elements that store string values
Definition: dhcp_parsers.h:181
isc::dhcp::Network::RelayInfoPtr relay_info_
Pointer to relay information.
Definition: dhcp_parsers.h:523
void parse(PoolStoragePtr pools, data::ConstElementPtr pools_list)
parses the actual structure
virtual ~PoolParser()
destructor.
Definition: dhcp_parsers.h:293
NameChangeProtocol
Defines the list of socket protocols supported.
Definition: ncr_io.h:68
This class parses a single IPv6 subnet.
Definition: dhcp_parsers.h:741
boost::shared_ptr< PoolStorage > PoolStoragePtr
Definition: dhcp_parsers.h:280
ValueStorage< uint32_t > Uint32Storage
a collection of elements that store uint32 values
Definition: dhcp_parsers.h:177
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.
Subnet4ConfigParser(bool check_iface=true)
Constructor.
boost::shared_ptr< Subnet6 > Subnet6Ptr
A pointer to a Subnet6 object.
Definition: subnet.h:670
void parse(CfgOptionDefPtr cfg, isc::data::ConstElementPtr def_list)
Parses a list of option definitions, create them and store in cfg.
Parser for the control-socket structure.
Definition: dhcp_parsers.h:210
virtual void parse(PoolStoragePtr pools, isc::data::ConstElementPtr pool_structure, const uint16_t address_family)
parses the actual structure
Subnet6ConfigParser(bool check_iface=true)
Constructor.
boost::shared_ptr< D2ClientConfig > D2ClientConfigPtr
Defines a pointer for D2ClientConfig instances.
bool check_iface_
Check if the specified interface exists in the system.
Definition: dhcp_parsers.h:529
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.
boost::shared_ptr< BooleanStorage > BooleanStoragePtr
Definition: dhcp_parsers.h:186
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
Definition: dhcp_parsers.h:279
boost::shared_ptr< Subnet > SubnetPtr
A generic pointer to either Subnet4 or Subnet6 object.
Definition: subnet.h:513
RelayInfoParser(const isc::dhcp::Option::Universe &family)
constructor
void parse(PoolStoragePtr pools, data::ConstElementPtr pools_list)
parses the actual structure
ValueType getOptionalParam(const std::string &name, const ValueType &default_value) const
Returns the data value for an optional parameter.
Definition: dhcp_parsers.h:130