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"
78 .SetGroupName(
"TrafficControl")
80 .AddAttribute (
"Mode",
81 "Determines unit for QueueLimit",
86 .AddAttribute (
"MeanPktSize",
87 "Average of packet size",
90 MakeUintegerChecker<uint32_t> ())
91 .AddAttribute (
"IdlePktSize",
92 "Average packet size used during idle times. Used when m_cautions = 3",
95 MakeUintegerChecker<uint32_t> ())
96 .AddAttribute (
"Wait",
97 "True for waiting between dropped packets",
101 .AddAttribute (
"Gentle",
102 "True to increases dropping probability slowly when average queue exceeds maxthresh",
106 .AddAttribute (
"ARED",
107 "True to enable ARED",
111 .AddAttribute (
"AdaptMaxP",
112 "True to adapt m_curMaxP",
116 .AddAttribute (
"MinTh",
117 "Minimum average length threshold in packets/bytes",
120 MakeDoubleChecker<double> ())
121 .AddAttribute (
"MaxTh",
122 "Maximum average length threshold in packets/bytes",
125 MakeDoubleChecker<double> ())
126 .AddAttribute (
"QueueLimit",
127 "Queue limit in bytes/packets",
130 MakeUintegerChecker<uint32_t> ())
132 "Queue weight related to the exponential weighted moving average (EWMA)",
135 MakeDoubleChecker <double> ())
136 .AddAttribute (
"LInterm",
137 "The maximum probability of dropping a packet",
140 MakeDoubleChecker <double> ())
141 .AddAttribute (
"TargetDelay",
142 "Target average queuing delay in ARED",
146 .AddAttribute (
"Interval",
147 "Time interval to update m_curMaxP",
151 .AddAttribute (
"Top",
152 "Upper bound for m_curMaxP in ARED",
155 MakeDoubleChecker <double> (0, 1))
156 .AddAttribute (
"Bottom",
157 "Lower bound for m_curMaxP in ARED",
160 MakeDoubleChecker <double> (0, 1))
161 .AddAttribute (
"Alpha",
162 "Increment parameter for m_curMaxP in ARED",
165 MakeDoubleChecker <double> (0, 1))
166 .AddAttribute (
"Beta",
167 "Decrement parameter for m_curMaxP in ARED",
170 MakeDoubleChecker <double> (0, 1))
171 .AddAttribute (
"LastSet",
172 "Store the last time m_curMaxP was updated",
176 .AddAttribute (
"Rtt",
177 "Round Trip Time to be considered while automatically setting m_bottom",
181 .AddAttribute (
"Ns1Compat",
182 "NS-1 compatibility",
186 .AddAttribute (
"LinkBandwidth",
187 "The RED link bandwidth",
190 MakeDataRateChecker ())
191 .AddAttribute (
"LinkDelay",
192 "The RED link delay",
205 m_uv = CreateObject<UniformRandomVariable> ();
243 NS_LOG_WARN (
"Alpha value is above the recommended bound!");
262 NS_LOG_WARN (
"Beta value is below the recommended bound!");
309 uint32_t nQueued = 0;
333 m = uint32_t (ptc * (now -
m_idleTime).GetSeconds ());
388 NS_LOG_DEBUG (
"\t Dropping due to Queue Full " << nQueued);
457 if (
m_minTh < targetqueue / 2.0 )
486 m_vA = 1.0 / th_diff;
514 else if (
m_qW == -1.0)
522 m_qW = 1.0 - std::exp (-1.0 / (10 * rtt *
m_ptc));
524 else if (
m_qW == -2.0)
545 <<
"; m_isGentle " <<
m_isGentle <<
"; th_diff " << th_diff
546 <<
"; lInterm " <<
m_lInterm <<
"; va " <<
m_vA <<
"; cur_max_p "
557 if (newAve < m_minTh + m_part && m_curMaxP >
m_bottom)
582 double newAve = qAvg * pow(1.0-qW, m);
583 newAve += qW * nQueued;
610 double pkts =
m_ptc * 0.05;
611 double fraction = std::pow ((1 -
m_qW), pkts);
613 if ((
double) qSize < fraction *
m_qAvg)
630 double pkts =
m_ptc * 0.05;
631 double fraction = std::pow ((1 -
m_qW), pkts);
632 double ratio = qSize / (fraction *
m_qAvg);
658 double vB,
double vC,
double vD,
double maxP)
660 NS_LOG_FUNCTION (
this << qAvg << maxTh << isGentle << vA << vB << vC << vD << maxP);
663 if (isGentle && qAvg >= maxTh)
669 else if (!isGentle && qAvg >= maxTh)
699 uint32_t meanPktSize,
bool isWait, uint32_t size)
701 NS_LOG_FUNCTION (
this << p << count << countBytes << meanPktSize << isWait << size);
702 double count1 = (double) count;
706 count1 = (double) (countBytes / meanPktSize);
711 if (count1 * p < 1.0)
715 else if (count1 * p < 2.0)
717 p /= (2.0 - count1 * p);
726 if (count1 * p < 1.0)
728 p /= (1.0 - count1 * p);
738 p = (p * size) / meanPktSize;
824 NS_LOG_ERROR (
"RedQueueDisc cannot have packet filters");
851 NS_LOG_ERROR (
"The mode of the provided queue does not match the mode set on the RedQueueDisc");
858 NS_LOG_ERROR (
"The size of the internal queue is less than the queue disc limit");
bool m_isGentle
True to increases dropping prob.
Simulation virtual time values and global simulation resolution.
uint32_t GetQueueSize(void)
Get the current value of the queue in bytes or packets.
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 this RNG stream.
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.
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
#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.
Ptr< Queue > GetInternalQueue(uint32_t i) const
Get the i-th internal queue.
uint32_t GetNBytes(void) const
Get the amount of bytes stored by the queue disc.
double m_qAvg
Average queue length.
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
#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
#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
double m_qW
Queue weight given to cur queue size sample.
QueueDisc is an abstract base class providing the interface and implementing the operations common to...
Stats m_stats
RED statistics.
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.
double m_alpha
Increment parameter for m_curMaxP in ARED.
Time m_lastSet
Last time m_curMaxP was updated.
void UpdateMaxP(double newAve, Time now)
Update m_curMaxP.
bool m_isAdaptMaxP
True to adapt m_curMaxP.
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.
Time m_idleTime
Start of current idle period.
void Drop(Ptr< QueueItem > item)
Drop a packet.
uint32_t forcedDrop
Forced drops, qavg > max threshold.
Hold variables of type enum.
AttributeValue implementation for Time.
uint32_t m_queueLimit
Queue limit in bytes / packets.
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.cc) 2 experimental (see red-queue.cc) 3 use Idle packet size in the ptc
uint32_t qLimDrop
Drops due to queue limits.
void AddInternalQueue(Ptr< Queue > queue)
Add an internal queue to the tail of the list of queues.
Ptr< UniformRandomVariable > m_uv
rng stream
Queue::QueueMode m_mode
Mode (Bytes or packets)
double m_vB
-m_minTh / (m_maxTh - m_minTh)
virtual void DoDispose(void)
Dispose of the object.
uint32_t GetNPacketFilters(void) const
Get the number of packet filters.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
double m_minTh
Min avg length threshold (bytes)
uint32_t m_idlePktSize
Avg pkt size used during idle times.
Use number of bytes for maximum queue size.
double m_vA
1.0 / (m_maxTh - m_minTh)
double CalculatePNew(double qAvg, double, bool gentle, double vA, double vB, double vC, double vD, double maxP)
Returns a probability using these function parameters for the DropEarly function. ...
uint32_t m_countBytes
Number of bytes since last drop.
Ptr< const AttributeChecker > MakeBooleanChecker(void)
double m_lInterm
The max probability of dropping a packet.
uint64_t GetBitRate() const
Get the underlying bitrate.
Queue::QueueMode GetMode(void)
Get the encapsulation mode of this queue.
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.
QueueMode
Enumeration of the modes supported in the class.
virtual Ptr< QueueDiscItem > DoDequeue(void)
This function actually extracts a packet from the queue disc.
An "unforced" (random) drop.
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Use number of packets for maximum queue 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.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
AttributeValue implementation for DataRate.
double ModifyP(double p, uint32_t count, uint32_t countBytes, uint32_t meanPktSize, bool wait, uint32_t size)
Returns a probability using these function parameters for the DropEarly function. ...
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.
void SetMode(Queue::QueueMode mode)
Set the operating mode of this queue.
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.
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 SetAredAlpha(double alpha)
Set the alpha value to adapt m_curMaxP.
virtual Ptr< const QueueDiscItem > DoPeek(void) const
This function returns a copy of the next packet the queue disc will extract.
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.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Stats GetStats()
Get the RED statistics after running.
double m_maxTh
Max avg length threshold (bytes), should be >= 2*minTh.
uint32_t unforcedDrop
Early probability drops.
uint32_t GetNPackets(void) const
Get the number of packets stored by the queue disc.
bool m_isNs1Compat
Ns-1 compatibility.