X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FDefaultBundle%2FEthernetPacket.hh;h=7cd5347ec3f79613e02c8e22ed0bc90d74e112a1;hb=1f3b4447179d0cd771037d02b9a5671eeaaaec8d;hp=5dbec31f44e2b550171027d4f20dadf494d05a38;hpb=9357448dc66bc9acfd3bd8db423deb75bcd6a2c4;p=senf.git diff --git a/Packets/DefaultBundle/EthernetPacket.hh b/Packets/DefaultBundle/EthernetPacket.hh index 5dbec31..7cd5347 100644 --- a/Packets/DefaultBundle/EthernetPacket.hh +++ b/Packets/DefaultBundle/EthernetPacket.hh @@ -1,4 +1,4 @@ -// $Id$ +// $id: EthernetPacket.hh 299 2007-07-10 21:23:49Z g0dil $ // // Copyright (C) 2006 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) @@ -20,130 +20,218 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +/** \file + \brief EthernetPacket public header */ + #ifndef HH_EthernetPacket_ #define HH_EthernetPacket_ 1 // Custom includes -#include "Packets/Packet.hh" -#include "Packets/ParseInt.hh" -#include "Packets/ParseArray.hh" -#include "Packets/PacketRegistry.hh" +#include +#include +#include "Packets/Packets.hh" //#include "EthernetPacket.mpp" ///////////////////////////////hh.p//////////////////////////////////////// namespace senf { + /** \brief Ethernet MAC address + + The Ethernet MAC is modelled as a fixed-size container/sequence of 6 bytes. - template - struct Parse_Ethernet : public ParserBase + \todo Move to someplace else when implementing the addressing classes + */ + struct MACAddress + : boost::array { - template - struct rebind { typedef Parse_Ethernet parser; }; - typedef Iterator byte_iterator; + MACAddress(std::string addr); + template + MACAddress(InputIterator i); + + struct SyntaxException : public std::exception + { virtual char const * what() const throw() { return "invalid mac address syntax"; } }; + }; - Parse_Ethernet() {} - Parse_Ethernet(Iterator const & i) : ParserBase(i) {} + /** \brief Parse an Ethernet MAC address - static unsigned bytes() { return 14; } + The ethernet MAC is returned by value as a 6-byte sequence + \see MACAddress \n + EthernetPacket + */ + struct Parse_MAC : public PacketParserBase + { + Parse_MAC(data_iterator i, state_type s) : PacketParserBase(i,s,fixed_bytes) {} + /////////////////////////////////////////////////////////////////////////// - typedef Parse_Array < 6, Parse_UInt8<>, Iterator > Parse_MAC; - typedef Parse_UInt16 < Iterator > Parse_Type; + typedef MACAddress value_type; + static const size_type fixed_bytes = 6u; + + value_type value() const { return MACAddress(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); } - 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() ); } + Parse_MAC const & operator= (value_type const & other) { value(other); return *this; } }; + + /** \brief Parse an Ethernet packet + + Parser implementing an ethernet header. + + \see EthernetPacketType + */ + struct Parse_Ethernet : public PacketParserBase + { + typedef Parse_UInt16 Parse_Type; + +# ifndef DOXYGEN + SENF_PACKET_PARSER_INIT(Parse_Ethernet); + + SENF_PACKET_PARSER_DEFINE_FIXED_FIELDS( + ((Field)( destination, Parse_MAC )) + ((Field)( source, Parse_MAC )) + ((Field)( type, Parse_Type )) ); + +# else + + Parse_MAC destination(); + Parse_MAC source(); + Parse_Type type(); + +# endif + }; + + /** \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 Parse_Ethernet + + \par Associated registries: + \ref EtherTypes + + \ingroup protocolbundle_default + */ + struct EthernetPacketType + : public PacketTypeBase, + public PacketTypeMixin + { + typedef PacketTypeMixin mixin; + typedef ConcretePacket packet; + typedef Parse_Ethernet parser; - private: - template - EthernetPacket(Arg const & arg); + using mixin::nextPacketRange; + using mixin::nextPacketType; + using mixin::initSize; + using mixin::init; - virtual void v_nextInterpreter() const; - virtual void v_finalize(); - virtual void v_dump(std::ostream & os) const; + /** \todo Add LLC/SNAP support -> only use the registry + for type() values >=1536, otherwise expect an LLC header */ + static registry_key_t nextPacketKey(packet p) + { return p->type(); } - friend class Packet; + static void dump(packet p, std::ostream & os); }; - template - struct Parse_EthVLan : public ParserBase + /** \brief Ethernet packet typedef */ + typedef EthernetPacketType::packet EthernetPacket; + + /** \brief Parse an ethernet VLAN tag + + Parser interpreting the ethernet VLAN tag. Fields are + + \see EthVLanPacketType + */ + struct Parse_EthVLan : public PacketParserBase { - template - struct rebind { typedef Parse_Ethernet parser; }; - typedef Iterator byte_iterator; + typedef Parse_UIntField < 0, 3 > Parse_Priority; + typedef Parse_Flag < 3 > Parse_CFI; + typedef Parse_UIntField < 4, 16 > Parse_VLanId; + typedef Parse_UInt16 Parse_Type; - Parse_EthVLan() {} - Parse_EthVLan(Iterator const & i) : ParserBase(i) {} +# ifndef DOXYGEN - static unsigned bytes() { return 4; } + SENF_PACKET_PARSER_INIT(Parse_EthVLan); - /////////////////////////////////////////////////////////////////////////// + SENF_PACKET_PARSER_DEFINE_FIXED_FIELDS( + ((OverlayField)( priority, Parse_Priority )) + ((OverlayField)( cfi, Parse_CFI )) + ((Field )( vlanId, Parse_VLanId )) + ((Field )( type, Parse_Type )) ); - 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; +# else - 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); } + Parse_Priority priority(); + Parse_CFI cfi(); + Parse_VLanId vlanId(); + Parse_Type type(); + +# endif }; - 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 Parse_EthVLan - 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; + \ingroup protocolbundle_default + */ + struct EthVLanPacketType + : public PacketTypeBase, + public PacketTypeMixin + { + typedef PacketTypeMixin mixin; + typedef ConcretePacket packet; + typedef Parse_EthVLan parser; + + using mixin::nextPacketRange; + using mixin::nextPacketType; + using mixin::initSize; + using mixin::init; - friend class Packet; + /** \todo Add LLC/SNAP support -> only use the registry + for type() values >=1536, otherwise expect an LLC header */ + static registry_key_t nextPacketKey(packet p) + { return p->type(); } + + static void dump(packet p, std::ostream & os); }; + /** \brief Ethernet VLAN tag typedef */ + typedef EthVLanPacketType::packet EthVLanPacket; } ///////////////////////////////hh.e//////////////////////////////////////// +#endif +#ifndef SENF_PACKETS_DECL_ONLY //#include "EthernetPacket.cci" -//#include "EthernetPacket.ct" -#include "EthernetPacket.cti" +#include "EthernetPacket.ct" +//#include "EthernetPacket.cti" #endif @@ -153,4 +241,6 @@ namespace senf { // c-file-style: "senf" // indent-tabs-mode: nil // ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 // End: