// $Id$
//
// Copyright (C) 2006
-// Fraunhofer Institute for Open Communication Systems (FOKUS)
-// Competence Center NETwork research (NET), St. Augustin, GERMANY
+// 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
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() + IPv4PacketParser::source_t::fixed_bytes );
+ 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() + IPv4PacketParser::destination_t::fixed_bytes );
}
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() + IPv6PacketParser::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() + 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
+ // 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;
}