SENF_PACKET_TLV_REGISTRY_REGISTER( senf::MIHValidTimeIntervalTLVParser );
///////////////////////////////////////////////////////////////////////////
+// senf::MIHBaseListTLVParser
+
+prefix_ void senf::MIHBaseListTLVParser::maxListSize(MIHTLVLengthParser::value_type maxl)
+ const
+{
+ protect(), listSize_().capacity( maxl);
+ maxLength( maxl + senf::bytes(listSize_()));
+}
+
+///////////////////////////////////////////////////////////////////////////
// senf::MIHFIdTLVParser
prefix_ void senf::MIHFIdTLVParser::dump(std::ostream & os)
hexdump(src_mihfId.begin(), src_mihfId.end(), os);
}
+prefix_ void senf::MIHFIdTLVParser::finalize()
+{
+ protect(), idLength_().finalize();
+ length_() << idLength() + senf::bytes(idLength_());
+ MIHBaseTLVParser::finalize();
+}
+
+prefix_ void senf::MIHFIdTLVParser::maxIdLength(boost::uint8_t maxl)
+ const
+{
+ // the maximum length of a MIHF_ID is 253 octets (see F.3.11 in 802.21)
+ if (maxl > 253)
+ throw std::length_error("maximum length of a MIHF_ID is 253 octets");
+ protect(), idLength_().capacity( maxl);
+ maxLength( maxl + senf::bytes(idLength_()));
+}
+
+prefix_ senf::safe_data_iterator senf::MIHFIdTLVParser::resizeValueField(
+ MIHTLVLengthParser::value_type size)
+{
+ MIHTLVLengthParser::value_type current_length ( idLength());
+ idLength_() << size;
+ length_() << size + idLength_().bytes();
+
+ safe_data_iterator si (data(), valueBegin());
+ if (current_length > size)
+ data().erase( si, boost::next(si, current_length-size));
+ else
+ data().insert( si, size-current_length, 0);
+ return si;
+}
+
prefix_ void senf::MIHFIdTLVParser::value(std::string const & id)
{
size_type str_size (id.size());
prefix_ void senf::MIHFIdTLVParser::value(senf::MACAddress const & addr)
{
- safe_data_iterator si = resizeValueField(12);
+ safe_data_iterator si = resizeValueField(6*2);
std::copy( addr.begin(), addr.end(), getNAIEncodedOutputIterator(si));
}
prefix_ void senf::MIHFIdTLVParser::value(senf::INet4Address const & addr)
{
- safe_data_iterator si = resizeValueField(8);
+ safe_data_iterator si = resizeValueField(4*2);
std::copy( addr.begin(), addr.end(), getNAIEncodedOutputIterator(si));
}
prefix_ void senf::MIHFIdTLVParser::value(senf::INet6Address const & addr)
{
- safe_data_iterator si = resizeValueField(32);
+ safe_data_iterator si = resizeValueField(16*2);
std::copy( addr.begin(), addr.end(), getNAIEncodedOutputIterator(si));
}
prefix_ void senf::MIHFIdTLVParser::value(senf::EUI64 const & addr)
{
- safe_data_iterator si = resizeValueField(16);
+ safe_data_iterator si = resizeValueField(8*2);
std::copy( addr.begin(), addr.end(), getNAIEncodedOutputIterator(si));
}
<< ( value()==0 ? " (infinite)" : " seconds") << std::endl;
}
-
-///////////////////////////////////////////////////////////////////////////
-// senf::MIHBaseTLVParser
-
-prefix_ senf::safe_data_iterator senf::MIHBaseTLVParser::resizeValueField(
- MIHTLVLengthParser::value_type size)
-{
- MIHTLVLengthParser::value_type current_length ( length());
- length_() << size;
-
- safe_data_iterator si (data(), boost::next(i(), 1 + length_().bytes() ));
- if (current_length > size)
- data().erase( si, boost::next(si, current_length-size));
- else
- data().insert( si, size-current_length, 0);
- return si;
-}
-
-
///////////////////////////////////////////////////////////////////////////
// senf::MIHTLVLengthParser
underflow_flag() = (v <= 128);
}
-prefix_ senf::MIHTLVLengthParser::value_type senf::MIHTLVLengthParser::maxValue()
+prefix_ senf::MIHTLVLengthParser::value_type senf::MIHTLVLengthParser::capacity()
const
{
switch (bytes() ) {
if (b != 5) resize_(5);
}
-prefix_ void senf::MIHTLVLengthParser:: maxValue(MIHTLVLengthParser::value_type v)
+prefix_ void senf::MIHTLVLengthParser::capacity(MIHTLVLengthParser::value_type v)
{
if (v <= 128)
return;