Add TCP delayed acks
authorRaj Bhattacharjea <raj.b@gatech.edu>
Fri Apr 04 17:20:36 2008 -0400 (22 months ago)
changeset 2880ce64dffad49f
parent 2879 4e5aa7f1e2a0
child 2883 0b4cb407bb9e
Add TCP delayed acks
src/internet-node/tcp-socket.cc
src/internet-node/tcp-socket.h
src/node/tcp.cc
src/node/tcp.h
     1.1 --- a/src/internet-node/tcp-socket.cc	Fri Apr 04 14:00:41 2008 -0400
     1.2 +++ b/src/internet-node/tcp-socket.cc	Fri Apr 04 17:20:36 2008 -0400
     1.3 @@ -43,6 +43,7 @@
     1.4    TcpSocket::TcpSocket ()
     1.5    : m_skipRetxResched (false),
     1.6      m_dupAckCount (0),
     1.7 +    m_delAckCount (0),
     1.8      m_endPoint (0),
     1.9      m_node (0),
    1.10      m_tcp (0),
    1.11 @@ -73,6 +74,9 @@
    1.12    : Socket(sock), //copy the base class callbacks
    1.13      m_skipRetxResched (sock.m_skipRetxResched),
    1.14      m_dupAckCount (sock.m_dupAckCount),
    1.15 +    m_delAckCount (0),
    1.16 +    m_delAckMaxCount (sock.m_delAckMaxCount),
    1.17 +    m_delAckTimout (sock.m_delAckTimout),
    1.18      m_endPoint (0),
    1.19      m_node (sock.m_node),
    1.20      m_tcp (sock.m_tcp),
    1.21 @@ -160,6 +164,8 @@
    1.22    m_initialCWnd = t->GetDefaultInitialCwnd ();
    1.23    m_cnTimeout = Seconds (t->GetDefaultConnTimeout ());
    1.24    m_cnCount = t->GetDefaultConnCount ();
    1.25 +  m_delAckTimout = Seconds(t->GetDefaultDelAckTimeout ());
    1.26 +  m_delAckMaxCount = t->GetDefaultDelAckCount ();
    1.27  }
    1.28  
    1.29  void 
    1.30 @@ -1034,10 +1040,24 @@
    1.31                 << "       flags " << tcpHeader.GetFlags ());
    1.32      }
    1.33    // Now send a new ack packet acknowledging all received and delivered data
    1.34 +  if(++m_delAckCount >= m_delAckMaxCount)
    1.35 +  {
    1.36 +    m_delAckEvent.Cancel();
    1.37 +    m_delAckCount = 0;
    1.38 +    SendEmptyPacket (TcpHeader::ACK);
    1.39 +  }
    1.40 +  else
    1.41 +  {
    1.42 +    m_delAckEvent = Simulator::Schedule (m_delAckTimout, &TcpSocket::DelAckTimeout, this);
    1.43 +  }
    1.44 +}
    1.45 +
    1.46 +void TcpSocket::DelAckTimeout ()
    1.47 +{
    1.48 +  m_delAckCount = 0;
    1.49    SendEmptyPacket (TcpHeader::ACK);
    1.50  }
    1.51  
    1.52 -
    1.53  void TcpSocket::CommonNewAck (SequenceNumber ack, bool skipTimer)
    1.54  { // CommonNewAck is called only for "New" (non-duplicate) acks
    1.55    // and MUST be called by any subclass, from the NewAck function
     2.1 --- a/src/internet-node/tcp-socket.h	Fri Apr 04 14:00:41 2008 -0400
     2.2 +++ b/src/internet-node/tcp-socket.h	Fri Apr 04 17:20:36 2008 -0400
     2.3 @@ -101,6 +101,7 @@
     2.4    // XXX This should be virtual and overridden
     2.5    void DupAck (const TcpHeader& t, uint32_t count); 
     2.6    void ReTxTimeout ();
     2.7 +  void DelAckTimeout ();
     2.8    void LastAckTimeout ();
     2.9    void Retransmit ();
    2.10    void CommonNewAck (SequenceNumber seq, bool skipTimer = false);
    2.11 @@ -110,6 +111,11 @@
    2.12    EventId m_retxEvent;
    2.13    EventId m_lastAckEvent;
    2.14  
    2.15 +  EventId m_delAckEvent;
    2.16 +  uint32_t m_delAckCount;
    2.17 +  uint32_t m_delAckMaxCount;
    2.18 +  Time m_delAckTimout;
    2.19 +
    2.20    Ipv4EndPoint *m_endPoint;
    2.21    Ptr<Node> m_node;
    2.22    Ptr<TcpL4Protocol> m_tcp;
    2.23 @@ -118,10 +124,6 @@
    2.24    //these two are so that the socket/endpoint cloning works
    2.25    Ipv4Address m_localAddress;
    2.26    uint16_t m_localPort;
    2.27 -  //XXX Dead code?
    2.28 -  Callback<void, Ptr<Socket>, uint32_t, const Address &> m_dummyRxCallback;
    2.29 -  Callback<void, Ptr<Socket>, uint8_t const*, uint32_t, const Address &> 
    2.30 -    m_rxCallback;
    2.31    enum SocketErrno m_errno;
    2.32    bool m_shutdownSend;
    2.33    bool m_shutdownRecv;
     3.1 --- a/src/node/tcp.cc	Fri Apr 04 14:00:41 2008 -0400
     3.2 +++ b/src/node/tcp.cc	Fri Apr 04 17:20:36 2008 -0400
     3.3 @@ -19,6 +19,7 @@
     3.4   */
     3.5  #include "tcp.h"
     3.6  #include "ns3/uinteger.h"
     3.7 +#include "ns3/double.h"
     3.8  
     3.9  namespace ns3 {
    3.10  
    3.11 @@ -69,6 +70,16 @@
    3.12                     Uinteger (6),
    3.13                     MakeUintegerAccessor (&Tcp::m_defaultConnCount),
    3.14                     MakeUintegerChecker<uint32_t> ())
    3.15 +    .AddAttribute ("TcpDefaultDelAckTimeout",
    3.16 +                   "Default timeout value for TCP delayed acks, in seconds",
    3.17 +                   Double (0.2),
    3.18 +                   MakeDoubleAccessor (&Tcp::m_defaultDelAckTimeout),
    3.19 +                   MakeDoubleChecker<double> ())
    3.20 +    .AddAttribute ("TcpDefaultDelAckCount",
    3.21 +                   "Default number of packets to wait before sending a TCP ack",
    3.22 +                   Uinteger (2),
    3.23 +                   MakeUintegerAccessor (&Tcp::m_defaultDelAckCount),
    3.24 +                   MakeUintegerChecker<uint32_t> ())
    3.25       ;
    3.26    return tid;
    3.27  }
    3.28 @@ -114,4 +125,16 @@
    3.29    return m_defaultConnCount;
    3.30  }
    3.31  
    3.32 +double
    3.33 +Tcp::GetDefaultDelAckTimeout (void) const
    3.34 +{
    3.35 +  return m_defaultDelAckTimeout;
    3.36 +}
    3.37 +
    3.38 +uint32_t
    3.39 +Tcp::GetDefaultDelAckCount (void) const
    3.40 +{
    3.41 +  return m_defaultDelAckCount;
    3.42 +}
    3.43 +
    3.44  } // namespace ns3
     4.1 --- a/src/node/tcp.h	Fri Apr 04 14:00:41 2008 -0400
     4.2 +++ b/src/node/tcp.h	Fri Apr 04 17:20:36 2008 -0400
     4.3 @@ -55,15 +55,20 @@
     4.4    uint32_t GetDefaultInitialCwnd (void) const;
     4.5    uint32_t GetDefaultConnTimeout (void) const;
     4.6    uint32_t GetDefaultConnCount (void) const;
     4.7 +  double   GetDefaultDelAckTimeout (void) const;
     4.8 +  uint32_t GetDefaultDelAckCount (void) const;
     4.9 +
    4.10  private:
    4.11 -  uint32_t  m_defaultSegSize;  
    4.12 -  uint32_t  m_defaultAdvWin;   
    4.13 -  uint32_t  m_defaultSsThresh; 
    4.14 -  uint32_t  m_defaultTxBuffer; 
    4.15 -  uint32_t  m_defaultRxBuffer; 
    4.16 -  uint32_t  m_defaultInitialCwnd; 
    4.17 -  uint32_t  m_defaultConnTimeout;  
    4.18 -  uint32_t  m_defaultConnCount;  
    4.19 +  uint32_t  m_defaultSegSize;
    4.20 +  uint32_t  m_defaultAdvWin; 
    4.21 +  uint32_t  m_defaultSsThresh;
    4.22 +  uint32_t  m_defaultTxBuffer;
    4.23 +  uint32_t  m_defaultRxBuffer;
    4.24 +  uint32_t  m_defaultInitialCwnd;
    4.25 +  uint32_t  m_defaultConnTimeout;
    4.26 +  uint32_t  m_defaultConnCount;
    4.27 +  double    m_defaultDelAckTimeout;
    4.28 +  uint32_t  m_defaultDelAckCount;
    4.29  
    4.30  };
    4.31