Add ipv4 header checksum support.
--- a/src/node/ipv4-header.cc Thu Jun 05 11:46:15 2008 +0100
+++ 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=" <<checksum);
i = start;
i.Next (10);
i.WriteU16 (checksum);
-#endif
}
}
uint32_t
@@ -313,18 +325,11 @@
if (m_calcChecksum)
{
-#if 0
- uint8_t *data = start.PeekData ();
- uint16_t localChecksum = UtilsChecksumCalculate (0, data, headerSize);
- if (localChecksum == 0xffff)
- {
- m_goodChecksum = true;
- }
- else
- {
- m_goodChecksum = false;
- }
-#endif
+ i = start;
+ uint16_t checksum = ChecksumCalculate(i, headerSize);
+ NS_LOG_LOGIC ("checksum=" <<checksum);
+
+ m_goodChecksum = (checksum == 0);
}
return GetSerializedSize ();
}
--- a/src/node/ipv4-header.h Thu Jun 05 11:46:15 2008 +0100
+++ b/src/node/ipv4-header.h Thu Jun 05 01:08:33 2008 +0200
@@ -131,7 +131,7 @@
Ipv4Address GetDestination (void) const;
/**
- * \returns true if the upv4 checksum is correct, false otherwise.
+ * \returns true if the ipv4 checksum is correct, false otherwise.
*
* If Ipv4Header::EnableChecksums has not been called prior to
* creating this packet, this method will always return true.
@@ -146,6 +146,7 @@
virtual uint32_t Deserialize (Buffer::Iterator start);
private:
+ static uint16_t ChecksumCalculate(Buffer::Iterator &i, uint16_t len);
enum FlagsE {
DONT_FRAGMENT = (1<<0),
MORE_FRAGMENTS = (1<<1)