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);
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() {
167 std::vector<OptionBuffer> buffers;
184 field != fields.end(); ++field) {
186 createBuffer(buf, *field);
189 buffers.push_back(buf);
201 createBuffer(buf, data_type);
203 buffers.push_back(buf);
208 std::swap(buffers, buffers_);
212OptionCustom::bufferLength(
const OptionDataType data_type,
bool in_array,
213 OptionBuffer::const_iterator begin,
214 OptionBuffer::const_iterator end)
const {
222 if (data_size == 0) {
233 data_size = fqdn.size() + 1;
243 data_size = std::distance(begin, end);
249 if ((begin == end) && !in_array)
255 data_size =
sizeof(uint8_t) + (prefix.first.asUint8() + 7) / 8;
261 data_size = value.size();
277OptionCustom::createBuffers(
const OptionBuffer& data_buf) {
282 std::vector<OptionBuffer> buffers;
283 OptionBuffer::const_iterator data = data_buf.begin();
295 field != fields.end(); ++field) {
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;
409 text << static_cast<int>(readInteger<int8_t>(index));
412 text << readInteger<int16_t>(index);
415 text << readInteger<int32_t>(index);
418 text << static_cast<unsigned>(readInteger<uint8_t>(index));
421 text << readInteger<uint16_t>(index);
424 text << readInteger<uint32_t>(index);
431 text <<
"\"" <<
readFqdn(index) <<
"\"";
434 text <<
"\"" <<
readTuple(index) <<
"\"";
442 text <<
"len=" << t.first.asUnsigned() <<
",psid=" << t.second.asUint16();
461 for (std::vector<OptionBuffer>::const_iterator it = buffers_.begin();
462 it != buffers_.end(); ++it) {
483 if (buffers_[index].size() == asiolink::V4ADDRESS_LEN) {
485 }
else if (buffers_[index].size() == asiolink::V6ADDRESS_LEN) {
489 <<
" IP address. Invalid buffer length "
490 << buffers_[index].size() <<
".");
496 const uint32_t index) {
499 if ((address.
isV4() && buffers_[index].size() != V4ADDRESS_LEN) ||
500 (address.
isV6() && buffers_[index].size() != V6ADDRESS_LEN)) {
502 << address <<
". Expected a valid IPv"
503 << (buffers_[index].size() == V4ADDRESS_LEN ?
"4" :
"6")
509 std::swap(buf, buffers_[index]);
515 return (buffers_[index]);
520 const uint32_t index) {
522 buffers_[index] = buf;
534 const uint32_t index)
const {
543 buffers_[index].clear();
552 buffers_[index].clear();
566 buffers_[index].clear();
590 std::swap(buffers_[index], buf);
602 const uint32_t index) {
609 std::swap(buffers_[index], buf);
621 const uint32_t index) {
628 std::swap(buffers_[index], buf);
645 buffers_[index].clear();
665 for (std::vector<OptionBuffer>::const_iterator buf = buffers_.begin();
666 buf != buffers_.end(); ++buf) {
667 length += buf->size();
671 for (OptionCollection::const_iterator it =
options_.begin();
674 length += (*it).second->len();
677 return (
static_cast<uint16_t
>(length));
682 setData(first, last);
690 std::stringstream output;
703 field != fields.end(); ++field) {
704 output <<
" " << dataFieldToText(*field, std::distance(fields.begin(),
711 output <<
" " << dataFieldToText(fields.back(), i);
721 output <<
" " << dataFieldToText(definition_.
getType(), i);
728 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.
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.
std::vector< OptionDataType >::const_iterator RecordFieldsConstIter
Const iterator for record data fields.
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.
std::string getEncapsulatedSpace() const
Return name of the encapsulated option space.
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.
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.
OptionDataType
Data types of DHCP option fields.
OptionBuffer::const_iterator OptionBufferConstIter
const_iterator for walking over OptionBuffer
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 ('hex') format.
Defines the logger used by the top-level component of kea-lfc.