A Discrete-Event Network Simulator
API
red-queue-disc.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright © 2011 Marcos Talau
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Marcos Talau (talau@users.sourceforge.net)
19  *
20  * Thanks to: Duy Nguyen<duy@soe.ucsc.edu> by RED efforts in NS3
21  *
22  *
23  * This file incorporates work covered by the following copyright and
24  * permission notice:
25  *
26  * Copyright (c) 1990-1997 Regents of the University of California.
27  * All rights reserved.
28  *
29  * Redistribution and use in source and binary forms, with or without
30  * modification, are permitted provided that the following conditions
31  * are met:
32  * 1. Redistributions of source code must retain the above copyright
33  * notice, this list of conditions and the following disclaimer.
34  * 2. Redistributions in binary form must reproduce the above copyright
35  * notice, this list of conditions and the following disclaimer in the
36  * documentation and/or other materials provided with the distribution.
37  * 3. Neither the name of the University nor of the Laboratory may be used
38  * to endorse or promote products derived from this software without
39  * specific prior written permission.
40  *
41  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  */
53 
54 /*
55  * PORT NOTE: This code was ported from ns-2 (queue/red.h). Almost all
56  * comments also been ported from NS-2.
57  * This implementation aims to be close to the results cited in [0]
58  * [0] S.Floyd, K.Fall http://icir.org/floyd/papers/redsims.ps
59  */
60 
61 #ifndef RED_QUEUE_DISC_H
62 #define RED_QUEUE_DISC_H
63 
64 #include "ns3/queue-disc.h"
65 #include "ns3/nstime.h"
66 #include "ns3/boolean.h"
67 #include "ns3/data-rate.h"
68 #include "ns3/random-variable-stream.h"
69 
70 namespace ns3 {
71 
72 class TraceContainer;
73 
79 class RedQueueDisc : public QueueDisc
80 {
81 public:
86  static TypeId GetTypeId (void);
92  RedQueueDisc ();
93 
99  virtual ~RedQueueDisc ();
100 
105  {
109  };
110 
114  enum
115  {
119  };
120 
126  void SetAredAlpha (double alpha);
127 
133  double GetAredAlpha (void);
134 
140  void SetAredBeta (double beta);
141 
147  double GetAredBeta (void);
148 
154  void SetFengAdaptiveA (double a);
155 
161  double GetFengAdaptiveA (void);
162 
168  void SetFengAdaptiveB (double b);
169 
175  double GetFengAdaptiveB (void);
176 
183  void SetTh (double minTh, double maxTh);
184 
193  int64_t AssignStreams (int64_t stream);
194 
195  // Reasons for dropping packets
196  static constexpr const char* UNFORCED_DROP = "Unforced drop";
197  static constexpr const char* FORCED_DROP = "Forced drop";
198  // Reasons for marking packets
199  static constexpr const char* UNFORCED_MARK = "Unforced mark";
200  static constexpr const char* FORCED_MARK = "Forced mark";
201 
202 protected:
206  virtual void DoDispose (void);
207 
208 private:
209  virtual bool DoEnqueue (Ptr<QueueDiscItem> item);
210  virtual Ptr<QueueDiscItem> DoDequeue (void);
211  virtual Ptr<const QueueDiscItem> DoPeek (void);
212  virtual bool CheckConfig (void);
213 
222  virtual void InitializeParams (void);
231  double Estimator (uint32_t nQueued, uint32_t m, double qAvg, double qW);
236  void UpdateMaxP (double newAve);
241  void UpdateMaxPFeng (double newAve);
248  uint32_t DropEarly (Ptr<QueueDiscItem> item, uint32_t qSize);
253  double CalculatePNew (void);
260  double ModifyP (double p, uint32_t size);
261 
262  // ** Variables supplied by user
263  uint32_t m_meanPktSize;
264  uint32_t m_idlePktSize;
265  bool m_isWait;
266  bool m_isGentle;
267  bool m_isARED;
269  double m_minTh;
270  double m_maxTh;
271  double m_qW;
272  double m_lInterm;
275  double m_top;
276  double m_bottom;
277  double m_alpha;
278  double m_beta;
282  double m_b;
283  double m_a;
287  bool m_useEcn;
289 
290  // ** Variables maintained by RED
291  double m_vA;
292  double m_vB;
293  double m_vC;
294  double m_vD;
295  double m_curMaxP;
297  double m_vProb;
298  uint32_t m_countBytes;
299  uint32_t m_old;
300  uint32_t m_idle;
301  double m_ptc;
302  double m_qAvg;
303  uint32_t m_count;
305 
311  uint32_t m_cautious;
313 
315 };
316 
317 }; // namespace ns3
318 
319 #endif // RED_QUEUE_DISC_H
ns3::TypeId
a unique identifier for an interface.
Definition: type-id.h:59
ns3::RedQueueDisc::m_interval
Time m_interval
Time interval to update m_curMaxP.
Definition: red-queue-disc.h:274
ns3::RedQueueDisc::RedQueueDisc
RedQueueDisc()
RedQueueDisc Constructor.
Definition: red-queue-disc.cc:226
ns3::RedQueueDisc::m_isNonlinear
bool m_isNonlinear
True to enable Nonlinear RED.
Definition: red-queue-disc.h:281
ns3::RedQueueDisc::m_old
uint32_t m_old
0 when average queue first exceeds threshold
Definition: red-queue-disc.h:299
ns3::RedQueueDisc::m_vProb
double m_vProb
Prob.
Definition: red-queue-disc.h:297
ns3::RedQueueDisc::GetFengAdaptiveA
double GetFengAdaptiveA(void)
Get the alpha value to adapt m_curMaxP in Feng's Adaptive RED.
Definition: red-queue-disc.cc:297
ns3::RedQueueDisc::m_alpha
double m_alpha
Increment parameter for m_curMaxP in ARED.
Definition: red-queue-disc.h:277
ns3::RedQueueDisc::UpdateMaxP
void UpdateMaxP(double newAve)
Update m_curMaxP.
Definition: red-queue-disc.cc:602
ns3::RedQueueDisc::m_isGentle
bool m_isGentle
True to increase dropping prob.
Definition: red-queue-disc.h:266
ns3::RedQueueDisc::m_vC
double m_vC
(1.0 - m_curMaxP) / m_maxTh - used in "gentle" mode
Definition: red-queue-disc.h:293
ns3::RedQueueDisc::GetFengAdaptiveB
double GetFengAdaptiveB(void)
Get the beta value to adapt m_curMaxP in Feng's Adaptive RED.
Definition: red-queue-disc.cc:316
ns3::RedQueueDisc::CheckConfig
virtual bool CheckConfig(void)
Check whether the current configuration is correct.
Definition: red-queue-disc.cc:856
ns3::RedQueueDisc::DTYPE_UNFORCED
@ DTYPE_UNFORCED
An "unforced" (random) drop.
Definition: red-queue-disc.h:118
ns3::RedQueueDisc::DTYPE_FORCED
@ DTYPE_FORCED
A "forced" drop.
Definition: red-queue-disc.h:117
ns3::RedQueueDisc::m_vB
double m_vB
-m_minTh / (m_maxTh - m_minTh)
Definition: red-queue-disc.h:292
ns3
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns3::RedQueueDisc::SetAredAlpha
void SetAredAlpha(double alpha)
Set the alpha value to adapt m_curMaxP.
Definition: red-queue-disc.cc:247
ns3::RedQueueDisc::SetFengAdaptiveB
void SetFengAdaptiveB(double b)
Set the beta value to adapt m_curMaxP in Feng's Adaptive RED.
Definition: red-queue-disc.cc:304
ns3::RedQueueDisc::m_idlePktSize
uint32_t m_idlePktSize
Avg pkt size used during idle times.
Definition: red-queue-disc.h:264
ns3::RedQueueDisc::Below
@ Below
When m_qAvg < m_minTh.
Definition: red-queue-disc.h:108
ns3::QueueDisc
QueueDisc is an abstract base class providing the interface and implementing the operations common to...
Definition: queue-disc.h:181
ns3::RedQueueDisc::FengStatus
FengStatus
Used in Feng's Adaptive RED.
Definition: red-queue-disc.h:105
ns3::RedQueueDisc::DoDispose
virtual void DoDispose(void)
Dispose of the object.
Definition: red-queue-disc.cc:239
ns3::RedQueueDisc::UNFORCED_MARK
static constexpr const char * UNFORCED_MARK
Early probability marks.
Definition: red-queue-disc.h:199
ns3::RedQueueDisc::m_beta
double m_beta
Decrement parameter for m_curMaxP in ARED.
Definition: red-queue-disc.h:278
ns3::RedQueueDisc::m_bottom
double m_bottom
Lower bound for m_curMaxP in ARED.
Definition: red-queue-disc.h:276
ns3::RedQueueDisc::m_cautious
uint32_t m_cautious
0 for default RED 1 experimental (see red-queue-disc.cc) 2 experimental (see red-queue-disc....
Definition: red-queue-disc.h:311
ns3::RedQueueDisc::m_count
uint32_t m_count
Number of packets since last random number generation.
Definition: red-queue-disc.h:303
ns3::RedQueueDisc::SetTh
void SetTh(double minTh, double maxTh)
Set the thresh limits of RED.
Definition: red-queue-disc.cc:323
ns3::RedQueueDisc::m_top
double m_top
Upper bound for m_curMaxP in ARED.
Definition: red-queue-disc.h:275
ns3::RedQueueDisc::m_useEcn
bool m_useEcn
True if ECN is used (packets are marked instead of being dropped)
Definition: red-queue-disc.h:287
ns3::RedQueueDisc::DoDequeue
virtual Ptr< QueueDiscItem > DoDequeue(void)
This function actually extracts a packet from the queue disc.
Definition: red-queue-disc.cc:811
ns3::RedQueueDisc::Above
@ Above
When m_qAvg > m_maxTh.
Definition: red-queue-disc.h:106
ns3::RedQueueDisc::GetAredBeta
double GetAredBeta(void)
Get the beta value to adapt m_curMaxP.
Definition: red-queue-disc.cc:278
ns3::Ptr
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
ns3::RedQueueDisc::GetAredAlpha
double GetAredAlpha(void)
Get the alpha value to adapt m_curMaxP.
Definition: red-queue-disc.cc:259
ns3::DataRate
Class for representing data rates.
Definition: data-rate.h:89
ns3::RedQueueDisc::m_isWait
bool m_isWait
True for waiting between dropped packets.
Definition: red-queue-disc.h:265
ns3::RedQueueDisc::m_meanPktSize
uint32_t m_meanPktSize
Avg pkt size.
Definition: red-queue-disc.h:263
ns3::RedQueueDisc::CalculatePNew
double CalculatePNew(void)
Returns a probability using these function parameters for the DropEarly function.
Definition: red-queue-disc.cc:714
ns3::RedQueueDisc::Estimator
double Estimator(uint32_t nQueued, uint32_t m, double qAvg, double qW)
Compute the average queue size.
Definition: red-queue-disc.cc:630
ns3::RedQueueDisc::m_vA
double m_vA
1.0 / (m_maxTh - m_minTh)
Definition: red-queue-disc.h:291
ns3::RedQueueDisc::m_maxTh
double m_maxTh
Maximum threshold for m_qAvg (bytes or packets), should be >= 2 * m_minTh.
Definition: red-queue-disc.h:270
ns3::RedQueueDisc::m_uv
Ptr< UniformRandomVariable > m_uv
rng stream
Definition: red-queue-disc.h:314
sample-rng-plot.alpha
alpha
Definition: sample-rng-plot.py:37
ns3::RedQueueDisc::m_linkBandwidth
DataRate m_linkBandwidth
Link bandwidth.
Definition: red-queue-disc.h:285
ns3::RedQueueDisc::ModifyP
double ModifyP(double p, uint32_t size)
Returns a probability using these function parameters for the DropEarly function.
Definition: red-queue-disc.cc:760
ns3::RedQueueDisc::m_targetDelay
Time m_targetDelay
Target average queuing delay in ARED.
Definition: red-queue-disc.h:273
ns3::RedQueueDisc::m_a
double m_a
Decrement parameter for m_curMaxP in Feng's Adaptive RED.
Definition: red-queue-disc.h:283
ns3::Time
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:104
ns3::RedQueueDisc::AssignStreams
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
Definition: red-queue-disc.cc:332
ns3::RedQueueDisc::m_isARED
bool m_isARED
True to enable Adaptive RED.
Definition: red-queue-disc.h:267
ns3::RedQueueDisc::m_fengStatus
FengStatus m_fengStatus
For use in Feng's Adaptive RED.
Definition: red-queue-disc.h:304
ns3::RedQueueDisc::m_ptc
double m_ptc
packet time constant in packets/second
Definition: red-queue-disc.h:301
ns3::RedQueueDisc::SetFengAdaptiveA
void SetFengAdaptiveA(double a)
Set the alpha value to adapt m_curMaxP in Feng's Adaptive RED.
Definition: red-queue-disc.cc:285
ns3::RedQueueDisc::DoEnqueue
virtual bool DoEnqueue(Ptr< QueueDiscItem > item)
This function actually enqueues a packet into the queue disc.
Definition: red-queue-disc.cc:340
ns3::RedQueueDisc::DTYPE_NONE
@ DTYPE_NONE
Ok, no drop.
Definition: red-queue-disc.h:116
ns3::RedQueueDisc::~RedQueueDisc
virtual ~RedQueueDisc()
Destructor.
Definition: red-queue-disc.cc:233
ns3::RedQueueDisc::Between
@ Between
When m_maxTh < m_qAvg < m_minTh.
Definition: red-queue-disc.h:107
ns3::RedQueueDisc::UNFORCED_DROP
static constexpr const char * UNFORCED_DROP
Early probability drops.
Definition: red-queue-disc.h:196
ns3::RedQueueDisc::m_countBytes
uint32_t m_countBytes
Number of bytes since last drop.
Definition: red-queue-disc.h:298
ns3::RedQueueDisc::m_rtt
Time m_rtt
Rtt to be considered while automatically setting m_bottom in ARED.
Definition: red-queue-disc.h:279
ns3::RedQueueDisc::m_curMaxP
double m_curMaxP
Current max_p.
Definition: red-queue-disc.h:295
ns3::RedQueueDisc::m_idleTime
Time m_idleTime
Start of current idle period.
Definition: red-queue-disc.h:312
ns3::RedQueueDisc::m_b
double m_b
Increment parameter for m_curMaxP in Feng's Adaptive RED.
Definition: red-queue-disc.h:282
ns3::RedQueueDisc::FORCED_MARK
static constexpr const char * FORCED_MARK
Forced marks, m_qAvg > m_maxTh.
Definition: red-queue-disc.h:200
ns3::RedQueueDisc::m_minTh
double m_minTh
Minimum threshold for m_qAvg (bytes or packets)
Definition: red-queue-disc.h:269
ns3::RedQueueDisc
A RED packet queue disc.
Definition: red-queue-disc.h:80
ns3::RedQueueDisc::m_vD
double m_vD
2.0 * m_curMaxP - 1.0 - used in "gentle" mode
Definition: red-queue-disc.h:294
ns3::RedQueueDisc::GetTypeId
static TypeId GetTypeId(void)
Get the type ID.
Definition: red-queue-disc.cc:74
ns3::RedQueueDisc::FORCED_DROP
static constexpr const char * FORCED_DROP
Forced drops, m_qAvg > m_maxTh.
Definition: red-queue-disc.h:197
ns3::RedQueueDisc::m_lastSet
Time m_lastSet
Last time m_curMaxP was updated.
Definition: red-queue-disc.h:296
ns3::RedQueueDisc::InitializeParams
virtual void InitializeParams(void)
Initialize the queue parameters.
Definition: red-queue-disc.cc:453
ns3::RedQueueDisc::m_qAvg
double m_qAvg
Average queue length.
Definition: red-queue-disc.h:302
ns3::RedQueueDisc::m_isNs1Compat
bool m_isNs1Compat
Ns-1 compatibility.
Definition: red-queue-disc.h:284
ns3::RedQueueDisc::m_isAdaptMaxP
bool m_isAdaptMaxP
True to adapt m_curMaxP.
Definition: red-queue-disc.h:268
ns3::RedQueueDisc::m_idle
uint32_t m_idle
0/1 idle status
Definition: red-queue-disc.h:300
ns3::RedQueueDisc::DropEarly
uint32_t DropEarly(Ptr< QueueDiscItem > item, uint32_t qSize)
Check if a packet needs to be dropped due to probability mark.
Definition: red-queue-disc.cc:652
ns3::RedQueueDisc::SetAredBeta
void SetAredBeta(double beta)
Set the beta value to adapt m_curMaxP.
Definition: red-queue-disc.cc:266
ns3::RedQueueDisc::m_qW
double m_qW
Queue weight given to cur queue size sample.
Definition: red-queue-disc.h:271
ns3::RedQueueDisc::m_useHardDrop
bool m_useHardDrop
True if packets are always dropped above max threshold.
Definition: red-queue-disc.h:288
ns3::RedQueueDisc::m_linkDelay
Time m_linkDelay
Link delay.
Definition: red-queue-disc.h:286
ns3::RedQueueDisc::DoPeek
virtual Ptr< const QueueDiscItem > DoPeek(void)
Return a copy of the next packet the queue disc will extract.
Definition: red-queue-disc.cc:838
ns3::RedQueueDisc::UpdateMaxPFeng
void UpdateMaxPFeng(double newAve)
Update m_curMaxP based on Feng's Adaptive RED.
Definition: red-queue-disc.cc:580
ns3::RedQueueDisc::m_lInterm
double m_lInterm
The max probability of dropping a packet.
Definition: red-queue-disc.h:272
ns3::RedQueueDisc::m_isFengAdaptive
bool m_isFengAdaptive
True to enable Feng's Adaptive RED.
Definition: red-queue-disc.h:280