1.1 --- a/examples/tcp-large-transfer.cc Sun Apr 06 19:22:39 2008 +0100
1.2 +++ b/examples/tcp-large-transfer.cc Sun Apr 06 19:54:39 2008 +0100
1.3 @@ -75,7 +75,7 @@
1.4
1.5 void CloseConnection (Ptr<Socket> localSocket)
1.6 {
1.7 - //localSocket->Close ();
1.8 + localSocket->Close ();
1.9 }
1.10
1.11 void StartFlow(Ptr<Socket> localSocket, uint32_t nBytes,
2.1 --- a/src/internet-node/tcp-socket.cc Sun Apr 06 19:22:39 2008 +0100
2.2 +++ b/src/internet-node/tcp-socket.cc Sun Apr 06 19:54:39 2008 +0100
2.3 @@ -43,6 +43,7 @@
2.4 TcpSocket::TcpSocket ()
2.5 : m_skipRetxResched (false),
2.6 m_dupAckCount (0),
2.7 + m_delAckCount (0),
2.8 m_endPoint (0),
2.9 m_node (0),
2.10 m_tcp (0),
2.11 @@ -73,6 +74,9 @@
2.12 : Socket(sock), //copy the base class callbacks
2.13 m_skipRetxResched (sock.m_skipRetxResched),
2.14 m_dupAckCount (sock.m_dupAckCount),
2.15 + m_delAckCount (0),
2.16 + m_delAckMaxCount (sock.m_delAckMaxCount),
2.17 + m_delAckTimout (sock.m_delAckTimout),
2.18 m_endPoint (0),
2.19 m_node (sock.m_node),
2.20 m_tcp (sock.m_tcp),
2.21 @@ -160,6 +164,8 @@
2.22 m_initialCWnd = t->GetDefaultInitialCwnd ();
2.23 m_cnTimeout = Seconds (t->GetDefaultConnTimeout ());
2.24 m_cnCount = t->GetDefaultConnCount ();
2.25 + m_delAckTimout = Seconds(t->GetDefaultDelAckTimeout ());
2.26 + m_delAckMaxCount = t->GetDefaultDelAckCount ();
2.27 }
2.28
2.29 void
2.30 @@ -1034,10 +1040,24 @@
2.31 << " flags " << tcpHeader.GetFlags ());
2.32 }
2.33 // Now send a new ack packet acknowledging all received and delivered data
2.34 + if(++m_delAckCount >= m_delAckMaxCount)
2.35 + {
2.36 + m_delAckEvent.Cancel();
2.37 + m_delAckCount = 0;
2.38 + SendEmptyPacket (TcpHeader::ACK);
2.39 + }
2.40 + else
2.41 + {
2.42 + m_delAckEvent = Simulator::Schedule (m_delAckTimout, &TcpSocket::DelAckTimeout, this);
2.43 + }
2.44 +}
2.45 +
2.46 +void TcpSocket::DelAckTimeout ()
2.47 +{
2.48 + m_delAckCount = 0;
2.49 SendEmptyPacket (TcpHeader::ACK);
2.50 }
2.51
2.52 -
2.53 void TcpSocket::CommonNewAck (SequenceNumber ack, bool skipTimer)
2.54 { // CommonNewAck is called only for "New" (non-duplicate) acks
2.55 // and MUST be called by any subclass, from the NewAck function
3.1 --- a/src/internet-node/tcp-socket.h Sun Apr 06 19:22:39 2008 +0100
3.2 +++ b/src/internet-node/tcp-socket.h Sun Apr 06 19:54:39 2008 +0100
3.3 @@ -101,6 +101,7 @@
3.4 // XXX This should be virtual and overridden
3.5 void DupAck (const TcpHeader& t, uint32_t count);
3.6 void ReTxTimeout ();
3.7 + void DelAckTimeout ();
3.8 void LastAckTimeout ();
3.9 void Retransmit ();
3.10 void CommonNewAck (SequenceNumber seq, bool skipTimer = false);
3.11 @@ -110,6 +111,11 @@
3.12 EventId m_retxEvent;
3.13 EventId m_lastAckEvent;
3.14
3.15 + EventId m_delAckEvent;
3.16 + uint32_t m_delAckCount;
3.17 + uint32_t m_delAckMaxCount;
3.18 + Time m_delAckTimout;
3.19 +
3.20 Ipv4EndPoint *m_endPoint;
3.21 Ptr<Node> m_node;
3.22 Ptr<TcpL4Protocol> m_tcp;
3.23 @@ -118,10 +124,6 @@
3.24 //these two are so that the socket/endpoint cloning works
3.25 Ipv4Address m_localAddress;
3.26 uint16_t m_localPort;
3.27 - //XXX Dead code?
3.28 - Callback<void, Ptr<Socket>, uint32_t, const Address &> m_dummyRxCallback;
3.29 - Callback<void, Ptr<Socket>, uint8_t const*, uint32_t, const Address &>
3.30 - m_rxCallback;
3.31 enum SocketErrno m_errno;
3.32 bool m_shutdownSend;
3.33 bool m_shutdownRecv;
4.1 --- a/src/node/tcp.cc Sun Apr 06 19:22:39 2008 +0100
4.2 +++ b/src/node/tcp.cc Sun Apr 06 19:54:39 2008 +0100
4.3 @@ -19,6 +19,7 @@
4.4 */
4.5 #include "tcp.h"
4.6 #include "ns3/uinteger.h"
4.7 +#include "ns3/double.h"
4.8
4.9 namespace ns3 {
4.10
4.11 @@ -69,6 +70,16 @@
4.12 Uinteger (6),
4.13 MakeUintegerAccessor (&Tcp::m_defaultConnCount),
4.14 MakeUintegerChecker<uint32_t> ())
4.15 + .AddAttribute ("TcpDefaultDelAckTimeout",
4.16 + "Default timeout value for TCP delayed acks, in seconds",
4.17 + Double (0.2),
4.18 + MakeDoubleAccessor (&Tcp::m_defaultDelAckTimeout),
4.19 + MakeDoubleChecker<double> ())
4.20 + .AddAttribute ("TcpDefaultDelAckCount",
4.21 + "Default number of packets to wait before sending a TCP ack",
4.22 + Uinteger (2),
4.23 + MakeUintegerAccessor (&Tcp::m_defaultDelAckCount),
4.24 + MakeUintegerChecker<uint32_t> ())
4.25 ;
4.26 return tid;
4.27 }
4.28 @@ -114,4 +125,16 @@
4.29 return m_defaultConnCount;
4.30 }
4.31
4.32 +double
4.33 +Tcp::GetDefaultDelAckTimeout (void) const
4.34 +{
4.35 + return m_defaultDelAckTimeout;
4.36 +}
4.37 +
4.38 +uint32_t
4.39 +Tcp::GetDefaultDelAckCount (void) const
4.40 +{
4.41 + return m_defaultDelAckCount;
4.42 +}
4.43 +
4.44 } // namespace ns3
5.1 --- a/src/node/tcp.h Sun Apr 06 19:22:39 2008 +0100
5.2 +++ b/src/node/tcp.h Sun Apr 06 19:54:39 2008 +0100
5.3 @@ -55,15 +55,20 @@
5.4 uint32_t GetDefaultInitialCwnd (void) const;
5.5 uint32_t GetDefaultConnTimeout (void) const;
5.6 uint32_t GetDefaultConnCount (void) const;
5.7 + double GetDefaultDelAckTimeout (void) const;
5.8 + uint32_t GetDefaultDelAckCount (void) const;
5.9 +
5.10 private:
5.11 - uint32_t m_defaultSegSize;
5.12 - uint32_t m_defaultAdvWin;
5.13 - uint32_t m_defaultSsThresh;
5.14 - uint32_t m_defaultTxBuffer;
5.15 - uint32_t m_defaultRxBuffer;
5.16 - uint32_t m_defaultInitialCwnd;
5.17 - uint32_t m_defaultConnTimeout;
5.18 - uint32_t m_defaultConnCount;
5.19 + uint32_t m_defaultSegSize;
5.20 + uint32_t m_defaultAdvWin;
5.21 + uint32_t m_defaultSsThresh;
5.22 + uint32_t m_defaultTxBuffer;
5.23 + uint32_t m_defaultRxBuffer;
5.24 + uint32_t m_defaultInitialCwnd;
5.25 + uint32_t m_defaultConnTimeout;
5.26 + uint32_t m_defaultConnCount;
5.27 + double m_defaultDelAckTimeout;
5.28 + uint32_t m_defaultDelAckCount;
5.29
5.30 };
5.31