--- 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 15:19:48 2011 -0400 @@ -63,7 +63,8 @@ } NscTcpSocketImpl::NscTcpSocketImpl () - : m_endPoint (0), + : m_nagle (false), + m_endPoint (0), m_node (0), m_tcp (0), m_localAddress (Ipv4Address::GetZero ()), @@ -85,6 +86,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 +796,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 15:19:48 2011 -0400 @@ -124,6 +124,8 @@ virtual void SetDelAckTimeout (Time timeout); virtual Time GetDelAckTimeout (void) const; virtual void SetDelAckMaxCount (uint32_t count); + virtual bool GetNagle (void) const; + virtual void SetNagle (bool enable); virtual uint32_t GetDelAckMaxCount (void) const; virtual void SetPersistTimeout (Time timeout); virtual Time GetPersistTimeout (void) const; @@ -131,6 +133,7 @@ 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 15:19:48 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 15:19:48 2011 -0400 @@ -83,6 +83,7 @@ TcpSocketBase::TcpSocketBase (void) : m_dupAckCount (0), m_delAckCount (0), + m_nagle (true), m_endPoint (0), m_node (0), m_tcp (0), @@ -109,6 +110,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 +1298,16 @@ { break; // No more } + + // Nagle's algorithm. 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 (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 +1744,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 15:19:48 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