/usr/include/ns3.27/ns3/tcp-veno.h is in libns3-dev 3.27+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2016 ResiliNets, ITTC, University of Kansas
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Truc Anh N. Nguyen <annguyen@ittc.ku.edu>
*
* James P.G. Sterbenz <jpgs@ittc.ku.edu>, director
* ResiliNets Research Group http://wiki.ittc.ku.edu/resilinets
* Information and Telecommunication Technology Center (ITTC)
* and Department of Electrical Engineering and Computer Science
* The University of Kansas Lawrence, KS USA.
*/
#ifndef TCPVENO_H
#define TCPVENO_H
#include "ns3/tcp-congestion-ops.h"
namespace ns3 {
/**
* \ingroup congestionOps
*
* \brief An implementation of TCP Veno
*
* TCP Veno enhances Reno algorithm for more effectively dealing with random
* packet loss in wireless access networks by employing Vegas's method in
* estimating the backlog at the bottleneck queue to distinguish between
* congestive and non-congestive states.
*
* The backlog (the number of packets accumulated at the bottleneck queue) is
* calculated using Equation (1):
*
* N = Actual * (RTT - BaseRTT) = Diff * BaseRTT (1)
* where
* Diff = Expected - Actual = cwnd/BaseRTT - cwnd/RTT
*
* Veno makes decision on cwnd modification based on the calculated N and its
* predefined threshold beta.
*
* Specifically, it refines the additive increase algorithm of Reno so that the
* connection can stay longer in the stable state by incrementing cwnd by
* 1/cwnd for every other new ACK received after the available bandwidth has
* been fully utilized, i.e. when N exceeds beta. Otherwise, Veno increases
* its cwnd by 1/cwnd upon every new ACK receipt as in Reno.
*
* In the multiplicative decrease algorithm, when Veno is in the non-congestive
* state, i.e. when N is less than beta, Veno decrements its cwnd by only 1/5
* because the loss encountered is more likely a corruption-based loss than a
* congestion-based. Only when N is greater than beta, Veno halves its sending
* rate as in Reno.
*
* More information: http://dx.doi.org/10.1109/JSAC.2002.807336
*/
class TcpVeno : public TcpNewReno
{
public:
/**
* \brief Get the type ID.
* \return the object TypeId
*/
static TypeId GetTypeId (void);
/**
* Create an unbound tcp socket.
*/
TcpVeno (void);
/**
* \brief Copy constructor
* \param sock the object to copy
*/
TcpVeno (const TcpVeno& sock);
virtual ~TcpVeno (void);
virtual std::string GetName () const;
/**
* \brief Perform RTT sampling needed to execute Veno algorithm
*
* The function filters RTT samples from the last RTT to find
* the current smallest propagation delay + queueing delay (m_minRtt).
* We take the minimum to avoid the effects of delayed ACKs.
*
* The function also min-filters all RTT measurements seen to find the
* propagation delay (m_baseRtt).
*
* \param tcb internal congestion state
* \param segmentsAcked count of segments ACKed
* \param rtt last RTT
*
*/
virtual void PktsAcked (Ptr<TcpSocketState> tcb, uint32_t segmentsAcked,
const Time& rtt);
/**
* \brief Enable/disable Veno depending on the congestion state
*
* We only start a Veno when we are in normal congestion state (CA_OPEN state).
*
* \param tcb internal congestion state
* \param newState new congestion state to which the TCP is going to switch
*/
virtual void CongestionStateSet (Ptr<TcpSocketState> tcb,
const TcpSocketState::TcpCongState_t newState);
/**
* \brief Adjust cwnd following Veno additive increase algorithm
*
* \param tcb internal congestion state
* \param segmentsAcked count of segments ACKed
*/
virtual void IncreaseWindow (Ptr<TcpSocketState> tcb, uint32_t segmentsAcked);
/**
* \brief Get slow start threshold during Veno multiplicative-decrease phase
*
* \param tcb internal congestion state
* \param bytesInFlight bytes in flight
*
* \return the slow start threshold value
*/
virtual uint32_t GetSsThresh (Ptr<const TcpSocketState> tcb,
uint32_t bytesInFlight);
virtual Ptr<TcpCongestionOps> Fork ();
protected:
private:
/**
* \brief Enable Veno algorithm to start Veno sampling
*
* Veno algorithm is enabled in the following situations:
* 1. at the establishment of a connection
* 2. after an RTO
* 3. after fast recovery
* 4. when an idle connection is restarted
*
*/
void EnableVeno ();
/**
* \brief Turn off Veno
*/
void DisableVeno ();
private:
Time m_baseRtt; //!< Minimum of all RTT measurements seen during connection
Time m_minRtt; //!< Minimum of RTTs measured within last RTT
uint32_t m_cntRtt; //!< Number of RTT measurements during last RTT
bool m_doingVenoNow; //!< If true, do Veno for this RTT
uint32_t m_diff; //!< Difference between expected and actual throughput
bool m_inc; //!< If true, cwnd needs to be incremented
uint32_t m_ackCnt; //!< Number of received ACK
uint32_t m_beta; //!< Threshold for congestion detection
};
} // namespace ns3
#endif // TCPVENO_H
|