X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FDefaultBundle%2FEthernetPacket.hh;h=3dcddc6f4fef53ea4743c80dbe54b5e7162342d5;hb=6a3a31fb7b2d2a5e8ae6d67d50797700274fb34e;hp=126748896e638c426bec592a89f2ef4cb3d3d5e3;hpb=64e170521a221effc1ba11a0544f753544d03bac;p=senf.git diff --git a/Packets/DefaultBundle/EthernetPacket.hh b/Packets/DefaultBundle/EthernetPacket.hh index 1267488..3dcddc6 100644 --- a/Packets/DefaultBundle/EthernetPacket.hh +++ b/Packets/DefaultBundle/EthernetPacket.hh @@ -20,36 +20,29 @@ // 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 -#include -#include "Packets/PacketType.hh" -#include "Packets/ParseInt.hh" -#include "Packets/PacketRegistry.hh" -#include "Packets/PacketParser.hh" +#include "../../Socket/Protocols/Raw/MACAddress.hh" +#include "../../Packets/Packets.hh" //#include "EthernetPacket.mpp" ///////////////////////////////hh.p//////////////////////////////////////// namespace senf { - ///\addtogroup protocolbundle_default - ///@{ - - struct MACAddress - : boost::array - { - MACAddress(std::string addr); - template - MACAddress(InputIterator i); + /** \brief Parse an Ethernet MAC address - struct SyntaxException : public std::exception - { virtual char const * what() const throw() { return "invalid mac address syntax"; } }; - }; + 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) {} @@ -59,82 +52,125 @@ namespace senf { typedef MACAddress value_type; static const size_type fixed_bytes = 6u; - value_type value() const { return MACAddress(i()); } + 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); } 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 { - SENF_PACKET_PARSER_INIT(Parse_Ethernet); - - /////////////////////////////////////////////////////////////////////////// +# include SENF_FIXED_PARSER() - typedef Parse_UInt16 Parse_Type; + SENF_PARSER_FIELD( destination, Parse_MAC ); + SENF_PARSER_FIELD( source, Parse_MAC ); + SENF_PARSER_FIELD( type_length, Parse_UInt16 ); - SENF_PACKET_PARSER_DEFINE_FIXED_FIELDS( - ((Field)( destination, Parse_MAC )) - ((Field)( source, Parse_MAC )) - ((Field)( type, Parse_Type )) ); + SENF_PARSER_FINALIZE(Parse_Ethernet); }; + /** \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; }; + /** \brief Ethernet packet + + \par Packet type (typedef): + \ref EthernetPacket + + \par Fields: + \ref Parse_Ethernet + + \par Associated registries: + \ref EtherTypes + + \par Finalize action: + Set \a type from type of next packet if found in \ref EtherTypes + + \ingroup protocolbundle_default + */ struct EthernetPacketType : public PacketTypeBase, public PacketTypeMixin { +#ifndef DOXYGEN typedef PacketTypeMixin mixin; typedef ConcretePacket packet; typedef Parse_Ethernet parser; - +#endif using mixin::nextPacketRange; - using mixin::nextPacketType; + // 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 registry_key_t nextPacketKey(packet p) - { return p->type(); } - + static factory_t nextPacketType(packet p); static void dump(packet p, std::ostream & os); + static void finalize(packet p); }; - typedef EthernetPacketType::packet EthernetPacket; + /** \brief Ethernet packet typedef */ + typedef ConcretePacket EthernetPacket; + + /** \brief Parse an ethernet VLAN tag + + Parser interpreting the ethernet VLAN tag. Fields are + \see EthVLanPacketType + */ struct Parse_EthVLan : public PacketParserBase { - SENF_PACKET_PARSER_INIT(Parse_EthVLan); +# 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 > Parse_Priority; - typedef Parse_Flag < 3 > Parse_CFI; - typedef Parse_UIntField < 4, 16 > Parse_VLanId; - typedef Parse_UInt16 Parse_Type; + SENF_PARSER_FIELD( type, Parse_UInt16 ); - SENF_PACKET_PARSER_DEFINE_FIXED_FIELDS( - ((OverlayField)( priority, Parse_Priority )) - ((OverlayField)( cfi, Parse_CFI )) - ((Field )( vlanId, Parse_VLanId )) - ((Field )( type, Parse_Type )) ); + SENF_PARSER_FINALIZE(Parse_EthVLan); }; + /** \brief Ethernet VLAN tag + + \par Packet type (typedef): + \ref EthVLanPacket + + \par Fields: + \ref Parse_EthVLan + + \par Associated registries: + \ref EtherTypes + + \par Finalize action: + Set \a type from type of next packet if found in \ref EtherTypes + + \ingroup protocolbundle_default + */ struct EthVLanPacketType : public PacketTypeBase, public PacketTypeMixin { +#ifndef DOXYGEN typedef PacketTypeMixin mixin; typedef ConcretePacket packet; typedef Parse_EthVLan parser; - +#endif using mixin::nextPacketRange; using mixin::nextPacketType; using mixin::initSize; @@ -146,17 +182,82 @@ namespace senf { { return p->type(); } static void dump(packet p, std::ostream & os); + static void finalize(packet p); }; - typedef EthVLanPacketType::packet EthVLanPacket; + /** \brief Ethernet VLAN tag typedef */ + typedef ConcretePacket EthVLanPacket; + + + /** \brief Parse an ethernet LLC/SNAP header + + \todo document me + + \see EthVLanPacketType + */ + struct Parse_EthLlcSnapPacket : public PacketParserBase + { +# include SENF_FIXED_PARSER() + + SENF_PARSER_FIELD( dsap, Parse_UInt8 ); + SENF_PARSER_FIELD( ssap, Parse_UInt8 ); + SENF_PARSER_FIELD( ctrl, Parse_UInt8 ); + + SENF_PARSER_FIELD( protocolId, Parse_UInt24 ); + SENF_PARSER_FIELD( type, Parse_UInt24 ); + + SENF_PARSER_FINALIZE(Parse_EthLlcSnapPacket); + }; + + /** \brief Ethernet LLC/SNAP header + + \todo document me + + \par Packet type (typedef): + \ref EthLlcSnapPacketType + + \par Fields: + \ref Parse_EthLlcSnapPacket + + \par Associated registries: + \ref EtherTypes + + \par Finalize action: + XXXX - ///@} + \ingroup protocolbundle_default + */ + struct EthLlcSnapPacketType + : public PacketTypeBase, + public PacketTypeMixin + { +#ifndef DOXYGEN + typedef PacketTypeMixin mixin; + typedef ConcretePacket packet; + typedef Parse_EthLlcSnapPacket parser; +#endif + using mixin::nextPacketRange; + using mixin::nextPacketType; + using mixin::initSize; + using mixin::init; + + static registry_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 EthLlcSnapPacket; } ///////////////////////////////hh.e//////////////////////////////////////// +#endif +#ifndef SENF_PACKETS_DECL_ONLY //#include "EthernetPacket.cci" -#include "EthernetPacket.ct" +//#include "EthernetPacket.ct" //#include "EthernetPacket.cti" #endif