Fix for bug 615
This commit is contained in:
1 parent
d2c08094eb
commit
43b1ccc7c8
3 files changed
+30
-1
No files matched your search
@@ -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:
|
||||
|
||||
@@ -45,6 +45,7 @@ public:
|
||||
enum RxStatus {
|
||||
RX_OK,
|
||||
RX_CSUM_FAILED,
|
||||
RX_ENDPOINT_CLOSED,
|
||||
RX_ENDPOINT_UNREACH
|
||||
};
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in new issue
Block a user