X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2F80221Bundle%2FTLVParser.cc;h=729b1ece583706b2247f715f54a849d628afe42b;hb=57daeae6f2e924ce3f16f9677c3474f531cba9e5;hp=ad14cb5915695c9db12f2be6fedd572147247d94;hpb=ff305084cba283649a2c97e73d2608c3e4598683;p=senf.git diff --git a/senf/Packets/80221Bundle/TLVParser.cc b/senf/Packets/80221Bundle/TLVParser.cc index ad14cb5..729b1ec 100644 --- a/senf/Packets/80221Bundle/TLVParser.cc +++ b/senf/Packets/80221Bundle/TLVParser.cc @@ -27,10 +27,8 @@ //#include "TLVParser.ih" // Custom includes -#include #include #include -#include #define prefix_ //-///////////////////////////////////////////////////////////////////////////////////////////////// @@ -41,6 +39,26 @@ 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) @@ -168,6 +186,13 @@ prefix_ void senf::MIHFSrcIdTLVParser::dump(std::ostream & os) MIHFIdTLVParser::dump(os); } +prefix_ void senf::MIHFSrcIdTLVParser::validate() + const +{ + validateType( typeId); +} + + //-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHFDstIdTLVParser @@ -179,6 +204,12 @@ prefix_ void senf::MIHFDstIdTLVParser::dump(std::ostream & os) MIHFIdTLVParser::dump(os); } +prefix_ void senf::MIHFDstIdTLVParser::validate() + const +{ + validateType( typeId); +} + //-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::MIHStatusTLVParser @@ -211,6 +242,14 @@ 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 @@ -234,12 +273,12 @@ prefix_ void senf::MIHRegisterReqCodeTLVParser::dump(std::ostream & os) os << " (???; invalid value!)" << std::endl; } -prefix_ std::pair senf::MIHRegisterReqCodeTLVParser::validate() +prefix_ void senf::MIHRegisterReqCodeTLVParser::validate() const { - if (length() != 1) return std::make_pair(false, "invalid length in MIHRegisterReqCodeTLV " + senf::str(length())); - if (value() >= 2) return std::make_pair(false, "invalid value in MIHRegisterReqCodeTLV " + senf::str(value())); - return std::make_pair(true, ""); + validateTypeLength( typeId, 1); + if (value() >= 2) + throw InvalidMIHPacketException("invalid value in MIHRegisterReqCodeTLV ") << unsigned( value()); } //-///////////////////////////////////////////////////////////////////////////////////////////////// @@ -257,11 +296,10 @@ prefix_ void senf::MIHValidTimeIntervalTLVParser::dump(std::ostream & os) << ( value()==0 ? " (infinite)" : " seconds") << std::endl; } -prefix_ std::pair senf::MIHValidTimeIntervalTLVParser::validate() +prefix_ void senf::MIHValidTimeIntervalTLVParser::validate() const { - if (length() != 4) return std::make_pair(false, "invalid length in MIHValidTimeIntervalTLV " + senf::str(length())); - return std::make_pair(true, ""); + validateTypeLength( typeId, 4); } //-/////////////////////////////////////////////////////////////////////////////////////////////////