X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FMPEGDVBBundle%2FGREPacket.hh;h=f056b51e54fc2726011afe05fb7a807eb6dc41ed;hb=bbff2057f39e475b00e598cae018c68db0e16a82;hp=f5617e337c082a39a52f6aae6a5299c78693cd5f;hpb=ff0f2fabb3dbb76ee9383a98291a1420d2a59a7f;p=senf.git diff --git a/Packets/MPEGDVBBundle/GREPacket.hh b/Packets/MPEGDVBBundle/GREPacket.hh index f5617e3..f056b51 100644 --- a/Packets/MPEGDVBBundle/GREPacket.hh +++ b/Packets/MPEGDVBBundle/GREPacket.hh @@ -29,6 +29,7 @@ // Custom includes #include #include "../../Packets/Packets.hh" +#include "../DefaultBundle/EthernetPacket.hh" //#include "GREPacket.mpp" ///////////////////////////////hh.p//////////////////////////////////////// @@ -41,6 +42,13 @@ namespace senf { \see GREPacketType */ + struct GREChecksumParser : public PacketParserBase { +# include SENF_PARSER() + SENF_PARSER_FIELD ( checksum1_, Parse_UInt16 ); + SENF_PARSER_PRIVATE_FIELD ( reserved1_, Parse_UInt16 ); + SENF_PARSER_FINALIZE(GREChecksumParser); + }; + struct Parse_GREPacket : public PacketParserBase { # include SENF_PARSER() @@ -50,15 +58,13 @@ namespace senf { SENF_PARSER_BITFIELD_RO ( version_number, 3, unsigned ); // TODO: Always Zero !! SENF_PARSER_FIELD ( protocol_type, Parse_UInt16 ); SENF_PARSER_PRIVATE_VARIANT ( checksum_, checksum_present, - (VoidPacketParser) (Parse_UInt16) ); - SENF_PARSER_PRIVATE_VARIANT ( reserved1_, checksum_present, - (VoidPacketParser) (Parse_UInt16) ); - + (VoidPacketParser) (GREChecksumParser) ); + SENF_PARSER_FINALIZE( Parse_GREPacket ); private: Parse_UInt16 checksum() const /// only defined if checksum_present() == \c true - { return checksum_().get<1>(); } + { return checksum_().get<1>().checksum1_(); } }; /** \brief GRE packet @@ -73,17 +79,20 @@ namespace senf { */ struct GREPacketType : public PacketTypeBase, - public PacketTypeMixin + public PacketTypeMixin { - typedef PacketTypeMixin mixin; + typedef PacketTypeMixin mixin; typedef ConcretePacket packet; typedef Parse_GREPacket parser; using mixin::nextPacketRange; + using mixin::nextPacketType; using mixin::init; using mixin::initSize; static void dump(packet p, std::ostream & os); + static EtherTypes::key_t nextPacketKey(packet p) { return p->protocol_type(); } + static void finalize(packet p) { p->protocol_type() << key(p.next()); } }; /** \brief GRE packet typedef */