Fix for bug 615

This commit is contained in:
Josh Pelkey committed 2009-10-07 23:06:21 -04:00
1 parent d2c08094eb
commit 43b1ccc7c8
3 files changed
+30 -1

No files matched your search

+2
View File
@@ -735,6 +735,8 @@ Ipv4L3Protocol::LocalDeliver (Ptr<const Packet> 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:
+1
View File
@@ -45,6 +45,7 @@ public:
enum RxStatus {
RX_OK,
RX_CSUM_FAILED,
RX_ENDPOINT_CLOSED,
RX_ENDPOINT_UNREACH
};
+27 -1
View File
@@ -512,7 +512,33 @@ TcpL4Protocol::Receive (Ptr<Packet> packet,
source.Print (oss);
oss<<" source port: "<<tcpHeader.GetSourcePort ();
NS_LOG_LOGIC (oss.str ());
return Ipv4L4Protocol::RX_ENDPOINT_UNREACH;
if (!(tcpHeader.GetFlags () & TcpHeader::RST))
{
// build a RST packet and send
Ptr<Packet> rstPacket = Create<Packet> ();
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 "<<this<<" forwarding up to endpoint/socket");