Kea 1.9.11
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>
15#include <dhcpsrv/cfg_iface.h>
16#include <dhcpsrv/cfg_option.h>
17#include <dhcpsrv/network.h>
18#include <dhcpsrv/subnet.h>
21#include <dhcpsrv/srv_config.h>
23#include <cc/simple_parser.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
33namespace isc {
34namespace dhcp {
35
38typedef OptionSpaceContainer<OptionContainer, OptionDescriptor,
39 std::string> OptionStorage;
41typedef boost::shared_ptr<OptionStorage> OptionStoragePtr;
42
54template<typename ValueType>
56public:
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
160private:
162 std::map<std::string, ValueType> values_;
163
169 std::map<std::string, data::Element::Position> positions_;
170
171};
172
174typedef std::pair<std::string, isc::data::ConstElementPtr> ConfigPair;
175
178typedef boost::shared_ptr<Uint32Storage> Uint32StoragePtr;
179
182typedef boost::shared_ptr<StringStorage> StringStoragePtr;
183
186typedef boost::shared_ptr<BooleanStorage> BooleanStoragePtr;
187
195public:
203 void parse(CfgMACSource& mac_sources, isc::data::ConstElementPtr value);
204};
205
211public:
221 void parse(SrvConfig& srv_cfg, isc::data::ConstElementPtr value);
222};
223
228public:
232 OptionDefParser(const uint16_t address_family);
233
241
242private:
244 uint16_t address_family_;
245};
246
254public:
258 OptionDefListParser(const uint16_t address_family);
259
269
270private:
272 uint16_t address_family_;
273};
274
279typedef std::vector<PoolPtr> PoolStorage;
280typedef boost::shared_ptr<PoolStorage> PoolStoragePtr;
281
290public:
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
309protected:
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
338class Pool4Parser : public PoolParser {
339protected:
347 PoolPtr poolMaker (asiolink::IOAddress &addr, uint32_t len,
348 int32_t ignored);
349
358 int32_t ignored);
359};
360
367public:
368
371 }
372
380 virtual void parse(PoolStoragePtr pools,
381 isc::data::ConstElementPtr pools_list) = 0;
382};
383
386public:
387
395 void parse(PoolStoragePtr pools, data::ConstElementPtr pools_list);
396};
397
406public:
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,
441 const isc::dhcp::Network::RelayInfoPtr& relay_info);
442private:
443
445 Option::Universe family_;
446};
447
469public:
470
476 explicit SubnetConfigParser(uint16_t family, bool check_iface = true);
477
480
481protected:
492
500 isc::asiolink::IOAddress addr, uint8_t len) = 0;
501
502private:
503
509 void createSubnet(isc::data::ConstElementPtr data);
510
511protected:
512
515
518
521
524
527
530};
531
539public:
546 Subnet4ConfigParser(bool check_iface = true);
547
554
555protected:
556
564 asiolink::IOAddress addr, uint8_t len);
565
571 void validateResv(const Subnet4Ptr& subnet, ConstHostPtr host);
572};
573
580public:
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
607protected:
608
611};
612
621class Pool6Parser : public PoolParser {
622protected:
631 PoolPtr poolMaker (asiolink::IOAddress &addr, uint32_t len, int32_t ptype);
632
642 int32_t ptype);
643};
644
647public:
648
656 void parse(PoolStoragePtr pools, data::ConstElementPtr pools_list);
657};
658
677public:
678
681 PdPoolParser();
682
693 void parse(PoolStoragePtr pools, data::ConstElementPtr pd_pool_);
694
695private:
696
699
701 CfgOptionPtr options_;
702
706 isc::data::ConstElementPtr user_context_;
707
711 isc::data::ConstElementPtr client_class_;
712};
713
720public:
721
732 void parse(PoolStoragePtr pools, data::ConstElementPtr pd_pool_list);
733};
734
742public:
743
750 Subnet6ConfigParser(bool check_iface = true);
751
758
759protected:
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
794public:
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
821protected:
822
825};
826
833public:
834
852
855
862 // to ElementPtr)
864 static size_t setAllDefaults(isc::data::ConstElementPtr d2_config);
865
866private:
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
static const Position & ZERO_POSITION()
Returns Position object with line_ and pos_ set to 0, and with an empty file name.
Definition: data.h:124
Common configuration parser for shared networks and subnets.
Wrapper class that holds MAC/hardware address sources.
Parser for the control-socket structure.
Definition: dhcp_parsers.h:210
void parse(SrvConfig &srv_cfg, isc::data::ConstElementPtr value)
"Parses" control-socket structure
Definition: dhcp_parsers.cc:76
Parser for D2ClientConfig.
Definition: dhcp_parsers.h:832
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.
Definition: dhcp_parsers.h:854
static size_t setAllDefaults(isc::data::ConstElementPtr d2_config)
Sets all defaults for D2 client configuration.
ReplaceClientNameMode
Defines the client name replacement modes.
Definition: d2_client_cfg.h:75
To be removed. Please use ConfigError instead.
parser for MAC/hardware acquisition sources
Definition: dhcp_parsers.h:194
void parse(CfgMACSource &mac_sources, isc::data::ConstElementPtr value)
parses parameters value
Definition: dhcp_parsers.cc:45
boost::shared_ptr< Network::RelayInfo > RelayInfoPtr
Pointer to the RelayInfo structure.
Definition: network.h:180
Parser for a list of option definitions.
Definition: dhcp_parsers.h:253
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.
Definition: dhcp_parsers.h:227
OptionDefinitionPtr parse(isc::data::ConstElementPtr option_def)
Parses an entry that describes single option definition.
OptionDefParser(const uint16_t address_family)
Constructor.
Universe
defines option universe DHCPv4 or DHCPv6
Definition: option.h:82
Parser for IPv6 prefix delegation definitions.
Definition: dhcp_parsers.h:676
PdPoolParser()
Constructor.
void parse(PoolStoragePtr pools, data::ConstElementPtr pd_pool_)
Builds a prefix delegation pool from the given configuration.
Parser for a list of prefix delegation pools.
Definition: dhcp_parsers.h:719
void parse(PoolStoragePtr pools, data::ConstElementPtr pd_pool_list)
Parse configuration entries.
Parser for IPv4 pool definitions.
Definition: dhcp_parsers.h:338
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 IPv6 pool definitions.
Definition: dhcp_parsers.h:621
PoolPtr poolMaker(asiolink::IOAddress &addr, uint32_t len, int32_t ptype)
Creates a Pool6 object given a IPv6 prefix and the prefix length.
parser for a single pool definition
Definition: dhcp_parsers.h:289
virtual void parse(PoolStoragePtr pools, isc::data::ConstElementPtr pool_structure, const uint16_t address_family)
parses the actual structure
virtual PoolPtr poolMaker(isc::asiolink::IOAddress &min, isc::asiolink::IOAddress &max, int32_t ptype=0)=0
Creates a Pool object given starting and ending IP addresses.
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 ~PoolParser()
destructor.
Definition: dhcp_parsers.h:293
Specialization of the pool list parser for DHCPv4.
Definition: dhcp_parsers.h:385
void parse(PoolStoragePtr pools, data::ConstElementPtr pools_list)
parses the actual structure
Specialization of the pool list parser for DHCPv6.
Definition: dhcp_parsers.h:646
void parse(PoolStoragePtr pools, data::ConstElementPtr pools_list)
parses the actual structure
Parser for a list of pools.
Definition: dhcp_parsers.h:366
virtual void parse(PoolStoragePtr pools, isc::data::ConstElementPtr pools_list)=0
parses the actual structure
virtual ~PoolsListParser()
destructor.
Definition: dhcp_parsers.h:370
parser for additional relay information
Definition: dhcp_parsers.h:405
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
Specifies current DHCP configuration.
Definition: srv_config.h:167
Subnet4ConfigParser(bool check_iface=true)
Constructor.
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)
Parses a single IPv4 subnet configuration and adds to the Configuration Manager.
virtual void duplicate_option_warning(uint32_t code, asiolink::IOAddress &addr)
Issues a DHCP6 server specific warning regarding duplicate subnet options.
Subnet6Ptr parse(data::ConstElementPtr subnet)
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.
void validateResvs(const Subnet6Ptr &subnet, ConstHostPtr host)
Verifies host reservation addresses are in the subnet range.
Subnet6ConfigParser(bool check_iface=true)
Constructor.
this class parses a single subnet
Definition: dhcp_parsers.h:468
SubnetConfigParser(uint16_t family, bool check_iface=true)
constructor
isc::dhcp::SubnetPtr subnet_
Pointer to the created subnet object.
Definition: dhcp_parsers.h:517
CfgOptionPtr options_
Pointer to the options configuration.
Definition: dhcp_parsers.h:526
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.
SubnetPtr parse(isc::data::ConstElementPtr subnet)
parses a subnet description and returns Subnet{4,6} structure
isc::dhcp::Network::RelayInfoPtr relay_info_
Pointer to relay information.
Definition: dhcp_parsers.h:523
virtual ~SubnetConfigParser()
virtual destructor (does nothing)
Definition: dhcp_parsers.h:479
uint16_t address_family_
Address family: AF_INET or AF_INET6.
Definition: dhcp_parsers.h:520
bool check_iface_
Check if the specified interface exists in the system.
Definition: dhcp_parsers.h:529
PoolStoragePtr pools_
Storage for pools belonging to this subnet.
Definition: dhcp_parsers.h:514
this class parses list of DHCP4 subnets
Definition: dhcp_parsers.h:579
bool check_iface_
Check if the specified interface exists in the system.
Definition: dhcp_parsers.h:610
Subnets4ListConfigParser(bool check_iface=true)
constructor
size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list)
parses contents of the list
this class parses a list of DHCP6 subnets
Definition: dhcp_parsers.h:793
Subnets6ListConfigParser(bool check_iface=true)
constructor
size_t parse(SrvConfigPtr cfg, data::ConstElementPtr subnets_list)
parses contents of the list
bool check_iface_
Check if the specified interface exists in the system.
Definition: dhcp_parsers.h:824
A template class that stores named elements of a given data type.
Definition: dhcp_parsers.h:55
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
ValueType getParam(const std::string &name) const
Returns the data value for the given parameter.
Definition: dhcp_parsers.h:82
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
ValueType getOptionalParam(const std::string &name, const ValueType &default_value) const
Returns the data value for an optional parameter.
Definition: dhcp_parsers.h:130
void delParam(const std::string &name)
Remove the parameter from the store.
Definition: dhcp_parsers.h:148
void clear()
Deletes all of the entries from the store.
Definition: dhcp_parsers.h:155
Defines the D2ClientConfig class.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:27
std::vector< SimpleDefault > SimpleDefaults
This specifies all default values in a given scope (e.g. a subnet).
NameChangeFormat
Defines the list of data wire formats supported.
Definition: ncr_msg.h:60
NameChangeProtocol
Defines the list of socket protocols supported.
Definition: ncr_io.h:68
std::pair< std::string, isc::data::ConstElementPtr > ConfigPair
Combination of parameter name and configuration contents.
Definition: dhcp_parsers.h:174
boost::shared_ptr< Subnet > SubnetPtr
A generic pointer to either Subnet4 or Subnet6 object.
Definition: subnet.h:513
boost::shared_ptr< Subnet4 > Subnet4Ptr
A pointer to a Subnet4 object.
Definition: subnet.h:522
std::vector< PoolPtr > PoolStorage
a collection of pools
Definition: dhcp_parsers.h:279
boost::shared_ptr< StringStorage > StringStoragePtr
Definition: dhcp_parsers.h:182
boost::shared_ptr< D2ClientConfig > D2ClientConfigPtr
Defines a pointer for D2ClientConfig instances.
boost::shared_ptr< CfgOption > CfgOptionPtr
Non-const pointer.
Definition: cfg_option.h:706
boost::shared_ptr< CfgOptionDef > CfgOptionDefPtr
Non-const pointer.
boost::shared_ptr< Subnet6 > Subnet6Ptr
A pointer to a Subnet6 object.
Definition: subnet.h:670
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
boost::shared_ptr< BooleanStorage > BooleanStoragePtr
Definition: dhcp_parsers.h:186
boost::shared_ptr< SrvConfig > SrvConfigPtr
Non-const pointer to the SrvConfig.
Definition: srv_config.h:1044
boost::shared_ptr< Uint32Storage > Uint32StoragePtr
Definition: dhcp_parsers.h:178
ValueStorage< uint32_t > Uint32Storage
a collection of elements that store uint32 values
Definition: dhcp_parsers.h:177
boost::shared_ptr< OptionDefinition > OptionDefinitionPtr
Pointer to option definition object.
boost::shared_ptr< PoolStorage > PoolStoragePtr
Definition: dhcp_parsers.h:280
boost::shared_ptr< Pool > PoolPtr
a pointer to either IPv4 or IPv6 Pool
Definition: pool.h:505
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
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
boost::shared_ptr< const Host > ConstHostPtr
Const pointer to the Host object.
Definition: host.h:788
ValueStorage< bool > BooleanStorage
Storage for parsed boolean values.
Definition: dhcp_parsers.h:185
ValueStorage< std::string > StringStorage
a collection of elements that store string values
Definition: dhcp_parsers.h:181
OptionSpaceContainer< OptionContainer, OptionDescriptor, std::string > OptionStorage
Collection of containers holding option spaces.
Definition: dhcp_parsers.h:39
boost::shared_ptr< OptionStorage > OptionStoragePtr
Shared pointer to option storage.
Definition: dhcp_parsers.h:41
boost::shared_ptr< Pool6 > Pool6Ptr
a pointer an IPv6 Pool
Definition: pool.h:312
Defines the logger used by the top-level component of kea-lfc.
Represents the position of the data element within a configuration string.
Definition: data.h:92