30 :
Option(u, def.getCode(), data.begin(), data.end()),
40 :
Option(u, def.getCode(), first, last),
48 return (cloneInternal<OptionCustom>());
58 << address <<
". Expected a valid IPv"
60 "4" :
"6") <<
" address.");
65 buffers_.push_back(buf);
76 buffers_.push_back(buf);
85 buffers_.push_back(buf);
94 buffers_.push_back(buf);
104 " an option comprising an array of IPv6 prefix values");
109 buffers_.push_back(buf);
118 " an option comprising an array of PSID length / value"
124 buffers_.push_back(buf);
128 OptionCustom::checkIndex(
const uint32_t index)
const {
129 if (index >= buffers_.size()) {
131 <<
" is out of range.");
147 if (data_size == 0) {
160 buffer.resize(data_size);
165 OptionCustom::createBuffers() {
168 std::vector<OptionBuffer> buffers;
185 field != fields.end(); ++field) {
187 createBuffer(buf, *field);
190 buffers.push_back(buf);
202 createBuffer(buf, data_type);
204 buffers.push_back(buf);
209 std::swap(buffers, buffers_);
213 OptionCustom::bufferLength(
const OptionDataType data_type,
bool in_array,
214 OptionBuffer::const_iterator begin,
215 OptionBuffer::const_iterator end)
const {
223 if (data_size == 0) {
234 data_size = fqdn.size() + 1;
244 data_size = std::distance(begin, end);
250 if ((begin == end) && !in_array)
256 data_size =
sizeof(uint8_t) + (prefix.first.asUint8() + 7) / 8;
264 data_size = value.size();
272 isc_throw(OutOfRange,
"option buffer truncated");
280 OptionCustom::createBuffers(
const OptionBuffer& data_buf) {
285 std::vector<OptionBuffer> buffers;
286 OptionBuffer::const_iterator data = data_buf.begin();
298 field != fields.end(); ++field) {
299 size_t data_size = bufferLength(*field,
false,
300 data, data_buf.end());
304 if (std::distance(data, data_buf.end()) < data_size) {
305 isc_throw(OutOfRange,
"option buffer truncated");
309 buffers.push_back(
OptionBuffer(data, data + data_size));
316 while (data != data_buf.end()) {
318 size_t data_size = bufferLength(fields.back(),
true,
319 data, data_buf.end());
321 if (std::distance(data, data_buf.end()) < data_size) {
324 buffers.push_back(
OptionBuffer(data, data + data_size));
346 if (std::distance(data, data_buf.end()) < data_size) {
347 isc_throw(OutOfRange,
"option buffer truncated");
352 while (data != data_buf.end()) {
353 data_size = bufferLength(data_type,
true, data, data_buf.end());
365 if (std::distance(data, data_buf.end()) < data_size) {
368 buffers.push_back(
OptionBuffer(data, data + data_size));
375 data_size = bufferLength(data_type,
false, data, data_buf.end());
376 if ((data_size > 0) && (std::distance(data, data_buf.end()) >= data_size)) {
377 buffers.push_back(
OptionBuffer(data, data + data_size));
380 isc_throw(OutOfRange,
"option buffer truncated");
395 std::swap(buffers_, buffers);
400 const uint32_t index)
const {
401 std::ostringstream text;
412 text << static_cast<int>(readInteger<int8_t>(index));
415 text << readInteger<int16_t>(index);
418 text << readInteger<int32_t>(index);
421 text << static_cast<unsigned>(readInteger<uint8_t>(index));
424 text << readInteger<uint16_t>(index);
427 text << readInteger<uint32_t>(index);
434 text <<
"\"" <<
readFqdn(index) <<
"\"";
437 text <<
"\"" <<
readTuple(index) <<
"\"";
445 text <<
"len=" << t.first.asUnsigned() <<
",psid=" << t.second.asUint16();
464 for (std::vector<OptionBuffer>::const_iterator it = buffers_.begin();
465 it != buffers_.end(); ++it) {
486 if (buffers_[index].size() == asiolink::V4ADDRESS_LEN) {
488 }
else if (buffers_[index].size() == asiolink::V6ADDRESS_LEN) {
492 <<
" IP address. Invalid buffer length "
493 << buffers_[index].size() <<
".");
499 const uint32_t index) {
502 if ((address.
isV4() && buffers_[index].size() != V4ADDRESS_LEN) ||
503 (address.
isV6() && buffers_[index].size() != V6ADDRESS_LEN)) {
505 << address <<
". Expected a valid IPv"
506 << (buffers_[index].size() == V4ADDRESS_LEN ?
"4" :
"6")
512 std::swap(buf, buffers_[index]);
518 return (buffers_[index]);
523 const uint32_t index) {
525 buffers_[index] = buf;
538 const uint32_t index)
const {
547 buffers_[index].clear();
557 buffers_[index].clear();
571 buffers_[index].clear();
595 std::swap(buffers_[index], buf);
607 const uint32_t index) {
614 std::swap(buffers_[index], buf);
626 const uint32_t index) {
633 std::swap(buffers_[index], buf);
650 buffers_[index].clear();
670 for (std::vector<OptionBuffer>::const_iterator buf = buffers_.begin();
671 buf != buffers_.end(); ++buf) {
672 length += buf->size();
676 for (OptionCollection::const_iterator it =
options_.begin();
679 length += (*it).second->len();
682 return (static_cast<uint16_t>(length));
695 std::stringstream output;
708 field != fields.end(); ++field) {
709 output <<
" " << dataFieldToText(*field, std::distance(fields.begin(),
716 output <<
" " << dataFieldToText(fields.back(), i);
726 output <<
" " << dataFieldToText(definition_.
getType(), i);
733 return (output.str());
bool getArrayType() const
Return array type indicator.
Universe getUniverse() const
returns option universe (V4 or V6)
void writeTuple(const std::string &value, const uint32_t index=0)
Write a length and string tuple into a buffer.
virtual void pack(isc::util::OutputBuffer &buf) const
Writes DHCP option in a wire format to a buffer.
void addArrayDataField(const asiolink::IOAddress &address)
Create new buffer and set its value as an IP address.
#define isc_throw_assert(expr)
Replacement for assert() that throws if the expression is false.
Encapsulates PSID length.
Base class representing a DHCP option definition.
void packHeader(isc::util::OutputBuffer &buf) const
Store option's header in a buffer.
void writeAddress(const asiolink::IOAddress &address, const uint32_t index=0)
Write an IP address into a buffer.
void packOptions(isc::util::OutputBuffer &buf) const
Store sub options in a buffer.
std::vector< OptionDataType > RecordFieldsCollection
List of fields within the record.
virtual std::string toText(int indent=0) const
Returns string representation of the option.
static void writePsid(const PSIDLen &psid_len, const PSID &psid, std::vector< uint8_t > &buf)
Append PSID length/value into a buffer.
static const std::string & getDataTypeName(const OptionDataType data_type)
Return option data type name from the data type enumerator.
static std::string readFqdn(const std::vector< uint8_t > &buf)
Read FQDN from a buffer as a string value.
asiolink::IOAddress readAddress(const uint32_t index=0) const
Read a buffer as IP address.
OptionCustom(const OptionDefinition &def, Universe u)
Constructor, used for options to be sent.
static void writeBool(const bool value, std::vector< uint8_t > &buf)
Append boolean value into a buffer.
boost::shared_ptr< Option > OptionPtr
std::string readFqdn(const uint32_t index=0) const
Read a buffer as FQDN.
static void writeFqdn(const std::string &fqdn, std::vector< uint8_t > &buf, const bool downcase=false)
Append FQDN into a buffer.
static int getDataTypeLen(const OptionDataType data_type)
Get data type buffer length.
Universe
defines option universe DHCPv4 or DHCPv6
static void writePrefix(const PrefixLen &prefix_len, const asiolink::IOAddress &prefix, std::vector< uint8_t > &buf)
Append prefix into a buffer.
static bool readBool(const std::vector< uint8_t > &buf)
Read boolean value from a buffer.
std::pair< PrefixLen, asiolink::IOAddress > PrefixTuple
Defines a pair of prefix length / value.
virtual const OptionBuffer & getData() const
Returns pointer to actual data.
virtual void unpack(OptionBufferConstIter begin, OptionBufferConstIter end)
Parses received buffer.
std::string readString(const uint32_t index=0) const
Read a buffer as string value.
void writeBoolean(const bool value, const uint32_t index=0)
Write a boolean value into a buffer.
bool readBoolean(const uint32_t index=0) const
Read a buffer as boolean value.
static PSIDTuple readPsid(const std::vector< uint8_t > &buf)
Read PSID length / value tuple from a buffer.
virtual uint16_t getHeaderLen() const
Returns length of header (2 for v4, 4 for v6)
bool isV4() const
Convenience function to check for an IPv4 address.
std::vector< uint8_t > OptionBuffer
buffer types used in DHCP code.
static const IOAddress & IPV6_ZERO_ADDRESS()
Returns an IPv6 zero address.
void writeData(const void *data, size_t len)
Copy an arbitrary length of data into the buffer.
static void writeTuple(const std::string &value, OpaqueDataTuple::LengthFieldType lengthfieldtype, std::vector< uint8_t > &buf)
Append length and string tuple to a buffer.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
static std::string readString(const std::vector< uint8_t > &buf)
Read string value from a buffer.
OptionDataType
Data types of DHCP option fields.
void validate() const
Check if the option definition is valid.
OptionCollection options_
collection for storing suboptions
void writePsid(const PSIDLen &psid_len, const PSID &psid, const uint32_t index=0)
Write PSID length / value into a buffer.
void writePrefix(const PrefixLen &prefix_len, const asiolink::IOAddress &prefix, const uint32_t index=0)
Write prefix length and value into a buffer.
std::string readTuple(const uint32_t index=0) const
Read a buffer as length and string tuple.
void setEncapsulatedSpace(const std::string &encapsulated_space)
Sets the name of the option space encapsulated by this option.
virtual uint16_t len() const
Returns length of the complete option (data length + DHCPv4/DHCPv6 option header) ...
The OutputBuffer class is a buffer abstraction for manipulating mutable data.
OptionBuffer::const_iterator OptionBufferConstIter
const_iterator for walking over OptionBuffer
LengthFieldType
Size of the length field in the tuple.
static asiolink::IOAddress readAddress(const std::vector< uint8_t > &buf, const short family)
Read IPv4 or IPv6 address from a buffer.
std::string suboptionsToText(const int indent=0) const
Returns collection of suboptions in the textual format.
std::pair< PSIDLen, PSID > PSIDTuple
Defines a pair of PSID length / value.
Defines the logger used by the top-level component of kea-dhcp-ddns.
const RecordFieldsCollection & getRecordFields() const
Return list of record fields.
string encodeHex(const vector< uint8_t > &binary)
Encode binary data in the base16 ('hex') format.
std::string getEncapsulatedSpace() const
Return name of the encapsulated option space.
PSIDTuple readPsid(const uint32_t index=0) const
Read a buffer as a PSID length / value tuple.
void unpackOptions(const OptionBuffer &buf)
Builds a collection of sub options from the buffer.
std::string headerToText(const int indent=0, const std::string &type_name="") const
Returns option header in the textual format.
void writeBinary(const OptionBuffer &buf, const uint32_t index=0)
Write binary data into a buffer.
static std::string readTuple(const std::vector< uint8_t > &buf, OpaqueDataTuple::LengthFieldType lengthfieldtype)
Read length and string tuple from a buffer.
static void writeAddress(const asiolink::IOAddress &address, std::vector< uint8_t > &buf)
Append IPv4 or IPv6 address to a buffer.
void writeFqdn(const std::string &fqdn, const uint32_t index=0)
Write an FQDN into a buffer.
static PrefixTuple readPrefix(const std::vector< uint8_t > &buf)
Read prefix from a buffer.
Represents a single instance of the opaque data preceded by length.
std::string getEncapsulatedSpace() const
Returns the name of the option space encapsulated by this option.
A generic exception that is thrown if a parameter given to a method would refer to or modify out-of-r...
std::vector< OptionDataType >::const_iterator RecordFieldsConstIter
Const iterator for record data fields.
bool isV6() const
Convenience function to check for an IPv6 address.
Exception to be thrown when cast to the data type was unsuccessful.
The IOAddress class represents an IP addresses (version agnostic)
void setData(InputIterator first, InputIterator last)
Sets content of this option from buffer.
static void writeString(const std::string &value, std::vector< uint8_t > &buf)
Write UTF8-encoded string into a buffer.
Encapsulates prefix length.
void writeString(const std::string &text, const uint32_t index=0)
Write a string value into a buffer.
uint32_t getDataFieldsNum() const
Return a number of the data fields.
virtual OptionPtr clone() const
Copies this option and returns a pointer to the copy.
OptionDataType getType() const
Return option data type.
const OptionBuffer & readBinary(const uint32_t index=0) const
Read a buffer as binary data.
void initialize(const OptionBufferConstIter first, const OptionBufferConstIter last)
Sets content of this option from buffer.
PrefixTuple readPrefix(const uint32_t index=0) const
Read a buffer as variable length prefix.