// $Id$
//
// Copyright (C) 2006
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
-// Stefan Bund <stefan.bund@fokus.fraunhofer.de>
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+// Stefan Bund <g0dil@berlios.de>
//
// 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
#include "UDPPacket.hh"
//#include "UDPPacket.ih"
-#include "IpV4Packet.hh"
+#include "IPv4Packet.hh"
// Custom includes
#include <iomanip>
#include <boost/io/ios_state.hpp>
#include "../../Packets/Packets.hh"
#include "../../Utils/IpChecksum.hh"
-#include "IpV4Packet.hh"
-#include "IpV6Packet.hh"
+#include "IPv4Packet.hh"
+#include "IPv6Packet.hh"
#define prefix_
///////////////////////////////cc.p////////////////////////////////////////
}
///////////////////////////////////////////////////////////////////////////
-// senf::Parse_UDP
+// senf::UDPPacketParser
-prefix_ boost::uint16_t senf::Parse_UDP::calcChecksum()
+prefix_ boost::uint16_t senf::UDPPacketParser::calcChecksum()
const
{
IpChecksum summer;
- summer.feed( i(), i()+checksum_offset );
- summer.feed( i()+checksum_offset+2, data().end() );
-
- // Now on to the awkward part: the IP pseudo header
- IpV4Packet ipv4 (packet().prev<IpV4Packet>(nothrow));
+ // first on to the awkward part: the IP pseudo header
+ IPv4Packet ipv4 (packet().rfind<IPv4Packet>(nothrow));
if (ipv4) {
// Pseudo header defined in RFC768
summer.feed( ipv4->source().i(),
- ipv4->source().i() + Parse_IpV4::source_t::fixed_bytes );
- ///\fixme What about a hop-by-hop routing option? Which destination is used in IpV4 ?
+ ipv4->source().i() + IPv4Packet::Parser::source_t::fixed_bytes );
+ ///\fixme What about a hop-by-hop routing option? Which destination is used in IPv4 ?
summer.feed( ipv4->destination().i(),
- ipv4->destination().i() + Parse_IpV4::destination_t::fixed_bytes );
+ ipv4->destination().i() + IPv4PacketParser::destination_t::fixed_bytes );
summer.feed( 0u );
- ///\fixme May there be another header between the IpV4 header and UDP? if so, we
+ ///\fixme May there be another header between the IPv4 header and UDP? if so, we
/// need to hack the correct protocol number here ...
summer.feed( 17u );
summer.feed( i() + length_offset, i() + length_offset + 2 );
}
else {
// Pseudo header defined in RFC2460
- IpV6Packet ipv6 (packet().prev<IpV6Packet>(nothrow));
+ IPv6Packet ipv6 (packet().rfind<IPv6Packet>(nothrow));
if (ipv6) {
summer.feed( ipv6->source().i(),
- ipv6->source().i() + Parse_IpV6::source_t::fixed_bytes );
+ ipv6->source().i() + IPv6Packet::Parser::source_t::fixed_bytes );
///\todo Implement routing header support
// The destination used here must be the *final* destination ...
summer.feed( ipv6->destination().i(),
- ipv6->destination().i() + Parse_IpV6::destination_t::fixed_bytes );
- /// This is a simplification. The value is really 32bit to support UDP Jumbograms
- /// (RFC2147). However, skipping an even number of 0 bytes does not change the checksum
+ ipv6->destination().i() + IPv6PacketParser::destination_t::fixed_bytes );
+ // This is a simplification. The value is really 32bit to support UDP Jumbograms
+ // (RFC2147). However, skipping an even number of 0 bytes does not change the checksum
summer.feed( i() + length_offset, i() + length_offset + 2 );
// RFC2460 specifies, that this must always be 17, not the value used in the ipv6
// header
}
}
+ // since header are 16 / even 32bit aligned we don't have to care for padding. since IpChecksum
+ // cares for padding at the final summing we don't have to care is the payload is 16nbit-aligned, too.
+ summer.feed( i(), i()+checksum_offset );
+ summer.feed( i()+checksum_offset+2, data().end() );
+
boost::uint16_t rv (summer.sum());
return rv ? rv : 0xffffu;
}