From a968aeabb87d846bd7d0ec05690fea4052455c44 Mon Sep 17 00:00:00 2001 From: Natale Patriciello Date: Fri, 3 Feb 2017 14:02:11 +0100 Subject: [PATCH] tcp: Emulate SACK for SACKless connections in TcpSocketBase --- src/internet/model/tcp-socket-base.cc | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/internet/model/tcp-socket-base.cc b/src/internet/model/tcp-socket-base.cc index 88dcaa40d..4958b466c 100644 --- a/src/internet/model/tcp-socket-base.cc +++ b/src/internet/model/tcp-socket-base.cc @@ -1305,6 +1305,26 @@ TcpSocketBase::DoForwardUp (Ptr packet, const Address &fromAddress, EstimateRtt (tcpHeader); UpdateWindowSize (tcpHeader); + + if (!m_sackEnabled + && m_tcb->m_congState != TcpSocketState::CA_LOSS + && !m_persistEvent.IsRunning ()) + { + // Emulate SACK for (old) dupack definition. + // Don't generate block for the persistent window probe + // Don't include the ACK number in any SACK block + if (tcpHeader.GetAckNumber () == m_txBuffer->HeadSequence () + && tcpHeader.GetAckNumber () < m_tcb->m_nextTxSequence) + { + // Dupack following old ns-3 behavior. Craft a special SACK option. + uint8_t available = tcpHeader.GetMaxOptionLength () - tcpHeader.GetOptionLength (); + Ptr sackBlock = m_txBuffer->CraftSackOption (tcpHeader.GetAckNumber (), available); + if (sackBlock != 0) + { + tcpHeader.AppendOption (sackBlock); + } + } + } }