Minor changes to rebase and finalize FqCobalt
This commit is contained in:
@@ -90,6 +90,7 @@ SOURCES = \
|
||||
$(SRC)/traffic-control/doc/codel.rst \
|
||||
$(SRC)/traffic-control/doc/cobalt.rst \
|
||||
$(SRC)/traffic-control/doc/fq-codel.rst \
|
||||
$(SRC)/traffic-control/doc/fq-cobalt.rst \
|
||||
$(SRC)/traffic-control/doc/pie.rst \
|
||||
$(SRC)/traffic-control/doc/mq.rst \
|
||||
$(SRC)/spectrum/doc/spectrum.rst \
|
||||
|
||||
@@ -13,5 +13,6 @@ Traffic Control Layer
|
||||
codel
|
||||
fq-codel
|
||||
cobalt
|
||||
fq-cobalt
|
||||
pie
|
||||
mq
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2016 Universita' degli Studi di Napoli Federico II
|
||||
* Copyright (c) 2020 NITK Surathkal (adapted for COBALT)
|
||||
*
|
||||
* 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
|
||||
@@ -17,7 +18,8 @@
|
||||
*
|
||||
* Authors: Pasquale Imputato <p.imputato@gmail.com>
|
||||
* Stefano Avallone <stefano.avallone@unina.it>
|
||||
*/
|
||||
* Modified by: Bhaskar Kataria <bhaskar.k7920@gmail.com> (COBALT changes)
|
||||
*/
|
||||
|
||||
#include "ns3/test.h"
|
||||
#include "ns3/simulator.h"
|
||||
|
||||
@@ -2,15 +2,20 @@
|
||||
.. highlight:: cpp
|
||||
.. highlight:: bash
|
||||
|
||||
.. _sec-fq-cobalt:
|
||||
|
||||
FqCobalt queue disc
|
||||
------------------
|
||||
-------------------
|
||||
|
||||
This chapter describes the FqCobalt ([Hoe16]_) queue disc implementation in |ns3|.
|
||||
This chapter describes the FqCobalt ([Pal19]_) queue disc implementation in |ns3|.
|
||||
|
||||
The FlowQueue-Cobalt (FQ-Cobalt) algorithm is similar to FlowQueue-CoDel (FQ-CoDel) algorithm available in ns-3-dev/src/traffic-control/doc/fq-codel.rst.
|
||||
The documentation for Cobalt is available in ns-3-dev/src/traffic-control/doc/cobalt.rst.
|
||||
The FlowQueue-Cobalt (FQ-Cobalt) algorithm is similar to FlowQueue-CoDel (FQ-CoDel) algorithm available in ::ref:`sec-fq-codel`.
|
||||
The documentation for Cobalt is available in
|
||||
``ns-3-dev/src/traffic-control/doc/cobalt.rst``.
|
||||
|
||||
FqCobalt is one of the crucial piece needed to complete to CAKE module `<https://ieeexplore.ieee.org/document/8475045>`
|
||||
FqCobalt is one of the key components of the CAKE smart queue management framework ([Hoe18]_). The COBALT AQM is preferred to the CoDel AQM for CAKE because
|
||||
it adds a heuristic called BLUE to cover cases in which the CoDel control
|
||||
law is too sluggish to respond to queue growth.
|
||||
|
||||
Model Description
|
||||
*****************
|
||||
@@ -19,38 +24,40 @@ The source code for the FqCobalt queue disc is located in the directory
|
||||
``src/traffic-control/model`` and consists of 2 files `fq-cobalt-queue-disc.h`
|
||||
and `fq-cobalt-queue-disc.cc` defining a FqCobaltQueueDisc class and a helper
|
||||
FqCobaltFlow class. The code was ported to |ns3| based on Linux kernel code
|
||||
implemented by Jonathan Morton.
|
||||
implemented by Jonathan Morton
|
||||
(https://github.com/torvalds/linux/blob/master/net/sched/sch_cake.c).
|
||||
|
||||
The Model Description is similar to the FqCoDel documentation mentioned above.
|
||||
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
.. [CAK16] https://github.com/torvalds/linux/blob/master/net/sched/sch_cake.c , Implementation of CAKE in Linux
|
||||
.. [Pal19] J. Palmei, S. Gupta, P. Imputato, J. Morton, M. Tahiliani, S. Avallone, and D. Taht, Design and Evaluation of COBALT Queue Discipline, 2019 IEEE International Symposium on Local and Metropolitan Area Networks (LANMAN), Paris, France, 2019.
|
||||
|
||||
.. [Hoe18] T. Hoiland-Jørgensen, D. Taht and J. Morton, "Piece of CAKE: A Comprehensive Queue Management Solution for Home Gateways," 2018 IEEE International Symposium on Local and Metropolitan Area Networks (LANMAN), Washington, DC, USA, 2018.
|
||||
|
||||
Attributes
|
||||
==========
|
||||
|
||||
The key attributes that the FqCobaltQueue class holds include the following:
|
||||
Most of the key attributes are similar to the FqCoDel implementation mentioned above. One difference is the absence of the ``MinBytes`` parameter.
|
||||
|
||||
Some additional parameters implemented as attributes are:
|
||||
|
||||
Most of the key attributes are similar to the FqCoDel implementation mentioned above.
|
||||
Some differences are:
|
||||
Absence of ``MinBytes`` parameter.
|
||||
Some extra parameters are
|
||||
* ``Pdrop:`` Value of drop probability.
|
||||
* ``Increment:`` Increment value of drop probability. Default value is 1./256 .
|
||||
* ``Decrement:`` Decrement value of drop probability. Default value is 1./4096 .
|
||||
* ``BlueThreshold:`` The Threshold after which Blue is enabled. Default value is 400ms.
|
||||
* ``BlueThreshold:`` The threshold after which Blue is enabled. Default value is 400ms.
|
||||
|
||||
Note that if the user wants to disable Blue Enhancement then the user can set
|
||||
it to a large value for example Time::Max().
|
||||
it to a large value; for example, to `Time::Max ()`.
|
||||
|
||||
Examples
|
||||
========
|
||||
|
||||
A typical usage pattern is to create a traffic control helper and to configure type
|
||||
and attributes of queue disc and filters from the helper. For example, FqCobalt
|
||||
can be configured as follows:
|
||||
A typical usage pattern is to create a traffic control helper and to configure
|
||||
the type
|
||||
and attributes of the queue disc and filters from the helper.
|
||||
For example, `FqCobalt` can be configured as follows:
|
||||
|
||||
.. sourcecode:: cpp
|
||||
|
||||
@@ -73,4 +80,4 @@ The test suite can be run using the following commands::
|
||||
|
||||
or::
|
||||
|
||||
$ NS_LOG="FqCobaltQueueDisc" ./waf --run "test-runner --suite=fq-cobalt-queue-disc"
|
||||
$ NS_LOG="FqCobaltQueueDisc" ./waf --run "test-runner --suite=fq-cobalt-queue-disc"
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
.. highlight:: cpp
|
||||
.. highlight:: bash
|
||||
|
||||
.. _sec-fq-codel:
|
||||
|
||||
FqCoDel queue disc
|
||||
------------------
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ TypeId CobaltQueueDisc::GetTypeId (void)
|
||||
.AddAttribute ("Pdrop",
|
||||
"Marking Probability",
|
||||
DoubleValue (0),
|
||||
MakeDoubleAccessor (&CobaltQueueDisc::m_Pdrop),
|
||||
MakeDoubleAccessor (&CobaltQueueDisc::m_pDrop),
|
||||
MakeDoubleChecker<double> ())
|
||||
.AddAttribute ("Increment",
|
||||
"Pdrop increment value",
|
||||
@@ -159,9 +159,9 @@ CobaltQueueDisc::CobaltQueueDisc ()
|
||||
m_uv = CreateObject<UniformRandomVariable> ();
|
||||
}
|
||||
|
||||
double CobaltQueueDisc::GetPdrop ()
|
||||
double CobaltQueueDisc::GetPdrop () const
|
||||
{
|
||||
return m_Pdrop;
|
||||
return m_pDrop;
|
||||
}
|
||||
|
||||
CobaltQueueDisc::~CobaltQueueDisc ()
|
||||
@@ -204,25 +204,25 @@ CobaltQueueDisc::CoDelTimeAfterEq (int64_t a, int64_t b)
|
||||
}
|
||||
|
||||
int64_t
|
||||
CobaltQueueDisc::Time2CoDel (Time t)
|
||||
CobaltQueueDisc::Time2CoDel (Time t) const
|
||||
{
|
||||
return (t.GetNanoSeconds ());
|
||||
}
|
||||
|
||||
Time
|
||||
CobaltQueueDisc::GetTarget (void)
|
||||
CobaltQueueDisc::GetTarget (void) const
|
||||
{
|
||||
return m_target;
|
||||
}
|
||||
|
||||
Time
|
||||
CobaltQueueDisc::GetInterval (void)
|
||||
CobaltQueueDisc::GetInterval (void) const
|
||||
{
|
||||
return m_interval;
|
||||
}
|
||||
|
||||
int64_t
|
||||
CobaltQueueDisc::GetDropNext (void)
|
||||
CobaltQueueDisc::GetDropNext (void) const
|
||||
{
|
||||
return m_dropNext;
|
||||
}
|
||||
@@ -408,7 +408,7 @@ void CobaltQueueDisc::CobaltQueueFull (int64_t now)
|
||||
if (CoDelTimeAfter ((now - m_lastUpdateTimeBlue), Time2CoDel (m_target)))
|
||||
{
|
||||
NS_LOG_LOGIC ("inside IF block");
|
||||
m_Pdrop = min (m_Pdrop + m_increment, (double)1.0);
|
||||
m_pDrop = min (m_pDrop + m_increment, (double)1.0);
|
||||
m_lastUpdateTimeBlue = now;
|
||||
}
|
||||
m_dropping = true;
|
||||
@@ -423,9 +423,9 @@ void CobaltQueueDisc::CobaltQueueFull (int64_t now)
|
||||
void CobaltQueueDisc::CobaltQueueEmpty (int64_t now)
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
if (m_Pdrop && CoDelTimeAfter ((now - m_lastUpdateTimeBlue), Time2CoDel (m_target)))
|
||||
if (m_pDrop && CoDelTimeAfter ((now - m_lastUpdateTimeBlue), Time2CoDel (m_target)))
|
||||
{
|
||||
m_Pdrop = max (m_Pdrop - m_decrement, (double)0.0);
|
||||
m_pDrop = max (m_pDrop - m_decrement, (double)0.0);
|
||||
m_lastUpdateTimeBlue = now;
|
||||
}
|
||||
m_dropping = false;
|
||||
@@ -526,19 +526,19 @@ bool CobaltQueueDisc::CobaltShouldDrop (Ptr<QueueDiscItem> item, int64_t now)
|
||||
{
|
||||
NS_LOG_LOGIC ("Marking due to CeThreshold " << m_ceThreshold.GetSeconds ());
|
||||
}
|
||||
|
||||
|
||||
// Enable Blue Enhancement if sojourn time is greater than blueThreshold and its been m_target time until the last time blue was updated
|
||||
if (CoDelTimeAfter (sojournTime, Time2CoDel (m_blueThreshold)) && CoDelTimeAfter ((now - m_lastUpdateTimeBlue), Time2CoDel (m_target)))
|
||||
{
|
||||
m_Pdrop = min (m_Pdrop + m_increment, (double)1.0);
|
||||
m_pDrop = min (m_pDrop + m_increment, (double)1.0);
|
||||
m_lastUpdateTimeBlue = now;
|
||||
}
|
||||
|
||||
/* Simple BLUE implementation. Lack of ECN is deliberate. */
|
||||
if (m_Pdrop)
|
||||
if (m_pDrop)
|
||||
{
|
||||
double u = m_uv->GetValue ();
|
||||
drop = drop | (u < m_Pdrop);
|
||||
drop = drop | (u < m_pDrop);
|
||||
}
|
||||
|
||||
/* Overload the drop_next field as an activity timeout */
|
||||
|
||||
@@ -84,21 +84,21 @@ public:
|
||||
*
|
||||
* \returns The target queue delay
|
||||
*/
|
||||
Time GetTarget (void);
|
||||
Time GetTarget (void) const;
|
||||
|
||||
/**
|
||||
* \brief Get the interval
|
||||
*
|
||||
* \returns The interval
|
||||
*/
|
||||
Time GetInterval (void);
|
||||
Time GetInterval (void) const;
|
||||
|
||||
/**
|
||||
* \brief Get the time for next packet drop while in the dropping state
|
||||
*
|
||||
* \returns The time for next packet drop
|
||||
* \returns The time (in microseconds) for next packet drop
|
||||
*/
|
||||
int64_t GetDropNext (void);
|
||||
int64_t GetDropNext (void) const;
|
||||
|
||||
static constexpr const char* TARGET_EXCEEDED_DROP = "Target exceeded drop"; //!< Sojourn time above target
|
||||
static constexpr const char* OVERLIMIT_DROP = "Overlimit drop"; //!< Overlimit dropped packet
|
||||
@@ -110,7 +110,7 @@ public:
|
||||
*
|
||||
* \returns The current value of Blue's drop probability
|
||||
*/
|
||||
double GetPdrop ();
|
||||
double GetPdrop () const;
|
||||
|
||||
/**
|
||||
* Assign a fixed random variable stream number to the random variables
|
||||
@@ -128,7 +128,7 @@ public:
|
||||
* @param t the input Time Object
|
||||
* @return the unsigned 32-bit integer representation
|
||||
*/
|
||||
int64_t Time2CoDel (Time t);
|
||||
int64_t Time2CoDel (Time t) const;
|
||||
|
||||
protected:
|
||||
/**
|
||||
@@ -198,17 +198,21 @@ private:
|
||||
|
||||
/**
|
||||
* Called when the queue becomes full to alter the drop probabilities of Blue
|
||||
* \param now time in CoDel time units (microseconds)
|
||||
*/
|
||||
void CobaltQueueFull (int64_t now);
|
||||
|
||||
/**
|
||||
* Called when the queue becomes empty to alter the drop probabilities of Blue
|
||||
* \param now time in CoDel time units (microseconds)
|
||||
*/
|
||||
void CobaltQueueEmpty (int64_t now);
|
||||
|
||||
/**
|
||||
* Called to decide whether the current packet should be dropped based on decisions taken by Blue and Codel working parallely
|
||||
* Returns true if the packet should be dropped, false otherwise
|
||||
* \param item current packet
|
||||
* \param now time in CoDel time units (microseconds)
|
||||
*/
|
||||
bool CobaltShouldDrop (Ptr<QueueDiscItem> item, int64_t now);
|
||||
|
||||
@@ -225,8 +229,8 @@ private:
|
||||
uint32_t m_recInvSqrtCache[REC_INV_SQRT_CACHE] = {0}; //!< Cache to maintain some initial values of InvSqrt
|
||||
|
||||
// Supplied by user
|
||||
Time m_interval; //!< 100 ms sliding minimum time window width
|
||||
Time m_target; //!< 5 ms target queue delay
|
||||
Time m_interval; //!< sliding minimum time window width
|
||||
Time m_target; //!< target queue delay
|
||||
bool m_useEcn; //!< True if ECN is used (packets are marked instead of being dropped)
|
||||
Time m_ceThreshold; //!< Threshold above which to CE mark
|
||||
bool m_useL4s; //!< True if L4S is used (ECT1 packets are marked at CE threshold)
|
||||
@@ -240,7 +244,7 @@ private:
|
||||
// Supplied by user
|
||||
double m_increment; //!< increment value for marking probability
|
||||
double m_decrement; //!< decrement value for marking probability
|
||||
double m_Pdrop; //!< Drop Probability
|
||||
double m_pDrop; //!< Drop Probability
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2016 Universita' degli Studi di Napoli Federico II
|
||||
* Copyright (c) 2020 NITK Surathkal (adapted for COBALT)
|
||||
*
|
||||
* 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
|
||||
@@ -17,7 +18,12 @@
|
||||
*
|
||||
* Authors: Pasquale Imputato <p.imputato@gmail.com>
|
||||
* Stefano Avallone <stefano.avallone@unina.it>
|
||||
*/
|
||||
* Modified by: Bhaskar Kataria <bhaskar.k7920@gmail.com> (for COBALT)
|
||||
* Tom Henderson <tomhend@u.washington.edu>
|
||||
* Mohit P. Tahiliani <tahiliani@nitk.edu.in>
|
||||
* Vivek Jain <jain.vivek.anand@gmail.com>
|
||||
* Ankit Deepak <adadeepak8@gmail.com>
|
||||
*/
|
||||
|
||||
#include "ns3/log.h"
|
||||
#include "ns3/string.h"
|
||||
@@ -405,7 +411,8 @@ FqCobaltQueueDisc::DoDequeue (void)
|
||||
{
|
||||
NS_LOG_DEBUG ("Dequeued packet " << item->GetPacket ());
|
||||
}
|
||||
} while (item == 0);
|
||||
}
|
||||
while (item == 0);
|
||||
|
||||
flow->IncreaseDeficit (item->GetSize () * -1);
|
||||
|
||||
@@ -458,7 +465,7 @@ FqCobaltQueueDisc::CheckConfig (void)
|
||||
// If UseL4S attribute is enabled then CE threshold must be set.
|
||||
if (m_useL4s)
|
||||
{
|
||||
NS_ABORT_MSG_IF (m_ceThreshold == Time::Max(), "CE threshold not set");
|
||||
NS_ABORT_MSG_IF (m_ceThreshold == Time::Max (), "CE threshold not set");
|
||||
if (m_useEcn == false)
|
||||
{
|
||||
NS_LOG_WARN ("Enabling ECN as L4S mode is enabled");
|
||||
@@ -514,7 +521,8 @@ FqCobaltQueueDisc::FqCobaltDrop (void)
|
||||
item = qd->GetInternalQueue (0)->Dequeue ();
|
||||
DropAfterDequeue (item, OVERLIMIT_DROP);
|
||||
len += item->GetSize ();
|
||||
} while (++count < m_dropBatchSize && len < threshold);
|
||||
}
|
||||
while (++count < m_dropBatchSize && len < threshold);
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2020 NITK Surathkal
|
||||
* Copyright (c) 2016 Universita' degli Studi di Napoli Federico II
|
||||
* Copyright (c) 2020 NITK Surathkal (adapted for COBALT)
|
||||
*
|
||||
* 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
|
||||
@@ -15,8 +16,10 @@
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Authors: Bhaskar Kataria <bhaskar.k7920@gmail.com>
|
||||
* Tom Henderson <tomhend@u.washington.edu>
|
||||
* Authors: Pasquale Imputato <p.imputato@gmail.com>
|
||||
* Stefano Avallone <stefano.avallone@unina.it>
|
||||
* Modified by: Bhaskar Kataria <bhaskar.k7920@gmail.com> (for COBALT)
|
||||
* Tom Henderson <tomhend@u.washington.edu>
|
||||
* Mohit P. Tahiliani <tahiliani@nitk.edu.in>
|
||||
* Vivek Jain <jain.vivek.anand@gmail.com>
|
||||
* Ankit Deepak <adadeepak8@gmail.com>
|
||||
@@ -38,7 +41,8 @@ namespace ns3 {
|
||||
* \brief A flow queue used by the FqCobalt queue disc
|
||||
*/
|
||||
|
||||
class FqCobaltFlow : public QueueDiscClass {
|
||||
class FqCobaltFlow : public QueueDiscClass
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief Get the type ID.
|
||||
@@ -57,11 +61,11 @@ public:
|
||||
* \brief Used to determine the status of this flow queue
|
||||
*/
|
||||
enum FlowStatus
|
||||
{
|
||||
INACTIVE,
|
||||
NEW_FLOW,
|
||||
OLD_FLOW
|
||||
};
|
||||
{
|
||||
INACTIVE,
|
||||
NEW_FLOW,
|
||||
OLD_FLOW
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Set the deficit for this flow
|
||||
@@ -112,7 +116,8 @@ private:
|
||||
* \brief A FqCobalt packet queue disc
|
||||
*/
|
||||
|
||||
class FqCobaltQueueDisc : public QueueDisc {
|
||||
class FqCobaltQueueDisc : public QueueDisc
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief Get the type ID.
|
||||
@@ -126,19 +131,19 @@ public:
|
||||
|
||||
virtual ~FqCobaltQueueDisc ();
|
||||
|
||||
/**
|
||||
* \brief Set the quantum value.
|
||||
*
|
||||
* \param quantum The number of bytes each queue gets to dequeue on each round of the scheduling algorithm
|
||||
*/
|
||||
void SetQuantum (uint32_t quantum);
|
||||
/**
|
||||
* \brief Set the quantum value.
|
||||
*
|
||||
* \param quantum The number of bytes each queue gets to dequeue on each round of the scheduling algorithm
|
||||
*/
|
||||
void SetQuantum (uint32_t quantum);
|
||||
|
||||
/**
|
||||
* \brief Get the quantum value.
|
||||
*
|
||||
* \returns The number of bytes each queue gets to dequeue on each round of the scheduling algorithm
|
||||
*/
|
||||
uint32_t GetQuantum (void) const;
|
||||
/**
|
||||
* \brief Get the quantum value.
|
||||
*
|
||||
* \returns The number of bytes each queue gets to dequeue on each round of the scheduling algorithm
|
||||
*/
|
||||
uint32_t GetQuantum (void) const;
|
||||
|
||||
// Reasons for dropping packets
|
||||
static constexpr const char* UNCLASSIFIED_DROP = "Unclassified drop"; //!< No packet filter able to classify packet
|
||||
|
||||
Reference in New Issue
Block a user