@@ -774,6 +774,7 @@ TcpTxBuffer::Update(const TcpOptionSack::SackList& list, const Callback<void, Tc
774774 NS_LOG_INFO (" Updating scoreboard, got " << list.size() << " blocks to analyze");
775775
776776 uint32_t bytesSacked = 0 ;
777+ Time newestSackedSentTime = Time::Min ();
777778
778779 for (auto option_it = list.begin (); option_it != list.end (); ++option_it)
779780 {
@@ -827,6 +828,7 @@ TcpTxBuffer::Update(const TcpOptionSack::SackList& list, const Callback<void, Tc
827828 (*item_it)->m_sacked = true ;
828829 m_sackedOut += (*item_it)->m_packet ->GetSize ();
829830 bytesSacked += (*item_it)->m_packet ->GetSize ();
831+ newestSackedSentTime = std::max (newestSackedSentTime, (*item_it)->m_lastSent );
830832
831833 if (m_highestSack.first == m_sentList.end () ||
832834 m_highestSack.second <= beginOfCurrentPacket + pktSize)
@@ -862,6 +864,7 @@ TcpTxBuffer::Update(const TcpOptionSack::SackList& list, const Callback<void, Tc
862864 if (bytesSacked > 0 )
863865 {
864866 NS_ASSERT_MSG (m_highestSack.first != m_sentList.end(), "Buffer status: " << *this);
867+ MarkRetransmittedSegmentsLost (newestSackedSentTime);
865868 UpdateLostCount ();
866869 }
867870
@@ -922,6 +925,35 @@ TcpTxBuffer::UpdateLostCount()
922925 ConsistencyCheck ();
923926}
924927
928+ void
929+ TcpTxBuffer::MarkRetransmittedSegmentsLost (const Time& sackedSentTime)
930+ {
931+ NS_LOG_FUNCTION (this << sackedSentTime);
932+
933+ SequenceNumber32 beginOfCurrentPacket = m_firstByteSeq;
934+ for (auto it = m_sentList.begin (); it != m_sentList.end (); ++it)
935+ {
936+ TcpTxItem* item = *it;
937+ if (beginOfCurrentPacket >= m_highestSack.second )
938+ {
939+ break ;
940+ }
941+ if (item->m_retrans && !item->m_sacked && item->m_lastSent < sackedSentTime)
942+ {
943+ item->m_retrans = false ;
944+ m_retrans -= item->m_packet ->GetSize ();
945+ if (!item->m_lost )
946+ {
947+ item->m_lost = true ;
948+ m_lostOut += item->m_packet ->GetSize ();
949+ }
950+ NS_LOG_INFO (" Retransmission of segment " << *item << " deemed lost" );
951+ }
952+ beginOfCurrentPacket += item->m_packet ->GetSize ();
953+ }
954+ ConsistencyCheck ();
955+ }
956+
925957bool
926958TcpTxBuffer::IsLost (const SequenceNumber32& seq) const
927959{
0 commit comments