src/internet/model/tcp-reno.cc
author Adrian S Tam <adrian.sw.tam@gmail.com>
Thu, 01 Dec 2011 04:53:20 -0500
changeset 7608 de67936e4017
parent 7385 10beb0e53130
child 7609 7193df6ebc5d
permissions -rw-r--r--
Mixed bugfixes on TCP, closes bug 1166, 1227, 1242. 1. Make connection count (m_cnCount) a separate variable from the number of connection retries (m_cnRetries), so that the number of connection retries can be cloned without affecting the number of connections to be made in the cloned sockets. 2. There was a case that the m_highTxMark was mistaken as m_nextTxSequence 3. Update m_lastRtt correctly, fixes bug 1242 4. The endpoint allocation/deallocation is rewritten so that the endpoint remembers the correct peer's address and it is deleted upon close. RecvFrom() call now use the data in endpoint to return the peer's address, and the socket closes nicely. 5. TcpL4Protocol::m_sockets now holds a complete list of all existing sockets 6. RST packet is sent before CloseAndNotify() is called, so that m_endPoint is not yet destroyed, fixes bug 1166 7. Fix cwnd deflation bug in partial ACK handling in TcpNewReno 8. Created attributes for fast retransmit threshold (m_retxThresh) and max advertised window size (m_maxWinSize) 9. Refactor SendPendingData() and DoRetransmit(), created SendDataPacket() 10. Call NotifySend() after connection established in ProcessSynSent() and ProcessSynRcvd() 11. Defines new flags in TcpHeader: ECE and CWR (see RFC3168) 12. Prepared hooks for TCP option handling 13. Code tidy up 14. Fix the definition of out-of-order packets 15. TCP can now move from TIME_WAIT state to CLOSED state after 2*MSL 16. Implemented limited transmit (RFC3042) in TcpNewReno, c.f. bug 1227 17. Added Raj's email to the preamble, as TcpSocketBase was modified from TcpSocketImpl.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7385
10beb0e53130 standardize emacs c++ mode comments
Vedran Mileti? <rivanvx@gmail.com>
parents: 7176
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
6694
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     2
/*
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     3
 * Copyright (c) 2010 Adrian Sai-wah Tam
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     4
 *
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     8
 *
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    12
 * GNU General Public License for more details.
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    13
 *
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    17
 *
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    18
 * Author: Adrian Sai-wah Tam <adrian.sw.tam@gmail.com>
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    19
 */
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    20
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    21
#define NS_LOG_APPEND_CONTEXT \
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    22
  if (m_node) { std::clog << Simulator::Now ().GetSeconds () << " [node " << m_node->GetId () << "] "; }
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    23
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    24
#include "tcp-reno.h"
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    25
#include "ns3/log.h"
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    26
#include "ns3/trace-source-accessor.h"
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    27
#include "ns3/simulator.h"
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    28
#include "ns3/abort.h"
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    29
#include "ns3/node.h"
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    30
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    31
NS_LOG_COMPONENT_DEFINE ("TcpReno");
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    32
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    33
namespace ns3 {
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    34
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    35
NS_OBJECT_ENSURE_REGISTERED (TcpReno);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    36
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    37
TypeId
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    38
TcpReno::GetTypeId (void)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    39
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    40
  static TypeId tid = TypeId ("ns3::TcpReno")
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    41
    .SetParent<TcpSocketBase> ()
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    42
    .AddConstructor<TcpReno> ()
7608
de67936e4017 Mixed bugfixes on TCP, closes bug 1166, 1227, 1242.
Adrian S Tam <adrian.sw.tam@gmail.com>
parents: 7385
diff changeset
    43
    .AddAttribute ("ReTxThreshold", "Threshold for fast retransmit",
de67936e4017 Mixed bugfixes on TCP, closes bug 1166, 1227, 1242.
Adrian S Tam <adrian.sw.tam@gmail.com>
parents: 7385
diff changeset
    44
                    UintegerValue (3),
de67936e4017 Mixed bugfixes on TCP, closes bug 1166, 1227, 1242.
Adrian S Tam <adrian.sw.tam@gmail.com>
parents: 7385
diff changeset
    45
                    MakeUintegerAccessor (&TcpReno::m_retxThresh),
de67936e4017 Mixed bugfixes on TCP, closes bug 1166, 1227, 1242.
Adrian S Tam <adrian.sw.tam@gmail.com>
parents: 7385
diff changeset
    46
                    MakeUintegerChecker<uint32_t> ())
6694
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    47
    .AddTraceSource ("CongestionWindow",
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    48
                     "The TCP connection's congestion window",
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    49
                     MakeTraceSourceAccessor (&TcpReno::m_cWnd))
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    50
  ;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    51
  return tid;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    52
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    53
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    54
TcpReno::TcpReno (void) : m_inFastRec (false)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    55
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    56
  NS_LOG_FUNCTION (this);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    57
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    58
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    59
TcpReno::TcpReno (const TcpReno& sock)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    60
  : TcpSocketBase (sock),
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    61
    m_cWnd (sock.m_cWnd),
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    62
    m_ssThresh (sock.m_ssThresh),
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    63
    m_initialCWnd (sock.m_initialCWnd),
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    64
    m_inFastRec (false)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    65
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    66
  NS_LOG_FUNCTION (this);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    67
  NS_LOG_LOGIC ("Invoked the copy constructor");
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    68
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    69
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    70
TcpReno::~TcpReno (void)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    71
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    72
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    73
6697
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
    74
/** We initialize m_cWnd from this function, after attributes initialized */
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
    75
int
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
    76
TcpReno::Listen (void)
6694
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    77
{
6697
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
    78
  NS_LOG_FUNCTION (this);
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
    79
  InitializeCwnd ();
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
    80
  return TcpSocketBase::Listen ();
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
    81
}
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
    82
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
    83
/** We initialize m_cWnd from this function, after attributes initialized */
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
    84
int
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
    85
TcpReno::Connect (const Address & address)
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
    86
{
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
    87
  NS_LOG_FUNCTION (this << address);
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
    88
  InitializeCwnd ();
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
    89
  return TcpSocketBase::Connect (address);
6694
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    90
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    91
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    92
/** Limit the size of in-flight data by cwnd and receiver's rxwin */
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    93
uint32_t
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    94
TcpReno::Window (void)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    95
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    96
  NS_LOG_FUNCTION (this);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    97
  return std::min (m_rWnd.Get (), m_cWnd.Get ());
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    98
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    99
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   100
Ptr<TcpSocketBase>
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   101
TcpReno::Fork (void)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   102
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   103
  return CopyObject<TcpReno> (this);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   104
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   105
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   106
/** New ACK (up to seqnum seq) received. Increase cwnd and call TcpSocketBase::NewAck() */
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   107
void
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   108
TcpReno::NewAck (const SequenceNumber32& seq)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   109
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   110
  NS_LOG_FUNCTION (this << seq);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   111
  NS_LOG_LOGIC ("TcpReno receieved ACK for seq " << seq <<
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   112
                " cwnd " << m_cWnd <<
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   113
                " ssthresh " << m_ssThresh);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   114
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   115
  // Check for exit condition of fast recovery
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   116
  if (m_inFastRec)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   117
    { // RFC2001, sec.4; RFC2581, sec.3.2
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   118
      // First new ACK after fast recovery: reset cwnd
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   119
      m_cWnd = m_ssThresh;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   120
      m_inFastRec = false;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   121
      NS_LOG_INFO ("Reset cwnd to " << m_cWnd);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   122
    };
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   123
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   124
  // Increase of cwnd based on current phase (slow start or congestion avoidance)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   125
  if (m_cWnd < m_ssThresh)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   126
    { // Slow start mode, add one segSize to cWnd. Default m_ssThresh is 65535. (RFC2001, sec.1)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   127
      m_cWnd += m_segmentSize;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   128
      NS_LOG_INFO ("In SlowStart, updated to cwnd " << m_cWnd << " ssthresh " << m_ssThresh);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   129
    }
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   130
  else
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   131
    { // Congestion avoidance mode, increase by (segSize*segSize)/cwnd. (RFC2581, sec.3.1)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   132
      // To increase cwnd for one segSize per RTT, it should be (ackBytes*segSize)/cwnd
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   133
      double adder = static_cast<double> (m_segmentSize * m_segmentSize) / m_cWnd.Get ();
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   134
      adder = std::max (1.0, adder);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   135
      m_cWnd += static_cast<uint32_t> (adder);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   136
      NS_LOG_INFO ("In CongAvoid, updated to cwnd " << m_cWnd << " ssthresh " << m_ssThresh);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   137
    }
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   138
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   139
  // Complete newAck processing
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   140
  TcpSocketBase::NewAck (seq);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   141
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   142
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   143
// Fast recovery and fast retransmit
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   144
void
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   145
TcpReno::DupAck (const TcpHeader& t, uint32_t count)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   146
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   147
  NS_LOG_FUNCTION (this << "t " << count);
7608
de67936e4017 Mixed bugfixes on TCP, closes bug 1166, 1227, 1242.
Adrian S Tam <adrian.sw.tam@gmail.com>
parents: 7385
diff changeset
   148
  if (count == m_retxThresh && !m_inFastRec)
6694
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   149
    { // triple duplicate ack triggers fast retransmit (RFC2581, sec.3.2)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   150
      m_ssThresh = std::max (2 * m_segmentSize, BytesInFlight () / 2);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   151
      m_cWnd = m_ssThresh + 3 * m_segmentSize;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   152
      m_inFastRec = true;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   153
      NS_LOG_INFO ("Triple dupack. Reset cwnd to " << m_cWnd << ", ssthresh to " << m_ssThresh);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   154
      DoRetransmit ();
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   155
    }
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   156
  else if (m_inFastRec)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   157
    { // In fast recovery, inc cwnd for every additional dupack (RFC2581, sec.3.2)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   158
      m_cWnd += m_segmentSize;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   159
      NS_LOG_INFO ("Increased cwnd to " << m_cWnd);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   160
      SendPendingData (m_connected);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   161
    };
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   162
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   163
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   164
// Retransmit timeout
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   165
void TcpReno::Retransmit (void)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   166
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   167
  NS_LOG_FUNCTION (this);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   168
  NS_LOG_LOGIC (this << " ReTxTimeout Expired at time " << Simulator::Now ().GetSeconds ());
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   169
  m_inFastRec = false;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   170
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   171
  // If erroneous timeout in closed/timed-wait state, just return
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   172
  if (m_state == CLOSED || m_state == TIME_WAIT) return;
7608
de67936e4017 Mixed bugfixes on TCP, closes bug 1166, 1227, 1242.
Adrian S Tam <adrian.sw.tam@gmail.com>
parents: 7385
diff changeset
   173
  // If all data are received (non-closing socket and nothing to send), just return
de67936e4017 Mixed bugfixes on TCP, closes bug 1166, 1227, 1242.
Adrian S Tam <adrian.sw.tam@gmail.com>
parents: 7385
diff changeset
   174
  if (m_state <= ESTABLISHED && m_txBuffer.HeadSequence () >= m_highTxMark) return;
6694
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   175
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   176
  // According to RFC2581 sec.3.1, upon RTO, ssthresh is set to half of flight
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   177
  // size and cwnd is set to 1*MSS, then the lost packet is retransmitted and
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   178
  // TCP back to slow start
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   179
  m_ssThresh = std::max (2 * m_segmentSize, BytesInFlight () / 2);
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   180
  m_cWnd = m_segmentSize;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   181
  m_nextTxSequence = m_txBuffer.HeadSequence (); // Restart from highest Ack
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   182
  NS_LOG_INFO ("RTO. Reset cwnd to " << m_cWnd <<
7176
9f2663992e99 internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6834
diff changeset
   183
               ", ssthresh to " << m_ssThresh << ", restart from seqnum " << m_nextTxSequence);
6694
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   184
  m_rtt->IncreaseMultiplier ();             // Double the next RTO
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   185
  DoRetransmit ();                          // Retransmit the packet
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   186
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   187
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   188
void
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   189
TcpReno::SetSegSize (uint32_t size)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   190
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   191
  NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpReno::SetSegSize() cannot change segment size after connection started.");
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   192
  m_segmentSize = size;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   193
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   194
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   195
void
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   196
TcpReno::SetSSThresh (uint32_t threshold)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   197
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   198
  m_ssThresh = threshold;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   199
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   200
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   201
uint32_t
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   202
TcpReno::GetSSThresh (void) const
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   203
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   204
  return m_ssThresh;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   205
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   206
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   207
void
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   208
TcpReno::SetInitialCwnd (uint32_t cwnd)
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   209
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   210
  NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpReno::SetInitialCwnd() cannot change initial cwnd after connection started.");
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   211
  m_initialCWnd = cwnd;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   212
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   213
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   214
uint32_t
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   215
TcpReno::GetInitialCwnd (void) const
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   216
{
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   217
  return m_initialCWnd;
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   218
}
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   219
6697
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
   220
void 
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
   221
TcpReno::InitializeCwnd (void)
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
   222
{
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
   223
  /*
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
   224
   * Initialize congestion window, default to 1 MSS (RFC2001, sec.1) and must
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
   225
   * not be larger than 2 MSS (RFC2581, sec.3.1). Both m_initiaCWnd and
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
   226
   * m_segmentSize are set by the attribute system in ns3::TcpSocket.
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
   227
   */
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
   228
  m_cWnd = m_initialCWnd * m_segmentSize;
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
   229
}
6f1114f669ff fix valgrind warnings for new TCP code
Tom Henderson <tomh@tomh.org>
parents: 6694
diff changeset
   230
6694
a814f37d15bf merge new TCP code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   231
} // namespace ns3