61 #include "ns3/uinteger.h" 
   62 #include "ns3/double.h" 
   63 #include "ns3/simulator.h" 
   64 #include "ns3/abort.h" 
   66 #include "ns3/drop-tail-queue.h" 
   67 #include "ns3/net-device-queue-interface.h" 
   79     .SetGroupName(
"TrafficControl")
 
   81     .AddAttribute (
"Mode",
 
   82                    "Determines unit for QueueLimit",
 
   89                    "Use the MaxSize attribute instead")
 
   90     .AddAttribute (
"MeanPktSize",
 
   91                    "Average of packet size",
 
   94                    MakeUintegerChecker<uint32_t> ())
 
   95     .AddAttribute (
"IdlePktSize",
 
   96                    "Average packet size used during idle times. Used when m_cautions = 3",
 
   99                    MakeUintegerChecker<uint32_t> ())
 
  100     .AddAttribute (
"Wait",
 
  101                    "True for waiting between dropped packets",
 
  105     .AddAttribute (
"Gentle",
 
  106                    "True to increases dropping probability slowly when average queue exceeds maxthresh",
 
  110     .AddAttribute (
"ARED",
 
  111                    "True to enable ARED",
 
  115     .AddAttribute (
"AdaptMaxP",
 
  116                    "True to adapt m_curMaxP",
 
  120     .AddAttribute (
"FengAdaptive",
 
  121                    "True to enable Feng's Adaptive RED",
 
  125     .AddAttribute (
"NLRED",
 
  126                    "True to enable Nonlinear RED",
 
  130     .AddAttribute (
"MinTh",
 
  131                    "Minimum average length threshold in packets/bytes",
 
  134                    MakeDoubleChecker<double> ())
 
  135     .AddAttribute (
"MaxTh",
 
  136                    "Maximum average length threshold in packets/bytes",
 
  139                    MakeDoubleChecker<double> ())
 
  140     .AddAttribute (
"QueueLimit",
 
  141                    "Queue limit in bytes/packets",
 
  144                    MakeUintegerChecker<uint32_t> (),
 
  146                    "Use the MaxSize attribute instead")
 
  147     .AddAttribute (
"MaxSize",
 
  148                    "The maximum number of packets accepted by this queue disc",
 
  154                    "Queue weight related to the exponential weighted moving average (EWMA)",
 
  157                    MakeDoubleChecker <double> ())
 
  158     .AddAttribute (
"LInterm",
 
  159                    "The maximum probability of dropping a packet",
 
  162                    MakeDoubleChecker <double> ())
 
  163     .AddAttribute (
"TargetDelay",
 
  164                    "Target average queuing delay in ARED",
 
  168     .AddAttribute (
"Interval",
 
  169                    "Time interval to update m_curMaxP",
 
  173     .AddAttribute (
"Top",
 
  174                    "Upper bound for m_curMaxP in ARED",
 
  177                    MakeDoubleChecker <double> (0, 1))
 
  178     .AddAttribute (
"Bottom",
 
  179                    "Lower bound for m_curMaxP in ARED",
 
  182                    MakeDoubleChecker <double> (0, 1))
 
  183     .AddAttribute (
"Alpha",
 
  184                    "Increment parameter for m_curMaxP in ARED",
 
  187                    MakeDoubleChecker <double> (0, 1))
 
  188     .AddAttribute (
"Beta",
 
  189                    "Decrement parameter for m_curMaxP in ARED",
 
  192                    MakeDoubleChecker <double> (0, 1))
 
  193     .AddAttribute (
"FengAlpha",
 
  194                    "Decrement parameter for m_curMaxP in Feng's Adaptive RED",
 
  197                    MakeDoubleChecker <double> ())
 
  198     .AddAttribute (
"FengBeta",
 
  199                    "Increment parameter for m_curMaxP in Feng's Adaptive RED",
 
  202                    MakeDoubleChecker <double> ())
 
  203     .AddAttribute (
"LastSet",
 
  204                    "Store the last time m_curMaxP was updated",
 
  208     .AddAttribute (
"Rtt",
 
  209                    "Round Trip Time to be considered while automatically setting m_bottom",
 
  213     .AddAttribute (
"Ns1Compat",
 
  214                    "NS-1 compatibility",
 
  218     .AddAttribute (
"LinkBandwidth", 
 
  219                    "The RED link bandwidth",
 
  223     .AddAttribute (
"LinkDelay", 
 
  224                    "The RED link delay",
 
  228     .AddAttribute (
"UseEcn",
 
  229                    "True to use ECN (packets are marked instead of being dropped)",
 
  233     .AddAttribute (
"UseHardDrop",
 
  234                    "True to always drop packets above max threshold",
 
  247   m_uv = CreateObject<UniformRandomVariable> ();
 
  297       NS_LOG_WARN (
"Alpha value is above the recommended bound!");
 
  316       NS_LOG_WARN (
"Beta value is below the recommended bound!");
 
  335       NS_LOG_WARN (
"Alpha value does not follow the recommendations!");
 
  354       NS_LOG_WARN (
"Beta value does not follow the recommendations!");
 
  407           m = uint32_t (ptc * (now - 
m_idleTime).GetSeconds ());
 
  535       if (
m_minTh < targetqueue / 2.0 )
 
  561   m_vA = 1.0 / th_diff;
 
  589   else if (
m_qW == -1.0)
 
  597       m_qW = 1.0 - std::exp (-1.0 / (10 * rtt * 
m_ptc));
 
  599   else if (
m_qW == -2.0)
 
  620                              << 
"; m_isGentle " << 
m_isGentle << 
"; th_diff " << th_diff
 
  621                              << 
"; lInterm " << 
m_lInterm << 
"; va " << 
m_vA <<  
"; cur_max_p " 
  659   if (newAve < m_minTh + m_part && m_curMaxP > 
m_bottom)
 
  684   double newAve = qAvg * std::pow (1.0 - qW, m);
 
  685   newAve += qW * nQueued;
 
  717       double pkts = 
m_ptc * 0.05;
 
  718       double fraction = std::pow ((1 - 
m_qW), pkts);
 
  720       if ((
double) qSize < fraction * 
m_qAvg)
 
  737       double pkts = 
m_ptc * 0.05;
 
  738       double fraction = std::pow ((1 - 
m_qW), pkts);
 
  739       double ratio = qSize / (fraction * 
m_qAvg);
 
  813   double count1 = (double) 
m_count;
 
  822       if (count1 * p < 1.0)
 
  826       else if (count1 * p < 2.0)
 
  828           p /= (2.0 - count1 * p);
 
  837       if (count1 * p < 1.0)
 
  839           p /= (1.0 - count1 * p);
 
  917       NS_LOG_ERROR (
"RedQueueDisc cannot have packet filters");
 
  936       NS_LOG_ERROR (
"m_isAdaptMaxP and m_isFengAdaptive cannot be simultaneously true");
 
void SetMode(QueueDiscMode mode)
Set the operating mode of this queue disc. 
 
bool m_isGentle
True to increase dropping prob. 
 
Simulation virtual time values and global simulation resolution. 
 
uint32_t GetNQueueDiscClasses(void) const 
Get the number of queue disc classes. 
 
Smart pointer class similar to boost::intrusive_ptr. 
 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
 
void SetStream(int64_t stream)
Specifies the stream number for the RngStream. 
 
double m_beta
Decrement parameter for m_curMaxP in ARED. 
 
AttributeValue implementation for Boolean. 
 
uint32_t m_count
Number of packets since last random number generation. 
 
Class for representing queue sizes. 
 
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message. 
 
void DropBeforeEnqueue(Ptr< const QueueDiscItem > item, const char *reason)
Perform the actions required when the queue disc is notified of a packet dropped before enqueue...
 
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system. 
 
bool m_isARED
True to enable Adaptive RED. 
 
void SetTh(double minTh, double maxTh)
Set the thresh limits of RED. 
 
virtual bool DoEnqueue(Ptr< QueueDiscItem > item)
This function actually enqueues a packet into the queue disc. 
 
uint32_t GetNBytes(void) const 
Get the amount of bytes stored by the queue disc. 
 
double GetFengAdaptiveA(void)
Get the alpha value to adapt m_curMaxP in Feng's Adaptive RED. 
 
double m_qAvg
Average queue length. 
 
bool Mark(Ptr< QueueDiscItem > item, const char *reason)
Marks the given packet and, if successful, updates the counters associated with the given reason...
 
Time m_linkDelay
Link delay. 
 
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
 
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
 
void SetAredBeta(double beta)
Set the beta value to adapt m_curMaxP. 
 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
 
uint32_t m_idle
0/1 idle status 
 
FengStatus m_fengStatus
For use in Feng's Adaptive RED. 
 
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
 
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit. 
 
double m_vD
2.0 * m_curMaxP - 1.0 - used in "gentle" mode 
 
void SetFengAdaptiveB(double b)
Set the beta value to adapt m_curMaxP in Feng's Adaptive RED. 
 
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO. 
 
double m_vC
(1.0 - m_curMaxP) / m_maxTh - used in "gentle" mode 
 
bool m_useHardDrop
True if packets are always dropped above max threshold. 
 
double m_qW
Queue weight given to cur queue size sample. 
 
static constexpr const char * FORCED_MARK
Forced marks, m_qAvg > m_maxTh. 
 
QueueDisc is an abstract base class providing the interface and implementing the operations common to...
 
double m_b
Increment parameter for m_curMaxP in Feng's Adaptive RED. 
 
static constexpr const char * FORCED_DROP
Forced drops, m_qAvg > m_maxTh. 
 
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
 
double GetAredAlpha(void)
Get the alpha value to adapt m_curMaxP. 
 
Time m_rtt
Rtt to be considered while automatically setting m_bottom in ARED. 
 
static constexpr const char * UNFORCED_DROP
Early probability drops. 
 
double m_alpha
Increment parameter for m_curMaxP in ARED. 
 
Time m_lastSet
Last time m_curMaxP was updated. 
 
bool m_isAdaptMaxP
True to adapt m_curMaxP. 
 
Ptr< const AttributeChecker > MakeDataRateChecker(void)
 
Ptr< InternalQueue > GetInternalQueue(uint32_t i) const 
Get the i-th internal queue. 
 
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range. 
 
static TypeId GetTypeId(void)
Get the type ID. 
 
Class for representing data rates. 
 
double m_curMaxP
Current max_p. 
 
double GetSeconds(void) const 
Get an approximation of the time stored in this instance in the indicated unit. 
 
void SetQueueLimit(uint32_t lim)
Set the limit of the queue. 
 
uint32_t GetNInternalQueues(void) const 
Get the number of internal queues. 
 
void AddInternalQueue(Ptr< InternalQueue > queue)
Add an internal queue to the tail of the list of queues. 
 
Time m_idleTime
Start of current idle period. 
 
Ptr< T > CreateObjectWithAttributes(std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
Allocate an Object on the heap and initialize with a set of attributes. 
 
Hold variables of type enum. 
 
AttributeValue implementation for Time. 
 
double GetFengAdaptiveB(void)
Get the beta value to adapt m_curMaxP in Feng's Adaptive RED. 
 
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit. 
 
virtual bool CheckConfig(void)
Check whether the current configuration is correct. 
 
Hold an unsigned integer type. 
 
virtual void InitializeParams(void)
Initialize the queue parameters. 
 
uint32_t m_cautious
0 for default RED 1 experimental (see red-queue-disc.cc) 2 experimental (see red-queue-disc.cc) 3 use Idle packet size in the ptc 
 
Use number of packets for queue size. 
 
Ptr< UniformRandomVariable > m_uv
rng stream 
 
Ptr< const AttributeAccessor > MakeQueueSizeAccessor(T1 a1)
 
Attribute or trace source is deprecated; user is warned. 
 
double m_vB
-m_minTh / (m_maxTh - m_minTh) 
 
virtual void DoDispose(void)
Dispose of the object. 
 
bool m_isNonlinear
True to enable Nonlinear RED. 
 
uint32_t GetNPacketFilters(void) const 
Get the number of packet filters. 
 
Ptr< const AttributeAccessor > MakeDataRateAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
 
bool m_useEcn
True if ECN is used (packets are marked instead of being dropped) 
 
double m_minTh
Minimum threshold for m_qAvg (bytes or packets) 
 
virtual Ptr< const QueueDiscItem > DoPeek(void)
This function returns a copy of the next packet the queue disc will extract. 
 
Use number of bytes for maximum queue disc size. 
 
uint32_t m_idlePktSize
Avg pkt size used during idle times. 
 
Introspection did not find any typical Config paths. 
 
Ptr< const AttributeChecker > MakeQueueSizeChecker(void)
 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
 
double m_vA
1.0 / (m_maxTh - m_minTh) 
 
uint32_t m_countBytes
Number of bytes since last drop. 
 
QueueDiscMode
Enumeration of the modes supported in the class. 
 
Ptr< const AttributeChecker > MakeBooleanChecker(void)
 
double m_lInterm
The max probability of dropping a packet. 
 
uint64_t GetBitRate() const 
Get the underlying bitrate. 
 
static constexpr const char * UNFORCED_MARK
Early probability marks. 
 
uint32_t DropEarly(Ptr< QueueDiscItem > item, uint32_t qSize)
Check if a packet needs to be dropped due to probability mark. 
 
RedQueueDisc()
RedQueueDisc Constructor. 
 
double m_bottom
Lower bound for m_curMaxP in ARED. 
 
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
 
static Time Now(void)
Return the current simulation virtual time. 
 
virtual Ptr< QueueDiscItem > DoDequeue(void)
This function actually extracts a packet from the queue disc. 
 
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
 
void UpdateMaxP(double newAve)
Update m_curMaxP. 
 
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
 
QueueDiscSizePolicy
Enumeration of the available policies to handle the queue disc size. 
 
uint32_t m_old
0 when average queue first exceeds threshold 
 
Ptr< const AttributeChecker > MakeEnumChecker(int v1, std::string n1, int v2, std::string n2, int v3, std::string n3, int v4, std::string n4, int v5, std::string n5, int v6, std::string n6, int v7, std::string n7, int v8, std::string n8, int v9, std::string n9, int v10, std::string n10, int v11, std::string n11, int v12, std::string n12, int v13, std::string n13, int v14, std::string n14, int v15, std::string n15, int v16, std::string n16, int v17, std::string n17, int v18, std::string n18, int v19, std::string n19, int v20, std::string n20, int v21, std::string n21, int v22, std::string n22)
Make an EnumChecker pre-configured with a set of allowed values by name. 
 
Used by queue discs with single internal queue. 
 
void SetFengAdaptiveA(double a)
Set the alpha value to adapt m_curMaxP in Feng's Adaptive RED. 
 
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN. 
 
AttributeValue implementation for DataRate. 
 
An "unforced" (random) drop. 
 
DataRate m_linkBandwidth
Link bandwidth. 
 
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG. 
 
Time Seconds(double value)
Construct a Time in the indicated unit. 
 
Time m_interval
Time interval to update m_curMaxP. 
 
bool SetMaxSize(QueueSize size)
Set the maximum size of the queue disc. 
 
bool m_isWait
True for waiting between dropped packets. 
 
Time m_targetDelay
Target average queuing delay in ARED. 
 
double GetAredBeta(void)
Get the beta value to adapt m_curMaxP. 
 
double m_ptc
packet time constant in packets/second 
 
virtual ~RedQueueDisc()
Destructor. 
 
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR. 
 
double m_top
Upper bound for m_curMaxP in ARED. 
 
QueueDiscMode GetMode(void) const 
Get the operating mode of this queue disc. 
 
double Estimator(uint32_t nQueued, uint32_t m, double qAvg, double qW)
Compute the average queue size. 
 
uint32_t m_meanPktSize
Avg pkt size. 
 
void UpdateMaxPFeng(double newAve)
Update m_curMaxP based on Feng's Adaptive RED. 
 
bool m_isFengAdaptive
True to enable Feng's Adaptive RED. 
 
double CalculatePNew(void)
Returns a probability using these function parameters for the DropEarly function. ...
 
void SetAredAlpha(double alpha)
Set the alpha value to adapt m_curMaxP. 
 
This class can be used to hold variables of floating point type such as 'double' or 'float'...
 
virtual void DoDispose(void)
Dispose of the object. 
 
double ModifyP(double p, uint32_t size)
Returns a probability using these function parameters for the DropEarly function. ...
 
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
 
Use number of bytes for queue size. 
 
a unique identifier for an interface. 
 
TypeId SetParent(TypeId tid)
Set the parent TypeId. 
 
Use number of packets for maximum queue disc size. 
 
double m_maxTh
Maximum threshold for m_qAvg (bytes or packets), should be >= 2 * m_minTh. 
 
When m_maxTh < m_qAvg < m_minTh. 
 
QueueSize GetMaxSize(void) const 
Get the maximum size of the queue disc. 
 
double m_a
Decrement parameter for m_curMaxP in Feng's Adaptive RED. 
 
uint32_t GetNPackets(void) const 
Get the number of packets stored by the queue disc. 
 
bool m_isNs1Compat
Ns-1 compatibility.