[BUG 2258] Discarded segments should not update options and rtt
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user