18 #include <arpa/inet.h> 32 return(LibDHCP::optionFactory(u, type, buf));
37 :universe_(u), type_(type) {
40 if ((u ==
V4) && ((type == 0) || (type > 254))) {
42 << type <<
", V4 options are in range 1..254");
47 :universe_(u), type_(type), data_(data) {
53 :universe_(u), type_(type), data_(first, last) {
58 : universe_(option.universe_), type_(option.type_),
59 data_(option.data_), options_(),
60 encapsulated_space_(option.encapsulated_space_) {
78 return (cloneInternal<Option>());
85 <<
"Only V4 and V6 are allowed.");
92 <<
"For DHCPv4 allowed type range is 0..255");
93 }
else if (
data_.size() > 255) {
109 if (!
data_.empty()) {
121 <<
"At most 255 bytes are supported.");
157 list<uint16_t> deferred;
179 for (OptionCollection::const_iterator it =
options_.begin();
182 length += (*it).second->len();
188 return (static_cast<uint16_t>(length));
202 isc::dhcp::OptionCollection::const_iterator x =
213 for (OptionCollection::const_iterator it =
options_.begin();
216 local_options.insert(std::make_pair(it->second->getType(),
221 options_copy.swap(local_options);
225 isc::dhcp::OptionCollection::iterator x =
options_.find(opt_type);
235 std::stringstream output;
238 for (
unsigned int i = 0; i <
data_.size(); i++) {
242 output << setfill(
'0') << setw(2) << hex
243 << static_cast<unsigned short>(
data_[i]);
249 return (output.str());
266 }
catch (
const std::exception &ex) {
268 " of option " <<
getType() <<
": " << ex.what());
270 const uint8_t* option_data = static_cast<const uint8_t*>(buf.
getData());
274 std::vector<uint8_t> option_vec(option_data + (include_header ? 0 :
getHeaderLen()),
282 std::vector<uint8_t> option_vec =
toBinary(include_header);
286 std::ostringstream s;
287 if (!option_vec.empty()) {
295 std::stringstream output;
296 for (
int i = 0; i < indent; i++)
300 output <<
"type=" << std::setw(field_len) << std::setfill(
'0')
303 if (!type_name.empty()) {
304 output <<
"(" << type_name <<
")";
307 output <<
", len=" << std::setw(field_len) << std::setfill(
'0')
309 return (output.str());
314 std::stringstream output;
317 output <<
"," << std::endl <<
"options:";
318 for (OptionCollection::const_iterator opt =
options_.begin();
320 output << std::endl << (*opt).second->toText(indent);
324 return (output.str());
343 <<
" already present in this message.");
346 options_.insert(make_pair(opt->getType(), opt));
350 if (
data_.size() <
sizeof(uint8_t) ) {
352 <<
" that has size " <<
data_.size());
368 data_.resize(
sizeof(value));
373 data_.resize(
sizeof(value));
378 data_.resize(
sizeof(value));
void getOptionsCopy(OptionCollection &options_copy) const
Performs deep copy of suboptions.
std::string suboptionsToText(const int indent=0) const
Returns collection of suboptions in the textual format.
uint16_t getUint16() const
Returns content of first word.
uint8_t * writeUint32(uint32_t value, uint8_t *buffer, size_t length)
Write Unsigned 32-Bit Integer to Buffer.
uint16_t getType() const
Returns option type (0-255 for DHCPv4, 0-65535 for DHCPv6)
static void packOptions6(isc::util::OutputBuffer &buf, const isc::dhcp::OptionCollection &options)
Stores DHCPv6 options in a buffer.
void packHeader(isc::util::OutputBuffer &buf) const
Store option's header in a buffer.
virtual ~Option()
just to force that every option has virtual dtor
virtual std::vector< uint8_t > toBinary(const bool include_header=false) const
Returns binary representation of the option.
static void packOptions4(isc::util::OutputBuffer &buf, const isc::dhcp::OptionCollection &options)
Stores DHCPv4 options in a buffer.
void setUint16(uint16_t value)
Sets content of this option to singe uint16 value.
boost::shared_ptr< Option > OptionPtr
Universe
defines option universe DHCPv4 or DHCPv6
uint32_t getUint32() const
Returns content of first double word.
Option(Universe u, uint16_t type)
ctor, used for options constructed, usually during transmission
virtual uint16_t getHeaderLen() const
Returns length of header (2 for v4, 4 for v6)
Universe universe_
option universe (V4 or V6)
std::vector< uint8_t > OptionBuffer
buffer types used in DHCP code.
static const size_t OPTION4_HDR_LEN
length of the usual DHCPv4 option header (there are exceptions)
void setUint32(uint32_t value)
Sets content of this option to singe uint32 value.
static size_t unpackOptions6(const OptionBuffer &buf, const std::string &option_space, isc::dhcp::OptionCollection &options, size_t *relay_msg_offset=0, size_t *relay_msg_len=0)
Parses provided buffer as DHCPv6 options and creates Option objects.
void writeData(const void *data, size_t len)
Copy an arbitrary length of data into the buffer.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
std::string headerToText(const int indent=0, const std::string &type_name="") const
Returns option header in the textual format.
Universe getUniverse() const
returns option universe (V4 or V6)
virtual std::string toString() const
Returns string representation of the value.
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
uint8_t * writeUint16(uint16_t value, void *buffer, size_t length)
Write Unsigned 16-Bit Integer to Buffer.
virtual OptionPtr clone() const
Copies this option and returns a pointer to the copy.
bool equals(const OptionPtr &other) const
Checks if options are equal.
bool delOption(uint16_t type)
Attempts to delete first suboption of requested type.
virtual void pack(isc::util::OutputBuffer &buf) const
Writes option in wire-format to a buffer.
OptionPtr getOption(uint16_t type) const
Returns shared_ptr to suboption of specific type.
OptionCollection options_
collection for storing suboptions
const void * getData() const
Return a pointer to the head of the data stored in the buffer.
virtual const OptionBuffer & getData() const
Returns pointer to actual data.
void check() const
A protected method used for option correctness.
std::multimap< unsigned int, OptionPtr > OptionCollection
A collection of DHCP (v4 or v6) options.
void addOption(OptionPtr opt)
Adds a sub-option.
The OutputBuffer class is a buffer abstraction for manipulating mutable data.
uint32_t readUint32(const uint8_t *buffer, size_t length)
Read Unsigned 32-Bit Integer from Buffer.
OptionBuffer::const_iterator OptionBufferConstIter
const_iterator for walking over OptionBuffer
size_t getLength() const
Return the length of data written in the buffer.
Defines the logger used by the top-level component of kea-dhcp-ddns.
void packOptions(isc::util::OutputBuffer &buf) const
Store sub options in a buffer.
virtual uint16_t len() const
Returns length of the complete option (data length + DHCPv4/DHCPv6 option header)
string encodeHex(const vector< uint8_t > &binary)
Encode binary data in the base16 ('hex') format.
virtual bool valid() const
returns if option is valid (e.g.
Option & operator=(const Option &rhs)
Assignment operator.
void unpackOptions(const OptionBuffer &buf)
Builds a collection of sub options from the buffer.
uint16_t readUint16(const void *buffer, size_t length)
Read Unsigned 16-Bit Integer from Buffer.
void writeUint8(uint8_t data)
Write an unsigned 8-bit integer into the buffer.
std::string getEncapsulatedSpace() const
Returns the name of the option space encapsulated by this option.
virtual void unpack(OptionBufferConstIter begin, OptionBufferConstIter end)
Parses received buffer.
void writeUint16(uint16_t data)
Write an unsigned 16-bit integer in host byte order into the buffer in network byte order.
A generic exception that is thrown if a parameter given to a method would refer to or modify out-of-r...
void setUint8(uint8_t value)
Sets content of this option to singe uint8 value.
static size_t unpackOptions4(const OptionBuffer &buf, const std::string &option_space, isc::dhcp::OptionCollection &options, std::list< uint16_t > &deferred)
Parses provided buffer as DHCPv4 options and creates Option objects.
OptionBuffer data_
contains content of this data
virtual std::string toHexString(const bool include_header=false) const
Returns string containing hexadecimal representation of option.
uint16_t type_
option type (0-255 for DHCPv4, 0-65535 for DHCPv6)
void setData(InputIterator first, InputIterator last)
Sets content of this option from buffer.
uint8_t getUint8() const
Returns content of first byte.
std::string encapsulated_space_
Name of the option space being encapsulated by this option.
virtual std::string toText(int indent=0) const
Returns string representation of the option.
static const size_t OPTION6_HDR_LEN
length of any DHCPv6 option header