Kea 2.2.0
option_definition.h
Go to the documentation of this file.
1// Copyright (C) 2012-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 OPTION_DEFINITION_H
8#define OPTION_DEFINITION_H
9
10#include <dhcp/option.h>
13#include <cc/stamped_element.h>
14#include <cc/user_context.h>
15
16#include <boost/multi_index/hashed_index.hpp>
17#include <boost/multi_index/mem_fun.hpp>
18#include <boost/multi_index/ordered_index.hpp>
19#include <boost/multi_index/sequenced_index.hpp>
20#include <boost/multi_index_container.hpp>
21#include <boost/shared_ptr.hpp>
22#include <map>
23#include <string>
24
25namespace isc {
26namespace dhcp {
27
31public:
32 InvalidOptionValue(const char* file, size_t line, const char* what) :
33 isc::Exception(file, line, what) { };
34};
35
38public:
39 MalformedOptionDefinition(const char* file, size_t line, const char* what) :
40 isc::Exception(file, line, what) { };
41};
42
46public:
47 DuplicateOptionDefinition(const char* file, size_t line, const char* what) :
48 isc::Exception(file, line, what) { };
49};
50
52class OptionDefinition;
53
55typedef boost::shared_ptr<OptionDefinition> OptionDefinitionPtr;
56
64template<typename T>
65class OptionInt;
66
74template<typename T>
75class OptionIntArray;
76
139public:
140
142 typedef std::vector<OptionDataType> RecordFieldsCollection;
144 typedef std::vector<OptionDataType>::const_iterator RecordFieldsConstIter;
145
154 explicit OptionDefinition(const std::string& name,
155 const uint16_t code,
156 const std::string& space,
157 const std::string& type,
158 const bool array_type = false);
159
168 explicit OptionDefinition(const std::string& name,
169 const uint16_t code,
170 const std::string& space,
171 const OptionDataType type,
172 const bool array_type = false);
173
189 explicit OptionDefinition(const std::string& name,
190 const uint16_t code,
191 const std::string& space,
192 const std::string& type,
193 const char* encapsulated_space);
194
210 explicit OptionDefinition(const std::string& name,
211 const uint16_t code,
212 const std::string& space,
213 const OptionDataType type,
214 const char* encapsulated_space);
215
231 static OptionDefinitionPtr create(const std::string& name,
232 const uint16_t code,
233 const std::string& space,
234 const std::string& type,
235 const bool array_type = false);
236
252 static OptionDefinitionPtr create(const std::string& name,
253 const uint16_t code,
254 const std::string& space,
255 const OptionDataType type,
256 const bool array_type = false);
257
273 static OptionDefinitionPtr create(const std::string& name,
274 const uint16_t code,
275 const std::string& space,
276 const std::string& type,
277 const char* encapsulated_space);
278
294 static OptionDefinitionPtr create(const std::string& name,
295 const uint16_t code,
296 const std::string& space,
297 const OptionDataType type,
298 const char* encapsulated_space);
299
302
303
308 bool equals(const OptionDefinition& other) const;
309
315 bool operator==(const OptionDefinition& other) const {
316 return (equals(other));
317 }
318
324 bool operator!=(const OptionDefinition& other) const {
325 return (!equals(other));
326 }
328
335 void addRecordField(const std::string& data_type_name);
336
343 void addRecordField(const OptionDataType data_type);
344
351 bool getArrayType() const { return (array_type_); }
352
356 uint16_t getCode() const { return (code_); }
357
361 std::string getEncapsulatedSpace() const {
362 return (encapsulated_space_);
363 }
364
368 std::string getName() const { return (name_); }
369
374 return (record_fields_);
375 }
376
380 std::string getOptionSpaceName() const {
381 return (option_space_name_);
382 }
383
387 OptionDataType getType() const { return (type_); };
388
391 return (user_context_.getContext());
392 }
393
397 user_context_.setContext(ctx);
398 }
399
407 user_context_.contextToElement(map);
408 }
409
420 void validate() const;
421
441 OptionBufferConstIter end) const;
442
460 const OptionBuffer& buf = OptionBuffer()) const;
461
487 const std::vector<std::string>& values) const;
488
499 static OptionPtr factoryAddrList4(uint16_t type,
502
513 static OptionPtr factoryAddrList6(uint16_t type,
516
521 static OptionPtr factoryEmpty(Option::Universe u, uint16_t type);
522
529 static OptionPtr factoryGeneric(Option::Universe u, uint16_t type,
532
541 static OptionPtr factoryIA6(uint16_t type,
544
553 static OptionPtr factoryIAAddr6(uint16_t type,
556
565 static OptionPtr factoryIAPrefix6(uint16_t type,
568
580 uint16_t type,
583
596 template<typename T>
598 const std::string& encapsulated_space,
601 OptionPtr option(new OptionInt<T>(u, type, 0));
602 option->setEncapsulatedSpace(encapsulated_space);
603 option->unpack(begin, end);
604 return (option);
605 }
606
616 template<typename T>
618 uint16_t type,
621 OptionPtr option(new OptionIntArray<T>(u, type, begin, end));
622 return (option);
623 }
624
625private:
626
628 bool haveCompressedFqdnListFormat() const;
629
639 OptionPtr factoryFqdnList(Option::Universe u,
641 OptionBufferConstIter end) const;
642
659 OptionPtr factorySpecialFormatOption(Option::Universe u,
661 OptionBufferConstIter end) const;
662
666 inline bool haveType(const OptionDataType type) const {
667 return (type == type_);
668 }
669
673 inline bool haveSpace(const std::string& space) const {
674 return (space == option_space_name_);
675 }
676
695 bool convertToBool(const std::string& value_str) const;
696
709 template<typename T>
710 T lexicalCastWithRangeCheck(const std::string& value_str) const;
711
728 void writeToBuffer(Option::Universe u, const std::string& value,
729 const OptionDataType type, OptionBuffer& buf) const;
730
732 std::string name_;
734 uint16_t code_;
736 OptionDataType type_;
738 bool array_type_;
740 std::string encapsulated_space_;
742 RecordFieldsCollection record_fields_;
744 data::UserContext user_context_;
746 std::string option_space_name_;
747};
748
749
764typedef boost::multi_index_container<
765 // Container comprises elements of OptionDefinition type.
767 // Here we start enumerating various indexes.
768 boost::multi_index::indexed_by<
769 // Sequenced index allows accessing elements in the same way
770 // as elements in std::list. Sequenced is an index #0.
771 boost::multi_index::sequenced<>,
772 // Start definition of index #1.
773 boost::multi_index::hashed_non_unique<
774 // Use option type as the index key. The type is held
775 // in OptionDefinition object so we have to call
776 // OptionDefinition::getCode to retrieve this key
777 // for each element. The option code is non-unique so
778 // multiple elements with the same option code can
779 // be returned by this index.
780 boost::multi_index::const_mem_fun<
781 OptionDefinition,
782 uint16_t,
784 >
785 >,
786 // Start definition of index #2
787 boost::multi_index::hashed_non_unique<
788 // Use option name as the index key. This value is
789 // returned by the @c OptionDefinition::getName
790 // method.
791 boost::multi_index::const_mem_fun<
792 OptionDefinition,
793 std::string,
795 >
796 >,
797 // Start definition of index #3
798 boost::multi_index::ordered_non_unique<
799 // Use option definition modification time as the index key.
800 // This value is returned by the BaseStampedElement::getModificationTime
801 boost::multi_index::const_mem_fun<
802 data::BaseStampedElement,
803 boost::posix_time::ptime,
805 >
806 >,
807 // Start definition of index #4.
808 // Use StampedElement::getId as a key.
809 boost::multi_index::hashed_non_unique<
810 boost::multi_index::tag<OptionIdIndexTag>,
811 boost::multi_index::const_mem_fun<data::BaseStampedElement, uint64_t,
813 >
814 >
816
818typedef boost::shared_ptr<OptionDefContainer> OptionDefContainerPtr;
819
821typedef std::map<std::string, OptionDefContainerPtr> OptionDefContainers;
822
824typedef std::map<uint32_t, OptionDefContainerPtr> VendorOptionDefContainers;
825
827typedef OptionDefContainer::nth_index<1>::type OptionDefContainerTypeIndex;
832typedef std::pair<OptionDefContainerTypeIndex::const_iterator,
833 OptionDefContainerTypeIndex::const_iterator> OptionDefContainerTypeRange;
834
836typedef OptionDefContainer::nth_index<2>::type OptionDefContainerNameIndex;
841typedef std::pair<OptionDefContainerNameIndex::const_iterator,
842 OptionDefContainerNameIndex::const_iterator> OptionDefContainerNameRange;
843
848
851public:
852
861 void addItem(const OptionDefinitionPtr& def) {
862 BaseOptionDefSpaceContainer::addItem(def, def->getOptionSpaceName());
863 }
864};
865
866} // namespace isc::dhcp
867} // namespace isc
868
869#endif // OPTION_DEFINITION_H
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
boost::posix_time::ptime getModificationTime() const
Returns timestamp.
uint64_t getId() const
Returns element's database identifier.
This class represents configuration element which is associated with database identifier,...
Exception to be thrown when the particular option definition duplicates existing option definition.
DuplicateOptionDefinition(const char *file, size_t line, const char *what)
Exception to be thrown when invalid option value has been specified for a particular option definitio...
InvalidOptionValue(const char *file, size_t line, const char *what)
Exception to be thrown when option definition is invalid.
MalformedOptionDefinition(const char *file, size_t line, const char *what)
Class of option definition space container.
void addItem(const OptionDefinitionPtr &def)
Adds a new option definition to the container.
Base class representing a DHCP option definition.
uint16_t getCode() const
Return option code.
bool operator==(const OptionDefinition &other) const
Equality operator.
OptionPtr optionFactory(Option::Universe u, uint16_t type, OptionBufferConstIter begin, OptionBufferConstIter end) const
Option factory.
static OptionPtr factoryEmpty(Option::Universe u, uint16_t type)
Empty option factory.
static OptionPtr factoryInteger(Option::Universe u, uint16_t type, const std::string &encapsulated_space, OptionBufferConstIter begin, OptionBufferConstIter end)
Factory function to create option with integer value.
static OptionPtr factoryIAPrefix6(uint16_t type, OptionBufferConstIter begin, OptionBufferConstIter end)
Factory for IAPREFIX-type of option.
static OptionPtr factoryIntegerArray(Option::Universe u, uint16_t type, OptionBufferConstIter begin, OptionBufferConstIter end)
Factory function to create option with array of integer values.
OptionDefinition(const std::string &name, const uint16_t code, const std::string &space, const std::string &type, const bool array_type=false)
Constructor.
bool operator!=(const OptionDefinition &other) const
Inequality operator.
OptionDataType getType() const
Return option data type.
static OptionPtr factoryAddrList6(uint16_t type, OptionBufferConstIter begin, OptionBufferConstIter end)
Factory to create option with address list.
static OptionPtr factoryAddrList4(uint16_t type, OptionBufferConstIter begin, OptionBufferConstIter end)
Factory to create option with address list.
void setContext(const data::ConstElementPtr &ctx)
Sets user context.
std::string getOptionSpaceName() const
Returns option space name.
std::vector< OptionDataType >::const_iterator RecordFieldsConstIter
Const iterator for record data fields.
static OptionPtr factoryIAAddr6(uint16_t type, OptionBufferConstIter begin, OptionBufferConstIter end)
Factory for IAADDR-type of option.
data::ConstElementPtr getContext() const
Returns const pointer to the user context.
void addRecordField(const std::string &data_type_name)
Adds data field to the record.
bool equals(const OptionDefinition &other) const
Check if option definition is equal to other.
void contextToElement(data::ElementPtr map) const
Merge unparse a user_context object.
std::string getName() const
Return option name.
const RecordFieldsCollection & getRecordFields() const
Return list of record fields.
void validate() const
Check if the option definition is valid.
std::vector< OptionDataType > RecordFieldsCollection
List of fields within the record.
static OptionPtr factoryIA6(uint16_t type, OptionBufferConstIter begin, OptionBufferConstIter end)
Factory for IA-type of option.
std::string getEncapsulatedSpace() const
Return name of the encapsulated option space.
static OptionDefinitionPtr create(const std::string &name, const uint16_t code, const std::string &space, const std::string &type, const bool array_type=false)
Factory function creating an instance of the OptionDefinition.
static OptionPtr factoryOpaqueDataTuples(Option::Universe u, uint16_t type, OptionBufferConstIter begin, OptionBufferConstIter end)
Factory to create option with tuple list.
bool getArrayType() const
Return array type indicator.
static OptionPtr factoryGeneric(Option::Universe u, uint16_t type, OptionBufferConstIter begin, OptionBufferConstIter end)
Factory to create generic option.
Forward declaration to OptionIntArray.
Forward declaration to OptionInt.
Definition: option_int.h:49
Simple container for option spaces holding various items.
void addItem(const ItemType &item, const Selector &option_space)
Adds a new item to the option_space.
Universe
defines option universe DHCPv4 or DHCPv6
Definition: option.h:83
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:27
boost::shared_ptr< Element > ElementPtr
Definition: data.h:24
OptionDataType
Data types of DHCP option fields.
OptionBuffer::const_iterator OptionBufferConstIter
const_iterator for walking over OptionBuffer
Definition: option.h:30
OptionSpaceContainer< OptionDefContainer, OptionDefinitionPtr, std::string > BaseOptionDefSpaceContainer
Base type of option definition space container.
std::map< uint32_t, OptionDefContainerPtr > VendorOptionDefContainers
Container that holds various vendor option containers.
boost::shared_ptr< OptionDefinition > OptionDefinitionPtr
Pointer to option definition object.
std::pair< OptionDefContainerNameIndex::const_iterator, OptionDefContainerNameIndex::const_iterator > OptionDefContainerNameRange
Pair of iterators to represent the range of options definitions having the same option name.
std::map< std::string, OptionDefContainerPtr > OptionDefContainers
Container that holds option definitions for various option spaces.
OptionDefContainer::nth_index< 2 >::type OptionDefContainerNameIndex
Type of the index #2 - option name.
std::vector< uint8_t > OptionBuffer
buffer types used in DHCP code.
Definition: option.h:24
std::pair< OptionDefContainerTypeIndex::const_iterator, OptionDefContainerTypeIndex::const_iterator > OptionDefContainerTypeRange
Pair of iterators to represent the range of options definitions having the same option type value.
boost::multi_index_container< OptionDefinitionPtr, boost::multi_index::indexed_by< boost::multi_index::sequenced<>, boost::multi_index::hashed_non_unique< boost::multi_index::const_mem_fun< OptionDefinition, uint16_t, &OptionDefinition::getCode > >, boost::multi_index::hashed_non_unique< boost::multi_index::const_mem_fun< OptionDefinition, std::string, &OptionDefinition::getName > >, boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime, &data::StampedElement::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 > > > > OptionDefContainer
Multi index container for DHCP option definitions.
OptionDefContainer::nth_index< 1 >::type OptionDefContainerTypeIndex
Type of the index #1 - option type.
boost::shared_ptr< Option > OptionPtr
Definition: option.h:36
boost::shared_ptr< OptionDefContainer > OptionDefContainerPtr
Pointer to an option definition container.
Defines the logger used by the top-level component of kea-lfc.
data::ConstElementPtr getContext() const
Returns const pointer to the user context.
Definition: user_context.h:24
void contextToElement(data::ElementPtr map) const
Merge unparse a user_context object.
Definition: user_context.cc:15
void setContext(const data::ConstElementPtr &ctx)
Sets user context.
Definition: user_context.h:30