# HG changeset patch # User Florian Westphal # Date 1212094152 -7200 # Node ID c1de9e827b5f82c13ed5db036a09eea86c69b2d1 # Parent f19a176ad723ce12db8c2b7d0cff45bcfb539c8e Add ipv4 header checksum support. diff -r f19a176ad723 -r c1de9e827b5f src/internet-node/ipv4-header.cc --- a/src/internet-node/ipv4-header.cc Thu May 29 21:56:24 2008 +0200 +++ b/src/internet-node/ipv4-header.cc Thu May 29 22:49:12 2008 +0200 @@ -178,6 +178,20 @@ return m_goodChecksum; } +uint16_t +Ipv4Header::Checksum(Buffer::Iterator &i) +{ + uint32_t sum = 0; + + // doesn't handle ip headers with size != 20 yet + for (int j = 0; j < 10 ; j++) + sum += i.ReadU16 (); + + while (sum >> 16) + sum = (sum >> 16) + sum & 0xFFFFU; + return ~sum; +} + TypeId Ipv4Header::GetTypeId (void) @@ -266,16 +280,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 = Checksum(i); NS_LOG_LOGIC ("checksum=" <