// $Id$
//
// Copyright (C) 2007
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
-// Joachim Kaeber <joachim.kaeber@fokus.fraunhofer.de>
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+// Joachim Kaeber <jkaeber@berlios.de>
//
// 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
// Custom includes
#include <algorithm>
#include "../../Packets/Packets.hh"
+#include "../DefaultBundle/EthernetPacket.hh"
//#include "GREPacket.mpp"
///////////////////////////////hh.p////////////////////////////////////////
*/
struct GREChecksumParser : public PacketParserBase {
# include SENF_PARSER()
- SENF_PARSER_PRIVATE_FIELD ( checksum1_, Parse_UInt16 );
- SENF_PARSER_PRIVATE_FIELD ( reserved1_, Parse_UInt16 );
- SENF_PARSER_FINALIZE(GREChecksumParser);
+ SENF_PARSER_FIELD ( checksum1_, UInt16Parser );
+ SENF_PARSER_PRIVATE_FIELD ( reserved1_, UInt16Parser );
+ SENF_PARSER_FINALIZE(GREChecksumParser);
};
- struct Parse_GREPacket : public PacketParserBase
+ 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) (GREChecksumParser) );
- SENF_PARSER_FINALIZE( Parse_GREPacket );
+ 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
\ref GREPacket
\par Fields:
- \ref Parse_GREPacket
+ \ref GREPacketParser
\ingroup protocolbundle_mpegdvb
*/
struct GREPacketType
: public PacketTypeBase,
- public PacketTypeMixin<GREPacketType>
+ public PacketTypeMixin<GREPacketType, EtherTypes>
{
- typedef PacketTypeMixin<GREPacketType> mixin;
+ typedef PacketTypeMixin<GREPacketType, EtherTypes> mixin;
typedef ConcretePacket<GREPacketType> 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 */