-// $Id:DatagramSection.hh 327 2007-07-20 10:03:44Z tho $
+// $Id$
//
// Copyright (C) 2007
// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
// Custom includes
#include <algorithm>
#include "../../Packets/Packets.hh"
+#include "../DefaultBundle/EthernetPacket.hh"
//#include "GREPacket.mpp"
///////////////////////////////hh.p////////////////////////////////////////
\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()
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
*/
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;
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 */