src/internet-stack/tcp-header.cc
changeset 3404 b5d4a04c7b68
parent 3363 33d1ca2e4ba4
child 6434 ac8b4bf77e50
--- a/src/internet-stack/tcp-header.cc	Wed Jul 09 20:12:05 2008 -0700
+++ b/src/internet-stack/tcp-header.cc	Thu Jul 10 15:58:24 2008 -0700
@@ -23,6 +23,7 @@
 #include "tcp-socket-impl.h"
 #include "tcp-header.h"
 #include "ns3/buffer.h"
+#include "ns3/address-utils.h"
 
 namespace ns3 {
 
@@ -37,8 +38,6 @@
     m_flags (0),
     m_windowSize (0xffff),
     m_urgentPointer (0),
-    m_initialChecksum(0),
-    m_checksum (0),
     m_calcChecksum(false),
     m_goodChecksum(true)
 {}
@@ -52,11 +51,6 @@
   m_calcChecksum = true;
 }
 
-void TcpHeader::SetPayloadSize(uint16_t payloadSize)
-{
-  m_payloadSize = payloadSize;
-}
-
 void TcpHeader::SetSourcePort (uint16_t port)
 {
   m_sourcePort = port;
@@ -85,10 +79,6 @@
 {
   m_windowSize = windowSize;
 }
-void TcpHeader::SetChecksum (uint16_t checksum)
-{
-  m_checksum = checksum;
-}
 void TcpHeader::SetUrgentPointer (uint16_t urgentPointer)
 {
   m_urgentPointer = urgentPointer;
@@ -122,10 +112,6 @@
 {
   return m_windowSize;
 }
-uint16_t TcpHeader::GetChecksum () const
-{
-  return m_checksum;
-}
 uint16_t TcpHeader::GetUrgentPointer () const
 {
   return m_urgentPointer;
@@ -133,29 +119,31 @@
 
 void 
 TcpHeader::InitializeChecksum (Ipv4Address source, 
-                                   Ipv4Address destination,
-                                   uint8_t protocol)
+                               Ipv4Address destination,
+                               uint8_t protocol)
 {
-  Buffer buf = Buffer(12);
-  uint8_t tmp[4];
-  Buffer::Iterator it;
-  uint16_t tcpLength = m_payloadSize + GetSerializedSize();
-
-  buf.AddAtStart(12);
-  it = buf.Begin();
+  m_source = source;
+  m_destination = destination;
+  m_protocol = protocol;
+}
 
-  source.Serialize(tmp);
-  it.Write(tmp, 4); /* source IP address */
-  destination.Serialize(tmp);
-  it.Write(tmp, 4); /* destination IP address */
-  it.WriteU8(0); /* protocol */
-  it.WriteU8(protocol); /* protocol */
-  it.WriteU8(tcpLength >> 8); /* length */
-  it.WriteU8(tcpLength & 0xff); /* length */
+uint16_t
+TcpHeader::CalculateHeaderChecksum (uint16_t size) const
+{
+  Buffer buf = Buffer (12);
+  buf.AddAtStart (12);
+  Buffer::Iterator it = buf.Begin ();
 
-  it = buf.Begin();
+  WriteTo (it, m_source);
+  WriteTo (it, m_destination);
+  it.WriteU8 (0); /* protocol */
+  it.WriteU8 (m_protocol); /* protocol */
+  it.WriteU8 (size >> 8); /* length */
+  it.WriteU8 (size & 0xff); /* length */
+
+  it = buf.Begin ();
   /* we don't CompleteChecksum ( ~ ) now */
-  m_initialChecksum = ~(it.CalculateIpChecksum(12));
+  return ~(it.CalculateIpChecksum (12));
 }
 
 bool
@@ -219,7 +207,6 @@
 void TcpHeader::Serialize (Buffer::Iterator start)  const
 {
   Buffer::Iterator i = start;
-  uint16_t tcpLength = m_payloadSize + GetSerializedSize();
   i.WriteHtonU16 (m_sourcePort);
   i.WriteHtonU16 (m_destinationPort);
   i.WriteHtonU32 (m_sequenceNumber);
@@ -231,8 +218,9 @@
 
   if(m_calcChecksum)
   {
+    uint16_t headerChecksum = CalculateHeaderChecksum (start.GetSize ());
     i = start;
-    uint16_t checksum = i.CalculateIpChecksum(tcpLength, m_initialChecksum);
+    uint16_t checksum = i.CalculateIpChecksum(start.GetSize (), headerChecksum);
     
     i = start;
     i.Next(16);
@@ -250,16 +238,16 @@
   m_flags = field & 0x3F;
   m_length = field>>12;
   m_windowSize = i.ReadNtohU16 ();
-  m_checksum = i.ReadU16 ();
+  i.Next (2);
   m_urgentPointer = i.ReadNtohU16 ();
 
   if(m_calcChecksum)
-  {
+    {
+      uint16_t headerChecksum = CalculateHeaderChecksum (start.GetSize ());
       i = start;
-      uint16_t checksum = i.CalculateIpChecksum(m_payloadSize + GetSerializedSize(), m_initialChecksum);
-
+      uint16_t checksum = i.CalculateIpChecksum(start.GetSize (), headerChecksum);
       m_goodChecksum = (checksum == 0);
-  }
+    }
 
   return GetSerializedSize ();
 }