--- a/src/internet/model/nsc-tcp-socket-impl.cc Tue Mar 15 12:17:06 2011 +0100 +++ a/src/internet/model/nsc-tcp-socket-impl.cc Wed Mar 16 16:06:03 2011 -0400 @@ -85,6 +85,7 @@ : TcpSocket(sock), //copy the base class callbacks m_delAckMaxCount (sock.m_delAckMaxCount), m_delAckTimeout (sock.m_delAckTimeout), + m_nagle (sock.m_nagle), m_endPoint (0), m_node (sock.m_node), m_tcp (sock.m_tcp), @@ -794,6 +795,18 @@ return m_delAckMaxCount; } +void +NscTcpSocketImpl::SetNagle (bool enable) +{ + m_nagle = enable; +} + +bool +NscTcpSocketImpl::GetNagle (void) const +{ + return m_nagle; +} + void NscTcpSocketImpl::SetPersistTimeout (Time timeout) { --- a/src/internet/model/nsc-tcp-socket-impl.h Tue Mar 15 12:17:06 2011 +0100 +++ a/src/internet/model/nsc-tcp-socket-impl.h Wed Mar 16 16:06:03 2011 -0400 @@ -125,12 +125,15 @@ virtual Time GetDelAckTimeout (void) const; virtual void SetDelAckMaxCount (uint32_t count); virtual uint32_t GetDelAckMaxCount (void) const; + virtual void SetNagle (bool enable); + virtual bool GetNagle (void) const; virtual void SetPersistTimeout (Time timeout); virtual Time GetPersistTimeout (void) const; enum Socket::SocketErrno GetNativeNs3Errno(int err) const; uint32_t m_delAckMaxCount; Time m_delAckTimeout; + bool m_nagle; Ipv4EndPoint *m_endPoint; Ptr m_node; --- a/src/internet/model/rtt-estimator.cc Tue Mar 15 12:17:06 2011 +0100 +++ a/src/internet/model/rtt-estimator.cc Wed Mar 16 16:06:03 2011 -0400 @@ -53,7 +53,7 @@ MakeTimeChecker ()) .AddAttribute ("MinRTO", "Minimum retransmit timeout value", - TimeValue (Seconds (0.2)), + TimeValue (Seconds (1)), MakeTimeAccessor (&RttEstimator::minrto), MakeTimeChecker ()) ; --- a/src/internet/model/tcp-socket-base.cc Tue Mar 15 12:17:06 2011 +0100 +++ a/src/internet/model/tcp-socket-base.cc Wed Mar 16 16:06:03 2011 -0400 @@ -109,6 +109,7 @@ m_dupAckCount (sock.m_dupAckCount), m_delAckCount (0), m_delAckMaxCount (sock.m_delAckMaxCount), + m_nagle (sock.m_nagle), m_cnCount (sock.m_cnCount), m_delAckTimeout (sock.m_delAckTimeout), m_persistTimeout (sock.m_persistTimeout), @@ -1296,6 +1297,20 @@ { break; // No more } + + // Nagle's algorithm. If enabled, hold off sending if there is unacked + // data in the buffer and the amount of data to send is less than a + // segment size + if (m_nagle) + { + if (UnAckDataCount () > 0 && + m_txBuffer.SizeFromSequence (m_nextTxSequence) < m_segmentSize) + { + NS_LOG_LOGIC ("Invoking Nagle's algorithm. Wait to send."); + break; + } + } + uint32_t s = std::min (w, m_segmentSize); // Send no more than window Ptr p = m_txBuffer.CopyFromSequence (s, m_nextTxSequence); NS_LOG_LOGIC ("TcpSocketBase " << this << " SendPendingData" << @@ -1732,6 +1747,18 @@ } void +TcpSocketBase::SetNagle (bool enable) +{ + m_nagle = enable; +} + +bool +TcpSocketBase::GetNagle (void) const +{ + return m_nagle; +} + +void TcpSocketBase::SetPersistTimeout (Time timeout) { m_persistTimeout = timeout; --- a/src/internet/model/tcp-socket-base.h Tue Mar 15 12:17:06 2011 +0100 +++ a/src/internet/model/tcp-socket-base.h Wed Mar 16 16:06:03 2011 -0400 @@ -115,6 +115,8 @@ virtual Time GetDelAckTimeout (void) const; virtual void SetDelAckMaxCount (uint32_t count); virtual uint32_t GetDelAckMaxCount (void) const; + virtual void SetNagle (bool enable); + virtual bool GetNagle (void) const; virtual void SetPersistTimeout (Time timeout); virtual Time GetPersistTimeout (void) const; virtual bool SetAllowBroadcast (bool allowBroadcast); @@ -182,6 +184,7 @@ uint32_t m_dupAckCount; //< Dupack counter uint32_t m_delAckCount; //< Delayed ACK counter uint32_t m_delAckMaxCount; //< Number of packet to fire an ACK before delay timeout + bool m_nagle; //< Enable or disable Nagle's algorithm uint32_t m_cnCount; //< Count of remaining connection retries TracedValue