From 83665ea6ff5368feb40c9c1f824bc4da6de8e703 Mon Sep 17 00:00:00 2001 From: Natale Patriciello Date: Fri, 22 Jan 2016 14:57:10 +0100 Subject: [PATCH] [BUG 2258] Discarded segments should not update options and rtt --- RELEASE_NOTES | 1 + src/internet/model/tcp-socket-base.cc | 33 +++++++++++++-------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/RELEASE_NOTES b/RELEASE_NOTES index 2bc2df08a..f4e6b8d0a 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -80,6 +80,7 @@ Bugs fixed - Bug 2254 - Ipv[4,6]RawSocket can return the wrong number of bytes sent. - Bug 2255 - Ipv6RawSocket does not call data sent callbacks. - Bug 2257 - Ipv[4,6]InterfaceContainer::Add are not consistent +- Bug 2258 - TcpSocketBase updated options and RTT for out of range segments. - Bug 2259 - GSL not successfully enabled for Wi-Fi DSSS error rate model - Bug 2267 - Wrong channel bandwidth value in pcap files - Bug 2272 - SixLowPan NetDevice can not send uncompressed packets larger than 802.15.4 MTU diff --git a/src/internet/model/tcp-socket-base.cc b/src/internet/model/tcp-socket-base.cc index 56b4e86a1..60ca697f6 100644 --- a/src/internet/model/tcp-socket-base.cc +++ b/src/internet/model/tcp-socket-base.cc @@ -1158,11 +1158,27 @@ TcpSocketBase::DoForwardUp (Ptr packet, const Address &fromAddress, // Peel off TCP header and do validity checking TcpHeader tcpHeader; uint32_t bytesRemoved = packet->RemoveHeader (tcpHeader); + SequenceNumber32 seq = tcpHeader.GetSequenceNumber (); if (bytesRemoved == 0 || bytesRemoved > 60) { NS_LOG_ERROR ("Bytes removed: " << bytesRemoved << " invalid"); return; // Discard invalid packet } + else if (packet->GetSize () > 0 && OutOfRange (seq, seq + packet->GetSize ())) + { + // Discard fully out of range data packets + NS_LOG_LOGIC ("At state " << TcpStateName[m_state] << + " received packet of seq [" << seq << + ":" << seq + packet->GetSize () << + ") out of range [" << m_rxBuffer->NextRxSequence () << ":" << + m_rxBuffer->MaxRxSequence () << ")"); + // Acknowledgement should be sent for all unacceptable packets (RFC793, p.69) + if (m_state == ESTABLISHED && !(tcpHeader.GetFlags () & TcpHeader::RST)) + { + SendEmptyPacket (TcpHeader::ACK); + } + return; + } m_rxTrace (packet, tcpHeader, this); @@ -1173,23 +1189,6 @@ TcpSocketBase::DoForwardUp (Ptr packet, const Address &fromAddress, EstimateRtt (tcpHeader); } - // Discard fully out of range data packets - if (packet->GetSize () - && OutOfRange (tcpHeader.GetSequenceNumber (), tcpHeader.GetSequenceNumber () + packet->GetSize ())) - { - NS_LOG_LOGIC ("At state " << TcpStateName[m_state] << - " received packet of seq [" << tcpHeader.GetSequenceNumber () << - ":" << tcpHeader.GetSequenceNumber () + packet->GetSize () << - ") out of range [" << m_rxBuffer->NextRxSequence () << ":" << - m_rxBuffer->MaxRxSequence () << ")"); - // Acknowledgement should be sent for all unacceptable packets (RFC793, p.69) - if (m_state == ESTABLISHED && !(tcpHeader.GetFlags () & TcpHeader::RST)) - { - SendEmptyPacket (TcpHeader::ACK); - } - return; - } - // Update Rx window size, i.e. the flow control window if (tcpHeader.GetFlags () & TcpHeader::ACK) {