From 43b1ccc7c84dfd4c1a33a81eb74af8b335330fe7 Mon Sep 17 00:00:00 2001 From: Josh Pelkey Date: Wed, 7 Oct 2009 23:06:21 -0400 Subject: [PATCH] Fix for bug 615 --- src/internet-stack/ipv4-l3-protocol.cc | 2 ++ src/internet-stack/ipv4-l4-protocol.h | 1 + src/internet-stack/tcp-l4-protocol.cc | 28 +++++++++++++++++++++++++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/internet-stack/ipv4-l3-protocol.cc b/src/internet-stack/ipv4-l3-protocol.cc index 66b592513..8e95c4f70 100644 --- a/src/internet-stack/ipv4-l3-protocol.cc +++ b/src/internet-stack/ipv4-l3-protocol.cc @@ -735,6 +735,8 @@ Ipv4L3Protocol::LocalDeliver (Ptr packet, Ipv4Header const&ip, uin switch (status) { case Ipv4L4Protocol::RX_OK: // fall through + case Ipv4L4Protocol::RX_ENDPOINT_CLOSED: + // fall through case Ipv4L4Protocol::RX_CSUM_FAILED: break; case Ipv4L4Protocol::RX_ENDPOINT_UNREACH: diff --git a/src/internet-stack/ipv4-l4-protocol.h b/src/internet-stack/ipv4-l4-protocol.h index 09c04c3b8..810c5d2af 100644 --- a/src/internet-stack/ipv4-l4-protocol.h +++ b/src/internet-stack/ipv4-l4-protocol.h @@ -45,6 +45,7 @@ public: enum RxStatus { RX_OK, RX_CSUM_FAILED, + RX_ENDPOINT_CLOSED, RX_ENDPOINT_UNREACH }; diff --git a/src/internet-stack/tcp-l4-protocol.cc b/src/internet-stack/tcp-l4-protocol.cc index f67234a6b..7b9e87cec 100644 --- a/src/internet-stack/tcp-l4-protocol.cc +++ b/src/internet-stack/tcp-l4-protocol.cc @@ -512,7 +512,33 @@ TcpL4Protocol::Receive (Ptr packet, source.Print (oss); oss<<" source port: "< rstPacket = Create (); + TcpHeader header; + if (tcpHeader.GetFlags () & TcpHeader::ACK) + { + // ACK bit was set + header.SetFlags (TcpHeader::RST); + header.SetSequenceNumber (header.GetAckNumber ()); + } + else + { + header.SetFlags (TcpHeader::RST | TcpHeader::ACK); + header.SetSequenceNumber (SequenceNumber (0)); + header.SetAckNumber (header.GetSequenceNumber () + SequenceNumber (1)); + } + header.SetSourcePort (tcpHeader.GetDestinationPort ()); + header.SetDestinationPort (tcpHeader.GetSourcePort ()); + SendPacket (rstPacket, header, destination, source); + return Ipv4L4Protocol::RX_ENDPOINT_CLOSED; + } + else + { + return Ipv4L4Protocol::RX_ENDPOINT_CLOSED; + } } NS_ASSERT_MSG (endPoints.size() == 1 , "Demux returned more than one endpoint"); NS_LOG_LOGIC ("TcpL4Protocol "<