Kea 3.3.3
option.h
Go to the documentation of this file.
1// Copyright (C) 2011-2026 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_H
8#define OPTION_H
9
10#include <util/buffer.h>
11
12#include <cstdint>
13#include <map>
14#include <string>
15#include <vector>
16
17#include <boost/shared_ptr.hpp>
18
19namespace isc {
20namespace dhcp {
21
25typedef std::vector<uint8_t> OptionBuffer;
26
28typedef OptionBuffer::iterator OptionBufferIter;
29
31typedef OptionBuffer::const_iterator OptionBufferConstIter;
32
34typedef boost::shared_ptr<OptionBuffer> OptionBufferPtr;
35
37class Option;
38typedef boost::shared_ptr<Option> OptionPtr;
39
41typedef std::multimap<unsigned int, OptionPtr> OptionCollection;
42
44typedef boost::shared_ptr<OptionCollection> OptionCollectionPtr;
45
54public:
55 SkipRemainingOptionsError (const char* file, size_t line, const char* what) :
56 isc::Exception(file, line, what) { }
57};
58
69public:
70 SkipThisOptionError (const char* file, size_t line, const char* what) :
71 isc::Exception(file, line, what) { }
72};
73
77public:
78 OptionParseError (const char* file, size_t line, const char* what) :
79 isc::Exception(file, line, what) { }
80};
81
82class Option {
83public:
85 const static size_t OPTION4_HDR_LEN = 2;
86
88 const static size_t OPTION6_HDR_LEN = 4;
89
91 enum Universe : uint16_t { V4, V6 };
92
93
104 typedef OptionPtr Factory(Option::Universe u, uint16_t type, const OptionBuffer& buf);
105
121 uint16_t type,
122 const OptionBuffer& buf);
123
139 static OptionPtr factory(Option::Universe u, uint16_t type) {
140 return factory(u, type, OptionBuffer());
141 }
142
147 Option(Universe u, uint16_t type);
148
159 Option(Universe u, uint16_t type, const OptionBuffer& data);
160
181 Option(Universe u, uint16_t type, OptionBufferConstIter first,
183
190 Option(const Option& source);
191
203 static OptionPtr create(Universe u, uint16_t type);
204
217 static OptionPtr create(Universe u, uint16_t type, const OptionBuffer& data);
218
226 Option& operator=(const Option& rhs);
227
236 virtual OptionPtr clone() const;
237
242 return (universe_);
243 }
244
256 virtual void pack(isc::util::OutputBuffer& buf, bool check = true) const;
257
262 virtual void unpack(OptionBufferConstIter begin,
264
270 virtual std::string toText(int indent = 0) const;
271
278 virtual std::string toString() const;
279
287 virtual std::vector<uint8_t> toBinary(const bool include_header = false) const;
288
296 virtual std::string toHexString(const bool include_header = false) const;
297
301 uint16_t getType() const {
302 return (type_);
303 }
304
309 virtual uint16_t len() const;
310
314 virtual uint16_t getHeaderLen() const;
315
319 virtual bool valid() const;
320
325 virtual const OptionBuffer& getData() const {
326 return (data_);
327 }
328
341 void addOption(OptionPtr opt);
342
348 OptionPtr getOption(uint16_t type) const;
349
356 return (options_);
357 }
358
368
374 void getOptionsCopy(OptionCollection& options_copy) const;
375
381 bool delOption(uint16_t type);
382
388 uint8_t getUint8() const;
389
395 uint16_t getUint16() const;
396
402 uint32_t getUint32() const;
403
409 void setUint8(uint8_t value);
410
416 void setUint16(uint16_t value);
417
423 void setUint32(uint32_t value);
424
434 template<typename InputIterator>
435 void setData(InputIterator first, InputIterator last) {
436 data_.assign(first, last);
437 }
438
443 void setEncapsulatedSpace(const std::string& encapsulated_space) {
444 encapsulated_space_ = encapsulated_space;
445 }
446
450 std::string getEncapsulatedSpace() const {
451 return (encapsulated_space_);
452 }
453
455 virtual ~Option();
456
465 bool equals(const OptionPtr& other) const;
466
479 virtual bool equals(const Option& other) const;
480
491 static bool lenient_parsing_;
492
493protected:
494
504 template<typename OptionType>
506 const OptionType* cast_this = dynamic_cast<const OptionType*>(this);
507 if (cast_this) {
508 return (boost::shared_ptr<OptionType>(new OptionType(*cast_this)));
509 }
510 return (OptionPtr());
511 }
512
528 void packHeader(isc::util::OutputBuffer& buf, bool check = true) const;
529
544 void packOptions(isc::util::OutputBuffer& buf, bool check = true) const;
545
559 void unpackOptions(const OptionBuffer& buf, size_t rec_level = 0);
560
571 std::string headerToText(const int indent = 0,
572 const std::string& type_name = "") const;
573
586 std::string suboptionsToText(const int indent = 0) const;
587
593 void check() const;
594
597
599 uint16_t type_;
600
603
606
609
612};
613
614} // namespace isc::dhcp
615} // namespace isc
616
617#endif // OPTION_H
Exception(const char *file, size_t line, const char *what)
Constructor for a given type for exceptions with file name and file line number.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
OptionParseError(const char *file, size_t line, const char *what)
Definition option.h:78
static OptionPtr factory(Option::Universe u, uint16_t type, const OptionBuffer &buf)
Factory function to create instance of option.
Definition option.cc:33
uint16_t type_
option type (0-255 for DHCPv4, 0-65535 for DHCPv6)
Definition option.h:599
std::string headerToText(const int indent=0, const std::string &type_name="") const
Returns option header in the textual format.
Definition option.cc:294
std::string suboptionsToText(const int indent=0) const
Returns collection of suboptions in the textual format.
Definition option.cc:313
static bool lenient_parsing_
Governs whether options should be parsed less strictly.
Definition option.h:491
std::string encapsulated_space_
Name of the option space being encapsulated by this option.
Definition option.h:608
const OptionCollection & getOptions() const
Returns all encapsulated options.
Definition option.h:355
std::string getEncapsulatedSpace() const
Returns the name of the option space encapsulated by this option.
Definition option.h:450
bool equals(const OptionPtr &other) const
Checks if options are equal.
Definition option.cc:385
void setEncapsulatedSpace(const std::string &encapsulated_space)
Sets the name of the option space encapsulated by this option.
Definition option.h:443
virtual const OptionBuffer & getData() const
Returns pointer to actual data.
Definition option.h:325
virtual ~Option()
just to force that every option has virtual dtor
Definition option.cc:394
virtual void pack(isc::util::OutputBuffer &buf, bool check=true) const
Writes option in wire-format to a buffer.
Definition option.cc:107
Universe
defines option universe DHCPv4 or DHCPv6
Definition option.h:91
bool delOption(uint16_t type)
Attempts to delete first suboption of requested type.
Definition option.cc:220
virtual uint16_t getHeaderLen() const
Returns length of header (2 for v4, 4 for v6).
Definition option.cc:327
virtual uint16_t len() const
Returns length of the complete option (data length + DHCPv4/DHCPv6 option header).
Definition option.cc:172
Universe universe_
option universe (V4 or V6)
Definition option.h:596
OptionPtr getOption(uint16_t type) const
Returns shared_ptr to suboption of specific type.
Definition option.cc:200
void addOption(OptionPtr opt)
Adds a sub-option.
Definition option.cc:337
void setUint32(uint32_t value)
Sets content of this option to a single uint32 value.
Definition option.cc:380
uint16_t getType() const
Returns option type (0-255 for DHCPv4, 0-65535 for DHCPv6).
Definition option.h:301
OptionBuffer data_
contains content of this data
Definition option.h:602
virtual std::string toString() const
Returns string representation of the value.
Definition option.cc:253
void packOptions(isc::util::OutputBuffer &buf, bool check=true) const
Store sub options in a buffer.
Definition option.cc:136
static OptionPtr create(Universe u, uint16_t type)
Factory function creating an instance of the Option.
Definition option.cc:63
static const size_t OPTION6_HDR_LEN
length of any DHCPv6 option header
Definition option.h:88
OptionPtr Factory(Option::Universe u, uint16_t type, const OptionBuffer &buf)
a factory function prototype
Definition option.h:104
void setUint8(uint8_t value)
Sets content of this option to a single uint8 value.
Definition option.cc:370
Option & operator=(const Option &rhs)
Assignment operator.
Definition option.cc:73
void setData(InputIterator first, InputIterator last)
Sets content of this option from buffer.
Definition option.h:435
virtual bool valid() const
returns if option is valid (e.g.
Definition option.cc:191
OptionCollection options_
collection for storing suboptions
Definition option.h:605
void unpackOptions(const OptionBuffer &buf, size_t rec_level=0)
Builds a collection of sub options from the buffer.
Definition option.cc:155
OptionPtr cloneInternal() const
Copies this option and returns a pointer to the copy.
Definition option.h:505
Universe getUniverse() const
returns option universe (V4 or V6)
Definition option.h:241
uint8_t getUint8() const
Returns content of first byte.
Definition option.cc:347
virtual std::vector< uint8_t > toBinary(const bool include_header=false) const
Returns binary representation of the option.
Definition option.cc:259
void setUint16(uint16_t value)
Sets content of this option to a single uint16 value.
Definition option.cc:375
virtual OptionPtr clone() const
Copies this option and returns a pointer to the copy.
Definition option.cc:85
virtual void unpack(OptionBufferConstIter begin, OptionBufferConstIter end)
Parses received buffer.
Definition option.cc:149
static OptionPtr factory(Option::Universe u, uint16_t type)
Factory function to create instance of option.
Definition option.h:139
uint16_t getUint16() const
Returns content of first word.
Definition option.cc:354
virtual std::string toText(int indent=0) const
Returns string representation of the option.
Definition option.cc:229
OptionCollection & getMutableOptions()
Returns all encapsulated options.
Definition option.h:365
void packHeader(isc::util::OutputBuffer &buf, bool check=true) const
Store option's header in a buffer.
Definition option.cc:119
virtual std::string toHexString(const bool include_header=false) const
Returns string containing hexadecimal representation of option.
Definition option.cc:280
uint32_t getUint32() const
Returns content of first double word.
Definition option.cc:362
Option(Universe u, uint16_t type)
ctor, used for options constructed, usually during transmission
Definition option.cc:39
void check() const
A protected method used for option correctness.
Definition option.cc:90
void getOptionsCopy(OptionCollection &options_copy) const
Performs deep copy of suboptions.
Definition option.cc:209
static const size_t OPTION4_HDR_LEN
length of the usual DHCPv4 option header (there are exceptions)
Definition option.h:85
SkipRemainingOptionsError(const char *file, size_t line, const char *what)
Definition option.h:55
SkipThisOptionError(const char *file, size_t line, const char *what)
Definition option.h:70
The OutputBuffer class is a buffer abstraction for manipulating mutable data.
Definition buffer.h:355
boost::shared_ptr< OptionCollection > OptionCollectionPtr
A pointer to an OptionCollection.
Definition option.h:44
OptionBuffer::const_iterator OptionBufferConstIter
const_iterator for walking over OptionBuffer
Definition option.h:31
std::multimap< unsigned int, OptionPtr > OptionCollection
A collection of DHCP (v4 or v6) options.
Definition option.h:41
boost::shared_ptr< OptionBuffer > OptionBufferPtr
pointer to a DHCP buffer
Definition option.h:34
OptionBuffer::iterator OptionBufferIter
iterator for walking over OptionBuffer
Definition option.h:28
std::vector< uint8_t > OptionBuffer
buffer types used in DHCP code.
Definition option.h:25
boost::shared_ptr< Option > OptionPtr
Definition option.h:38
Defines the logger used by the top-level component of kea-lfc.