Add ipv4 header checksum support.
authorFlorian Westphal <fw@strlen.de>
Thu, 05 Jun 2008 01:08:33 +0200
changeset 3234 aabbcb2cba71
parent 3233 35ba9a71bcb5
child 3235 c2f34dac1b9e
Add ipv4 header checksum support.
src/node/ipv4-header.cc
src/node/ipv4-header.h
--- 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)