X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FMPEGDVBBundle%2FGREPacket.hh;h=32b8c1118ca0e60397c8aba295c9b28efec30d1f;hb=81f84badf27b66dbadec9890646ca1193e998505;hp=fa0b2e21a673cccd1d859c88b194e38f841f9396;hpb=044a1bfb46ce16c3daac307b8c684604b43dd4cf;p=senf.git diff --git a/Packets/MPEGDVBBundle/GREPacket.hh b/Packets/MPEGDVBBundle/GREPacket.hh index fa0b2e2..32b8c11 100644 --- a/Packets/MPEGDVBBundle/GREPacket.hh +++ b/Packets/MPEGDVBBundle/GREPacket.hh @@ -1,9 +1,9 @@ -// $Id:DatagramSection.hh 327 2007-07-20 10:03:44Z tho $ +// $Id$ // // Copyright (C) 2007 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) -// Joachim Kaeber +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY +// Joachim Kaeber // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -29,6 +29,7 @@ // Custom includes #include #include "../../Packets/Packets.hh" +#include "../DefaultBundle/EthernetPacket.hh" //#include "GREPacket.mpp" ///////////////////////////////hh.p//////////////////////////////////////// @@ -41,24 +42,29 @@ namespace senf { \see GREPacketType */ - struct Parse_GREPacket : public PacketParserBase + struct GREChecksumParser : public PacketParserBase { +# include SENF_PARSER() + SENF_PARSER_FIELD ( checksum1_, UInt16Parser ); + SENF_PARSER_PRIVATE_FIELD ( reserved1_, UInt16Parser ); + SENF_PARSER_FINALIZE(GREChecksumParser); + }; + + struct GREPacketParser : public PacketParserBase { # include SENF_PARSER() SENF_PARSER_BITFIELD ( checksum_present, 1, bool ); SENF_PARSER_PRIVATE_BITFIELD ( reserved0_, 12, unsigned ); // TODO: SKIP !! - SENF_PARSER_BITFIELD_RO ( version_number, 3, unsigned ); // TODO: Always Zero !! - SENF_PARSER_FIELD ( protocol_type, Parse_UInt16 ); + SENF_PARSER_BITFIELD ( version_number, 3, unsigned ); // TODO: Always Zero !! + SENF_PARSER_FIELD ( protocol_type, UInt16Parser ); SENF_PARSER_PRIVATE_VARIANT ( checksum_, checksum_present, - (VoidPacketParser) (Parse_UInt16) ); - SENF_PARSER_PRIVATE_VARIANT ( reserved1_, checksum_present, - (VoidPacketParser) (Parse_UInt16) ); - - SENF_PARSER_FINALIZE( Parse_GREPacket ); + (VoidPacketParser) (GREChecksumParser) ); + + SENF_PARSER_FINALIZE( GREPacketParser ); private: - Parse_UInt16 checksum() const /// only defined if checksum_present() == \c true - { return checksum_().get<1>(); } + UInt16Parser checksum() const /// only defined if checksum_present() == \c true + { return checksum_().get<1>().checksum1_(); } }; /** \brief GRE packet @@ -67,23 +73,38 @@ namespace senf { \ref GREPacket \par Fields: - \ref Parse_GREPacket + \ref GREPacketParser + \image html GREPacket.png \ingroup protocolbundle_mpegdvb */ struct GREPacketType : public PacketTypeBase, - public PacketTypeMixin + public PacketTypeMixin { - typedef PacketTypeMixin mixin; + typedef PacketTypeMixin mixin; typedef ConcretePacket packet; - typedef Parse_GREPacket parser; + typedef GREPacketParser 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(nothrow)); + p->version_number() = 0; // as per RFC2784, 2.3.1 + + if (p->checksum_present()) { + // compute checksum + } else { + // ??? + } + } }; /** \brief GRE packet typedef */