X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2F80221Bundle%2FTLVParser.cc;h=ca70a1ccbd8e8cdbb22342920bc7920f03cf5d45;hb=f13780e9e4da7df981d6f6542fbdc714beb34765;hp=80d2ce76f5f3162886b6b51c9ddb59445b745b8a;hpb=0973cf085ba0ebc276342ac20643af2e8084e056;p=senf.git diff --git a/senf/Packets/80221Bundle/TLVParser.cc b/senf/Packets/80221Bundle/TLVParser.cc index 80d2ce7..ca70a1c 100644 --- a/senf/Packets/80221Bundle/TLVParser.cc +++ b/senf/Packets/80221Bundle/TLVParser.cc @@ -40,6 +40,16 @@ SENF_PACKET_TLV_REGISTRY_REGISTER( senf::MIHStatusTLVParser ); 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) @@ -53,6 +63,38 @@ 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()); @@ -65,25 +107,25 @@ prefix_ void senf::MIHFIdTLVParser::value(std::string const & id) 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)); } @@ -206,25 +248,6 @@ prefix_ void senf::MIHValidTimeIntervalTLVParser::dump(std::ostream & os) << ( 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 @@ -274,7 +297,7 @@ prefix_ void senf::MIHTLVLengthParser::value(value_type const & v) underflow_flag() = (v <= 128); } -prefix_ senf::MIHTLVLengthParser::value_type senf::MIHTLVLengthParser::maxValue() +prefix_ senf::MIHTLVLengthParser::value_type senf::MIHTLVLengthParser::capacity() const { switch (bytes() ) { @@ -328,7 +351,7 @@ prefix_ void senf::MIHTLVLengthParser::finalize() 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;