# HG changeset patch # User Alexander Krotov # Date 1455548367 -10800 # Mon Feb 15 17:59:27 2016 +0300 # Node ID f117d17414e378b3ad81530c102bcd58d7eadf7c # Parent 4f0dc872b81e213990ff4ed91a7e57e7f2c2f3e8 Fix BytesInFlight (bug #1783) See https://tools.ietf.org/html/rfc4898#page-23 diff -r 4f0dc872b81e -r f117d17414e3 src/internet/model/tcp-socket-base.cc --- a/src/internet/model/tcp-socket-base.cc Thu Feb 11 21:59:47 2016 +0100 +++ b/src/internet/model/tcp-socket-base.cc Mon Feb 15 17:59:27 2016 +0300 @@ -2544,7 +2544,9 @@ TcpSocketBase::BytesInFlight () const { NS_LOG_FUNCTION (this); - return m_highTxMark.Get () - m_txBuffer->HeadSequence (); + uint32_t flightSize = m_nextTxSequence.Get () - m_txBuffer->HeadSequence (); + uint32_t duplicatesSize = m_dupAckCount * m_tcb->m_segmentSize; + return duplicatesSize > flightSize ? 0 : flightSize - duplicatesSize; } uint32_t @@ -2869,9 +2871,6 @@ * are not able to retransmit anything because of local congestion. */ - m_nextTxSequence = m_txBuffer->HeadSequence (); // Restart from highest Ack - m_dupAckCount = 0; - if (m_tcb->m_congState != TcpSocketState::CA_LOSS) { m_tcb->m_congState = TcpSocketState::CA_LOSS; @@ -2879,6 +2878,9 @@ m_tcb->m_cWnd = m_tcb->m_segmentSize; } + m_nextTxSequence = m_txBuffer->HeadSequence (); // Restart from highest Ack + m_dupAckCount = 0; + NS_LOG_DEBUG ("RTO. Reset cwnd to " << m_tcb->m_cWnd << ", ssthresh to " << m_tcb->m_ssThresh << ", restart from seqnum " << m_nextTxSequence); DoRetransmit (); // Retransmit the packet