Kea 2.7.5
option_definition.h
Go to the documentation of this file.
1// Copyright (C) 2012-2024 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
444 uint16_t type,
447 bool convenient_notation = false) const;
448
466 const OptionBuffer& buf = OptionBuffer()) const;
467
493 const std::vector<std::string>& values) const;
494
505 static OptionPtr factoryAddrList4(uint16_t type,
508
519 static OptionPtr factoryAddrList6(uint16_t type,
522
527 static OptionPtr factoryEmpty(Option::Universe u, uint16_t type);
528
535 static OptionPtr factoryGeneric(Option::Universe u, uint16_t type,
538
547 static OptionPtr factoryIA6(uint16_t type,
550
559 static OptionPtr factoryIAAddr6(uint16_t type,
562
571 static OptionPtr factoryIAPrefix6(uint16_t type,
574
586 uint16_t type,
589
603 uint16_t type,
606 OpaqueDataTuple::LengthFieldType length_field_type);
607
620 template<typename T>
622 const std::string& encapsulated_space,
625 OptionPtr option(new OptionInt<T>(u, type, 0));
626 option->setEncapsulatedSpace(encapsulated_space);
627 option->unpack(begin, end);
628 return (option);
629 }
630
640 template<typename T>
642 uint16_t type,
645 OptionPtr option(new OptionIntArray<T>(u, type, begin, end));
646 return (option);
647 }
648
649private:
650
652 bool haveCompressedFqdnListFormat() const;
653
663 OptionPtr factoryFqdnList(Option::Universe u,
665 OptionBufferConstIter end) const;
666
687 OptionPtr factorySpecialFormatOption(Option::Universe u,
690 bool convenient_notation = false) const;
691
695 inline bool haveType(const OptionDataType type) const {
696 return (type == type_);
697 }
698
702 inline bool haveSpace(const std::string& space) const {
703 return (space == option_space_name_);
704 }
705
724 bool convertToBool(const std::string& value_str) const;
725
738 template<typename T>
739 T lexicalCastWithRangeCheck(const std::string& value_str) const;
740
757 void writeToBuffer(Option::Universe u, const std::string& value,
758 const OptionDataType type, OptionBuffer& buf) const;
759
761 std::string name_;
763 uint16_t code_;
765 OptionDataType type_;
767 bool array_type_;
769 std::string encapsulated_space_;
771 RecordFieldsCollection record_fields_;
773 data::UserContext user_context_;
775 std::string option_space_name_;
776};
777
778
793typedef boost::multi_index_container<
794 // Container comprises elements of OptionDefinition type.
796 // Here we start enumerating various indexes.
797 boost::multi_index::indexed_by<
798 // Sequenced index allows accessing elements in the same way
799 // as elements in std::list. Sequenced is an index #0.
800 boost::multi_index::sequenced<>,
801 // Start definition of index #1.
802 boost::multi_index::hashed_non_unique<
803 // Use option type as the index key. The type is held
804 // in OptionDefinition object so we have to call
805 // OptionDefinition::getCode to retrieve this key
806 // for each element. The option code is non-unique so
807 // multiple elements with the same option code can
808 // be returned by this index.
809 boost::multi_index::const_mem_fun<
810 OptionDefinition,
811 uint16_t,
813 >
814 >,
815 // Start definition of index #2
816 boost::multi_index::hashed_non_unique<
817 // Use option name as the index key. This value is
818 // returned by the @c OptionDefinition::getName
819 // method.
820 boost::multi_index::const_mem_fun<
821 OptionDefinition,
822 std::string,
824 >
825 >,
826 // Start definition of index #3
827 boost::multi_index::ordered_non_unique<
828 // Use option definition modification time as the index key.
829 // This value is returned by the BaseStampedElement::getModificationTime
830 boost::multi_index::const_mem_fun<
831 data::BaseStampedElement,
832 boost::posix_time::ptime,
834 >
835 >,
836 // Start definition of index #4.
837 // Use StampedElement::getId as a key.
838 boost::multi_index::hashed_non_unique<
839 boost::multi_index::tag<OptionIdIndexTag>,
840 boost::multi_index::const_mem_fun<data::BaseStampedElement, uint64_t,
842 >
843 >
845
847typedef boost::shared_ptr<OptionDefContainer> OptionDefContainerPtr;
848
850typedef std::map<std::string, OptionDefContainerPtr> OptionDefContainers;
851
853typedef std::map<uint32_t, OptionDefContainerPtr> VendorOptionDefContainers;
854
856typedef OptionDefContainer::nth_index<1>::type OptionDefContainerTypeIndex;
861typedef std::pair<OptionDefContainerTypeIndex::const_iterator,
862 OptionDefContainerTypeIndex::const_iterator> OptionDefContainerTypeRange;
863
865typedef OptionDefContainer::nth_index<2>::type OptionDefContainerNameIndex;
870typedef std::pair<OptionDefContainerNameIndex::const_iterator,
871 OptionDefContainerNameIndex::const_iterator> OptionDefContainerNameRange;
872
877
880public:
881
890 void addItem(const OptionDefinitionPtr& def) {
891 BaseOptionDefSpaceContainer::addItem(def, def->getOptionSpaceName());
892 }
893};
894
895} // namespace isc::dhcp
896} // namespace isc
897
898#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.
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.
OptionPtr optionFactory(Option::Universe u, uint16_t type, OptionBufferConstIter begin, OptionBufferConstIter end, bool convenient_notation=false) const
Option factory.
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:90
boost::shared_ptr< const Element > ConstElementPtr
Definition data.h:29
boost::shared_ptr< Element > ElementPtr
Definition data.h:28
OptionBuffer::const_iterator OptionBufferConstIter
const_iterator for walking over OptionBuffer
Definition option.h:30
OptionDataType
Data types of DHCP option fields.
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:37
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.
void contextToElement(data::ElementPtr map) const
Merge unparse a user_context object.
void setContext(const data::ConstElementPtr &ctx)
Sets user context.