X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FDefaultBundle%2FEthernetPacket.hh;h=51a2389e2774e8b18397f248746025871897c285;hb=8674fb1d184e7d620eb7c604957b5b4203df37a6;hp=f40d7551e79cb305b9353d636da22fcfe94d67c0;hpb=d53c168dbfd70ffea9ebad8953193163e113ff3a;p=senf.git diff --git a/Packets/DefaultBundle/EthernetPacket.hh b/Packets/DefaultBundle/EthernetPacket.hh index f40d755..51a2389 100644 --- a/Packets/DefaultBundle/EthernetPacket.hh +++ b/Packets/DefaultBundle/EthernetPacket.hh @@ -1,9 +1,9 @@ -// $id: EthernetPacket.hh 299 2007-07-10 21:23:49Z g0dil $ +// $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,36 +20,22 @@ // 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 -#include -#include "Packets/Packets.hh" +#include "../../Socket/Protocols/Raw/MACAddress.hh" +#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. - - \todo Move to someplace else when implementing the addressing classes - */ - struct MACAddress - : boost::array - { - MACAddress(std::string addr); - template - MACAddress(InputIterator i); - - struct SyntaxException : public std::exception - { virtual char const * what() const throw() { return "invalid mac address syntax"; } }; - }; - /** \brief Parse an Ethernet MAC address The ethernet MAC is returned by value as a 6-byte sequence @@ -57,59 +43,48 @@ namespace senf { \see MACAddress \n EthernetPacket */ - struct Parse_MAC : public PacketParserBase + struct MACAddressParser : public PacketParserBase { - Parse_MAC(data_iterator i, state_type s) : PacketParserBase(i,s,fixed_bytes) {} + MACAddressParser(data_iterator i, state_type s) : PacketParserBase(i,s,fixed_bytes) {} /////////////////////////////////////////////////////////////////////////// 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; } + MACAddressParser const & operator= (value_type const & other) { value(other); return *this; } }; /** \brief Parse an Ethernet packet - Parser implementing an ethernet header. The fields implemented are - - - - - - -
Field name Parser type
destination \ref Parse_MAC
source \ref Parse_MAC
type \ref Parse_Type
+ Parser implementing an ethernet header. \see EthernetPacketType */ - struct Parse_Ethernet : public PacketParserBase + struct EthernetPacketParser : public PacketParserBase { - SENF_PACKET_PARSER_INIT(Parse_Ethernet); - - /////////////////////////////////////////////////////////////////////////// +# include SENF_FIXED_PARSER() - typedef Parse_UInt16 Parse_Type; + SENF_PARSER_FIELD( destination, MACAddressParser ); + SENF_PARSER_FIELD( source, MACAddressParser ); + SENF_PARSER_FIELD( type_length, UInt16Parser ); - SENF_PACKET_PARSER_DEFINE_FIXED_FIELDS( - ((Field)( destination, Parse_MAC )) - ((Field)( source, Parse_MAC )) - ((Field)( type, Parse_Type )) ); + SENF_PARSER_FINALIZE(EthernetPacketParser); }; /** \brief EtherType registry This registry registers packet types with their EtherType number. - \see Ethernet numbers - \ref PacketRegistry + \see Ethernet numbers \n + \ref PacketRegistry */ struct EtherTypes { - // See typedef boost::uint16_t key_t; }; @@ -119,67 +94,57 @@ namespace senf { \ref EthernetPacket \par Fields: - \ref Parse_Ethernet + \ref EthernetPacketParser + \image html EthernetPacket.png \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; +#endif typedef ConcretePacket packet; - typedef Parse_Ethernet parser; + typedef EthernetPacketParser 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 registry_key_t nextPacketKey(packet p) - { return p->type(); } - - static void dump(packet p, std::ostream & os); + static factory_t nextPacketType(packet p); + /// Dump given EthernetPacket in readable form to given output stream + static void dump(packet p, std::ostream & os); + static void finalize(packet p); }; /** \brief Ethernet packet typedef */ - typedef EthernetPacketType::packet EthernetPacket; + typedef ConcretePacket EthernetPacket; /** \brief Parse an ethernet VLAN tag Parser interpreting the ethernet VLAN tag. Fields are - - - - - - -
Field nameParser type
priority\ref Parse_Priority
cfi\ref Parse_CFI
vlanId\ref Parse_VLanId
type\ref Parse_Type
- \see EthVLanPacketType */ - struct Parse_EthVLan : public PacketParserBase + struct EthVLanPacketParser : 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, UInt16Parser ); - 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(EthVLanPacketParser); }; /** \brief Ethernet VLAN tag @@ -188,20 +153,26 @@ namespace senf { \ref EthVLanPacket \par Fields: - \ref Parse_EthVLan - + \ref EthVLanPacketParser + \image html EthVLanPacket.png + \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; +#endif typedef ConcretePacket packet; - typedef Parse_EthVLan parser; + typedef EthVLanPacketParser parser; using mixin::nextPacketRange; using mixin::nextPacketType; @@ -210,22 +181,22 @@ namespace senf { /** \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) + static key_t nextPacketKey(packet p) { return p->type(); } + /// Dump given EthVLanPacket in readable form to given output stream static void dump(packet p, std::ostream & os); + static void finalize(packet p); }; /** \brief Ethernet VLAN tag typedef */ - typedef EthVLanPacketType::packet EthVLanPacket; -} + typedef ConcretePacket EthVLanPacket; +} ///////////////////////////////hh.e//////////////////////////////////////// -#endif -#ifndef SENF_PACKETS_DECL_ONLY //#include "EthernetPacket.cci" -#include "EthernetPacket.ct" +//#include "EthernetPacket.ct" //#include "EthernetPacket.cti" #endif