X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2F80221Bundle%2FTLVParser.hh;h=f996881fb81717b281534e10ff1f2b48b4086ab7;hb=084d18afd1abb3c6b19de612dbdf4dbc40ffd795;hp=2df7440f4304ffb54ea7d6ddfccb903b1f0fc09a;hpb=0973cf085ba0ebc276342ac20643af2e8084e056;p=senf.git diff --git a/senf/Packets/80221Bundle/TLVParser.hh b/senf/Packets/80221Bundle/TLVParser.hh index 2df7440..f996881 100644 --- a/senf/Packets/80221Bundle/TLVParser.hh +++ b/senf/Packets/80221Bundle/TLVParser.hh @@ -70,8 +70,8 @@ namespace senf { SENF_PARSER_PRIVATE_BITFIELD ( fixed_length_field, 6, unsigned ); void finalize(); - void maxValue(value_type v); - value_type maxValue() const; + void capacity(value_type v); + value_type capacity() const; private: void resize_(size_type size); @@ -96,10 +96,10 @@ namespace senf { }; \endcode - You have to adjust the maximum length value with the \ref maxLengthValue function - before the length value is set. The default maximum value is 127. So, in the above + You have to adjust the maximum length value with the \ref maxLength function + before the length value is set. The default maximum value is 128. So, in the above example adding more than 21 MACAddresses to the vector will throw a TLVLengthException - if you don't call \c macAddressesTLVPacket->maxLengthValue( \e some_value) before. + if you don't call \c maxLength( \e some_value) before. \see MIHTLVLengthParser \n MIHGenericTLVParser \n @@ -112,31 +112,25 @@ namespace senf { SENF_PARSER_FIELD_RO ( length, MIHTLVLengthParser ); SENF_PARSER_FINALIZE ( MIHBaseTLVParser ); - /** \brief set maximum value of length field - - The size of the length field will be increased if necessary. - \param v maximum value of length field - */ - void maxLengthValue(MIHTLVLengthParser::value_type v) const { - protect(), length_().maxValue(v); - } - - /** \brief shrink size of length field to minimum + /** \brief shrink size of the TLV length field to minimum The size of the length field will be decreased to minimum necessary to hold the current length value. */ - void finalizeLength() { - protect(), length_().finalize(); - }; + void finalize(); typedef GenericTLVParserRegistry Registry; protected: - /// resize the packet after the length field to given size - senf::safe_data_iterator resizeValueField(MIHTLVLengthParser::value_type size); + /** \brief set maximum value of TLV length field + + The size of the length field will be increased if necessary. + \param v maximum value of length field + */ + void maxLength(MIHTLVLengthParser::value_type maxl) const; }; + /** \brief Parser for a generic TLV packet */ @@ -148,30 +142,56 @@ namespace senf { void init() const { defaultInit(); - maxLengthValue( MIHTLVLengthParser::max_value); + maxLength( MIHTLVLengthParser::max_value); } using base::init; + using base::maxLength; + }; + + + /** \brief Base class for list TLV parser + */ + struct MIHBaseListTLVParser + : public MIHBaseTLVParser + { + # include SENF_PARSER() + SENF_PARSER_INHERIT ( MIHBaseTLVParser ); + SENF_PARSER_FIELD_RO ( listSize, MIHTLVLengthParser ); + SENF_PARSER_FINALIZE ( MIHBaseListTLVParser ); + + void maxListSize(MIHTLVLengthParser::value_type maxl) const; + }; + + template + struct MIHListTLVParserMixin + { + void finalize(); }; + /** \brief Parse a MIHF_ID - the maximum length of a MIHF_ID is 253 octets (see F.3.11 in 802.21) - we could set maxLengthValue in init(), but for the most MIHF_IDs the default - maximum length of 127 should be enough. + Note that the maximum length of a MIHF_ID is 253 octets (see F.3.11 in 802.21) + We could set maxLength in init(), but for the most MIHF_IDs the default + maximum length of 128 should be enough. - \note you must call mihfIdPacket.maxLengthValue( 253) *before* - setting longer MIHF_IDs values. + \note you must call maxIdLength( 253) *before* setting MIHF_IDs values longer + than 128. + + \see MIHFId */ class MIHFIdTLVParser : public MIHBaseTLVParser { # include SENF_PARSER() SENF_PARSER_INHERIT ( MIHBaseTLVParser ); - SENF_PARSER_SKIP ( length(), 0 ); + SENF_PARSER_FIELD_RO ( idLength, MIHTLVLengthParser ); + SENF_PARSER_LABEL ( idValue ); + SENF_PARSER_SKIP ( idLength(), 0 ); SENF_PARSER_FINALIZE ( MIHFIdTLVParser ); public: - ///\name value setters + ///\name Value setters ///@{ void value( MIHFId const & id); @@ -182,7 +202,7 @@ namespace senf { void value( senf::EUI64 const & addr); ///@} - ///\name value getters + ///\name Value getters ///@{ MIHFId valueAs( MIHFId::Type type) const; @@ -193,7 +213,7 @@ namespace senf { senf::EUI64 valueAsEUI64() const; ///@} - ///\name value comparisons + ///\name Value comparisons ///@{ bool valueEquals( MIHFId const & id) const; @@ -205,8 +225,16 @@ namespace senf { ///@} void dump(std::ostream & os) const; + void maxIdLength(boost::uint8_t maxl) const; + void finalize(); private: + /// resize the packet after the length field to given size + senf::safe_data_iterator resizeValueField(MIHTLVLengthParser::value_type size); + + data_iterator valueBegin() const; + data_iterator valueEnd() const; + template struct binaryNAIEncoder { binaryNAIEncoder(OutputIterator & i); @@ -244,7 +272,7 @@ namespace senf { MIHFIdTLVParser const & parser; ValueEqualsVisitor( MIHFIdTLVParser const & p) : parser(p) {} bool operator()( boost::blank ) const { - return parser.length() == 0; + return parser.idLength() == 0; } template bool operator()( MIHFIdType const & id ) const { @@ -253,6 +281,8 @@ namespace senf { }; }; + /** \brief Parser for 802.21 source MIHF_ID TLV + */ struct MIHFSrcIdTLVParser : public MIHFIdTLVParser { MIHFSrcIdTLVParser(data_iterator i, state_type s) : MIHFIdTLVParser(i,s) {} @@ -265,6 +295,8 @@ namespace senf { void dump(std::ostream & os) const; }; + /** \brief Parser for 802.21 destination MIHF_ID TLV + */ struct MIHFDstIdTLVParser : public MIHFIdTLVParser { MIHFDstIdTLVParser(data_iterator i, state_type s) : MIHFIdTLVParser(i,s) {} @@ -337,7 +369,7 @@ namespace senf { ///////////////////////////////hh.e//////////////////////////////////////// #include "TLVParser.cci" -//#include "TLVParser.ct" +#include "TLVParser.ct" #include "TLVParser.cti" #endif