View | Details | Raw Unified | Return to bug 2150
Collapse All | Expand All

(-)a/src/internet/model/nsc-tcp-socket-impl.cc (-5 / +19 lines)
 Lines 119-125   NscTcpSocketImpl::NscTcpSocketImpl(const NscTcpSocketImpl& sock) Link Here 
119
    m_initialSsThresh (sock.m_initialSsThresh),
119
    m_initialSsThresh (sock.m_initialSsThresh),
120
    m_lastMeasuredRtt (Seconds (0.0)),
120
    m_lastMeasuredRtt (Seconds (0.0)),
121
    m_cnTimeout (sock.m_cnTimeout),
121
    m_cnTimeout (sock.m_cnTimeout),
122
    m_cnCount (sock.m_cnCount),
122
    m_synRetries (sock.m_synRetries),
123
    m_rxAvailable (0),
123
    m_rxAvailable (0),
124
    m_nscTcpSocket (0),
124
    m_nscTcpSocket (0),
125
    m_sndBufSize (sock.m_sndBufSize)
125
    m_sndBufSize (sock.m_sndBufSize)
 Lines 778-792   NscTcpSocketImpl::GetConnTimeout (void) const Link Here 
778
}
778
}
779
779
780
void 
780
void 
781
NscTcpSocketImpl::SetConnCount (uint32_t count)
781
NscTcpSocketImpl::SetSynRetries (uint32_t count)
782
{
782
{
783
  m_cnCount = count;
783
  m_synRetries = count;
784
}
784
}
785
785
786
uint32_t 
786
uint32_t 
787
NscTcpSocketImpl::GetConnCount (void) const
787
NscTcpSocketImpl::GetSynRetries (void) const
788
{
788
{
789
  return m_cnCount;
789
  return m_synRetries;
790
}
790
}
791
791
792
void 
792
void 
 Lines 795-800   NscTcpSocketImpl::SetDelAckTimeout (Time timeout) Link Here 
795
  m_delAckTimeout = timeout;
795
  m_delAckTimeout = timeout;
796
}
796
}
797
797
798
void
799
NscTcpSocketImpl::SetDataRetries (uint32_t retries)
800
{
801
  NS_LOG_FUNCTION (this << retries);
802
  m_dataRetries = retries;
803
}
804
805
uint32_t
806
NscTcpSocketImpl::GetDataRetries (void) const
807
{
808
  NS_LOG_FUNCTION (this);
809
  return m_dataRetries;
810
}
811
798
Time
812
Time
799
NscTcpSocketImpl::GetDelAckTimeout (void) const
813
NscTcpSocketImpl::GetDelAckTimeout (void) const
800
{
814
{
(-)a/src/internet/model/nsc-tcp-socket-impl.h (-3 / +6 lines)
 Lines 193-200   private: Link Here 
193
  virtual uint32_t GetInitialCwnd (void) const;
193
  virtual uint32_t GetInitialCwnd (void) const;
194
  virtual void SetConnTimeout (Time timeout);
194
  virtual void SetConnTimeout (Time timeout);
195
  virtual Time GetConnTimeout (void) const;
195
  virtual Time GetConnTimeout (void) const;
196
  virtual void SetConnCount (uint32_t count);
196
  virtual uint32_t GetSynRetries (void) const;
197
  virtual uint32_t GetConnCount (void) const;
197
  virtual void SetSynRetries (uint32_t count);
198
  virtual void SetDataRetries (uint32_t retries);
199
  virtual uint32_t GetDataRetries (void) const;
198
  virtual void SetDelAckTimeout (Time timeout);
200
  virtual void SetDelAckTimeout (Time timeout);
199
  virtual Time GetDelAckTimeout (void) const;
201
  virtual Time GetDelAckTimeout (void) const;
200
  virtual void SetDelAckMaxCount (uint32_t count);
202
  virtual void SetDelAckMaxCount (uint32_t count);
 Lines 250-256   private: Link Here 
250
252
251
  // Timer-related members
253
  // Timer-related members
252
  Time              m_cnTimeout;       //!< Timeout for connection retry
254
  Time              m_cnTimeout;       //!< Timeout for connection retry
253
  uint32_t          m_cnCount;         //!< Count of remaining connection retries
255
  uint32_t          m_synRetries;      //!< Count of remaining connection retries
256
  uint32_t          m_dataRetries;     //!< Count of remaining data retransmission attempts
254
  Time              m_persistTimeout;  //!< Time between sending 1-byte probes
257
  Time              m_persistTimeout;  //!< Time between sending 1-byte probes
255
258
256
  // Temporary queue for delivering data to application
259
  // Temporary queue for delivering data to application
(-)a/src/internet/model/tcp-socket-base.cc (-12 / +41 lines)
 Lines 298-304   TcpSocketBase::TcpSocketBase (const TcpSocketBase& sock) Link Here 
298
    m_delAckCount (0),
298
    m_delAckCount (0),
299
    m_delAckMaxCount (sock.m_delAckMaxCount),
299
    m_delAckMaxCount (sock.m_delAckMaxCount),
300
    m_noDelay (sock.m_noDelay),
300
    m_noDelay (sock.m_noDelay),
301
    m_cnRetries (sock.m_cnRetries),
301
    m_synRetries (sock.m_synRetries),
302
    m_delAckTimeout (sock.m_delAckTimeout),
302
    m_delAckTimeout (sock.m_delAckTimeout),
303
    m_persistTimeout (sock.m_persistTimeout),
303
    m_persistTimeout (sock.m_persistTimeout),
304
    m_cnTimeout (sock.m_cnTimeout),
304
    m_cnTimeout (sock.m_cnTimeout),
 Lines 661-667   TcpSocketBase::Connect (const Address & address) Link Here 
661
661
662
  // Re-initialize parameters in case this socket is being reused after CLOSE
662
  // Re-initialize parameters in case this socket is being reused after CLOSE
663
  m_rtt->Reset ();
663
  m_rtt->Reset ();
664
  m_cnCount = m_cnRetries;
664
  m_synCount = m_synRetries;
665
  m_dataRetrCount = m_dataRetries;
665
666
666
  // DoConnect() will do state-checking and send a SYN packet
667
  // DoConnect() will do state-checking and send a SYN packet
667
  return DoConnect ();
668
  return DoConnect ();
 Lines 1562-1568   TcpSocketBase::ProcessSynSent (Ptr<Packet> packet, const TcpHeader& tcpHeader) Link Here 
1562
    { // Received SYN, move to SYN_RCVD state and respond with SYN+ACK
1563
    { // Received SYN, move to SYN_RCVD state and respond with SYN+ACK
1563
      NS_LOG_DEBUG ("SYN_SENT -> SYN_RCVD");
1564
      NS_LOG_DEBUG ("SYN_SENT -> SYN_RCVD");
1564
      m_state = SYN_RCVD;
1565
      m_state = SYN_RCVD;
1565
      m_cnCount = m_cnRetries;
1566
      m_synCount = m_synRetries;
1567
      m_dataRetrCount = m_dataRetries;
1566
      m_rxBuffer->SetNextRxSequence (tcpHeader.GetSequenceNumber () + SequenceNumber32 (1));
1568
      m_rxBuffer->SetNextRxSequence (tcpHeader.GetSequenceNumber () + SequenceNumber32 (1));
1567
      SendEmptyPacket (TcpHeader::SYN | TcpHeader::ACK);
1569
      SendEmptyPacket (TcpHeader::SYN | TcpHeader::ACK);
1568
    }
1570
    }
 Lines 2014-2020   TcpSocketBase::SendEmptyPacket (uint8_t flags) Link Here 
2014
  bool isAck = flags == TcpHeader::ACK;
2016
  bool isAck = flags == TcpHeader::ACK;
2015
  if (hasSyn)
2017
  if (hasSyn)
2016
    {
2018
    {
2017
      if (m_cnCount == 0)
2019
      if (m_synCount == 0)
2018
        { // No more connection retries, give up
2020
        { // No more connection retries, give up
2019
          NS_LOG_LOGIC ("Connection failed.");
2021
          NS_LOG_LOGIC ("Connection failed.");
2020
          m_rtt->Reset (); //According to recommendation -> RFC 6298
2022
          m_rtt->Reset (); //According to recommendation -> RFC 6298
 Lines 2023-2031   TcpSocketBase::SendEmptyPacket (uint8_t flags) Link Here 
2023
        }
2025
        }
2024
      else
2026
      else
2025
        { // Exponential backoff of connection time out
2027
        { // Exponential backoff of connection time out
2026
          int backoffCount = 0x1 << (m_cnRetries - m_cnCount);
2028
          int backoffCount = 0x1 << (m_synRetries - m_synCount);
2027
          m_rto = m_cnTimeout * backoffCount;
2029
          m_rto = m_cnTimeout * backoffCount;
2028
          m_cnCount--;
2030
          m_synCount--;
2029
        }
2031
        }
2030
    }
2032
    }
2031
  if (m_endPoint != 0)
2033
  if (m_endPoint != 0)
 Lines 2177-2183   TcpSocketBase::CompleteFork (Ptr<Packet> p, const TcpHeader& h, Link Here 
2177
  // Change the cloned socket from LISTEN state to SYN_RCVD
2179
  // Change the cloned socket from LISTEN state to SYN_RCVD
2178
  NS_LOG_DEBUG ("LISTEN -> SYN_RCVD");
2180
  NS_LOG_DEBUG ("LISTEN -> SYN_RCVD");
2179
  m_state = SYN_RCVD;
2181
  m_state = SYN_RCVD;
2180
  m_cnCount = m_cnRetries;
2182
  m_synCount = m_synRetries;
2183
  m_dataRetrCount = m_dataRetries;
2181
  SetupCallback ();
2184
  SetupCallback ();
2182
  // Set the sequence number and send SYN+ACK
2185
  // Set the sequence number and send SYN+ACK
2183
  m_rxBuffer->SetNextRxSequence (h.GetSequenceNumber () + SequenceNumber32 (1));
2186
  m_rxBuffer->SetNextRxSequence (h.GetSequenceNumber () + SequenceNumber32 (1));
 Lines 2778-2784   TcpSocketBase::DoRetransmit () Link Here 
2778
  // Retransmit SYN packet
2781
  // Retransmit SYN packet
2779
  if (m_state == SYN_SENT)
2782
  if (m_state == SYN_SENT)
2780
    {
2783
    {
2781
      if (m_cnCount > 0)
2784
      if (m_synCount > 0)
2782
        {
2785
        {
2783
          SendEmptyPacket (TcpHeader::SYN);
2786
          SendEmptyPacket (TcpHeader::SYN);
2784
        }
2787
        }
 Lines 2788-2793   TcpSocketBase::DoRetransmit () Link Here 
2788
        }
2791
        }
2789
      return;
2792
      return;
2790
    }
2793
    }
2794
2795
  if (m_dataRetrCount == 0)
2796
    {
2797
      NotifyErrorClose ();
2798
      DeallocateEndPoint ();
2799
      return;
2800
    }
2801
  else
2802
    {
2803
      --m_dataRetrCount;
2804
    }
2805
2791
  // Retransmit non-data packet: Only if in FIN_WAIT_1 or CLOSING state
2806
  // Retransmit non-data packet: Only if in FIN_WAIT_1 or CLOSING state
2792
  if (m_txBuffer->Size () == 0)
2807
  if (m_txBuffer->Size () == 0)
2793
    {
2808
    {
 Lines 2887-2902   TcpSocketBase::GetConnTimeout (void) const Link Here 
2887
}
2902
}
2888
2903
2889
void
2904
void
2890
TcpSocketBase::SetConnCount (uint32_t count)
2905
TcpSocketBase::SetSynRetries (uint32_t count)
2891
{
2906
{
2892
  NS_LOG_FUNCTION (this << count);
2907
  NS_LOG_FUNCTION (this << count);
2893
  m_cnRetries = count;
2908
  m_synRetries = count;
2894
}
2909
}
2895
2910
2896
uint32_t
2911
uint32_t
2897
TcpSocketBase::GetConnCount (void) const
2912
TcpSocketBase::GetSynRetries (void) const
2898
{
2913
{
2899
  return m_cnRetries;
2914
  return m_synRetries;
2915
}
2916
2917
void
2918
TcpSocketBase::SetDataRetries (uint32_t retries)
2919
{
2920
  NS_LOG_FUNCTION (this << retries);
2921
  m_dataRetries = retries;
2922
}
2923
2924
uint32_t
2925
TcpSocketBase::GetDataRetries (void) const
2926
{
2927
  NS_LOG_FUNCTION (this);
2928
  return m_dataRetries;
2900
}
2929
}
2901
2930
2902
void
2931
void
(-)a/src/internet/model/tcp-socket-base.h (-4 / +8 lines)
 Lines 430-437   protected: Link Here 
430
  virtual uint32_t GetInitialCwnd (void) const;
430
  virtual uint32_t GetInitialCwnd (void) const;
431
  virtual void     SetConnTimeout (Time timeout);
431
  virtual void     SetConnTimeout (Time timeout);
432
  virtual Time     GetConnTimeout (void) const;
432
  virtual Time     GetConnTimeout (void) const;
433
  virtual void     SetConnCount (uint32_t count);
433
  virtual void     SetSynRetries (uint32_t count);
434
  virtual uint32_t GetConnCount (void) const;
434
  virtual uint32_t GetSynRetries (void) const;
435
  virtual void     SetDataRetries (uint32_t retries);
436
  virtual uint32_t GetDataRetries (void) const;
435
  virtual void     SetDelAckTimeout (Time timeout);
437
  virtual void     SetDelAckTimeout (Time timeout);
436
  virtual Time     GetDelAckTimeout (void) const;
438
  virtual Time     GetDelAckTimeout (void) const;
437
  virtual void     SetDelAckMaxCount (uint32_t count);
439
  virtual void     SetDelAckMaxCount (uint32_t count);
 Lines 934-941   protected: Link Here 
934
  uint32_t          m_delAckCount;     //!< Delayed ACK counter
936
  uint32_t          m_delAckCount;     //!< Delayed ACK counter
935
  uint32_t          m_delAckMaxCount;  //!< Number of packet to fire an ACK before delay timeout
937
  uint32_t          m_delAckMaxCount;  //!< Number of packet to fire an ACK before delay timeout
936
  bool              m_noDelay;         //!< Set to true to disable Nagle's algorithm
938
  bool              m_noDelay;         //!< Set to true to disable Nagle's algorithm
937
  uint32_t          m_cnCount;         //!< Count of remaining connection retries
939
  uint32_t          m_synCount;        //!< Count of remaining connection retries
938
  uint32_t          m_cnRetries;       //!< Number of connection retries before giving up
940
  uint32_t          m_synRetries;      //!< Number of connection attempts
941
  uint32_t          m_dataRetrCount;   //!< Count of remaining data retransmission attempts
942
  uint32_t          m_dataRetries;     //!< Number of data retransmission attempts
939
  TracedValue<Time> m_rto;             //!< Retransmit timeout
943
  TracedValue<Time> m_rto;             //!< Retransmit timeout
940
  Time              m_minRto;          //!< minimum value of the Retransmit timeout
944
  Time              m_minRto;          //!< minimum value of the Retransmit timeout
941
  Time              m_clockGranularity; //!< Clock Granularity used in RTO calcs
945
  Time              m_clockGranularity; //!< Clock Granularity used in RTO calcs
(-)a/src/internet/model/tcp-socket.cc (-3 / +10 lines)
 Lines 82-91   TcpSocket::GetTypeId (void) Link Here 
82
                                     &TcpSocket::SetConnTimeout),
82
                                     &TcpSocket::SetConnTimeout),
83
                   MakeTimeChecker ())
83
                   MakeTimeChecker ())
84
    .AddAttribute ("ConnCount",
84
    .AddAttribute ("ConnCount",
85
                   "Number of connection attempts (SYN retransmissions) before returning failure",
85
                   "Number of connection attempts (SYN retransmissions) before "
86
                   "returning failure",
86
                   UintegerValue (6),
87
                   UintegerValue (6),
87
                   MakeUintegerAccessor (&TcpSocket::GetConnCount,
88
                   MakeUintegerAccessor (&TcpSocket::GetSynRetries,
88
                                         &TcpSocket::SetConnCount),
89
                                         &TcpSocket::SetSynRetries),
90
                   MakeUintegerChecker<uint32_t> ())
91
    .AddAttribute ("DataRetries",
92
                   "Number of data retransmission attempts",
93
                   UintegerValue (6),
94
                   MakeUintegerAccessor (&TcpSocket::GetDataRetries,
95
                                         &TcpSocket::SetDataRetries),
89
                   MakeUintegerChecker<uint32_t> ())
96
                   MakeUintegerChecker<uint32_t> ())
90
    .AddAttribute ("DelAckTimeout",
97
    .AddAttribute ("DelAckTimeout",
91
                   "Timeout value for TCP delayed acks, in seconds",
98
                   "Timeout value for TCP delayed acks, in seconds",
(-)a/src/internet/model/tcp-socket.h (-2 / +14 lines)
 Lines 171-183   private: Link Here 
171
   * \brief Set the number of connection retries before giving up.
171
   * \brief Set the number of connection retries before giving up.
172
   * \param count the number of connection retries
172
   * \param count the number of connection retries
173
   */
173
   */
174
  virtual void SetConnCount (uint32_t count) = 0;
174
  virtual void SetSynRetries (uint32_t count) = 0;
175
175
176
  /**
176
  /**
177
   * \brief Get the number of connection retries before giving up.
177
   * \brief Get the number of connection retries before giving up.
178
   * \returns the number of connection retries
178
   * \returns the number of connection retries
179
   */
179
   */
180
  virtual uint32_t GetConnCount (void) const = 0;
180
  virtual uint32_t GetSynRetries (void) const = 0;
181
182
  /**
183
   * \brief Set the number of data transmission retries before giving up.
184
   * \param count the number of data transmission retries
185
   */
186
  virtual void SetDataRetries (uint32_t retries) = 0;
187
188
  /**
189
   * \brief Get the number of data transmission retries before giving up.
190
   * \returns the number of data transmission retries
191
   */
192
  virtual uint32_t GetDataRetries (void) const = 0;
181
193
182
  /**
194
  /**
183
   * \brief Set the time to delay an ACK.
195
   * \brief Set the time to delay an ACK.

Return to bug 2150