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",
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);
454 if (
m_minTh < targetqueue / 2.0 )
483 m_vA = 1.0 / th_diff;
511 else if (
m_qW == -1.0)
519 m_qW = 1.0 - std::exp (-1.0 / (10 * rtt *
m_ptc));
521 else if (
m_qW == -2.0)
542 <<
"; m_isGentle " <<
m_isGentle <<
"; th_diff " << th_diff
543 <<
"; lInterm " <<
m_lInterm <<
"; va " <<
m_vA <<
"; cur_max_p "
554 if (newAve < m_minTh + m_part && m_curMaxP >
m_bottom)
579 double newAve = qAvg * pow(1.0-qW, m);
580 newAve += qW * nQueued;
607 double pkts =
m_ptc * 0.05;
608 double fraction = std::pow ((1 -
m_qW), pkts);
610 if ((
double) qSize < fraction *
m_qAvg)
627 double pkts =
m_ptc * 0.05;
628 double fraction = std::pow ((1 -
m_qW), pkts);
629 double ratio = qSize / (fraction *
m_qAvg);
655 double vB,
double vC,
double vD,
double maxP)
657 NS_LOG_FUNCTION (
this << qAvg << maxTh << isGentle << vA << vB << vC << vD << maxP);
660 if (isGentle && qAvg >= maxTh)
666 else if (!isGentle && qAvg >= maxTh)
696 uint32_t meanPktSize,
bool isWait, uint32_t size)
698 NS_LOG_FUNCTION (
this << p << count << countBytes << meanPktSize << isWait << size);
699 double count1 = (double) count;
703 count1 = (double) (countBytes / meanPktSize);
708 if (count1 * p < 1.0)
712 else if (count1 * p < 2.0)
714 p /= (2.0 - count1 * p);
723 if (count1 * p < 1.0)
725 p /= (1.0 - count1 * p);
735 p = (p * size) / meanPktSize;
821 NS_LOG_ERROR (
"RedQueueDisc cannot have packet filters");
848 NS_LOG_ERROR (
"The mode of the provided queue does not match the mode set on the RedQueueDisc");
855 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.
Use number of bytes for maximum queue size.
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 > MakeDataRateChecker(void)
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.
QueueMode
Enumeration of the modes supported in the class.
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.
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.
Ptr< const AttributeAccessor > MakeDataRateAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
#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.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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.
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...
void Drop(Ptr< QueueDiscItem > item)
Drop a packet.
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.
Use number of packets for maximum queue size.
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.