Kea  2.5.2
option_definition.h
Go to the documentation of this file.
1 // Copyright (C) 2012-2023 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>
11 #include <dhcp/option_data_types.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 
25 namespace isc {
26 namespace dhcp {
27 
30 class InvalidOptionValue : public Exception {
31 public:
32  InvalidOptionValue(const char* file, size_t line, const char* what) :
33  isc::Exception(file, line, what) { };
34 };
35 
38 public:
39  MalformedOptionDefinition(const char* file, size_t line, const char* what) :
40  isc::Exception(file, line, what) { };
41 };
42 
46 public:
47  DuplicateOptionDefinition(const char* file, size_t line, const char* what) :
48  isc::Exception(file, line, what) { };
49 };
50 
52 class OptionDefinition;
53 
55 typedef boost::shared_ptr<OptionDefinition> OptionDefinitionPtr;
56 
64 template<typename T>
65 class OptionInt;
66 
74 template<typename T>
75 class OptionIntArray;
76 
139 public:
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  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 
439  OptionPtr optionFactory(Option::Universe u, uint16_t type,
440  OptionBufferConstIter begin,
441  OptionBufferConstIter end) const;
442 
459  OptionPtr optionFactory(Option::Universe u, uint16_t type,
460  const OptionBuffer& buf = OptionBuffer()) const;
461 
486  OptionPtr optionFactory(Option::Universe u, uint16_t type,
487  const std::vector<std::string>& values) const;
488 
499  static OptionPtr factoryAddrList4(uint16_t type,
500  OptionBufferConstIter begin,
502 
513  static OptionPtr factoryAddrList6(uint16_t type,
514  OptionBufferConstIter begin,
516 
521  static OptionPtr factoryEmpty(Option::Universe u, uint16_t type);
522 
529  static OptionPtr factoryGeneric(Option::Universe u, uint16_t type,
530  OptionBufferConstIter begin,
532 
541  static OptionPtr factoryIA6(uint16_t type,
542  OptionBufferConstIter begin,
544 
553  static OptionPtr factoryIAAddr6(uint16_t type,
554  OptionBufferConstIter begin,
556 
565  static OptionPtr factoryIAPrefix6(uint16_t type,
566  OptionBufferConstIter begin,
568 
580  uint16_t type,
581  OptionBufferConstIter begin,
583 
597  uint16_t type,
598  OptionBufferConstIter begin,
600  OpaqueDataTuple::LengthFieldType length_field_type);
601 
614  template<typename T>
615  static OptionPtr factoryInteger(Option::Universe u, uint16_t type,
616  const std::string& encapsulated_space,
617  OptionBufferConstIter begin,
618  OptionBufferConstIter end) {
619  OptionPtr option(new OptionInt<T>(u, type, 0));
620  option->setEncapsulatedSpace(encapsulated_space);
621  option->unpack(begin, end);
622  return (option);
623  }
624 
634  template<typename T>
636  uint16_t type,
637  OptionBufferConstIter begin,
638  OptionBufferConstIter end) {
639  OptionPtr option(new OptionIntArray<T>(u, type, begin, end));
640  return (option);
641  }
642 
643 private:
644 
646  bool haveCompressedFqdnListFormat() const;
647 
657  OptionPtr factoryFqdnList(Option::Universe u,
658  OptionBufferConstIter begin,
659  OptionBufferConstIter end) const;
660 
677  OptionPtr factorySpecialFormatOption(Option::Universe u,
678  OptionBufferConstIter begin,
679  OptionBufferConstIter end) const;
680 
684  inline bool haveType(const OptionDataType type) const {
685  return (type == type_);
686  }
687 
691  inline bool haveSpace(const std::string& space) const {
692  return (space == option_space_name_);
693  }
694 
713  bool convertToBool(const std::string& value_str) const;
714 
727  template<typename T>
728  T lexicalCastWithRangeCheck(const std::string& value_str) const;
729 
746  void writeToBuffer(Option::Universe u, const std::string& value,
747  const OptionDataType type, OptionBuffer& buf) const;
748 
750  std::string name_;
752  uint16_t code_;
754  OptionDataType type_;
756  bool array_type_;
758  std::string encapsulated_space_;
760  RecordFieldsCollection record_fields_;
762  data::UserContext user_context_;
764  std::string option_space_name_;
765 };
766 
767 
782 typedef boost::multi_index_container<
783  // Container comprises elements of OptionDefinition type.
785  // Here we start enumerating various indexes.
786  boost::multi_index::indexed_by<
787  // Sequenced index allows accessing elements in the same way
788  // as elements in std::list. Sequenced is an index #0.
789  boost::multi_index::sequenced<>,
790  // Start definition of index #1.
791  boost::multi_index::hashed_non_unique<
792  // Use option type as the index key. The type is held
793  // in OptionDefinition object so we have to call
794  // OptionDefinition::getCode to retrieve this key
795  // for each element. The option code is non-unique so
796  // multiple elements with the same option code can
797  // be returned by this index.
798  boost::multi_index::const_mem_fun<
799  OptionDefinition,
800  uint16_t,
802  >
803  >,
804  // Start definition of index #2
805  boost::multi_index::hashed_non_unique<
806  // Use option name as the index key. This value is
807  // returned by the @c OptionDefinition::getName
808  // method.
809  boost::multi_index::const_mem_fun<
810  OptionDefinition,
811  std::string,
813  >
814  >,
815  // Start definition of index #3
816  boost::multi_index::ordered_non_unique<
817  // Use option definition modification time as the index key.
818  // This value is returned by the BaseStampedElement::getModificationTime
819  boost::multi_index::const_mem_fun<
820  data::BaseStampedElement,
821  boost::posix_time::ptime,
823  >
824  >,
825  // Start definition of index #4.
826  // Use StampedElement::getId as a key.
827  boost::multi_index::hashed_non_unique<
828  boost::multi_index::tag<OptionIdIndexTag>,
829  boost::multi_index::const_mem_fun<data::BaseStampedElement, uint64_t,
831  >
832  >
834 
836 typedef boost::shared_ptr<OptionDefContainer> OptionDefContainerPtr;
837 
839 typedef std::map<std::string, OptionDefContainerPtr> OptionDefContainers;
840 
842 typedef std::map<uint32_t, OptionDefContainerPtr> VendorOptionDefContainers;
843 
845 typedef OptionDefContainer::nth_index<1>::type OptionDefContainerTypeIndex;
850 typedef std::pair<OptionDefContainerTypeIndex::const_iterator,
851  OptionDefContainerTypeIndex::const_iterator> OptionDefContainerTypeRange;
852 
854 typedef OptionDefContainer::nth_index<2>::type OptionDefContainerNameIndex;
859 typedef std::pair<OptionDefContainerNameIndex::const_iterator,
860  OptionDefContainerNameIndex::const_iterator> OptionDefContainerNameRange;
861 
863 typedef OptionSpaceContainer<
866 
869 public:
870 
879  void addItem(const OptionDefinitionPtr& def) {
880  BaseOptionDefSpaceContainer::addItem(def, def->getOptionSpaceName());
881  }
882 };
883 
884 } // namespace isc::dhcp
885 } // namespace isc
886 
887 #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)
LengthFieldType
Size of the length field in the tuple.
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.
const RecordFieldsCollection & getRecordFields() const
Return list of record fields.
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.
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:29
boost::shared_ptr< Element > ElementPtr
Definition: data.h:26
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