2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-08-30 21:45:37 +00:00

[2312] Return option length.

This commit is contained in:
Marcin Siodelski
2012-11-27 11:48:25 +01:00
parent c12d1b3b6e
commit 0a5970240b

View File

@@ -134,6 +134,10 @@ OptionCustom::pack6(isc::util::OutputBuffer& buf) {
void
OptionCustom::readAddress(const uint32_t index, asiolink::IOAddress& address) const {
checkIndex(index);
// The address being read can be either IPv4 or IPv6. The decision
// is made based on the buffer length. If it holds 4 bytes it is IPv4
// address, if it holds 16 bytes it is IPv6.
if (buffers_[index].size() == asiolink::V4ADDRESS_LEN) {
OptionDataTypeUtil::readAddress(buffers_[index], AF_INET, address);
} else if (buffers_[index].size() == asiolink::V6ADDRESS_LEN) {
@@ -170,22 +174,22 @@ OptionCustom::unpack(OptionBufferConstIter begin,
uint16_t
OptionCustom::len() {
// Returns length of the complete option (data length + DHCPv4/DHCPv6
// option header)
// The length of the option is a sum of option header ...
int length = getHeaderLen();
// length of the whole option is header and data stored in this option...
int length = getHeaderLen() + data_.size();
// ... lengths of all buffers that hold option data ...
for (std::vector<OptionBuffer>::const_iterator buf = buffers_.begin();
buf != buffers_.end(); ++buf) {
length += buf.size();
}
// ... and sum of lengths of all suboptions
// ... and lengths of all suboptions
for (OptionCustom::OptionCollection::iterator it = options_.begin();
it != options_.end();
++it) {
length += (*it).second->len();
}
// note that this is not equal to lenght field. This value denotes
// number of bytes required to store this option. length option should
// contain (len()-getHeaderLen()) value.
return (length);
}
@@ -225,6 +229,8 @@ void OptionCustom::setData(const OptionBufferConstIter first,
data_.resize(std::distance(first, last));
std::copy(first, last, data_.begin());
// Chop the data_ buffer into set of buffers that represent
// option fields data.
createBuffers();
}