[BUG 2258] Discarded segments should not update options and rtt

This commit is contained in:
Natale Patriciello
2016-01-22 14:57:10 +01:00
parent a37b455fc5
commit 83665ea6ff
2 changed files with 17 additions and 17 deletions

View File

@@ -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

View File

@@ -1158,11 +1158,27 @@ TcpSocketBase::DoForwardUp (Ptr<Packet> 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> 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)
{