X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FDefaultBundle%2FIpV4Packet.hh;h=5b45f698932bda8620c9a12f7f910aa6550c3dba;hb=6a3a31fb7b2d2a5e8ae6d67d50797700274fb34e;hp=9d451c56402cdaee61a9c37d1448e5aa3e94a5ca;hpb=3d5b1045dc2531f239a3af4a8f3b17b1fe31549c;p=senf.git diff --git a/Packets/DefaultBundle/IpV4Packet.hh b/Packets/DefaultBundle/IpV4Packet.hh index 9d451c5..5b45f69 100644 --- a/Packets/DefaultBundle/IpV4Packet.hh +++ b/Packets/DefaultBundle/IpV4Packet.hh @@ -20,17 +20,42 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +/** \file + \brief IpV4Packet public header */ + #ifndef HH_IpV4Packet_ #define HH_IpV4Packet_ 1 // Custom includes -#include "Packets/Packets.hh" +#include "../../Socket/Protocols/INet/INet4Address.hh" +#include "../../Packets/Packets.hh" //#include "IpV4Packet.mpp" ///////////////////////////////hh.p//////////////////////////////////////// namespace senf { + /** \brief Parse in IpV4 address + + \see INet4Address + */ + struct Parse_INet4Address : public PacketParserBase + { + Parse_INet4Address(data_iterator i, state_type s) : PacketParserBase(i,s,fixed_bytes) {} + + /////////////////////////////////////////////////////////////////////////// + + typedef INet4Address value_type; + static const size_type fixed_bytes = 4u; + + value_type value() const { return value_type::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_INet4Address const & operator= (value_type const & other) + { value(other); return *this; } + }; + /** \brief Parse an IpV4 packet Parser implementing the IpV4 header. The fields implemented are: @@ -42,57 +67,38 @@ namespace senf { */ struct Parse_IpV4 : public PacketParserBase { - typedef Parse_UIntField < 0, 4 > Parse_Version; - typedef Parse_UIntField < 4, 8 > Parse_IHL; - typedef Parse_UInt8 Parse_8bit; - typedef Parse_UInt16 Parse_16bit; - typedef Parse_Flag < 0 > Parse_R; - typedef Parse_Flag < 1 > Parse_DF; - typedef Parse_Flag < 2 > Parse_MF; - typedef Parse_UIntField < 3, 16 > Parse_Frag; - typedef Parse_UInt32 Parse_32bit; - -# ifndef DOXYGEN - - SENF_PACKET_PARSER_NO_INIT(Parse_IpV4); - - SENF_PACKET_PARSER_DEFINE_FIXED_FIELDS( - ((OverlayField)( version, Parse_Version )) - ((Field )( ihl, Parse_IHL )) - ((Field )( tos, Parse_8bit )) - ((Field )( length, Parse_16bit )) - ((Field )( identifier, Parse_16bit )) - ((OverlayField)( reserved, Parse_R )) - ((OverlayField)( df, Parse_DF )) - ((OverlayField)( mf, Parse_MF )) - ((Field )( frag, Parse_Frag )) - ((Field )( ttl, Parse_8bit )) - ((Field )( protocol, Parse_8bit )) - ((Field )( crc, Parse_16bit )) - ((Field )( source, Parse_32bit )) - ((Field )( destination, Parse_32bit )) ); - -# else - - Parse_Version version(); - Parse_IHL ihl(); - Parse_8bit tos(); - Parse_16bit length(); - Parse_16bit identifier(); - Parse_R reserved(); - Parse_DF df(); - Parse_MF mf(); - Parse_Frag frag(); - Parse_8bit ttl(); - Parse_8bit protocol(); - Parse_16bit crc(); - Parse_32bit source(); - Parse_32bit destination(); - -# endif - - void init() { +# include SENF_FIXED_PARSER() + + SENF_PARSER_BITFIELD( version, 4, unsigned ); + SENF_PARSER_BITFIELD( ihl, 4, unsigned ); + + SENF_PARSER_FIELD( tos, Parse_UInt8 ); + SENF_PARSER_FIELD( length, Parse_UInt16 ); + SENF_PARSER_FIELD( identifier, Parse_UInt16 ); + + SENF_PARSER_BITFIELD( reserved, 1, bool ); + SENF_PARSER_BITFIELD( df, 1, bool ); + SENF_PARSER_BITFIELD( mf, 1, bool ); + SENF_PARSER_BITFIELD( frag, 13, unsigned ); + + SENF_PARSER_FIELD( ttl, Parse_UInt8 ); + SENF_PARSER_FIELD( protocol, Parse_UInt8 ); + SENF_PARSER_FIELD( checksum, Parse_UInt16 ); + SENF_PARSER_FIELD( source, Parse_INet4Address ); + SENF_PARSER_FIELD( destination, Parse_INet4Address ); + + SENF_PARSER_INIT() { version() = 4; + // We don't support option headers at the moment ... + ihl() = 5; + } + + SENF_PARSER_FINALIZE(Parse_IpV4); + + boost::uint16_t calcChecksum() const; + + bool validateChecksum() const { + return checksum() == calcChecksum(); } }; @@ -118,16 +124,22 @@ namespace senf { \par Associated registries: \ref IpTypes + \par Finalize action: + Set \a length from payload size\n + Set \a protocol from type of next packet if found in \ref IpTypes\n + Calculate \a checksum + \ingroup protocolbundle_default */ struct IpV4PacketType : public PacketTypeBase, public PacketTypeMixin { +#ifndef DOXYGEN typedef PacketTypeMixin mixin; typedef ConcretePacket packet; typedef Parse_IpV4 parser; - +#endif using mixin::nextPacketRange; using mixin::nextPacketType; using mixin::initSize; @@ -137,10 +149,11 @@ namespace senf { { return p->protocol(); } static void dump(packet p, std::ostream & os); + static void finalize(packet p); }; /** \brief IpV4 packet typedef */ - typedef IpV4PacketType::packet IpV4Packet; + typedef ConcretePacket IpV4Packet; }