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