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);
};
\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
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<MIHBaseTLVParser> 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
*/
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 <class Self>
+ 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);
void value( senf::EUI64 const & addr);
///@}
- ///\name value getters
+ ///\name Value getters
///@{
MIHFId valueAs( MIHFId::Type type) const;
senf::EUI64 valueAsEUI64() const;
///@}
- ///\name value comparisons
+ ///\name Value comparisons
///@{
bool valueEquals( MIHFId const & id) const;
///@}
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 <class OutputIterator>
struct binaryNAIEncoder {
binaryNAIEncoder(OutputIterator & i);
MIHFIdTLVParser const & parser;
ValueEqualsVisitor( MIHFIdTLVParser const & p) : parser(p) {}
bool operator()( boost::blank ) const {
- return parser.length() == 0;
+ return parser.idLength() == 0;
}
template <typename MIHFIdType>
bool operator()( MIHFIdType const & id ) const {
};
};
+ /** \brief Parser for 802.21 source MIHF_ID TLV
+ */
struct MIHFSrcIdTLVParser : public MIHFIdTLVParser
{
MIHFSrcIdTLVParser(data_iterator i, state_type s) : MIHFIdTLVParser(i,s) {}
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) {}
///////////////////////////////hh.e////////////////////////////////////////
#include "TLVParser.cci"
-//#include "TLVParser.ct"
+#include "TLVParser.ct"
#include "TLVParser.cti"
#endif