diff -r 88debdc5d29d src/internet-stack/pending-data.cc --- a/src/internet-stack/pending-data.cc Mon Mar 01 14:36:41 2010 +0000 +++ b/src/internet-stack/pending-data.cc Wed Mar 03 15:45:24 2010 +0000 @@ -102,6 +102,7 @@ { data.push_back(p); size += p->GetSize(); + //std::cout << this << ": pending data size: " << size << " (" << int(data.size ()) << " packets)" << std::endl; } uint32_t PendingData::SizeFromSeq (const SequenceNumber& f, const SequenceNumber& o) diff -r 88debdc5d29d src/internet-stack/tcp-socket-impl.cc --- a/src/internet-stack/tcp-socket-impl.cc Mon Mar 01 14:36:41 2010 +0000 +++ b/src/internet-stack/tcp-socket-impl.cc Wed Mar 03 15:45:24 2010 +0000 @@ -1387,7 +1387,7 @@ } // See if all pending ack'ed; if so we can delete the data if (m_pendingData) - { // Data exists, see if can be deleted + { // Data exists, see if can be entirely deleted if (m_pendingData->SizeFromSeq (m_firstPendingSequence, m_highestRxAck) == 0) { // All pending acked, can be deleted m_pendingData->Clear (); @@ -1399,6 +1399,34 @@ Simulator::GetDelayLeft (m_retxEvent)).GetSeconds()); m_retxEvent.Cancel (); } + else // else delete just a portion + { + // std::cout << "begin delete portion of pending data;" + // << " m_firstPendingSequence=" << m_firstPendingSequence + // << "; m_highestRxAck=" << m_highestRxAck + // << "; size=" << m_pendingData->size << std::endl; + + for (std::vector< Ptr >::iterator dataI = m_pendingData->data.begin (); + dataI != m_pendingData->data.end ();) + { + Ptr data = *dataI; + // std::cout << "pending packet of size " << data->GetSize () << std::endl; + if (m_firstPendingSequence + SequenceNumber (data->GetSize ()) <= m_highestRxAck) + { + dataI = m_pendingData->data.erase (dataI); + m_pendingData->size -= data->GetSize (); + m_firstPendingSequence += data->GetSize (); + } + else + { + break; + } + } + // std::cout << " end delete portion of pending data;" + // << " m_firstPendingSequence=" << m_firstPendingSequence + // << "; m_highestRxAck=" << m_highestRxAck + // << "; size=" << m_pendingData->size << std::endl; + } } // Try to send more data SendPendingData (m_connected);