diff --git a/CHANGES.html b/CHANGES.html index c4a5b21cc..4708eb9e9 100644 --- a/CHANGES.html +++ b/CHANGES.html @@ -56,12 +56,17 @@ us a note on ns-developers mailing list.

Changes to existing API:

Changes to build system:

diff --git a/RELEASE_NOTES b/RELEASE_NOTES index d6d352418..ff21d9118 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -29,6 +29,7 @@ Bugs fixed ---------- - Bug 1762 - UE stuck in IDLE_CONNECTING because RRC CONN REQ is not transmitted +- Bug 1831 - TcpSocket SlowStartThreshold is not a TraceSource - Bug 1921 - Icmpv6L4Protocol::ForgeEchoRequest returns a malformed packet - Bug 1930 - Use of invalid reference in OLSR RemoveLinkTuple - Bug 1932 - NdiscCache entry is not failsafe on double neighbor probing. diff --git a/src/internet/model/nsc-tcp-socket-impl.cc b/src/internet/model/nsc-tcp-socket-impl.cc index a4a69ec2d..f552bf00b 100644 --- a/src/internet/model/nsc-tcp-socket-impl.cc +++ b/src/internet/model/nsc-tcp-socket-impl.cc @@ -57,6 +57,9 @@ NscTcpSocketImpl::GetTypeId () .AddTraceSource ("CongestionWindow", "The TCP connection's congestion window", MakeTraceSourceAccessor (&NscTcpSocketImpl::m_cWnd)) + .AddTraceSource ("SlowStartThreshold", + "TCP slow start threshold (bytes)", + MakeTraceSourceAccessor (&NscTcpSocketImpl::m_ssThresh)) ; return tid; } @@ -106,6 +109,7 @@ NscTcpSocketImpl::NscTcpSocketImpl(const NscTcpSocketImpl& sock) m_cWnd (sock.m_cWnd), m_ssThresh (sock.m_ssThresh), m_initialCWnd (sock.m_initialCWnd), + m_initialSsThresh (sock.m_initialSsThresh), m_lastMeasuredRtt (Seconds (0.0)), m_cnTimeout (sock.m_cnTimeout), m_cnCount (sock.m_cnCount), @@ -152,6 +156,7 @@ NscTcpSocketImpl::SetNode (Ptr node) m_node = node; // Initialize some variables m_cWnd = m_initialCWnd * m_segmentSize; + m_ssThresh = m_initialSsThresh; m_rxWindowSize = m_advertisedWindowSize; } @@ -730,15 +735,15 @@ NscTcpSocketImpl::GetAdvWin (void) const } void -NscTcpSocketImpl::SetSSThresh (uint32_t threshold) +NscTcpSocketImpl::SetInitialSSThresh (uint32_t threshold) { - m_ssThresh = threshold; + m_initialSsThresh = threshold; } uint32_t -NscTcpSocketImpl::GetSSThresh (void) const +NscTcpSocketImpl::GetInitialSSThresh (void) const { - return m_ssThresh; + return m_initialSsThresh; } void diff --git a/src/internet/model/nsc-tcp-socket-impl.h b/src/internet/model/nsc-tcp-socket-impl.h index 7d718e9df..8ed28d695 100644 --- a/src/internet/model/nsc-tcp-socket-impl.h +++ b/src/internet/model/nsc-tcp-socket-impl.h @@ -187,8 +187,8 @@ private: * \returns the window size */ virtual uint32_t GetAdvWin (void) const; - virtual void SetSSThresh (uint32_t threshold); - virtual uint32_t GetSSThresh (void) const; + virtual void SetInitialSSThresh (uint32_t threshold); + virtual uint32_t GetInitialSSThresh (void) const; virtual void SetInitialCwnd (uint32_t cwnd); virtual uint32_t GetInitialCwnd (void) const; virtual void SetConnTimeout (Time timeout); @@ -240,9 +240,10 @@ private: uint32_t m_segmentSize; //!< SegmentSize uint32_t m_rxWindowSize; //!< Receive window size uint32_t m_advertisedWindowSize; //!< Window to advertise + TracedValue m_ssThresh; //!< Slow Start Threshold TracedValue m_cWnd; //!< Congestion window - uint32_t m_ssThresh; //!< Slow Start Threshold uint32_t m_initialCWnd; //!< Initial cWnd value + uint32_t m_initialSsThresh; //!< Initial Slow Start Threshold // Round trip time estimation Time m_lastMeasuredRtt; //!< Last measured RTT diff --git a/src/internet/model/tcp-newreno.cc b/src/internet/model/tcp-newreno.cc index 5fa5f4580..ba7e91b0d 100644 --- a/src/internet/model/tcp-newreno.cc +++ b/src/internet/model/tcp-newreno.cc @@ -45,13 +45,16 @@ TcpNewReno::GetTypeId (void) MakeUintegerAccessor (&TcpNewReno::m_retxThresh), MakeUintegerChecker ()) .AddAttribute ("LimitedTransmit", "Enable limited transmit", - BooleanValue (false), - MakeBooleanAccessor (&TcpNewReno::m_limitedTx), - MakeBooleanChecker ()) + BooleanValue (false), + MakeBooleanAccessor (&TcpNewReno::m_limitedTx), + MakeBooleanChecker ()) .AddTraceSource ("CongestionWindow", "The TCP connection's congestion window", MakeTraceSourceAccessor (&TcpNewReno::m_cWnd)) - ; + .AddTraceSource ("SlowStartThreshold", + "TCP slow start threshold (bytes)", + MakeTraceSourceAccessor (&TcpNewReno::m_ssThresh)) + ; return tid; } @@ -68,6 +71,7 @@ TcpNewReno::TcpNewReno (const TcpNewReno& sock) m_cWnd (sock.m_cWnd), m_ssThresh (sock.m_ssThresh), m_initialCWnd (sock.m_initialCWnd), + m_initialSsThresh (sock.m_initialSsThresh), m_retxThresh (sock.m_retxThresh), m_inFastRec (false), m_limitedTx (sock.m_limitedTx) @@ -124,8 +128,7 @@ TcpNewReno::NewAck (const SequenceNumber32& seq) // Check for exit condition of fast recovery if (m_inFastRec && seq < m_recover) { // Partial ACK, partial window deflation (RFC2582 sec.3 bullet #5 paragraph 3) - m_cWnd -= seq - m_txBuffer.HeadSequence (); - m_cWnd += m_segmentSize; // increase cwnd + m_cWnd += m_segmentSize - (seq - m_txBuffer.HeadSequence ()); NS_LOG_INFO ("Partial ACK in fast recovery: cwnd set to " << m_cWnd); m_txBuffer.DiscardUpTo(seq); //Bug 1850: retransmit before newack DoRetransmit (); // Assume the next seq is lost. Retransmit lost packet @@ -134,7 +137,7 @@ TcpNewReno::NewAck (const SequenceNumber32& seq) } else if (m_inFastRec && seq >= m_recover) { // Full ACK (RFC2582 sec.3 bullet #5 paragraph 2, option 1) - m_cWnd = std::min (m_ssThresh, BytesInFlight () + m_segmentSize); + m_cWnd = std::min (m_ssThresh.Get (), BytesInFlight () + m_segmentSize); m_inFastRec = false; NS_LOG_INFO ("Received full ACK. Leaving fast recovery with cwnd set to " << m_cWnd); } @@ -220,15 +223,16 @@ TcpNewReno::SetSegSize (uint32_t size) } void -TcpNewReno::SetSSThresh (uint32_t threshold) +TcpNewReno::SetInitialSSThresh (uint32_t threshold) { - m_ssThresh = threshold; + NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpNewReno::SetSSThresh() cannot change initial ssThresh after connection started."); + m_initialSsThresh = threshold; } uint32_t -TcpNewReno::GetSSThresh (void) const +TcpNewReno::GetInitialSSThresh (void) const { - return m_ssThresh; + return m_initialSsThresh; } void @@ -253,6 +257,7 @@ TcpNewReno::InitializeCwnd (void) * m_segmentSize are set by the attribute system in ns3::TcpSocket. */ m_cWnd = m_initialCWnd * m_segmentSize; + m_ssThresh = m_initialSsThresh; } } // namespace ns3 diff --git a/src/internet/model/tcp-newreno.h b/src/internet/model/tcp-newreno.h index c9a3f96d5..61c26f284 100644 --- a/src/internet/model/tcp-newreno.h +++ b/src/internet/model/tcp-newreno.h @@ -65,8 +65,8 @@ protected: // Implementing ns3::TcpSocket -- Attribute get/set virtual void SetSegSize (uint32_t size); - virtual void SetSSThresh (uint32_t threshold); - virtual uint32_t GetSSThresh (void) const; + virtual void SetInitialSSThresh (uint32_t threshold); + virtual uint32_t GetInitialSSThresh (void) const; virtual void SetInitialCwnd (uint32_t cwnd); virtual uint32_t GetInitialCwnd (void) const; private: @@ -77,8 +77,9 @@ private: protected: TracedValue m_cWnd; //!< Congestion window - uint32_t m_ssThresh; //!< Slow Start Threshold + TracedValue m_ssThresh; //!< Slow Start Threshold uint32_t m_initialCWnd; //!< Initial cWnd value + uint32_t m_initialSsThresh; //!< Initial Slow Start Threshold value SequenceNumber32 m_recover; //!< Previous highest Tx seqnum for fast recovery uint32_t m_retxThresh; //!< Fast Retransmit threshold bool m_inFastRec; //!< currently in fast recovery diff --git a/src/internet/model/tcp-reno.cc b/src/internet/model/tcp-reno.cc index a8e03a6d7..eecab4f42 100644 --- a/src/internet/model/tcp-reno.cc +++ b/src/internet/model/tcp-reno.cc @@ -47,6 +47,9 @@ TcpReno::GetTypeId (void) .AddTraceSource ("CongestionWindow", "The TCP connection's congestion window", MakeTraceSourceAccessor (&TcpReno::m_cWnd)) + .AddTraceSource ("SlowStartThreshold", + "TCP slow start threshold (bytes)", + MakeTraceSourceAccessor (&TcpReno::m_ssThresh)) ; return tid; } @@ -61,6 +64,7 @@ TcpReno::TcpReno (const TcpReno& sock) m_cWnd (sock.m_cWnd), m_ssThresh (sock.m_ssThresh), m_initialCWnd (sock.m_initialCWnd), + m_initialSsThresh (sock.m_initialSsThresh), m_retxThresh (sock.m_retxThresh), m_inFastRec (false) { @@ -194,15 +198,16 @@ TcpReno::SetSegSize (uint32_t size) } void -TcpReno::SetSSThresh (uint32_t threshold) +TcpReno::SetInitialSSThresh (uint32_t threshold) { - m_ssThresh = threshold; + NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpReno::SetSSThresh() cannot change initial ssThresh after connection started."); + m_initialSsThresh = threshold; } uint32_t -TcpReno::GetSSThresh (void) const +TcpReno::GetInitialSSThresh (void) const { - return m_ssThresh; + return m_initialSsThresh; } void @@ -227,6 +232,7 @@ TcpReno::InitializeCwnd (void) * m_segmentSize are set by the attribute system in ns3::TcpSocket. */ m_cWnd = m_initialCWnd * m_segmentSize; + m_ssThresh = m_initialSsThresh; } } // namespace ns3 diff --git a/src/internet/model/tcp-reno.h b/src/internet/model/tcp-reno.h index 8387fbd4c..91d73844d 100644 --- a/src/internet/model/tcp-reno.h +++ b/src/internet/model/tcp-reno.h @@ -67,8 +67,8 @@ protected: // Implementing ns3::TcpSocket -- Attribute get/set virtual void SetSegSize (uint32_t size); - virtual void SetSSThresh (uint32_t threshold); - virtual uint32_t GetSSThresh (void) const; + virtual void SetInitialSSThresh (uint32_t threshold); + virtual uint32_t GetInitialSSThresh (void) const; virtual void SetInitialCwnd (uint32_t cwnd); virtual uint32_t GetInitialCwnd (void) const; private: @@ -79,8 +79,9 @@ private: protected: TracedValue m_cWnd; //!< Congestion window - uint32_t m_ssThresh; //!< Slow Start Threshold + TracedValue m_ssThresh; //!< Slow Start Threshold uint32_t m_initialCWnd; //!< Initial cWnd value + uint32_t m_initialSsThresh; //!< Initial Slow Start Threshold value uint32_t m_retxThresh; //!< Fast Retransmit threshold bool m_inFastRec; //!< currently in fast recovery }; diff --git a/src/internet/model/tcp-rfc793.cc b/src/internet/model/tcp-rfc793.cc index 0ff780e12..7224ee46d 100644 --- a/src/internet/model/tcp-rfc793.cc +++ b/src/internet/model/tcp-rfc793.cc @@ -63,13 +63,13 @@ TcpRfc793::DupAck (const TcpHeader& t, uint32_t count) } void -TcpRfc793::SetSSThresh (uint32_t threshold) +TcpRfc793::SetInitialSSThresh (uint32_t threshold) { NS_LOG_WARN ("DoD TCP does not perform slow start"); } uint32_t -TcpRfc793::GetSSThresh (void) const +TcpRfc793::GetInitialSSThresh (void) const { NS_LOG_WARN ("DoD TCP does not perform slow start"); return 0; diff --git a/src/internet/model/tcp-rfc793.h b/src/internet/model/tcp-rfc793.h index bdeebcbd9..91aac8027 100644 --- a/src/internet/model/tcp-rfc793.h +++ b/src/internet/model/tcp-rfc793.h @@ -58,8 +58,8 @@ public: protected: virtual Ptr Fork (); // Call CopyObject to clone me virtual void DupAck (const TcpHeader& t, uint32_t count); - virtual void SetSSThresh (uint32_t threshold); - virtual uint32_t GetSSThresh (void) const; + virtual void SetInitialSSThresh (uint32_t threshold); + virtual uint32_t GetInitialSSThresh (void) const; virtual void SetInitialCwnd (uint32_t cwnd); virtual uint32_t GetInitialCwnd (void) const; }; diff --git a/src/internet/model/tcp-socket-base.h b/src/internet/model/tcp-socket-base.h index 2e173460d..1c9ca21e4 100644 --- a/src/internet/model/tcp-socket-base.h +++ b/src/internet/model/tcp-socket-base.h @@ -132,8 +132,8 @@ protected: virtual uint32_t GetRcvBufSize (void) const; virtual void SetSegSize (uint32_t size); virtual uint32_t GetSegSize (void) const; - virtual void SetSSThresh (uint32_t threshold) = 0; - virtual uint32_t GetSSThresh (void) const = 0; + virtual void SetInitialSSThresh (uint32_t threshold) = 0; + virtual uint32_t GetInitialSSThresh (void) const = 0; virtual void SetInitialCwnd (uint32_t cwnd) = 0; virtual uint32_t GetInitialCwnd (void) const = 0; virtual void SetConnTimeout (Time timeout); diff --git a/src/internet/model/tcp-socket.cc b/src/internet/model/tcp-socket.cc index 2963ffc9b..78994646d 100644 --- a/src/internet/model/tcp-socket.cc +++ b/src/internet/model/tcp-socket.cc @@ -58,11 +58,11 @@ TcpSocket::GetTypeId (void) MakeUintegerAccessor (&TcpSocket::GetSegSize, &TcpSocket::SetSegSize), MakeUintegerChecker ()) - .AddAttribute ("SlowStartThreshold", - "TCP slow start threshold (bytes)", + .AddAttribute ("InitialSlowStartThreshold", + "TCP initial slow start threshold (bytes)", UintegerValue (0xffff), - MakeUintegerAccessor (&TcpSocket::GetSSThresh, - &TcpSocket::SetSSThresh), + MakeUintegerAccessor (&TcpSocket::GetInitialSSThresh, + &TcpSocket::SetInitialSSThresh), MakeUintegerChecker ()) .AddAttribute ("InitialCwnd", "TCP initial congestion window size (segments)", diff --git a/src/internet/model/tcp-socket.h b/src/internet/model/tcp-socket.h index 4ec01c0fd..77bb24516 100644 --- a/src/internet/model/tcp-socket.h +++ b/src/internet/model/tcp-socket.h @@ -119,16 +119,16 @@ private: virtual uint32_t GetSegSize (void) const = 0; /** - * \brief Set the Slow Start Threshold. + * \brief Set the initial Slow Start Threshold. * \param threshold the Slow Start Threshold (in bytes) */ - virtual void SetSSThresh (uint32_t threshold) = 0; + virtual void SetInitialSSThresh (uint32_t threshold) = 0; /** - * \brief Get the Slow Start Threshold. + * \brief Get the initial Slow Start Threshold. * \returns the Slow Start Threshold (in bytes) */ - virtual uint32_t GetSSThresh (void) const = 0; + virtual uint32_t GetInitialSSThresh (void) const = 0; /** * \brief Set the initial Congestion Window. diff --git a/src/internet/model/tcp-tahoe.cc b/src/internet/model/tcp-tahoe.cc index fb27c802e..8bb52d7ab 100644 --- a/src/internet/model/tcp-tahoe.cc +++ b/src/internet/model/tcp-tahoe.cc @@ -47,6 +47,9 @@ TcpTahoe::GetTypeId (void) .AddTraceSource ("CongestionWindow", "The TCP connection's congestion window", MakeTraceSourceAccessor (&TcpTahoe::m_cWnd)) + .AddTraceSource ("SlowStartThreshold", + "TCP slow start threshold (bytes)", + MakeTraceSourceAccessor (&TcpTahoe::m_ssThresh)) ; return tid; } @@ -61,6 +64,7 @@ TcpTahoe::TcpTahoe (const TcpTahoe& sock) m_cWnd (sock.m_cWnd), m_ssThresh (sock.m_ssThresh), m_initialCWnd (sock.m_initialCWnd), + m_initialSsThresh (sock.m_initialSsThresh), m_retxThresh (sock.m_retxThresh) { NS_LOG_FUNCTION (this); @@ -108,7 +112,7 @@ void TcpTahoe::NewAck (SequenceNumber32 const& seq) { NS_LOG_FUNCTION (this << seq); - NS_LOG_LOGIC ("TcpTahoe receieved ACK for seq " << seq << + NS_LOG_LOGIC ("TcpTahoe received ACK for seq " << seq << " cwnd " << m_cWnd << " ssthresh " << m_ssThresh); if (m_cWnd < m_ssThresh) @@ -172,15 +176,16 @@ TcpTahoe::SetSegSize (uint32_t size) } void -TcpTahoe::SetSSThresh (uint32_t threshold) +TcpTahoe::SetInitialSSThresh (uint32_t threshold) { - m_ssThresh = threshold; + NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpTahoe::SetSSThresh() cannot change initial ssThresh after connection started."); + m_initialSsThresh = threshold; } uint32_t -TcpTahoe::GetSSThresh (void) const +TcpTahoe::GetInitialSSThresh (void) const { - return m_ssThresh; + return m_initialSsThresh; } void @@ -205,6 +210,7 @@ TcpTahoe::InitializeCwnd (void) * m_segmentSize are set by the attribute system in ns3::TcpSocket. */ m_cWnd = m_initialCWnd * m_segmentSize; + m_ssThresh = m_initialSsThresh; } } // namespace ns3 diff --git a/src/internet/model/tcp-tahoe.h b/src/internet/model/tcp-tahoe.h index 096221928..0fc38103c 100644 --- a/src/internet/model/tcp-tahoe.h +++ b/src/internet/model/tcp-tahoe.h @@ -71,8 +71,8 @@ protected: // Implementing ns3::TcpSocket -- Attribute get/set virtual void SetSegSize (uint32_t size); - virtual void SetSSThresh (uint32_t threshold); - virtual uint32_t GetSSThresh (void) const; + virtual void SetInitialSSThresh (uint32_t threshold); + virtual uint32_t GetInitialSSThresh (void) const; virtual void SetInitialCwnd (uint32_t cwnd); virtual uint32_t GetInitialCwnd (void) const; private: @@ -83,8 +83,9 @@ private: protected: TracedValue m_cWnd; //!< Congestion window - uint32_t m_ssThresh; //!< Slow Start Threshold + TracedValue m_ssThresh; //!< Slow Start Threshold uint32_t m_initialCWnd; //!< Initial cWnd value + uint32_t m_initialSsThresh; //!< Initial Slow Start Threshold value uint32_t m_retxThresh; //!< Fast Retransmit threshold }; diff --git a/src/internet/model/tcp-westwood.cc b/src/internet/model/tcp-westwood.cc index 70a0a92b7..cd993a9ef 100644 --- a/src/internet/model/tcp-westwood.cc +++ b/src/internet/model/tcp-westwood.cc @@ -56,6 +56,9 @@ TcpWestwood::GetTypeId (void) .AddConstructor() .AddTraceSource("CongestionWindow", "The TCP connection's congestion window", MakeTraceSourceAccessor(&TcpWestwood::m_cWnd)) + .AddTraceSource ("SlowStartThreshold", + "TCP slow start threshold (bytes)", + MakeTraceSourceAccessor (&TcpWestwood::m_ssThresh)) .AddAttribute("FilterType", "Use this to choose no filter or Tustin's approximation filter", EnumValue(TcpWestwood::TUSTIN), MakeEnumAccessor(&TcpWestwood::m_fType), MakeEnumChecker(TcpWestwood::NONE, "None", TcpWestwood::TUSTIN, "Tustin")) @@ -88,6 +91,7 @@ TcpWestwood::TcpWestwood (const TcpWestwood& sock) : m_cWnd(sock.m_cWnd), m_ssThresh(sock.m_ssThresh), m_initialCWnd(sock.m_initialCWnd), + m_initialSsThresh (sock.m_initialSsThresh), m_inFastRec(false), m_currentBW(sock.m_currentBW), m_lastSampleBW(sock.m_lastSampleBW), @@ -272,7 +276,7 @@ TcpWestwood::DupAck (const TcpHeader& header, uint32_t count) if (count == 3 && !m_inFastRec) {// Triple duplicate ACK triggers fast retransmit // Adjust cwnd and ssthresh based on the estimated BW - m_ssThresh = m_currentBW * static_cast (m_minRtt.GetSeconds()); + m_ssThresh = uint32_t(m_currentBW * static_cast (m_minRtt.GetSeconds())); if (m_cWnd > m_ssThresh) { m_cWnd = m_ssThresh; @@ -380,17 +384,18 @@ TcpWestwood::SetSegSize (uint32_t size) } void -TcpWestwood::SetSSThresh (uint32_t threshold) +TcpWestwood::SetInitialSSThresh (uint32_t threshold) { NS_LOG_FUNCTION (this); - m_ssThresh = threshold; + NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpWestwood::SetSSThresh() cannot change initial ssThresh after connection started."); + m_initialSsThresh = threshold; } uint32_t -TcpWestwood::GetSSThresh (void) const +TcpWestwood::GetInitialSSThresh (void) const { NS_LOG_FUNCTION (this); - return m_ssThresh; + return m_initialSsThresh; } void @@ -417,6 +422,7 @@ TcpWestwood::InitializeCwnd(void) * m_segmentSize are set by the attribute system in ns3::TcpSocket. */ m_cWnd = m_initialCWnd * m_segmentSize; + m_ssThresh = m_initialSsThresh; } } // namespace ns3 diff --git a/src/internet/model/tcp-westwood.h b/src/internet/model/tcp-westwood.h index 181d5211d..a983561c1 100644 --- a/src/internet/model/tcp-westwood.h +++ b/src/internet/model/tcp-westwood.h @@ -122,8 +122,8 @@ protected: // Implementing ns3::TcpSocket -- Attribute get/set virtual void SetSegSize (uint32_t size); - virtual void SetSSThresh (uint32_t threshold); - virtual uint32_t GetSSThresh (void) const; + virtual void SetInitialSSThresh (uint32_t threshold); + virtual uint32_t GetInitialSSThresh (void) const; virtual void SetInitialCwnd (uint32_t cwnd); virtual uint32_t GetInitialCwnd (void) const; @@ -164,8 +164,9 @@ private: protected: TracedValue m_cWnd; //!< Congestion window - uint32_t m_ssThresh; //!< Slow Start Threshold + TracedValue m_ssThresh; //!< Slow Start Threshold uint32_t m_initialCWnd; //!< Initial cWnd value + uint32_t m_initialSsThresh; //!< Initial Slow Start Threshold value bool m_inFastRec; //!< Currently in fast recovery if TRUE TracedValue m_currentBW; //!< Current value of the estimated BW