X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2F80221Bundle%2FTLVParser.cc;h=729b1ece583706b2247f715f54a849d628afe42b;hb=57daeae6f2e924ce3f16f9677c3474f531cba9e5;hp=ca70a1ccbd8e8cdbb22342920bc7920f03cf5d45;hpb=a05fb2ebf7d957628a15b5c1eb9fbf3512dfa548;p=senf.git diff --git a/senf/Packets/80221Bundle/TLVParser.cc b/senf/Packets/80221Bundle/TLVParser.cc index ca70a1c..729b1ec 100644 --- a/senf/Packets/80221Bundle/TLVParser.cc +++ b/senf/Packets/80221Bundle/TLVParser.cc @@ -27,19 +27,38 @@ //#include "TLVParser.ih" // 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 ); -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// +// MIHBaseTLVParser + +prefix_ void senf::MIHBaseTLVParser::validateType(boost::uint8_t expectedType) + const +{ + if (! check( 1 + senf::bytes(length_()) + length()) ) + throw InvalidMIHPacketException("truncated TLV.") << " Type: " << unsigned(type()); + if (type() != expectedType) + throw InvalidMIHPacketException("wrong TLV type. expected ") << unsigned(expectedType) << " got " << unsigned(type()); +} + +prefix_ void senf::MIHBaseTLVParser::validateTypeLength(boost::uint8_t expectedType, MIHTLVLengthParser::value_type expectedLength) + const +{ + validateType( expectedType); + if (length() != expectedLength) + throw InvalidMIHPacketException("invalid length in TLV.") << " Type: " << unsigned(type()); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHBaseListTLVParser prefix_ void senf::MIHBaseListTLVParser::maxListSize(MIHTLVLengthParser::value_type maxl) @@ -49,7 +68,7 @@ prefix_ void senf::MIHBaseListTLVParser::maxListSize(MIHTLVLengthParser::value_t maxLength( maxl + senf::bytes(listSize_())); } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHFIdTLVParser prefix_ void senf::MIHFIdTLVParser::dump(std::ostream & os) @@ -74,14 +93,14 @@ 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) + 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 size) { MIHTLVLengthParser::value_type current_length ( idLength()); idLength_() << size; @@ -99,9 +118,9 @@ 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) - if (str_size > 253) + if (str_size > 253) throw std::length_error("maximum length of a MIHF_ID is 253 octets"); - safe_data_iterator si = resizeValueField( str_size); + safe_data_iterator si = resizeValueField( str_size); std::copy( id.begin(), id.end(), si); } @@ -139,7 +158,7 @@ prefix_ senf::MIHFId senf::MIHFIdTLVParser::valueAs(MIHFId::Type type) { if (length() == 0) return MIHFId(); switch (type) { - case MIHFId::Empty: + case MIHFId::MulticastType: return MIHFId(); case MIHFId::MACAddress: return MIHFId( valueAsMACAddress()); @@ -156,7 +175,7 @@ prefix_ senf::MIHFId senf::MIHFIdTLVParser::valueAs(MIHFId::Type type) } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHFSrcIdTLVParser prefix_ void senf::MIHFSrcIdTLVParser::dump(std::ostream & os) @@ -167,7 +186,14 @@ prefix_ void senf::MIHFSrcIdTLVParser::dump(std::ostream & os) MIHFIdTLVParser::dump(os); } -/////////////////////////////////////////////////////////////////////////// +prefix_ void senf::MIHFSrcIdTLVParser::validate() + const +{ + validateType( typeId); +} + + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHFDstIdTLVParser prefix_ void senf::MIHFDstIdTLVParser::dump(std::ostream & os) @@ -178,7 +204,13 @@ prefix_ void senf::MIHFDstIdTLVParser::dump(std::ostream & os) MIHFIdTLVParser::dump(os); } -/////////////////////////////////////////////////////////////////////////// +prefix_ void senf::MIHFDstIdTLVParser::validate() + const +{ + validateType( typeId); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHStatusTLVParser prefix_ void senf::MIHStatusTLVParser::dump(std::ostream & os) @@ -194,7 +226,7 @@ prefix_ void senf::MIHStatusTLVParser::dump(std::ostream & os) case Success: os << " (Success)" << std::endl; return; - case UnspecifiedFailure: + case UnspecifiedFailure: os << " (Unspecified Failure)" << std::endl; return; case Rejected: @@ -210,7 +242,15 @@ prefix_ void senf::MIHStatusTLVParser::dump(std::ostream & os) os << " (???; invalid value!)" << std::endl; } -/////////////////////////////////////////////////////////////////////////// +prefix_ void senf::MIHStatusTLVParser::validate() + const +{ + validateTypeLength( typeId, 1); + if (value() >= 4) + throw InvalidMIHPacketException("invalid value in MIHStatusTLV ") << unsigned( value()); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHRegisterReqCodeTLVParser prefix_ void senf::MIHRegisterReqCodeTLVParser::dump(std::ostream & os) @@ -233,7 +273,15 @@ prefix_ void senf::MIHRegisterReqCodeTLVParser::dump(std::ostream & os) os << " (???; invalid value!)" << std::endl; } -/////////////////////////////////////////////////////////////////////////// +prefix_ void senf::MIHRegisterReqCodeTLVParser::validate() + const +{ + validateTypeLength( typeId, 1); + if (value() >= 2) + throw InvalidMIHPacketException("invalid value in MIHRegisterReqCodeTLV ") << unsigned( value()); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHValidTimeIntervalTLVParser prefix_ void senf::MIHValidTimeIntervalTLVParser::dump(std::ostream & os) @@ -248,10 +296,16 @@ prefix_ void senf::MIHValidTimeIntervalTLVParser::dump(std::ostream & os) << ( value()==0 ? " (infinite)" : " seconds") << std::endl; } -/////////////////////////////////////////////////////////////////////////// +prefix_ void senf::MIHValidTimeIntervalTLVParser::validate() + const +{ + validateTypeLength( typeId, 4); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHTLVLengthParser -prefix_ senf::MIHTLVLengthParser::value_type senf::MIHTLVLengthParser::value() const +prefix_ senf::MIHTLVLengthParser::value_type senf::MIHTLVLengthParser::value() const { switch (bytes() ) { case 1: @@ -269,7 +323,7 @@ prefix_ senf::MIHTLVLengthParser::value_type senf::MIHTLVLengthParser::value() c }; } -prefix_ void senf::MIHTLVLengthParser::value(value_type const & v) +prefix_ void senf::MIHTLVLengthParser::value(value_type const & v) { switch (bytes() ) { case 1: @@ -310,19 +364,19 @@ prefix_ senf::MIHTLVLengthParser::value_type senf::MIHTLVLengthParser::capacity( case 4: return UInt24Parser::max_value + 128; case 5: - return UInt32Parser::max_value; + return UInt32Parser::max_value; default: throw( MIHTLVLengthException()); }; } -prefix_ senf::MIHTLVLengthParser const & senf::MIHTLVLengthParser::operator= (value_type other) +prefix_ senf::MIHTLVLengthParser const & senf::MIHTLVLengthParser::operator= (value_type other) { value(other); - return *this; + return *this; } -prefix_ void senf::MIHTLVLengthParser::init() const +prefix_ void senf::MIHTLVLengthParser::init() const { defaultInit(); extended_length_flag() = false; @@ -385,7 +439,7 @@ prefix_ void senf::MIHTLVLengthParser::resize_(size_type size) } -///////////////////////////////cc.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_