src/internet/model/tcp-westwood.cc
author Peter D. Barnes, Jr. <barnes26@llnl.gov>
Thu, 02 Oct 2014 21:17:48 -0700
changeset 10978 754c8256c35c
parent 10968 2d29fee2b7b8
child 11190 f0458968b67d
permissions -rw-r--r--
TracedValue callback function signatures.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
     2
/*
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
     3
 * Copyright (c) 2013 ResiliNets, ITTC, University of Kansas 
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
     4
 *
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
     7
 * published by the Free Software Foundation;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
     8
 *
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    12
 * GNU General Public License for more details.
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    13
 *
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    17
 *
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    18
 * Authors: Siddharth Gangadhar <siddharth@ittc.ku.edu>, Truc Anh N. Nguyen <annguyen@ittc.ku.edu>,
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    19
 * and Greeshma Umapathi
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    20
 *
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    21
 * James P.G. Sterbenz <jpgs@ittc.ku.edu>, director
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    22
 * ResiliNets Research Group  http://wiki.ittc.ku.edu/resilinets
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    23
 * Information and Telecommunication Technology Center (ITTC)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    24
 * and Department of Electrical Engineering and Computer Science
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    25
 * The University of Kansas Lawrence, KS USA.
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    26
 *
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    27
 * Work supported in part by NSF FIND (Future Internet Design) Program
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    28
 * under grant CNS-0626918 (Postmodern Internet Architecture),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    29
 * NSF grant CNS-1050226 (Multilayer Network Resilience Analysis and Experimentation on GENI),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    30
 * US Department of Defense (DoD), and ITTC at The University of Kansas.
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    31
 */
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    32
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    33
#define NS_LOG_APPEND_CONTEXT \
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    34
  if (m_node) { std::clog << Simulator::Now ().GetSeconds () << " [node " << m_node->GetId () << "] "; }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    35
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    36
#include "tcp-westwood.h"
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    37
#include "ns3/log.h"
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    38
#include "ns3/trace-source-accessor.h"
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    39
#include "ns3/simulator.h"
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    40
#include "ns3/abort.h"
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    41
#include "ns3/node.h"
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    42
#include "ns3/sequence-number.h"
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    43
#include "rtt-estimator.h"
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    44
10968
2d29fee2b7b8 [Bug 1551] Redux: NS_LOG_COMPONENT_DEFINE inside or outside of ns3 namespace?
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10855
diff changeset
    45
namespace ns3 {
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    46
10968
2d29fee2b7b8 [Bug 1551] Redux: NS_LOG_COMPONENT_DEFINE inside or outside of ns3 namespace?
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10855
diff changeset
    47
NS_LOG_COMPONENT_DEFINE("TcpWestwood");
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    48
10652
dc18deba4502 [doxygen] Revert r10410, r10411, r10412
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10594
diff changeset
    49
NS_OBJECT_ENSURE_REGISTERED(TcpWestwood);
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    50
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    51
TypeId
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    52
TcpWestwood::GetTypeId (void)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    53
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    54
  static TypeId tid = TypeId("ns3::TcpWestwood")
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    55
      .SetParent<TcpSocketBase>()
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    56
      .AddConstructor<TcpWestwood>()
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    57
      .AddTraceSource("CongestionWindow", "The TCP connection's congestion window",
10978
754c8256c35c TracedValue callback function signatures.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    58
                      MakeTraceSourceAccessor(&TcpWestwood::m_cWnd),
754c8256c35c TracedValue callback function signatures.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    59
                      "ns3::TracedValue::Uint32Callback")
10855
7ef081ddfc7f Bug 1831 - TcpSocket SlowStartThreshold is not a TraceSource
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
    60
      .AddTraceSource ("SlowStartThreshold",
7ef081ddfc7f Bug 1831 - TcpSocket SlowStartThreshold is not a TraceSource
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
    61
                       "TCP slow start threshold (bytes)",
10978
754c8256c35c TracedValue callback function signatures.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    62
                       MakeTraceSourceAccessor (&TcpWestwood::m_ssThresh),
754c8256c35c TracedValue callback function signatures.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    63
                       "ns3::TracedValue::Uint32Callback")
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    64
      .AddAttribute("FilterType", "Use this to choose no filter or Tustin's approximation filter",
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    65
                    EnumValue(TcpWestwood::TUSTIN), MakeEnumAccessor(&TcpWestwood::m_fType),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    66
                    MakeEnumChecker(TcpWestwood::NONE, "None", TcpWestwood::TUSTIN, "Tustin"))
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    67
      .AddAttribute("ProtocolType", "Use this to let the code run as Westwood or WestwoodPlus",
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    68
                    EnumValue(TcpWestwood::WESTWOOD),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    69
                    MakeEnumAccessor(&TcpWestwood::m_pType),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    70
                    MakeEnumChecker(TcpWestwood::WESTWOOD, "Westwood",TcpWestwood::WESTWOODPLUS, "WestwoodPlus"))
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    71
      .AddTraceSource("EstimatedBW", "The estimated bandwidth",
10978
754c8256c35c TracedValue callback function signatures.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    72
                    MakeTraceSourceAccessor(&TcpWestwood::m_currentBW),
754c8256c35c TracedValue callback function signatures.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10968
diff changeset
    73
                      "ns3::TracedValue::DoubleCallback");
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    74
  return tid;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    75
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    76
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    77
TcpWestwood::TcpWestwood (void) :
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    78
  m_inFastRec(false),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    79
  m_currentBW(0),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    80
  m_lastSampleBW(0),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    81
  m_lastBW(0),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    82
  m_minRtt(0),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    83
  m_lastAck(0),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    84
  m_prevAckNo(0),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    85
  m_accountedFor(0),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    86
  m_ackedSegments(0),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    87
  m_IsCount(false)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    88
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    89
  NS_LOG_FUNCTION (this);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    90
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    91
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    92
TcpWestwood::TcpWestwood (const TcpWestwood& sock) :
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    93
  TcpSocketBase(sock),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    94
  m_cWnd(sock.m_cWnd),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    95
  m_ssThresh(sock.m_ssThresh),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    96
  m_initialCWnd(sock.m_initialCWnd),
10855
7ef081ddfc7f Bug 1831 - TcpSocket SlowStartThreshold is not a TraceSource
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
    97
  m_initialSsThresh (sock.m_initialSsThresh),
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    98
  m_inFastRec(false),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
    99
  m_currentBW(sock.m_currentBW),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   100
  m_lastSampleBW(sock.m_lastSampleBW),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   101
  m_lastBW(sock.m_lastBW),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   102
  m_minRtt(sock.m_minRtt),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   103
  m_lastAck(sock.m_lastAck),
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   104
  m_prevAckNo(sock.m_prevAckNo),
9713
863fb879a9d2 fix valgrind error
Tom Henderson <tomh@tomh.org>
parents: 9696
diff changeset
   105
  m_accountedFor(sock.m_accountedFor),
863fb879a9d2 fix valgrind error
Tom Henderson <tomh@tomh.org>
parents: 9696
diff changeset
   106
  m_pType(sock.m_pType),
863fb879a9d2 fix valgrind error
Tom Henderson <tomh@tomh.org>
parents: 9696
diff changeset
   107
  m_fType(sock.m_fType),
863fb879a9d2 fix valgrind error
Tom Henderson <tomh@tomh.org>
parents: 9696
diff changeset
   108
  m_IsCount(sock.m_IsCount)
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   109
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   110
  NS_LOG_FUNCTION (this);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   111
  NS_LOG_LOGIC ("Invoked the copy constructor");
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   112
  NS_LOG_INFO ("m_minRtt at copy constructor" << m_minRtt);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   113
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   114
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   115
TcpWestwood::~TcpWestwood (void)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   116
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   117
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   118
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   119
int
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   120
TcpWestwood::Listen (void)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   121
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   122
  NS_LOG_FUNCTION (this);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   123
  InitializeCwnd();
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   124
  return TcpSocketBase::Listen();
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   125
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   126
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   127
int
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   128
TcpWestwood::Connect (const Address & address)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   129
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   130
  NS_LOG_FUNCTION (this << address);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   131
  InitializeCwnd();
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   132
  return TcpSocketBase::Connect(address);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   133
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   134
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   135
uint32_t
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   136
TcpWestwood::Window (void)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   137
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   138
  NS_LOG_FUNCTION (this);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   139
  return std::min (m_rWnd.Get (), m_cWnd.Get ());
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   140
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   141
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   142
Ptr<TcpSocketBase>
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   143
TcpWestwood::Fork (void)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   144
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   145
  NS_LOG_FUNCTION (this);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   146
  return CopyObject<TcpWestwood>(this);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   147
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   148
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   149
void
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   150
TcpWestwood::NewAck (const SequenceNumber32& seq)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   151
{ // Same as Reno
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   152
  NS_LOG_FUNCTION (this << seq);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   153
  NS_LOG_LOGIC ("TcpWestwood receieved ACK for seq " << seq <<
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   154
                " cwnd " << m_cWnd <<
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   155
                " ssthresh " << m_ssThresh);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   156
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   157
  // Check for exit condition of fast recovery
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   158
  if (m_inFastRec)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   159
    {// First new ACK after fast recovery, reset cwnd as in Reno
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   160
      m_cWnd = m_ssThresh;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   161
      m_inFastRec = false;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   162
      NS_LOG_INFO ("Reset cwnd to " << m_cWnd);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   163
    };
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   164
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   165
  // Increase of cwnd based on current phase (slow start or congestion avoidance)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   166
  if (m_cWnd < m_ssThresh)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   167
    { // Slow start mode, add one segSize to cWnd as in Reno
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   168
      m_cWnd += m_segmentSize;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   169
      NS_LOG_INFO ("In SlowStart, updated to cwnd " << m_cWnd << " ssthresh " << m_ssThresh);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   170
    }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   171
  else
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   172
    { // Congestion avoidance mode, increase by (segSize*segSize)/cwnd as in Reno
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   173
      double adder = static_cast<double> (m_segmentSize * m_segmentSize) / m_cWnd.Get();
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   174
      adder = std::max(1.0, adder);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   175
      m_cWnd += static_cast<uint32_t>(adder);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   176
      NS_LOG_INFO ("In CongAvoid, updated to cwnd " << m_cWnd << " ssthresh " << m_ssThresh);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   177
    }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   178
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   179
  // Complete newAck processing
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   180
  TcpSocketBase::NewAck(seq);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   181
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   182
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   183
void
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   184
TcpWestwood::ReceivedAck (Ptr<Packet> packet, const TcpHeader& tcpHeader)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   185
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   186
  NS_LOG_FUNCTION (this);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   187
  int acked = 0;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   188
  if ((0 != (tcpHeader.GetFlags () & TcpHeader::ACK)) && tcpHeader.GetAckNumber() >= m_prevAckNo)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   189
    {// It is a duplicate ACK or a new ACK. Old ACK is ignored.
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   190
      if (m_pType == TcpWestwood::WESTWOOD)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   191
        {// For Westwood, calculate the number of ACKed segments and estimate the BW
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   192
          acked = CountAck (tcpHeader);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   193
          EstimateBW (acked, tcpHeader, Time(0));
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   194
        }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   195
      else if (m_pType == TcpWestwood::WESTWOODPLUS)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   196
        {// For Weswood+, calculate the number of ACKed segments and update m_ackedSegments
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   197
          if (m_IsCount)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   198
            {
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   199
              acked = CountAck (tcpHeader);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   200
              UpdateAckedSegments (acked);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   201
            }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   202
        }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   203
    }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   204
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   205
  TcpSocketBase::ReceivedAck (packet, tcpHeader);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   206
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   207
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   208
void
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   209
TcpWestwood::EstimateBW (int acked, const TcpHeader& tcpHeader, Time rtt)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   210
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   211
  NS_LOG_FUNCTION (this);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   212
  if (m_pType == TcpWestwood::WESTWOOD)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   213
    {
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   214
      // Get the time when the current ACK is received
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   215
      double currentAck = static_cast<double> (Simulator::Now().GetSeconds());
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   216
      // Calculate the BW
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   217
      m_currentBW = acked * m_segmentSize / (currentAck - m_lastAck);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   218
      // Update the last ACK time
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   219
      m_lastAck = currentAck;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   220
    }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   221
  else if (m_pType == TcpWestwood::WESTWOODPLUS)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   222
    {
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   223
      // Calculate the BW
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   224
      m_currentBW = m_ackedSegments * m_segmentSize / rtt.GetSeconds();
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   225
      // Reset m_ackedSegments and m_IsCount for the next sampling
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   226
      m_ackedSegments = 0;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   227
      m_IsCount = false;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   228
    }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   229
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   230
  // Filter the BW sample
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   231
  Filtering();
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   232
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   233
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   234
int
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   235
TcpWestwood::CountAck (const TcpHeader& tcpHeader)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   236
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   237
  NS_LOG_FUNCTION (this);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   238
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   239
  // Calculate the number of acknowledged segments based on the received ACK number
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   240
  int cumul_ack = (tcpHeader.GetAckNumber() - m_prevAckNo) / m_segmentSize;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   241
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   242
  if (cumul_ack == 0)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   243
    {// A DUPACK counts for 1 segment delivered successfully
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   244
      m_accountedFor++;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   245
      cumul_ack = 1;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   246
    }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   247
  if (cumul_ack > 1)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   248
    {// A delayed ACK or a cumulative ACK after a retransmission
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   249
     // Check how much new data it ACKs
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   250
      if (m_accountedFor >= cumul_ack)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   251
        {
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   252
          m_accountedFor -= cumul_ack;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   253
          cumul_ack = 1;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   254
        }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   255
      else if (m_accountedFor < cumul_ack)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   256
        {
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   257
          cumul_ack -= m_accountedFor;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   258
          m_accountedFor = 0;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   259
        }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   260
    }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   261
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   262
  // Update the previous ACK number
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   263
  m_prevAckNo = tcpHeader.GetAckNumber();
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   264
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   265
  return cumul_ack;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   266
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   267
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   268
void
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   269
TcpWestwood::UpdateAckedSegments (int acked)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   270
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   271
  m_ackedSegments += acked;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   272
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   273
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   274
void
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   275
TcpWestwood::DupAck (const TcpHeader& header, uint32_t count)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   276
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   277
  NS_LOG_FUNCTION (this << count << m_cWnd);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   278
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   279
  if (count == 3 && !m_inFastRec)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   280
    {// Triple duplicate ACK triggers fast retransmit
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   281
     // Adjust cwnd and ssthresh based on the estimated BW
10855
7ef081ddfc7f Bug 1831 - TcpSocket SlowStartThreshold is not a TraceSource
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   282
      m_ssThresh = uint32_t(m_currentBW * static_cast<double> (m_minRtt.GetSeconds()));
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   283
      if (m_cWnd > m_ssThresh)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   284
        {
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   285
          m_cWnd = m_ssThresh;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   286
        }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   287
      m_inFastRec = true;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   288
      NS_LOG_INFO ("Triple dupack. Enter fast recovery mode. Reset cwnd to " << m_cWnd <<", ssthresh to " << m_ssThresh);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   289
      DoRetransmit ();
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   290
    }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   291
  else if (m_inFastRec)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   292
    {// Increase cwnd for every additional DUPACK as in Reno
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   293
      m_cWnd += m_segmentSize;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   294
      NS_LOG_INFO ("Dupack in fast recovery mode. Increase cwnd to " << m_cWnd);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   295
      SendPendingData (m_connected);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   296
    }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   297
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   298
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   299
void
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   300
TcpWestwood::Retransmit (void)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   301
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   302
  NS_LOG_FUNCTION (this);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   303
  NS_LOG_LOGIC (this << " ReTxTimeout Expired at time " << Simulator::Now ().GetSeconds ());
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   304
  m_inFastRec = false;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   305
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   306
  // If erroneous timeout in closed/timed-wait state, just return
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   307
  if (m_state == CLOSED || m_state == TIME_WAIT)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   308
    return;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   309
  // If all data are received, just return
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   310
  if (m_txBuffer.HeadSequence() >= m_nextTxSequence)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   311
    return;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   312
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   313
  // Upon an RTO, adjust cwnd and ssthresh based on the estimated BW
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   314
  m_ssThresh = std::max (static_cast<double> (2 * m_segmentSize), m_currentBW.Get() * static_cast<double> (m_minRtt.GetSeconds()));
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   315
  m_cWnd = m_segmentSize;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   316
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   317
  // Restart from highest ACK
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   318
  m_nextTxSequence = m_txBuffer.HeadSequence();
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   319
  NS_LOG_INFO ("RTO. Reset cwnd to " << m_cWnd <<
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   320
      ", ssthresh to " << m_ssThresh << ", restart from seqnum " << m_nextTxSequence);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   321
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   322
  // Double the next RTO
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   323
  m_rtt->IncreaseMultiplier();
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   324
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   325
  // Retransmit the packet
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   326
  DoRetransmit();
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   327
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   328
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   329
void
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   330
TcpWestwood::EstimateRtt (const TcpHeader& tcpHeader)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   331
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   332
  NS_LOG_FUNCTION_NOARGS ();
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   333
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   334
  // Calculate m_lastRtt
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   335
  TcpSocketBase::EstimateRtt (tcpHeader);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   336
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   337
  // Update minRtt
10594
147765b4725b Update Time scaling usage to use new functions.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10410
diff changeset
   338
  if (m_minRtt == Time (0))
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   339
    {
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   340
      m_minRtt = m_lastRtt;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   341
    }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   342
  else
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   343
    {
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   344
      if (m_lastRtt < m_minRtt)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   345
        {
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   346
          m_minRtt = m_lastRtt;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   347
        }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   348
    }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   349
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   350
  // For Westwood+, start running a clock on the currently estimated RTT if possible
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   351
  // to trigger a new BW sampling event
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   352
  if (m_pType == TcpWestwood::WESTWOODPLUS)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   353
   {
10594
147765b4725b Update Time scaling usage to use new functions.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10410
diff changeset
   354
     if(m_lastRtt != Time (0) && m_state == ESTABLISHED && !m_IsCount)
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   355
       {
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   356
         m_IsCount = true;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   357
         m_bwEstimateEvent.Cancel();
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   358
         m_bwEstimateEvent = Simulator::Schedule (m_lastRtt, &TcpWestwood::EstimateBW,this,m_ackedSegments,tcpHeader,m_lastRtt);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   359
       }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   360
   }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   361
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   362
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   363
void
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   364
TcpWestwood::Filtering ()
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   365
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   366
  NS_LOG_FUNCTION (this);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   367
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   368
  double alpha = 0.9;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   369
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   370
  if (m_fType == TcpWestwood::NONE)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   371
    {
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   372
    }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   373
  else if (m_fType == TcpWestwood::TUSTIN)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   374
    {
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   375
      double sample_bwe = m_currentBW;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   376
      m_currentBW = (alpha * m_lastBW) + ((1 - alpha) * ((sample_bwe + m_lastSampleBW) / 2));
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   377
      m_lastSampleBW = sample_bwe;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   378
      m_lastBW = m_currentBW;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   379
    }
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   380
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   381
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   382
void
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   383
TcpWestwood::SetSegSize (uint32_t size)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   384
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   385
  NS_ABORT_MSG_UNLESS(m_state == CLOSED, "TcpWestwood::SetSegSize() cannot change segment size after connection started.");
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   386
  m_segmentSize = size;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   387
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   388
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   389
void
10855
7ef081ddfc7f Bug 1831 - TcpSocket SlowStartThreshold is not a TraceSource
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   390
TcpWestwood::SetInitialSSThresh (uint32_t threshold)
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   391
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   392
  NS_LOG_FUNCTION (this);
10855
7ef081ddfc7f Bug 1831 - TcpSocket SlowStartThreshold is not a TraceSource
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   393
  NS_ABORT_MSG_UNLESS (m_state == CLOSED, "TcpWestwood::SetSSThresh() cannot change initial ssThresh after connection started.");
7ef081ddfc7f Bug 1831 - TcpSocket SlowStartThreshold is not a TraceSource
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   394
  m_initialSsThresh = threshold;
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   395
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   396
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   397
uint32_t
10855
7ef081ddfc7f Bug 1831 - TcpSocket SlowStartThreshold is not a TraceSource
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   398
TcpWestwood::GetInitialSSThresh (void) const
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   399
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   400
  NS_LOG_FUNCTION (this);
10855
7ef081ddfc7f Bug 1831 - TcpSocket SlowStartThreshold is not a TraceSource
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   401
  return m_initialSsThresh;
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   402
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   403
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   404
void
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   405
TcpWestwood::SetInitialCwnd (uint32_t cwnd)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   406
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   407
  NS_ABORT_MSG_UNLESS(m_state == CLOSED, "TcpWestwood::SetInitialCwnd() cannot change initial cwnd after connection started.");
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   408
  m_initialCWnd = cwnd;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   409
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   410
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   411
uint32_t
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   412
TcpWestwood::GetInitialCwnd (void) const
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   413
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   414
  NS_LOG_FUNCTION (this);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   415
  return m_initialCWnd;
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   416
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   417
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   418
void
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   419
TcpWestwood::InitializeCwnd(void)
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   420
{
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   421
  NS_LOG_FUNCTION (this);
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   422
  /*
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   423
   * Initialize congestion window, default to 1 MSS (RFC2001, sec.1) and must
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   424
   * not be larger than 2 MSS (RFC2581, sec.3.1). Both m_initiaCWnd and
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   425
   * m_segmentSize are set by the attribute system in ns3::TcpSocket.
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   426
   */
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   427
  m_cWnd = m_initialCWnd * m_segmentSize;
10855
7ef081ddfc7f Bug 1831 - TcpSocket SlowStartThreshold is not a TraceSource
Tommaso Pecorella <tommaso.pecorella@unifi.it>
parents: 10652
diff changeset
   428
  m_ssThresh = m_initialSsThresh;
9696
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   429
}
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   430
4b977376f383 Westwood and Westwood+
Anh Nguyen annguyen@ittc.ku.edu
parents:
diff changeset
   431
} // namespace ns3