From 64e2c2bb8f60fe7b7c25735cdbe19fd9ab183498 Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Thu, 5 Jun 2008 01:08:33 +0200 Subject: [PATCH] Add ipv4 header checksum support. --- src/node/ipv4-header.cc | 41 +++++++++++++++++++++++------------------ src/node/ipv4-header.h | 3 ++- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/node/ipv4-header.cc b/src/node/ipv4-header.cc index 3c7fb355f..a9660c8dd 100644 --- a/src/node/ipv4-header.cc +++ b/src/node/ipv4-header.cc @@ -178,6 +178,22 @@ Ipv4Header::IsChecksumOk (void) const return m_goodChecksum; } +uint16_t +Ipv4Header::ChecksumCalculate(Buffer::Iterator &i, uint16_t size) +{ + /* see RFC 1071 to understand this code. */ + uint32_t sum = 0; + + for (int j = 0; j < size/2; j++) + sum += i.ReadU16 (); + + if (size & 1) + sum += i.ReadU8 (); + + while (sum >> 16) + sum = (sum & 0xffff) + (sum >> 16); + return ~sum; +} TypeId Ipv4Header::GetTypeId (void) @@ -266,16 +282,12 @@ Ipv4Header::Serialize (Buffer::Iterator start) const if (m_calcChecksum) { -#if 0 - // XXX we need to add Buffer::Iterator::PeekData method - uint8_t *data = start.PeekData (); - uint16_t checksum = UtilsChecksumCalculate (0, data, GetSize ()); - checksum = UtilsChecksumComplete (checksum); + i = start; + uint16_t checksum = ChecksumCalculate(i, 20); NS_LOG_LOGIC ("checksum=" <