40 :
Option(u, def.getCode(), first, last),
58 << address <<
". Expected a valid IPv"
60 "4" :
"6") <<
" address.");
65 buffers_.push_back(buf);
75 buffers_.push_back(buf);
84 buffers_.push_back(buf);
93 buffers_.push_back(buf);
103 " an option comprising an array of IPv6 prefix values");
108 buffers_.push_back(buf);
117 " an option comprising an array of PSID length / value"
123 buffers_.push_back(buf);
127OptionCustom::checkIndex(
const uint32_t index)
const {
128 if (index >= buffers_.size()) {
130 <<
" is out of range.");
146 if (data_size == 0) {
159 buffer.resize(data_size);
164OptionCustom::createBuffers() {
165 definition_.validate();
167 std::vector<OptionBuffer> buffers;
181 definition_.getRecordFields();
183 for (
auto const& field : fields) {
185 createBuffer(buf, field);
188 buffers.push_back(buf);
190 }
else if (!definition_.getArrayType() &&
200 createBuffer(buf, data_type);
202 buffers.push_back(buf);
207 std::swap(buffers, buffers_);
211OptionCustom::bufferLength(
const OptionDataType data_type,
bool in_array,
212 OptionBuffer::const_iterator begin,
213 OptionBuffer::const_iterator end)
const {
221 if (data_size == 0) {
232 data_size = fqdn.size() + 1;
233 }
else if (!definition_.getArrayType() &&
242 data_size = std::distance(begin, end);
248 if ((begin == end) && !in_array)
254 data_size =
sizeof(uint8_t) + (prefix.first.asUint8() + 7) / 8;
260 data_size = value.size();
268 isc_throw(OutOfRange,
"option buffer truncated");
276OptionCustom::createBuffers(
const OptionBuffer& data_buf) {
279 definition_.validate();
281 std::vector<OptionBuffer> buffers;
282 OptionBuffer::const_iterator data = data_buf.begin();
290 definition_.getRecordFields();
293 for (
auto const& field : fields) {
294 size_t data_size = bufferLength(field,
false,
295 data, data_buf.end());
299 if (std::distance(data, data_buf.end()) < data_size) {
300 isc_throw(OutOfRange,
"option buffer truncated");
304 buffers.push_back(
OptionBuffer(data, data + data_size));
310 if (definition_.getArrayType()) {
311 while (data != data_buf.end()) {
313 size_t data_size = bufferLength(fields.back(),
true,
314 data, data_buf.end());
316 if (std::distance(data, data_buf.end()) < data_size) {
319 buffers.push_back(
OptionBuffer(data, data + data_size));
341 if (std::distance(data, data_buf.end()) < data_size) {
342 isc_throw(OutOfRange,
"option buffer truncated");
346 if (definition_.getArrayType()) {
347 while (data != data_buf.end()) {
348 data_size = bufferLength(data_type,
true, data, data_buf.end());
360 if (std::distance(data, data_buf.end()) < data_size) {
363 buffers.push_back(
OptionBuffer(data, data + data_size));
370 data_size = bufferLength(data_type,
false, data, data_buf.end());
371 if ((data_size > 0) && (std::distance(data, data_buf.end()) >= data_size)) {
372 buffers.push_back(
OptionBuffer(data, data + data_size));
375 isc_throw(OutOfRange,
"option buffer truncated");
390 std::swap(buffers_, buffers);
395 const uint32_t index)
const {
396 std::ostringstream text;
410 text << readInteger<int16_t>(index);
413 text << readInteger<int32_t>(index);
419 text << readInteger<uint16_t>(index);
422 text << readInteger<uint32_t>(index);
429 text <<
"\"" <<
readFqdn(index) <<
"\"";
432 text <<
"\"" <<
readTuple(index) <<
"\"";
440 text <<
"len=" << t.first.asUnsigned() <<
",psid=" << t.second.asUint16();
459 for (
auto const& it : buffers_) {
480 if (buffers_[index].size() == asiolink::V4ADDRESS_LEN) {
482 }
else if (buffers_[index].size() == asiolink::V6ADDRESS_LEN) {
486 <<
" IP address. Invalid buffer length "
487 << buffers_[index].size() <<
".");
493 const uint32_t index) {
496 if ((address.
isV4() && buffers_[index].size() != V4ADDRESS_LEN) ||
497 (address.
isV6() && buffers_[index].size() != V6ADDRESS_LEN)) {
499 << address <<
". Expected a valid IPv"
500 << (buffers_[index].size() == V4ADDRESS_LEN ?
"4" :
"6")
506 std::swap(buf, buffers_[index]);
512 return (buffers_[index]);
517 const uint32_t index) {
519 buffers_[index] = buf;
531 const uint32_t index)
const {
540 buffers_[index].clear();
549 buffers_[index].clear();
563 buffers_[index].clear();
587 std::swap(buffers_[index], buf);
599 const uint32_t index) {
606 std::swap(buffers_[index], buf);
618 const uint32_t index) {
625 std::swap(buffers_[index], buf);
642 buffers_[index].clear();
662 for (
auto const& buf : buffers_) {
663 length += buf.size();
668 length += it.second->len();
671 return (
static_cast<uint16_t
>(length));
676 setData(first, last);
684 std::stringstream output;
691 definition_.getRecordFields();
697 for (
auto const& field : fields) {
698 output <<
" " << dataFieldToText(field, j);
703 if (definition_.getArrayType()) {
705 output <<
" " << dataFieldToText(fields.back(), i);
715 output <<
" " << dataFieldToText(definition_.getType(), i);
722 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)
bool isV6() const
Convenience function to check for an IPv6 address.
bool isV4() const
Convenience function to check for an IPv4 address.
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.
T readInteger(const uint32_t index=0) const
Read a buffer as integer value.
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.
std::vector< OptionDataType > RecordFieldsCollection
List of fields within the record.
std::string getEncapsulatedSpace() const
Return name of the encapsulated option space.
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
OptionPtr cloneInternal() const
Copies this option and returns a pointer to the copy.
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.
Option(Universe u, uint16_t type)
ctor, used for options constructed, usually during transmission
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.
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.
#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.
Defines the logger used by the top-level component of kea-lfc.