# HG changeset patch # User Florian Westphal # Date 1212620913 -7200 # Node ID 599598b98696a31a6346d3e47734e6ed414ac3be # Parent ec45f705b9ca71c89b2b7d9da775a3883886c564 Add ipv4 header checksum support. diff -r ec45f705b9ca -r 599598b98696 src/node/ipv4-header.cc --- a/src/node/ipv4-header.cc Wed Jun 04 16:14:49 2008 -0400 +++ b/src/node/ipv4-header.cc Thu Jun 05 01:08:33 2008 +0200 @@ -178,6 +178,22 @@ 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 @@ 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=" <