X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2F80221Bundle%2FTLVParser.cc;h=db7ef8b045997babc3e1b37d5c2f4e32e6683f1c;hb=33adfa86c0b25cb6eeda0fa12d47e077e488375a;hp=8f9d942caa3ed09efcfa366642384cf4541985cc;hpb=482523171f06cf239fd7e8c991f81711c02cf0ba;p=senf.git diff --git a/senf/Packets/80221Bundle/TLVParser.cc b/senf/Packets/80221Bundle/TLVParser.cc index 8f9d942..db7ef8b 100644 --- a/senf/Packets/80221Bundle/TLVParser.cc +++ b/senf/Packets/80221Bundle/TLVParser.cc @@ -29,12 +29,15 @@ // Custom includes #include #include +#include #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// SENF_PACKET_TLV_REGISTRY_REGISTER( senf::MIHFSrcIdTLVParser ); SENF_PACKET_TLV_REGISTRY_REGISTER( senf::MIHFDstIdTLVParser ); +SENF_PACKET_TLV_REGISTRY_REGISTER( senf::MIHStatusTLVParser ); +SENF_PACKET_TLV_REGISTRY_REGISTER( senf::MIHValidTimeIntervalTLVParser ); /////////////////////////////////////////////////////////////////////////// // senf::MIHFIdTLVParser @@ -42,14 +45,46 @@ SENF_PACKET_TLV_REGISTRY_REGISTER( senf::MIHFDstIdTLVParser ); prefix_ void senf::MIHFIdTLVParser::dump(std::ostream & os) const { - os << senf::fieldName(" type") << unsigned (type()) << "\n" - << senf::fieldName(" length") << unsigned (length()) << "\n" - << " value:\n"; - std::string src_mihfId (asString()); + senf::format::IndentHelper indent; + os << indent << "type: " << unsigned (type()) << std::endl + << indent << "length: " << unsigned (length()) << std::endl + << indent << "value:\n"; + std::string src_mihfId (valueAsString()); hexdump(src_mihfId.begin(), src_mihfId.end(), os); } -prefix_ void senf::MIHFIdTLVParser::setString(std::string const &id) +prefix_ void senf::MIHFIdTLVParser::finalize() +{ + protect(), idLength_().finalize(); + length_() << idLength() + idLength_().bytes(); + MIHBaseTLVParser::finalize(); +} + +prefix_ void senf::MIHFIdTLVParser::maxIdLength(boost::uint8_t maxLength) +{ + // the maximum length of a MIHF_ID is 253 octets (see F.3.11 in 802.21) + if (maxLength > 253) + throw std::length_error("maximum length of a MIHF_ID is 253 octets"); + protect(), idLength_().maxValue( maxLength); + maxLengthValue( maxLength + 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()); // the maximum length of a MIHF_ID is 253 octets (see F.3.11 in 802.21) @@ -59,30 +94,35 @@ prefix_ void senf::MIHFIdTLVParser::setString(std::string const &id) std::copy( id.begin(), id.end(), si); } -prefix_ void senf::MIHFIdTLVParser::setMACAddress(senf::MACAddress const &mac) +prefix_ void senf::MIHFIdTLVParser::value(senf::MACAddress const & addr) { - safe_data_iterator si = resizeValueField(12); - std::copy( mac.begin(), mac.end(), getNAIEncodedOutputIterator(si)); + safe_data_iterator si = resizeValueField(6*2); + std::copy( addr.begin(), addr.end(), getNAIEncodedOutputIterator(si)); } -prefix_ void senf::MIHFIdTLVParser::setINet4Address(senf::INet4Address const &addr) +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::setINet6Address(senf::INet6Address const &addr) +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::setEUI64(senf::EUI64 const &addr) +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)); } +prefix_ void senf::MIHFIdTLVParser::value( MIHFId const & id) +{ + boost::apply_visitor( ValueSetterVisitor(*this), id); +} + prefix_ senf::MIHFId senf::MIHFIdTLVParser::valueAs(MIHFId::Type type) const { @@ -91,15 +131,15 @@ prefix_ senf::MIHFId senf::MIHFIdTLVParser::valueAs(MIHFId::Type type) case MIHFId::Empty: return MIHFId(); case MIHFId::MACAddress: - return MIHFId( asMACAddress()); + return MIHFId( valueAsMACAddress()); case MIHFId::INet4Address: - return MIHFId( asINet4Address()); + return MIHFId( valueAsINet4Address()); case MIHFId::INet6Address: - return MIHFId( asINet6Address()); + return MIHFId( valueAsINet6Address()); case MIHFId::String: - return MIHFId( asINet6Address()); + return MIHFId( valueAsString()); case MIHFId::EUI64: - return MIHFId( asINet6Address()); + return MIHFId( valueAsEUI64()); } return MIHFId(); } @@ -111,7 +151,8 @@ prefix_ senf::MIHFId senf::MIHFIdTLVParser::valueAs(MIHFId::Type type) prefix_ void senf::MIHFSrcIdTLVParser::dump(std::ostream & os) const { - os << " source MIHF_Id TLV:\n"; + senf::format::IndentHelper indent; + os << indent << "source MIHF_Id TLV:\n"; MIHFIdTLVParser::dump(os); } @@ -121,27 +162,80 @@ prefix_ void senf::MIHFSrcIdTLVParser::dump(std::ostream & os) prefix_ void senf::MIHFDstIdTLVParser::dump(std::ostream & os) const { - os << " destination MIHF_Id TLV:\n"; + senf::format::IndentHelper indent; + os << indent << "destination MIHF_Id TLV:\n"; MIHFIdTLVParser::dump(os); } /////////////////////////////////////////////////////////////////////////// -// MIHBaseTLVParser +// senf::MIHStatusTLVParser -prefix_ senf::safe_data_iterator senf::MIHBaseTLVParser::resizeValueField( - MIHTLVLengthParser::value_type size) +prefix_ void senf::MIHStatusTLVParser::dump(std::ostream & os) + const { - MIHTLVLengthParser::value_type current_length ( length()); - length_() << size; + senf::format::IndentHelper indent; + os << indent << "Status TLV:" << std::endl; + indent.increase(); + os << indent << "type: " << unsigned( type()) << std::endl + << indent << "length: " << unsigned( length()) << " byte(s)" << std::endl + << indent << "value: " << unsigned( value()); + switch (value()) { + case Success: + os << " (Success)" << std::endl; + return; + case UnspecifiedFailure: + os << " (Unspecified Failure)" << std::endl; + return; + case Rejected: + os << " (Rejected)" << std::endl; + return; + case AuthorizationFailure: + os << " (Authorization Failure)" << std::endl; + return; + case NetworkError: + os << " (Network Error)" << std::endl; + return; + } + os << " (???; invalid value!)" << std::endl; +} - 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::MIHRegisterReqCodeTLVParser + +prefix_ void senf::MIHRegisterReqCodeTLVParser::dump(std::ostream & os) + const +{ + senf::format::IndentHelper indent; + os << indent << "Register Request Code TLV:" << std::endl; + indent.increase(); + os << indent << "type: " << unsigned( type()) << std::endl + << indent << "length: " << unsigned( length()) << " byte(s)" << std::endl + << indent << "value: " << unsigned( value()); + switch (value()) { + case Registration: + os << " (Registration)" << std::endl; + return; + case ReRegistration: + os << " (Re-Registration)" << std::endl; + return; + } + os << " (???; invalid value!)" << std::endl; } +/////////////////////////////////////////////////////////////////////////// +// senf::MIHValidTimeIntervalTLVParser + +prefix_ void senf::MIHValidTimeIntervalTLVParser::dump(std::ostream & os) + const +{ + senf::format::IndentHelper indent; + os << indent << "Valid Time Interval TLV:" << std::endl; + indent.increase(); + os << indent << "type: " << unsigned( type()) << std::endl + << indent << "length: " << unsigned( length()) << " byte(s)" << std::endl + << indent << "value: " << unsigned( value()) + << ( value()==0 ? " (infinite)" : " seconds") << std::endl; +} /////////////////////////////////////////////////////////////////////////// // senf::MIHTLVLengthParser @@ -246,7 +340,7 @@ prefix_ void senf::MIHTLVLengthParser::finalize() if (b != 5) resize_(5); } -prefix_ void senf::MIHTLVLengthParser:: maxValue(MIHTLVLengthParser::value_type v) +prefix_ void senf::MIHTLVLengthParser::maxValue(MIHTLVLengthParser::value_type v) { if (v <= 128) return;