X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FDefaultBundle%2FEthernetPacket.hh;h=cbaf6e353e8d1d73083cb6275075014aa79fdccd;hb=962f88fbbfc6f4da1502088dfa94273e7fbd3c80;hp=e8487fc6d2a8366688b1c23e6099b720cea7ffb9;hpb=145f6a7d0f3a6aaa77b3625351c952d24cb0b8a1;p=senf.git diff --git a/Packets/DefaultBundle/EthernetPacket.hh b/Packets/DefaultBundle/EthernetPacket.hh index e8487fc..cbaf6e3 100644 --- a/Packets/DefaultBundle/EthernetPacket.hh +++ b/Packets/DefaultBundle/EthernetPacket.hh @@ -1,9 +1,9 @@ // $Id$ // // Copyright (C) 2006 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) -// Stefan Bund +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY +// Thorsten Horstmann // // 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 @@ -20,130 +20,179 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -#ifndef HH_EthernetPacket_ -#define HH_EthernetPacket_ 1 +/** \file + \brief EthernetPacket public header */ + +#ifndef HH_SENF_Packets_DefaultBundle_EthernetPacket_ +#define HH_SENF_Packets_DefaultBundle_EthernetPacket_ 1 // Custom includes -#include "Packets/Packet.hh" -#include "Packets/ParseInt.hh" -#include "Packets/ParseArray.hh" -#include "Packets/PacketRegistry.hh" +#include +#include "../../Socket/Protocols/Raw/MACAddress.hh" +#include "../../Packets/Packets.hh" //#include "EthernetPacket.mpp" ///////////////////////////////hh.p//////////////////////////////////////// namespace senf { + /** \brief Parse an Ethernet MAC address + + The ethernet MAC is returned by value as a 6-byte sequence - template - struct Parse_Ethernet : public ParserBase + \see MACAddress \n + EthernetPacket + */ + struct MACAddressParser : public PacketParserBase { - template - struct rebind { typedef Parse_Ethernet parser; }; - typedef Iterator byte_iterator; + MACAddressParser(data_iterator i, state_type s) : PacketParserBase(i,s,fixed_bytes) {} + + /////////////////////////////////////////////////////////////////////////// - Parse_Ethernet() {} - Parse_Ethernet(Iterator const & i) : ParserBase(i) {} + typedef MACAddress value_type; + static const size_type fixed_bytes = 6u; - static unsigned bytes() { return 14; } + value_type value() const { return MACAddress::from_data(i()); } + void value(value_type const & v) { std::copy(v.begin(), v.end(), i()); } + operator value_type () { return value(); } + byte & operator[](size_type index) { return *boost::next(i(),index); } - /////////////////////////////////////////////////////////////////////////// + MACAddressParser const & operator= (value_type const & other) { value(other); return *this; } + }; + + /** \brief Parse an Ethernet packet + + Parser implementing an ethernet header. - typedef Parse_Array < 6, Parse_UInt8<>, Iterator > Parse_MAC; - typedef Parse_UInt16 < Iterator > Parse_Type; + \see EthernetPacketType + */ + struct EthernetPacketParser : public PacketParserBase + { +# include SENF_FIXED_PARSER() - Parse_MAC destination() const { return Parse_MAC (this->i() ); } - Parse_MAC source() const { return Parse_MAC (this->i() + Parse_MAC::size() ); } - Parse_Type type() const { return Parse_Type (this->i() + 2*Parse_MAC::size() ); } + SENF_PARSER_FIELD( destination, MACAddressParser ); + SENF_PARSER_FIELD( source, MACAddressParser ); + SENF_PARSER_FIELD( type_length, UInt16Parser ); + + SENF_PARSER_FINALIZE(EthernetPacketParser); }; + /** \brief EtherType registry + + This registry registers packet types with their EtherType number. + + \see Ethernet numbers \n + \ref PacketRegistry + */ struct EtherTypes { - // See http://www.iana.org/assignments/ethernet-numbers + // See typedef boost::uint16_t key_t; }; - class EthernetPacket - : public Packet, - public Parse_Ethernet, - public PacketRegistryMixin - { - using PacketRegistryMixin::registerInterpreter; - public: - /////////////////////////////////////////////////////////////////////////// - // Types + /** \brief Ethernet packet - typedef ptr_t::ptr ptr; + \par Packet type (typedef): + \ref EthernetPacket - /////////////////////////////////////////////////////////////////////////// + \par Fields: + \ref EthernetPacketParser - private: - template - EthernetPacket(Arg const & arg); + \par Associated registries: + \ref EtherTypes - virtual void v_nextInterpreter() const; - virtual void v_finalize(); - virtual void v_dump(std::ostream & os) const; + \par Finalize action: + Set \a type from type of next packet if found in \ref EtherTypes - friend class Packet; + \ingroup protocolbundle_default + */ + struct EthernetPacketType + : public PacketTypeBase, + public PacketTypeMixin + { + typedef PacketTypeMixin mixin; + typedef ConcretePacket packet; + typedef EthernetPacketParser parser; + + using mixin::nextPacketRange; + using mixin::initSize; + using mixin::init; + + static factory_t nextPacketType(packet p); + static void dump(packet p, std::ostream & os); + static void finalize(packet p); }; - template - struct Parse_EthVLan : public ParserBase - { - template - struct rebind { typedef Parse_Ethernet parser; }; - typedef Iterator byte_iterator; + /** \brief Ethernet packet typedef */ + typedef ConcretePacket EthernetPacket; - Parse_EthVLan() {} - Parse_EthVLan(Iterator const & i) : ParserBase(i) {} + /** \brief Parse an ethernet VLAN tag + + Parser interpreting the ethernet VLAN tag. Fields are - static unsigned bytes() { return 4; } + \see EthVLanPacketType + */ + struct EthVLanPacketParser : public PacketParserBase + { +# include SENF_FIXED_PARSER() - /////////////////////////////////////////////////////////////////////////// + SENF_PARSER_BITFIELD( priority, 3, unsigned ); + SENF_PARSER_BITFIELD( cfi, 1, bool ); + SENF_PARSER_BITFIELD( vlanId, 12, unsigned ); - typedef Parse_UIntField < 0, 3, Iterator > Parse_Priority; - typedef Parse_Flag < 3, Iterator > Parse_CFI; - typedef Parse_UIntField < 4, 16, Iterator > Parse_VLanId; - typedef Parse_UInt16 < Iterator > Parse_Type; + SENF_PARSER_FIELD( type, UInt16Parser ); - Parse_Priority priority() const { return Parse_Priority(this->i()); } - Parse_CFI cfi() const { return Parse_CFI(this->i()); } - Parse_VLanId vlanId() const { return Parse_VLanId(this->i()); } - Parse_Type type() const { return Parse_Type(this->i()+2); } + SENF_PARSER_FINALIZE(EthVLanPacketParser); }; - class EthVLanPacket - : public Packet, - public Parse_EthVLan, - public PacketRegistryMixin - { - using PacketRegistryMixin::registerInterpreter; - public: - /////////////////////////////////////////////////////////////////////////// - // Types + /** \brief Ethernet VLAN tag - typedef ptr_t::ptr ptr; + \par Packet type (typedef): + \ref EthVLanPacket - /////////////////////////////////////////////////////////////////////////// + \par Fields: + \ref EthVLanPacketParser - private: - template - EthVLanPacket(Arg const & arg); + \par Associated registries: + \ref EtherTypes - virtual void v_nextInterpreter() const; - virtual void v_finalize(); - virtual void v_dump(std::ostream & os) const; + \par Finalize action: + Set \a type from type of next packet if found in \ref EtherTypes - friend class Packet; + \ingroup protocolbundle_default + */ + struct EthVLanPacketType + : public PacketTypeBase, + public PacketTypeMixin + { + typedef PacketTypeMixin mixin; + typedef ConcretePacket packet; + typedef EthVLanPacketParser parser; + + using mixin::nextPacketRange; + using mixin::nextPacketType; + using mixin::initSize; + using mixin::init; + + /** \todo Add LLC/SNAP support -> only use the registry + for type() values >=1536, otherwise expect an LLC header */ + static key_t nextPacketKey(packet p) + { return p->type(); } + + static void dump(packet p, std::ostream & os); + static void finalize(packet p); }; -} + /** \brief Ethernet VLAN tag typedef */ + typedef ConcretePacket EthVLanPacket; +} ///////////////////////////////hh.e//////////////////////////////////////// +#endif +#ifndef SENF_PACKETS_DECL_ONLY //#include "EthernetPacket.cci" //#include "EthernetPacket.ct" -#include "EthernetPacket.cti" +//#include "EthernetPacket.cti" #endif