[BUG 2247] Disabled Fast Retransmit after RTO

This commit is contained in:
Natale Patriciello
2016-01-22 16:28:47 +01:00
parent 315f1fa74a
commit 8582e9e08a
2 changed files with 10 additions and 14 deletions

View File

@@ -78,6 +78,7 @@ Bugs fixed
- Bug 2242 - Mobility of both sender PHY and receiver PHY set to sender mobility in lr-wpan-phy-test.cc example.
- Bug 2243 - TCP Socket Fork() fails to copy some parameters, causing connections to close prematurely on retransmit
- Bug 2246 - Some DSR LogComponents and classes are not defined in a unique way.
- Bug 2247 - Disabled Fast retransmit after an RTO
- 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

View File

@@ -269,8 +269,7 @@ TcpSocketBase::TcpSocketBase (void)
m_node (0),
m_tcp (0),
m_rtt (0),
m_nextTxSequence (0),
// Change this for non-zero initial sequence number
m_nextTxSequence (0), // Change this for non-zero initial sequence number
m_highTxMark (0),
m_state (CLOSED),
m_errno (ERROR_NOTERROR),
@@ -292,7 +291,7 @@ TcpSocketBase::TcpSocketBase (void)
m_timestampEnabled (true),
m_timestampToEcho (0),
m_sendPendingDataEvent (),
m_recover (0),
m_recover (0), // Set to the initial sequence number
m_retxThresh (3),
m_limitedTx (false),
m_congestionControl (0),
@@ -1420,14 +1419,7 @@ TcpSocketBase::ReceivedAck (Ptr<Packet> packet, const TcpHeader& tcpHeader)
}
else if (m_tcb->m_congState == TcpSocketState::CA_DISORDER)
{
if (m_dupAckCount < m_retxThresh && m_limitedTx)
{
// RFC3042 Limited transmit: Send a new packet for each duplicated ACK before fast retransmit
NS_LOG_INFO ("Limited transmit");
uint32_t sz = SendDataPacket (m_nextTxSequence, m_tcb->m_segmentSize, true);
m_nextTxSequence += sz;
}
else if (m_dupAckCount == m_retxThresh)
if ((m_dupAckCount == m_retxThresh) && ((m_highRxAckMark - 1) > m_recover))
{
// triple duplicate ack triggers fast retransmit (RFC2582 sec.3 bullet #1)
NS_LOG_DEBUG (TcpSocketState::TcpCongStateName[m_tcb->m_congState] <<
@@ -1444,10 +1436,12 @@ TcpSocketBase::ReceivedAck (Ptr<Packet> packet, const TcpHeader& tcpHeader)
m_tcb->m_ssThresh << " at fast recovery seqnum " << m_recover);
DoRetransmit ();
}
else
else if (m_limitedTx)
{
NS_FATAL_ERROR ("m_dupAckCount > m_retxThresh and we still are "
"in DISORDER state");
// RFC3042 Limited transmit: Send a new packet for each duplicated ACK before fast retransmit
NS_LOG_INFO ("Limited transmit");
uint32_t sz = SendDataPacket (m_nextTxSequence, m_tcb->m_segmentSize, true);
m_nextTxSequence += sz;
}
}
else if (m_tcb->m_congState == TcpSocketState::CA_RECOVERY)
@@ -2751,6 +2745,7 @@ TcpSocketBase::ReTxTimeout ()
return;
}
m_recover = m_highTxMark;
Retransmit ();
}