OptionCustom::addArrayDataField(const std::string& value) {
checkArrayType();
- OpaqueDataTuple::LengthFieldType lft = getUniverse() == Option::V4 ?
- OpaqueDataTuple::LENGTH_1_BYTE : OpaqueDataTuple::LENGTH_2_BYTES;
+ OpaqueDataTuple::LengthFieldType lft = OptionDataTypeUtil::getTupleLenFieldType(getUniverse());
OptionBuffer buf;
OptionDataTypeUtil::writeTuple(value, lft, buf);
buffers_.push_back(buf);
data_size = sizeof(uint8_t) + (prefix.first.asUint8() + 7) / 8;
} else if (data_type == OPT_TUPLE_TYPE) {
OpaqueDataTuple::LengthFieldType lft =
- getUniverse() == Option::V4 ?
- OpaqueDataTuple::LENGTH_1_BYTE :
- OpaqueDataTuple::LENGTH_2_BYTES;
+ OptionDataTypeUtil::getTupleLenFieldType(getUniverse());
std::string value =
OptionDataTypeUtil::readTuple(OptionBuffer(begin, end), lft);
data_size = value.size();
std::string
OptionCustom::readTuple(const uint32_t index) const {
checkIndex(index);
- OpaqueDataTuple::LengthFieldType lft = getUniverse() == Option::V4 ?
- OpaqueDataTuple::LENGTH_1_BYTE : OpaqueDataTuple::LENGTH_2_BYTES;
+ OpaqueDataTuple::LengthFieldType lft = OptionDataTypeUtil::getTupleLenFieldType(getUniverse());
return (OptionDataTypeUtil::readTuple(buffers_[index], lft));
}
checkIndex(index);
buffers_[index].clear();
- OpaqueDataTuple::LengthFieldType lft = getUniverse() == Option::V4 ?
- OpaqueDataTuple::LENGTH_1_BYTE : OpaqueDataTuple::LENGTH_2_BYTES;
+ OpaqueDataTuple::LengthFieldType lft = OptionDataTypeUtil::getTupleLenFieldType(getUniverse());
OptionDataTypeUtil::writeTuple(value, lft, buffers_[index]);
}
buf.insert(buf.end(), binary.begin(), binary.end());
}
+OpaqueDataTuple::LengthFieldType
+OptionDataTypeUtil::getTupleLenFieldType(Option::Universe u) {
+ if (u == Option::V4) {
+ return OpaqueDataTuple::LENGTH_1_BYTE;
+ }
+ return OpaqueDataTuple::LENGTH_2_BYTES;
+}
+
std::string
OptionDataTypeUtil::readTuple(const std::vector<uint8_t>& buf,
OpaqueDataTuple::LengthFieldType lengthfieldtype) {
static void writeTuple(const OpaqueDataTuple& tuple,
std::vector<uint8_t>& buf);
+ /// @brief Returns Length Field Type for a tuple.
+ ///
+ /// Returns Length Field Type for a tuple basing on the given
+ /// Option v4/v6 Universe.
+ ///
+ /// @param u specifies universe (V4 or V6)
+ /// @return By default 1 octet Length Field Type for V4 option
+ /// or 2 octets Length Field Type for V6 option
+ static OpaqueDataTuple::LengthFieldType getTupleLenFieldType(Option::Universe u);
+
/// @brief Read boolean value from a buffer.
///
/// @param buf input buffer.
return;
case OPT_TUPLE_TYPE:
{
- OpaqueDataTuple::LengthFieldType lft = u == Option::V4 ?
- OpaqueDataTuple::LENGTH_1_BYTE : OpaqueDataTuple::LENGTH_2_BYTES;
+ OpaqueDataTuple::LengthFieldType lft;
+ if (getCode() == DHO_V4_SZTP_REDIRECT) {
+ lft = OpaqueDataTuple::LENGTH_2_BYTES;
+ } else {
+ lft = OptionDataTypeUtil::getTupleLenFieldType(u);
+ }
OptionDataTypeUtil::writeTuple(value, lft, buf);
return;
}
#include <dhcp/option.h>
#include <util/buffer.h>
#include <boost/shared_ptr.hpp>
+#include "option_data_types.h"
#include <stdint.h>
namespace isc {
if (prefLenFieldType_ != OpaqueDataTuple::LENGTH_EMPTY) {
return (prefLenFieldType_);
}
- return (universe_ == Option::V6 ? OpaqueDataTuple::LENGTH_2_BYTES :
- OpaqueDataTuple::LENGTH_1_BYTE);
+ return (OptionDataTypeUtil::getTupleLenFieldType(getUniverse()));
}
/// @brief Returns minimal length of the option for the given universe.
size_t offset = 0;
while (offset < std::distance(begin, end)) {
// Parse a tuple.
- OpaqueDataTuple tuple(getLengthFieldType(), begin + offset, end);
+ OpaqueDataTuple tuple(OptionDataTypeUtil::getTupleLenFieldType(getUniverse()),
+ begin + offset, end);
addTuple(tuple);
// The tuple has been parsed correctly which implies that it is safe to
// advance the offset by its total length.
void
OptionVendorClass::addTuple(const OpaqueDataTuple& tuple) {
- if (tuple.getLengthFieldType() != getLengthFieldType()) {
+ if (tuple.getLengthFieldType() != OptionDataTypeUtil::getTupleLenFieldType(getUniverse())) {
isc_throw(isc::BadValue, "attempted to add opaque data tuple having"
" invalid size of the length field "
<< tuple.getDataFieldSize() << " to Vendor Class option");
" vendor option at position " << at << " which is out of"
" range");
- } else if (tuple.getLengthFieldType() != getLengthFieldType()) {
+ } else if (tuple.getLengthFieldType() != OptionDataTypeUtil::getTupleLenFieldType(getUniverse())) {
isc_throw(isc::BadValue, "attempted to set opaque data tuple having"
" invalid size of the length field "
<< tuple.getDataFieldSize() << " to Vendor Class option");
#include <dhcp/option.h>
#include <util/buffer.h>
#include <boost/shared_ptr.hpp>
+#include "option_data_types.h"
#include <stdint.h>
namespace isc {
}
}
- /// @brief Returns the tuple length field type for the given universe.
- ///
- /// This function returns the length field type which should be used
- /// for the opaque data tuples being added to this option.
- ///
- /// @return Tuple length field type for the universe this option belongs to.
- OpaqueDataTuple::LengthFieldType getLengthFieldType() const {
- return (getUniverse() == V4 ? OpaqueDataTuple::LENGTH_1_BYTE :
- OpaqueDataTuple::LENGTH_2_BYTES);
- }
-
/// @brief Returns minimal length of the option for the given universe.
///
/// For DHCPv6, The Vendor Class option mandates a 2-byte