X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacketParser.hh;h=db7a32fbca119361570d012e26c9afcee227aa9a;hb=a3d3979b7daaf22ea63ca356edbfa8047dff7b78;hp=6c40b2f1fbb2826a55367530724e2dd9606e8dee;hpb=83df9651fac5af034774ff9314ee18eeb8a5ec2a;p=senf.git diff --git a/Packets/PacketParser.hh b/Packets/PacketParser.hh index 6c40b2f..db7a32f 100644 --- a/Packets/PacketParser.hh +++ b/Packets/PacketParser.hh @@ -63,6 +63,11 @@ Every parser is derived from senf::PacketParserBase. This class provides the necessary housekeeping information and provides the parsers with access to the data. + + \warning Parsers are like iterators: They are invalidated whenever the size of the packet's + data is changed. You should not store a parser anywhere. If you want to keep a parser + reference, use the senf::SafePacketParser wrapper. You still will need to take extra care to + ensure the parser is not invalidated. */ #ifndef HH_PacketParser_ @@ -74,9 +79,7 @@ #include #include "Utils/SafeBool.hh" #include "PacketTypes.hh" -#define HH_PacketData_DeclOnly #include "PacketData.hh" -#undef HH_PacketData_DeclOnly #include "PacketParser.mpp" ///////////////////////////////hh.p//////////////////////////////////////// @@ -459,7 +462,7 @@ namespace senf { \code struct ExtendedParser : public BaseParser { - SENF_PACKET_PARSER_NO_INIT(ExtendedParser); + ExtendedParser(data_iterator i, state_type s) : BaseParser(i,s) {} SENF_PACKET_PARSER_DEFINE_FIELDS_OFFSET(senf::bytes(BaseParser(*this)), ( ... fields ... ) ); @@ -499,7 +502,7 @@ namespace senf { \code struct ExtendedParser : public BaseParser { - SENF_PACKET_PARSER_NO_INIT(ExtendedParser); + ExtendedParser(data_iterator i, state_type s) : BaseParser(i,s) {} SENF_PACKET_PARSER_DEFINE_FIXED_FIELDS_OFFSET(BaseParser::fixed_bytes, ( ... fields ... ) ); @@ -518,6 +521,8 @@ namespace senf { # define SENF_PACKET_PARSER_DEFINE_FIXED_FIELDS_OFFSET(offset,fields) \ SENF_PACKET_PARSER_I_DEFINE_FIXED_FIELDS(offset,fields) + /** \brief Default parser parsing nothing + */ struct VoidPacketParser : public PacketParserBase { @@ -536,8 +541,10 @@ namespace senf { location will \e not be updated accordingly and therefore the parser will be invalid. - Additionally a SafePacketparser has an uninitialized state. The only allowed operations in + Additionally a SafePacketParser has an uninitialized state. The only allowed operations in this state are the boolean test for validity and assigning another parser. + + \ingroup packetparser */ template class SafePacketParser @@ -582,6 +589,9 @@ namespace senf { } ///////////////////////////////hh.e//////////////////////////////////////// +#endif +#if !defined(SENF_PACKETS_DECL_ONLY) && !defined(HH_PacketParser_i_) +#define HH_PacketParser_i_ #include "PacketParser.cci" #include "PacketParser.ct" #include "PacketParser.cti" @@ -598,13 +608,3 @@ namespace senf { // comment-column: 40 // End: -// LocalWords: templated PacketParser defgroup packetparser PacketParsers li -// LocalWords: EthernetParser ethertype UInt senf PacketParserBase tt -// LocalWords: struct FooParser const init endcode ingroup param SomeParser -// LocalWords: ethernet DefaultBundle EthernetPacket hh EthVLan UIntField CFI -// LocalWords: VLanId OverlayField cfi vlanId accessor defaultInit bitfield -// LocalWords: SomePacket SimpleVectorSizer packetparsermacros Fraunhofer std -// LocalWords: hideinitializer Institut fuer offene Kommunikationssysteme STL -// LocalWords: FOKUS Kompetenzzentrum Satelitenkommunikation SatCom Bund cerr -// LocalWords: berlios dil Structors someField someVector someOtherField -// LocalWords: TruncatedPacketException