X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FDefaultBundle%2FIPv4Packet.hh;h=e124ee4c6dd01ef9daddbbcced5e133d2523503c;hb=b89e3166f7680755683dccee5e48cb3a820185c0;hp=c047b96ca1dd4db1310996102829f4f5903759f6;hpb=67608d39cb73231d6deaae285aa5477762246e50;p=senf.git diff --git a/Packets/DefaultBundle/IPv4Packet.hh b/Packets/DefaultBundle/IPv4Packet.hh index c047b96..e124ee4 100644 --- a/Packets/DefaultBundle/IPv4Packet.hh +++ b/Packets/DefaultBundle/IPv4Packet.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 +// Stefan Bund // // 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 @@ -23,8 +23,8 @@ /** \file \brief IPv4Packet public header */ -#ifndef HH_IPv4Packet_ -#define HH_IPv4Packet_ 1 +#ifndef HH_SENF_Packets_DefaultBundle_IPv4Packet_ +#define HH_SENF_Packets_DefaultBundle_IPv4Packet_ 1 // Custom includes #include "../../Socket/Protocols/INet/INet4Address.hh" @@ -39,9 +39,9 @@ namespace senf { \see INet4Address */ - struct Parse_INet4Address : public PacketParserBase + struct INet4AddressParser : public PacketParserBase { - Parse_INet4Address(data_iterator i, state_type s) : PacketParserBase(i,s,fixed_bytes) {} + INet4AddressParser(data_iterator i, state_type s) : PacketParserBase(i,s,fixed_bytes) {} /////////////////////////////////////////////////////////////////////////// @@ -50,9 +50,9 @@ namespace senf { 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) + operator value_type() const { return value(); } + byte & operator[](size_type index) const { return *boost::next(i(),index); } + INet4AddressParser const & operator= (value_type const & other) { value(other); return *this; } }; @@ -60,32 +60,34 @@ namespace senf { Parser implementing the IPv4 header. + \image html IPv4Packet.png + \see IPv4PacketType \n RFC 791 \todo Implement options */ - struct Parse_IPv4 : public PacketParserBase + struct IPv4PacketParser : public PacketParserBase { # 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_FIELD( tos, UInt8Parser ); + SENF_PARSER_FIELD( length, UInt16Parser ); + SENF_PARSER_FIELD( identifier, UInt16Parser ); - 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_PRIVATE_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_FIELD( ttl, UInt8Parser ); + SENF_PARSER_FIELD( protocol, UInt8Parser ); + SENF_PARSER_FIELD( checksum, UInt16Parser ); + SENF_PARSER_FIELD( source, INet4AddressParser ); + SENF_PARSER_FIELD( destination, INet4AddressParser ); SENF_PARSER_INIT() { version() = 4; @@ -93,13 +95,18 @@ namespace senf { ihl() = 5; } - SENF_PARSER_FINALIZE(Parse_IPv4); + SENF_PARSER_FINALIZE(IPv4PacketParser); - boost::uint16_t calcChecksum() const; + boost::uint16_t calcChecksum() const; ///< calculate header checksum + /**< calculate and return the checksum of the header + \see \ref senf::IpChecksum */ bool validateChecksum() const { return checksum() == calcChecksum(); - } + } ///< validate header checksum + /**< return \c true if the \ref checksum() "checksum" + field is equal to the \ref calcChecksum() + "calculated checksum" */ }; /** \brief IP protocol number registry @@ -114,6 +121,12 @@ namespace senf { }; /** \brief IPv4 packet + + \par Packet type (typedef): + \ref IPv4Packet + + \par Fields: + see \ref IPv4PacketParser @@ -123,41 +136,33 @@ namespace senf { - - - - + + + + - - - - - + + + + + - - - + + + - + - +
20 24 28 31
\ref Parse_IPv4::version() "Version"\ref Parse_IPv4::ihl() "IHL"\ref Parse_IPv4::tos() "TOS"\ref Parse_IPv4::length() "Length"\ref IPv4PacketParser::version() "Version"\ref IPv4PacketParser::ihl() "IHL"\ref IPv4PacketParser::tos() "TOS"\ref IPv4PacketParser::length() "Length"
\ref Parse_IPv4::identifier() "Identifier"\ref Parse_IPv4::reserved() "R"\ref Parse_IPv4::df() "DF"\ref Parse_IPv4::mf() "MF"\ref Parse_IPv4::frag() "Fragment Offset"\ref IPv4PacketParser::identifier() "Identifier"R\ref IPv4PacketParser::df() "DF"\ref IPv4PacketParser::mf() "MF"\ref IPv4PacketParser::frag() "Fragment Offset"
\ref Parse_IPv4::ttl() "Time to Live (ttl)"\ref Parse_IPv4::protocol() "Protocol"\ref Parse_IPv4::checksum() "Header Checksum"\ref IPv4PacketParser::ttl() "Time to Live (ttl)"\ref IPv4PacketParser::protocol() "Protocol"\ref IPv4PacketParser::checksum() "Header Checksum"
\ref Parse_IPv4::source() "Source Address"\ref IPv4PacketParser::source() "Source Address"
\ref Parse_IPv4::destination() "Destination Address"\ref IPv4PacketParser::destination() "Destination Address"
- - \par Packet type (typedef): - \ref IPv4Packet - - \par Fields: - \ref Parse_IPv4 \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 - + \copydetails finalize() + \ingroup protocolbundle_default */ struct IPv4PacketType @@ -166,21 +171,30 @@ namespace senf { { #ifndef DOXYGEN typedef PacketTypeMixin mixin; - typedef ConcretePacket packet; - typedef Parse_IPv4 parser; #endif + typedef ConcretePacket packet; ///< IPv4 packet typedef + typedef IPv4PacketParser parser; ///< typedef to the parser of IPv4 packet + using mixin::nextPacketRange; using mixin::nextPacketType; using mixin::initSize; using mixin::init; - static registry_key_t nextPacketKey(packet p) + static key_t nextPacketKey(packet p) { return p->protocol(); } - - static void dump(packet p, std::ostream & os); - static void finalize(packet p); - }; + /** \brief Dump given IPv4Packet in readable form to given output stream */ + static void dump(packet p, std::ostream & os); + + static void finalize(packet p); ///< Finalize packet. + /**< \li set \ref IPv4PacketParser::length() "length" + from payload size + \li set \ref IPv4PacketParser::protocol() "protocol" + from type of next packet if found in \ref IpTypes + \li calculate and set + \ref IPv4PacketParser::checksum() "checksum" */ + }; + /** \brief IPv4 packet typedef */ typedef ConcretePacket IPv4Packet; } @@ -189,7 +203,7 @@ namespace senf { ///////////////////////////////hh.e//////////////////////////////////////// #endif #ifndef SENF_PACKETS_DECL_ONLY -//#include IPv4Packet.cci" +//#include "IPv4Packet.cci" //#include "IPv4Packet.ct" //#include "IPv4Packet.cti" #endif