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.