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) {
235 data_size = fqdn.size() + 1;
236 }
catch (
const std::exception& ex) {
238 isc_throw(SkipThisOptionError,
"failed to read "
239 "domain-name from wire format: "
254 data_size = std::distance(begin, end);
260 if ((begin == end) && !in_array)
266 data_size =
sizeof(uint8_t) + (prefix.first.asUint8() + 7) / 8;
272 data_size = value.size();
288OptionCustom::createBuffers(
const OptionBuffer& data_buf) {
293 std::vector<OptionBuffer> buffers;
294 OptionBuffer::const_iterator data = data_buf.begin();
305 for (
auto const& field : fields) {
306 size_t data_size = bufferLength(field,
false,
307 data, data_buf.end());
311 if (std::distance(data, data_buf.end()) < data_size) {
316 buffers.push_back(
OptionBuffer(data, data + data_size));
323 while (data != data_buf.end()) {
325 size_t data_size = bufferLength(fields.back(),
true,
326 data, data_buf.end());
328 if (std::distance(data, data_buf.end()) < data_size) {
331 buffers.push_back(
OptionBuffer(data, data + data_size));
353 if (std::distance(data, data_buf.end()) < data_size) {
359 while (data != data_buf.end()) {
360 data_size = bufferLength(data_type,
true, data, data_buf.end());
372 if (std::distance(data, data_buf.end()) < data_size) {
375 buffers.push_back(
OptionBuffer(data, data + data_size));
382 data_size = bufferLength(data_type,
false, data, data_buf.end());
383 if ((data_size > 0) && (std::distance(data, data_buf.end()) >= data_size)) {
384 buffers.push_back(
OptionBuffer(data, data + data_size));
402 std::swap(buffers_, buffers);
407 const uint32_t index)
const {
408 std::ostringstream text;
420 std::string printable(data.cbegin(), data.cend());
421 text <<
" '" << printable <<
"'";
430 text << static_cast<int>(readInteger<int8_t>(index));
433 text << readInteger<int16_t>(index);
436 text << readInteger<int32_t>(index);
439 text << static_cast<unsigned>(readInteger<uint8_t>(index));
442 text << readInteger<uint16_t>(index);
445 text << readInteger<uint32_t>(index);
452 text <<
"\"" <<
readFqdn(index) <<
"\"";
455 text <<
"\"" <<
readTuple(index) <<
"\"";
463 text <<
"len=" << t.first.asUnsigned() <<
",psid=" << t.second.asUint16();
483 for (
auto const& it : buffers_) {
488 buf.writeData(&it[0], it.size());
504 if (buffers_[index].size() == asiolink::V4ADDRESS_LEN) {
506 }
else if (buffers_[index].size() == asiolink::V6ADDRESS_LEN) {
510 <<
" IP address. Invalid buffer length "
511 << buffers_[index].size() <<
".");
517 const uint32_t index) {
520 if ((address.isV4() && buffers_[index].size() != V4ADDRESS_LEN) ||
521 (address.isV6() && buffers_[index].size() != V6ADDRESS_LEN)) {
523 << address <<
". Expected a valid IPv"
524 << (buffers_[index].size() == V4ADDRESS_LEN ?
"4" :
"6")
530 std::swap(buf, buffers_[index]);
536 return (buffers_[index]);
541 const uint32_t index) {
543 buffers_[index] = buf;
555 const uint32_t index)
const {
564 buffers_[index].clear();
573 buffers_[index].clear();
587 buffers_[index].clear();
611 std::swap(buffers_[index], buf);
623 const uint32_t index) {
630 std::swap(buffers_[index], buf);
642 const uint32_t index) {
649 std::swap(buffers_[index], buf);
666 buffers_[index].clear();
686 for (
auto const& buf : buffers_) {
687 length += buf.size();
692 length += it.second->len();
695 return (
static_cast<uint16_t
>(length));
700 setData(first, last);
708 std::stringstream output;
721 for (
auto const& field : fields) {
722 output <<
" " << dataFieldToText(field, j);
729 output <<
" " << dataFieldToText(fields.back(), i);
739 output <<
" " << dataFieldToText(definition_.
getType(), i);
746 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.
static bool lenient_parsing_
Governs whether options should be parsed less strictly.
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.