32 :
Option(u, def.getCode(), data.begin(), data.end()),
42 :
Option(u, def.getCode(), first, last),
50 return (cloneInternal<OptionCustom>());
60 << address <<
". Expected a valid IPv"
62 "4" :
"6") <<
" address.");
67 buffers_.push_back(buf);
77 buffers_.push_back(buf);
86 buffers_.push_back(buf);
95 buffers_.push_back(buf);
105 " an option comprising an array of IPv6 prefix values");
110 buffers_.push_back(buf);
119 " an option comprising an array of PSID length / value"
125 buffers_.push_back(buf);
129OptionCustom::checkIndex(
const uint32_t index)
const {
130 if (index >= buffers_.size()) {
132 <<
" is out of range.");
148 if (data_size == 0) {
161 buffer.resize(data_size);
166OptionCustom::createBuffers() {
169 std::vector<OptionBuffer> buffers;
185 for (
auto const& field : fields) {
187 createBuffer(buf, field);
190 buffers.push_back(buf);
202 createBuffer(buf, data_type);
204 buffers.push_back(buf);
209 std::swap(buffers, buffers_);
213OptionCustom::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;
262 data_size = value.size();
278OptionCustom::createBuffers(
const OptionBuffer& data_buf) {
283 std::vector<OptionBuffer> buffers;
284 OptionBuffer::const_iterator data = data_buf.begin();
295 for (
auto const& field : fields) {
296 size_t data_size = bufferLength(field,
false,
297 data, data_buf.end());
301 if (std::distance(data, data_buf.end()) < data_size) {
306 buffers.push_back(
OptionBuffer(data, data + data_size));
313 while (data != data_buf.end()) {
315 size_t data_size = bufferLength(fields.back(),
true,
316 data, data_buf.end());
318 if (std::distance(data, data_buf.end()) < data_size) {
321 buffers.push_back(
OptionBuffer(data, data + data_size));
343 if (std::distance(data, data_buf.end()) < data_size) {
349 while (data != data_buf.end()) {
350 data_size = bufferLength(data_type,
true, data, data_buf.end());
362 if (std::distance(data, data_buf.end()) < data_size) {
365 buffers.push_back(
OptionBuffer(data, data + data_size));
372 data_size = bufferLength(data_type,
false, data, data_buf.end());
373 if ((data_size > 0) && (std::distance(data, data_buf.end()) >= data_size)) {
374 buffers.push_back(
OptionBuffer(data, data + data_size));
392 std::swap(buffers_, buffers);
397 const uint32_t index)
const {
398 std::ostringstream text;
410 std::string printable(data.cbegin(), data.cend());
411 text <<
" '" << printable <<
"'";
420 text << static_cast<int>(readInteger<int8_t>(index));
423 text << readInteger<int16_t>(index);
426 text << readInteger<int32_t>(index);
429 text << static_cast<unsigned>(readInteger<uint8_t>(index));
432 text << readInteger<uint16_t>(index);
435 text << readInteger<uint32_t>(index);
442 text <<
"\"" <<
readFqdn(index) <<
"\"";
445 text <<
"\"" <<
readTuple(index) <<
"\"";
453 text <<
"len=" << t.first.asUnsigned() <<
",psid=" << t.second.asUint16();
473 for (
auto const& it : buffers_) {
478 buf.writeData(&it[0], it.size());
494 if (buffers_[index].size() == asiolink::V4ADDRESS_LEN) {
496 }
else if (buffers_[index].size() == asiolink::V6ADDRESS_LEN) {
500 <<
" IP address. Invalid buffer length "
501 << buffers_[index].size() <<
".");
507 const uint32_t index) {
510 if ((address.isV4() && buffers_[index].size() != V4ADDRESS_LEN) ||
511 (address.isV6() && buffers_[index].size() != V6ADDRESS_LEN)) {
513 << address <<
". Expected a valid IPv"
514 << (buffers_[index].size() == V4ADDRESS_LEN ?
"4" :
"6")
520 std::swap(buf, buffers_[index]);
526 return (buffers_[index]);
531 const uint32_t index) {
533 buffers_[index] = buf;
545 const uint32_t index)
const {
554 buffers_[index].clear();
563 buffers_[index].clear();
577 buffers_[index].clear();
601 std::swap(buffers_[index], buf);
613 const uint32_t index) {
620 std::swap(buffers_[index], buf);
632 const uint32_t index) {
639 std::swap(buffers_[index], buf);
656 buffers_[index].clear();
676 for (
auto const& buf : buffers_) {
677 length += buf.size();
682 length += it.second->len();
685 return (
static_cast<uint16_t
>(length));
690 setData(first, last);
698 std::stringstream output;
711 for (
auto const& field : fields) {
712 output <<
" " << dataFieldToText(field, j);
719 output <<
" " << dataFieldToText(fields.back(), i);
729 output <<
" " << dataFieldToText(definition_.
getType(), i);
736 return (output.str());
A generic exception that is thrown if a parameter given to a method would refer to or modify out-of-r...
The IOAddress class represents an IP addresses (version agnostic)
static const IOAddress & IPV6_ZERO_ADDRESS()
Returns an IPv6 zero address.
Exception to be thrown when cast to the data type was unsuccessful.
Represents a single instance of the opaque data preceded by length.
LengthFieldType
Size of the length field in the tuple.
std::string readString(const uint32_t index=0) const
Read a buffer as string value.
bool readBoolean(const uint32_t index=0) const
Read a buffer as boolean value.
virtual uint16_t len() const
Returns length of the complete option (data length + DHCPv4/DHCPv6 option header)
std::string readTuple(const uint32_t index=0) const
Read a buffer as length and string tuple.
void writeFqdn(const std::string &fqdn, const uint32_t index=0)
Write an FQDN into a buffer.
std::string readFqdn(const uint32_t index=0) const
Read a buffer as FQDN.
void writePrefix(const PrefixLen &prefix_len, const asiolink::IOAddress &prefix, const uint32_t index=0)
Write prefix length and value into a buffer.
virtual void unpack(OptionBufferConstIter begin, OptionBufferConstIter end)
Parses received buffer.
void writeAddress(const asiolink::IOAddress &address, const uint32_t index=0)
Write an IP address into a buffer.
virtual void pack(isc::util::OutputBuffer &buf, bool check=true) const
Writes DHCP option in a wire format to a buffer.
void initialize(const OptionBufferConstIter first, const OptionBufferConstIter last)
Sets content of this option from buffer.
const OptionBuffer & readBinary(const uint32_t index=0) const
Read a buffer as binary data.
PrefixTuple readPrefix(const uint32_t index=0) const
Read a buffer as variable length prefix.
void writePsid(const PSIDLen &psid_len, const PSID &psid, const uint32_t index=0)
Write PSID length / value into a buffer.
void writeBoolean(const bool value, const uint32_t index=0)
Write a boolean value into a buffer.
asiolink::IOAddress readAddress(const uint32_t index=0) const
Read a buffer as IP address.
PSIDTuple readPsid(const uint32_t index=0) const
Read a buffer as a PSID length / value tuple.
void writeString(const std::string &text, const uint32_t index=0)
Write a string value into a buffer.
void writeBinary(const OptionBuffer &buf, const uint32_t index=0)
Write binary data into a buffer.
void addArrayDataField(const asiolink::IOAddress &address)
Create new buffer and set its value as an IP address.
virtual OptionPtr clone() const
Copies this option and returns a pointer to the copy.
void writeTuple(const std::string &value, const uint32_t index=0)
Write a length and string tuple into a buffer.
virtual std::string toText(int indent=0) const
Returns string representation of the option.
OptionCustom(const OptionDefinition &def, Universe u)
Constructor, used for options to be sent.
uint32_t getDataFieldsNum() const
Return a number of the data fields.
static PrefixTuple readPrefix(const std::vector< uint8_t > &buf)
Read prefix from a buffer.
static asiolink::IOAddress readAddress(const std::vector< uint8_t > &buf, const short family)
Read IPv4 or IPv6 address from a buffer.
static void writeFqdn(const std::string &fqdn, std::vector< uint8_t > &buf, const bool downcase=false)
Append FQDN into a buffer.
static void writePrefix(const PrefixLen &prefix_len, const asiolink::IOAddress &prefix, std::vector< uint8_t > &buf)
Append prefix into a buffer.
static const std::string & getDataTypeName(const OptionDataType data_type)
Return option data type name from the data type enumerator.
static int getDataTypeLen(const OptionDataType data_type)
Get data type buffer length.
static std::string readFqdn(const std::vector< uint8_t > &buf)
Read FQDN from a buffer as a string value.
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.
static PSIDTuple readPsid(const std::vector< uint8_t > &buf)
Read PSID length / value tuple from a buffer.
static void writePsid(const PSIDLen &psid_len, const PSID &psid, std::vector< uint8_t > &buf)
Append PSID length/value into a buffer.
static void writeString(const std::string &value, std::vector< uint8_t > &buf)
Write UTF8-encoded string into a buffer.
static void writeTuple(const std::string &value, OpaqueDataTuple::LengthFieldType lengthfieldtype, std::vector< uint8_t > &buf)
Append length and string tuple to a buffer.
static OpaqueDataTuple::LengthFieldType getTupleLenFieldType(Option::Universe u)
Returns Length Field Type for a tuple.
static void writeBool(const bool value, std::vector< uint8_t > &buf)
Append boolean value into a buffer.
static bool readBool(const std::vector< uint8_t > &buf)
Read boolean value from a buffer.
static std::string readString(const std::vector< uint8_t > &buf)
Read string value from a buffer.
Base class representing a DHCP option definition.
OptionDataType getType() const
Return option data type.
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.
bool getArrayType() const
Return array type indicator.
std::string headerToText(const int indent=0, const std::string &type_name="") const
Returns option header in the textual format.
std::string suboptionsToText(const int indent=0) const
Returns collection of suboptions in the textual format.
std::string getEncapsulatedSpace() const
Returns the name of the option space encapsulated by this option.
void setEncapsulatedSpace(const std::string &encapsulated_space)
Sets the name of the option space encapsulated by this option.
virtual const OptionBuffer & getData() const
Returns pointer to actual data.
virtual uint16_t getHeaderLen() const
Returns length of header (2 for v4, 4 for v6)
Universe
defines option universe DHCPv4 or DHCPv6
void unpackOptions(const OptionBuffer &buf)
Builds a collection of sub options from the buffer.
void packOptions(isc::util::OutputBuffer &buf, bool check=true) const
Store sub options in a buffer.
OptionCollection options_
collection for storing suboptions
Universe getUniverse() const
returns option universe (V4 or V6)
void packHeader(isc::util::OutputBuffer &buf, bool check=true) const
Store option's header in a buffer.
void check() const
A protected method used for option correctness.
Encapsulates PSID length.
Encapsulates prefix length.
The OutputBuffer class is a buffer abstraction for manipulating mutable data.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
#define isc_throw_assert(expr)
Replacement for assert() that throws if the expression is false.
std::pair< PSIDLen, PSID > PSIDTuple
Defines a pair of PSID length / value.
OptionBuffer::const_iterator OptionBufferConstIter
const_iterator for walking over OptionBuffer
OptionDataType
Data types of DHCP option fields.
std::pair< PrefixLen, asiolink::IOAddress > PrefixTuple
Defines a pair of prefix length / value.
std::vector< uint8_t > OptionBuffer
buffer types used in DHCP code.
boost::shared_ptr< Option > OptionPtr
string encodeHex(const vector< uint8_t > &binary)
Encode binary data in the base16 format.
bool isPrintable(const string &content)
Check if a string is printable.
Defines the logger used by the top-level component of kea-lfc.