Bug 2132: If no endpoints are found for the incoming packet, the TcpL4Protocol sends an RST packet. However it was not well-formatted (missing right source, destination and ports).
authorNatale Patriciello <natale.patriciello@gmail.com>
Mon, 13 Jul 2015 07:50:47 -0700
changeset 11503 41b51e451375
parent 11502 aef58c4ab446
child 11504 00547750cdf2
Bug 2132: If no endpoints are found for the incoming packet, the TcpL4Protocol sends an RST packet. However it was not well-formatted (missing right source, destination and ports).
src/internet/model/tcp-l4-protocol.cc
src/internet/model/tcp-l4-protocol.h
--- a/src/internet/model/tcp-l4-protocol.cc	Mon Jul 13 07:48:39 2015 -0700
+++ b/src/internet/model/tcp-l4-protocol.cc	Mon Jul 13 07:50:47 2015 -0700
@@ -338,36 +338,43 @@
 
 enum IpL4Protocol::RxStatus
 TcpL4Protocol::Receive (Ptr<Packet> packet,
-                        Ipv4Header const &ipHeader,
+                        Ipv4Header const &incomingIpHeader,
                         Ptr<Ipv4Interface> incomingInterface)
 {
-  NS_LOG_FUNCTION (this << packet << ipHeader << incomingInterface);
+  NS_LOG_FUNCTION (this << packet << incomingIpHeader << incomingInterface);
 
-  TcpHeader tcpHeader;
+  TcpHeader incomingTcpHeader;
   if(Node::ChecksumEnabled ())
     {
-      tcpHeader.EnableChecksums ();
-      tcpHeader.InitializeChecksum (ipHeader.GetSource (), ipHeader.GetDestination (), PROT_NUMBER);
+      incomingTcpHeader.EnableChecksums ();
+      incomingTcpHeader.InitializeChecksum (incomingIpHeader.GetSource (),
+                                            incomingIpHeader.GetDestination (),
+                                            PROT_NUMBER);
     }
 
-  packet->PeekHeader (tcpHeader);
+  packet->PeekHeader (incomingTcpHeader);
 
   NS_LOG_LOGIC ("TcpL4Protocol " << this
-                                 << " receiving seq " << tcpHeader.GetSequenceNumber ()
-                                 << " ack " << tcpHeader.GetAckNumber ()
-                                 << " flags "<< std::hex << (int)tcpHeader.GetFlags () << std::dec
+                                 << " receiving seq " << incomingTcpHeader.GetSequenceNumber ()
+                                 << " ack " << incomingTcpHeader.GetAckNumber ()
+                                 << " flags "<< std::hex << (int)incomingTcpHeader.GetFlags () << std::dec
                                  << " data size " << packet->GetSize ());
 
-  if(!tcpHeader.IsChecksumOk ())
+  if(! incomingTcpHeader.IsChecksumOk ())
     {
       NS_LOG_INFO ("Bad checksum, dropping packet!");
       return IpL4Protocol::RX_CSUM_FAILED;
     }
 
   NS_LOG_LOGIC ("TcpL4Protocol "<<this<<" received a packet");
-  Ipv4EndPointDemux::EndPoints endPoints =
-    m_endPoints->Lookup (ipHeader.GetDestination (), tcpHeader.GetDestinationPort (),
-                         ipHeader.GetSource (), tcpHeader.GetSourcePort (),incomingInterface);
+
+  Ipv4EndPointDemux::EndPoints endPoints;
+  endPoints = m_endPoints->Lookup (incomingIpHeader.GetDestination (),
+                                   incomingTcpHeader.GetDestinationPort (),
+                                   incomingIpHeader.GetSource (),
+                                   incomingTcpHeader.GetSourcePort (),
+                                   incomingInterface);
+
   if (endPoints.empty ())
     {
       if (this->GetObject<Ipv6L3Protocol> () != 0)
@@ -375,42 +382,44 @@
           NS_LOG_LOGIC ("  No Ipv4 endpoints matched on TcpL4Protocol, trying Ipv6 "<<this);
           Ptr<Ipv6Interface> fakeInterface;
           Ipv6Header ipv6Header;
-          Ipv6Address src = Ipv6Address::MakeIpv4MappedAddress (ipHeader.GetSource ());
-          Ipv6Address dst = Ipv6Address::MakeIpv4MappedAddress (ipHeader.GetDestination ());
+          Ipv6Address src, dst;
+
+          src = Ipv6Address::MakeIpv4MappedAddress (incomingIpHeader.GetSource ());
+          dst = Ipv6Address::MakeIpv4MappedAddress (incomingIpHeader.GetDestination ());
           ipv6Header.SetSourceAddress (src);
           ipv6Header.SetDestinationAddress (dst);
           return (this->Receive (packet, ipv6Header, fakeInterface));
         }
 
-      NS_LOG_LOGIC ("  No endpoints matched on TcpL4Protocol "<<this);
-      std::ostringstream oss;
-      oss<<"  destination IP: ";
-      ipHeader.GetDestination ().Print (oss);
-      oss<<" destination port: "<< tcpHeader.GetDestinationPort ()<<" source IP: ";
-      ipHeader.GetSource ().Print (oss);
-      oss<<" source port: "<<tcpHeader.GetSourcePort ();
-      NS_LOG_LOGIC (oss.str ());
+      NS_LOG_LOGIC ("No endpoints matched on TcpL4Protocol "<< this <<
+                    " destination IP: " << incomingIpHeader.GetDestination () <<
+                    " destination port: "<< incomingTcpHeader.GetDestinationPort () <<
+                    " source IP: " << incomingIpHeader.GetSource () <<
+                    " source port: "<< incomingTcpHeader.GetSourcePort ());
 
-      if (!(tcpHeader.GetFlags () & TcpHeader::RST))
+      if (! (incomingTcpHeader.GetFlags () & TcpHeader::RST))
         {
           // build a RST packet and send
           Ptr<Packet> rstPacket = Create<Packet> ();
-          TcpHeader header;
-          if (tcpHeader.GetFlags () & TcpHeader::ACK)
+          TcpHeader outgoingTcpHeader;
+          if (incomingTcpHeader.GetFlags () & TcpHeader::ACK)
             {
               // ACK bit was set
-              header.SetFlags (TcpHeader::RST);
-              header.SetSequenceNumber (header.GetAckNumber ());
+              outgoingTcpHeader.SetFlags (TcpHeader::RST);
+              outgoingTcpHeader.SetSequenceNumber (incomingTcpHeader.GetAckNumber ());
             }
           else
             {
-              header.SetFlags (TcpHeader::RST | TcpHeader::ACK);
-              header.SetSequenceNumber (SequenceNumber32 (0));
-              header.SetAckNumber (header.GetSequenceNumber () + SequenceNumber32 (1));
+              outgoingTcpHeader.SetFlags (TcpHeader::RST | TcpHeader::ACK);
+              outgoingTcpHeader.SetSequenceNumber (SequenceNumber32 (0));
+              outgoingTcpHeader.SetAckNumber (incomingTcpHeader.GetSequenceNumber () + SequenceNumber32 (1));
             }
-          header.SetSourcePort (tcpHeader.GetDestinationPort ());
-          header.SetDestinationPort (tcpHeader.GetSourcePort ());
-          SendPacket (rstPacket, header, ipHeader.GetDestination (), ipHeader.GetSource ());
+
+          outgoingTcpHeader.SetSourcePort (incomingTcpHeader.GetDestinationPort ());
+          outgoingTcpHeader.SetDestinationPort (incomingTcpHeader.GetSourcePort ());
+
+          SendPacket (rstPacket, outgoingTcpHeader, incomingIpHeader.GetDestination (),
+                      incomingIpHeader.GetSource ());
           return IpL4Protocol::RX_ENDPOINT_CLOSED;
         }
       else
@@ -420,19 +429,21 @@
     }
   NS_ASSERT_MSG (endPoints.size () == 1, "Demux returned more than one endpoint");
   NS_LOG_LOGIC ("TcpL4Protocol "<<this<<" forwarding up to endpoint/socket");
-  (*endPoints.begin ())->ForwardUp (packet, ipHeader, tcpHeader.GetSourcePort (), 
+  (*endPoints.begin ())->ForwardUp (packet, incomingIpHeader,
+                                    incomingTcpHeader.GetSourcePort (),
                                     incomingInterface);
   return IpL4Protocol::RX_OK;
 }
 
 enum IpL4Protocol::RxStatus
 TcpL4Protocol::Receive (Ptr<Packet> packet,
-                        Ipv6Header const &ipHeader,
+                        Ipv6Header const &incomingIpHeader,
                         Ptr<Ipv6Interface> interface)
 {
-  NS_LOG_FUNCTION (this << packet << ipHeader.GetSourceAddress () << ipHeader.GetDestinationAddress ());
+  NS_LOG_FUNCTION (this << packet << incomingIpHeader.GetSourceAddress () <<
+                   incomingIpHeader.GetDestinationAddress ());
 
-  TcpHeader tcpHeader;
+  TcpHeader incomingTcpHeader;
 
   // If we are receving a v4-mapped packet, we will re-calculate the TCP checksum
   // Is it worth checking every received "v6" packet to see if it is v4-mapped in
@@ -440,19 +451,20 @@
 
   if(Node::ChecksumEnabled ())
     {
-      tcpHeader.EnableChecksums ();
-      tcpHeader.InitializeChecksum (ipHeader.GetSourceAddress (), ipHeader.GetDestinationAddress (), PROT_NUMBER);
+      incomingTcpHeader.EnableChecksums ();
+      incomingTcpHeader.InitializeChecksum (incomingIpHeader.GetSourceAddress (),
+                                    incomingIpHeader.GetDestinationAddress (), PROT_NUMBER);
     }
 
-  packet->PeekHeader (tcpHeader);
+  packet->PeekHeader (incomingTcpHeader);
 
   NS_LOG_LOGIC ("TcpL4Protocol " << this
-                                 << " receiving seq " << tcpHeader.GetSequenceNumber ()
-                                 << " ack " << tcpHeader.GetAckNumber ()
-                                 << " flags "<< std::hex << (int)tcpHeader.GetFlags () << std::dec
+                                 << " receiving seq " << incomingTcpHeader.GetSequenceNumber ()
+                                 << " ack " << incomingTcpHeader.GetAckNumber ()
+                                 << " flags "<< std::hex << (int)incomingTcpHeader.GetFlags () << std::dec
                                  << " data size " << packet->GetSize ());
 
-  if(!tcpHeader.IsChecksumOk ())
+  if(!incomingTcpHeader.IsChecksumOk ())
     {
       NS_LOG_INFO ("Bad checksum, dropping packet!");
       return IpL4Protocol::RX_CSUM_FAILED;
@@ -460,39 +472,37 @@
 
   NS_LOG_LOGIC ("TcpL4Protocol "<<this<<" received a packet");
   Ipv6EndPointDemux::EndPoints endPoints =
-    m_endPoints6->Lookup (ipHeader.GetDestinationAddress (), tcpHeader.GetDestinationPort (),
-                          ipHeader.GetSourceAddress (), tcpHeader.GetSourcePort (),interface);
+    m_endPoints6->Lookup (incomingIpHeader.GetDestinationAddress (), incomingTcpHeader.GetDestinationPort (),
+                          incomingIpHeader.GetSourceAddress (), incomingTcpHeader.GetSourcePort (),interface);
   if (endPoints.empty ())
     {
-      NS_LOG_LOGIC ("  No IPv6 endpoints matched on TcpL4Protocol "<<this);
-      std::ostringstream oss;
-      oss<<"  destination IP: ";
-      (ipHeader.GetDestinationAddress ()).Print (oss);
-      oss<<" destination port: "<< tcpHeader.GetDestinationPort ()<<" source IP: ";
-      (ipHeader.GetSourceAddress ()).Print (oss);
-      oss<<" source port: "<<tcpHeader.GetSourcePort ();
-      NS_LOG_LOGIC (oss.str ());
+      NS_LOG_LOGIC ("No endpoints matched on TcpL4Protocol "<< this <<
+                    " destination IP: " << incomingIpHeader.GetDestinationAddress () <<
+                    " destination port: "<< incomingTcpHeader.GetDestinationPort () <<
+                    " source IP: " << incomingIpHeader.GetSourceAddress () <<
+                    " source port: "<< incomingTcpHeader.GetSourcePort ());
 
-      if (!(tcpHeader.GetFlags () & TcpHeader::RST))
+      if (!(incomingTcpHeader.GetFlags () & TcpHeader::RST))
         {
           // build a RST packet and send
           Ptr<Packet> rstPacket = Create<Packet> ();
-          TcpHeader header;
-          if (tcpHeader.GetFlags () & TcpHeader::ACK)
+          TcpHeader outgoingTcpHeader;
+          if (incomingTcpHeader.GetFlags () & TcpHeader::ACK)
             {
               // ACK bit was set
-              header.SetFlags (TcpHeader::RST);
-              header.SetSequenceNumber (header.GetAckNumber ());
+              outgoingTcpHeader.SetFlags (TcpHeader::RST);
+              outgoingTcpHeader.SetSequenceNumber (incomingTcpHeader.GetAckNumber ());
             }
           else
             {
-              header.SetFlags (TcpHeader::RST | TcpHeader::ACK);
-              header.SetSequenceNumber (SequenceNumber32 (0));
-              header.SetAckNumber (header.GetSequenceNumber () + SequenceNumber32 (1));
+              outgoingTcpHeader.SetFlags (TcpHeader::RST | TcpHeader::ACK);
+              outgoingTcpHeader.SetSequenceNumber (SequenceNumber32 (0));
+              outgoingTcpHeader.SetAckNumber (incomingTcpHeader.GetSequenceNumber () + SequenceNumber32 (1));
             }
-          header.SetSourcePort (tcpHeader.GetDestinationPort ());
-          header.SetDestinationPort (tcpHeader.GetSourcePort ());
-          SendPacket (rstPacket, header, ipHeader.GetDestinationAddress (), ipHeader.GetSourceAddress ());
+          outgoingTcpHeader.SetSourcePort (incomingTcpHeader.GetDestinationPort ());
+          outgoingTcpHeader.SetDestinationPort (incomingTcpHeader.GetSourcePort ());
+          SendPacket (rstPacket, outgoingTcpHeader, incomingIpHeader.GetDestinationAddress (),
+                      incomingIpHeader.GetSourceAddress ());
           return IpL4Protocol::RX_ENDPOINT_CLOSED;
         }
       else
@@ -502,7 +512,7 @@
     }
   NS_ASSERT_MSG (endPoints.size () == 1, "Demux returned more than one endpoint");
   NS_LOG_LOGIC ("TcpL4Protocol "<<this<<" forwarding up to endpoint/socket");
-  (*endPoints.begin ())->ForwardUp (packet, ipHeader, tcpHeader.GetSourcePort (), interface);
+  (*endPoints.begin ())->ForwardUp (packet, incomingIpHeader, incomingTcpHeader.GetSourcePort (), interface);
   return IpL4Protocol::RX_OK;
 }
 
--- a/src/internet/model/tcp-l4-protocol.h	Mon Jul 13 07:48:39 2015 -0700
+++ b/src/internet/model/tcp-l4-protocol.h	Mon Jul 13 07:50:47 2015 -0700
@@ -221,10 +221,10 @@
 
   // From IpL4Protocol
   virtual enum IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
-                                               Ipv4Header const &header,
+                                               Ipv4Header const &incomingIpHeader,
                                                Ptr<Ipv4Interface> incomingInterface);
   virtual enum IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
-                                               Ipv6Header const &header,
+                                               Ipv6Header const &incomingIpHeader,
                                                Ptr<Ipv6Interface> incomingInterface);
 
   virtual void ReceiveIcmp (Ipv4Address icmpSource, uint8_t icmpTtl,