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=" <