X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2F80221Bundle%2FTLVParser.cc;h=5d6a20c01aa644a2f9513c3e2ebe04466802c8d9;hb=d0c31526ac12869eed085891e3ae13e8b21072e6;hp=ca70a1ccbd8e8cdbb22342920bc7920f03cf5d45;hpb=a05fb2ebf7d957628a15b5c1eb9fbf3512dfa548;p=senf.git diff --git a/senf/Packets/80221Bundle/TLVParser.cc b/senf/Packets/80221Bundle/TLVParser.cc index ca70a1c..5d6a20c 100644 --- a/senf/Packets/80221Bundle/TLVParser.cc +++ b/senf/Packets/80221Bundle/TLVParser.cc @@ -27,19 +27,34 @@ //#include "TLVParser.ih" // Custom includes -#include #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_ std::pair senf::MIHBaseTLVParser::validateTL(boost::uint8_t expectedType, MIHTLVLengthParser::value_type expectedLength) + const +{ + if (! check( 1 + senf::bytes(length_()) + length()) ) + return std::make_pair(false, "truncated TLV. Type: " + senf::str(type())); + if (type() != expectedType) + return std::make_pair(false, "invalid TLV type: " + senf::str(type())); + if (length() != expectedLength) + return std::make_pair(false, "invalid length in TLV. Type: " + senf::str(type())); + return std::make_pair(true, ""); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHBaseListTLVParser prefix_ void senf::MIHBaseListTLVParser::maxListSize(MIHTLVLengthParser::value_type maxl) @@ -49,7 +64,8 @@ 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 +90,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 +115,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 +155,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 +172,7 @@ prefix_ senf::MIHFId senf::MIHFIdTLVParser::valueAs(MIHFId::Type type) } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHFSrcIdTLVParser prefix_ void senf::MIHFSrcIdTLVParser::dump(std::ostream & os) @@ -167,7 +183,18 @@ prefix_ void senf::MIHFSrcIdTLVParser::dump(std::ostream & os) MIHFIdTLVParser::dump(os); } -/////////////////////////////////////////////////////////////////////////// +prefix_ std::pair senf::MIHFSrcIdTLVParser::validate() + const +{ + if (! check( 1 + senf::bytes(length_()) + length()) ) + return std::make_pair(false, "truncated TLV. Type: " + senf::str(type())); + if (type() != typeId) + return std::make_pair(false, "invalid TLV type: " + senf::str(type())); + return std::make_pair(true, ""); +} + + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHFDstIdTLVParser prefix_ void senf::MIHFDstIdTLVParser::dump(std::ostream & os) @@ -178,7 +205,17 @@ prefix_ void senf::MIHFDstIdTLVParser::dump(std::ostream & os) MIHFIdTLVParser::dump(os); } -/////////////////////////////////////////////////////////////////////////// +prefix_ std::pair senf::MIHFDstIdTLVParser::validate() + const +{ + if (! check( 1 + senf::bytes(length_()) + length()) ) + return std::make_pair(false, "truncated TLV. Type: " + senf::str(type())); + if (type() != typeId) + return std::make_pair(false, "invalid TLV type: " + senf::str(type())); + return std::make_pair(true, ""); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHStatusTLVParser prefix_ void senf::MIHStatusTLVParser::dump(std::ostream & os) @@ -194,7 +231,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 +247,17 @@ prefix_ void senf::MIHStatusTLVParser::dump(std::ostream & os) os << " (???; invalid value!)" << std::endl; } -/////////////////////////////////////////////////////////////////////////// +prefix_ std::pair senf::MIHStatusTLVParser::validate() + const +{ + if (! validateTL( typeId, 1).first) + return validateTL( typeId, 1); + if (value() >= 4) + return std::make_pair(false, "invalid value in MIHStatusTLV " + senf::str(value())); + return std::make_pair(true, ""); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHRegisterReqCodeTLVParser prefix_ void senf::MIHRegisterReqCodeTLVParser::dump(std::ostream & os) @@ -233,7 +280,17 @@ prefix_ void senf::MIHRegisterReqCodeTLVParser::dump(std::ostream & os) os << " (???; invalid value!)" << std::endl; } -/////////////////////////////////////////////////////////////////////////// +prefix_ std::pair senf::MIHRegisterReqCodeTLVParser::validate() + const +{ + if (! validateTL( typeId, 1).first) + return validateTL( typeId, 1); + if (value() >= 2) + return std::make_pair(false, "invalid value in MIHRegisterReqCodeTLV " + senf::str(value())); + return std::make_pair(true, ""); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHValidTimeIntervalTLVParser prefix_ void senf::MIHValidTimeIntervalTLVParser::dump(std::ostream & os) @@ -248,10 +305,17 @@ prefix_ void senf::MIHValidTimeIntervalTLVParser::dump(std::ostream & os) << ( value()==0 ? " (infinite)" : " seconds") << std::endl; } -/////////////////////////////////////////////////////////////////////////// +prefix_ std::pair senf::MIHValidTimeIntervalTLVParser::validate() + const +{ + if (! validateTL( typeId, 4).first) return validateTL( typeId, 4); + return std::make_pair(true, ""); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // 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 +333,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 +374,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 +449,7 @@ prefix_ void senf::MIHTLVLengthParser::resize_(size_type size) } -///////////////////////////////cc.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_