#include <REDQueue.h>
Protected Member Functions | |
| virtual void | initialize () |
| virtual void | finish () |
| virtual bool | enqueue (cMessage *msg) |
| virtual cMessage * | dequeue () |
| virtual void | sendOut (cMessage *msg) |
Protected Attributes | |
| double | wq |
| double | minth |
| double | maxth |
| double | maxp |
| double | pkrate |
| cQueue | queue |
| double | avg |
| simtime_t | q_time |
| int | count |
| cGate * | outGate |
| cOutVector | avgQlenVec |
| cOutVector | qlenVec |
| cOutVector | dropVec |
| long | numEarlyDrops |
RED queue. See NED for more info.
Definition at line 28 of file REDQueue.h.
| cMessage * REDQueue::dequeue | ( | ) | [protected, virtual] |
Redefined from PassiveQueueBase.
Implements PassiveQueueBase.
Definition at line 137 of file REDQueue.cc.
| bool REDQueue::enqueue | ( | cMessage * | msg | ) | [protected, virtual] |
Redefined from PassiveQueueBase.
Implements PassiveQueueBase.
Definition at line 55 of file REDQueue.cc.
{
//"
// for each packet arrival
// calculate the new average queue size avg:
// if the queue is nonempty
// avg <- (1-wq)*avg + wq*q
// else
// m <- f(time-q_time)
// avg <- (1-wq)^m * avg
//"
if (!queue.empty())
{
avg = (1-wq)*avg + wq*queue.length();
}
else
{
// Note: f() is supposed to estimate the number of packets
// that could have arrived during the idle interval (see Section 11
// of the paper). We use pkrate for this purpose.
double m = SIMTIME_DBL(simTime()-q_time) * pkrate;
avg = pow(1-wq, m) * avg;
}
// statistics
avgQlenVec.record(avg);
//"
// if minth <= avg < maxth
// increment count
// calculate probability pa:
// pb <- maxp*(avg-minth) / (maxth-minth)
// pa <- pb / (1-count*pb)
// with probability pa:
// mark the arriving packet
// count <- 0
// else if maxth <= avg
// mark the arriving packet
// count <- 0
// else count <- -1
//"
bool mark = false;
if (minth<=avg && avg<maxth)
{
count++;
double pb = maxp*(avg-minth) / (maxth-minth);
double pa = pb / (1-count*pb);
if (dblrand() < pa)
{
EV << "Random early packet drop (avg queue len=" << avg << ", pa=" << pa << ")\n";
mark = true;
count = 0;
numEarlyDrops++;
}
}
else if (maxth <= avg)
{
EV << "Avg queue len " << avg << " >= maxth, dropping packet.\n";
mark = true;
count = 0;
}
else
{
count = -1;
}
// carry out decision
if (mark || queue.length()>=maxth) // maxth is also the "hard" limit
{
delete msg;
dropVec.record(1);
return true;
}
else
{
queue.insert(msg);
qlenVec.record(queue.length());
return false;
}
}
| void REDQueue::finish | ( | ) | [protected, virtual] |
Reimplemented from PassiveQueueBase.
Definition at line 161 of file REDQueue.cc.
{
PassiveQueueBase::finish();
recordScalar("packets dropped early by RED", numEarlyDrops);
}
| void REDQueue::initialize | ( | ) | [protected, virtual] |
Reimplemented from PassiveQueueBase.
Definition at line 25 of file REDQueue.cc.
{
PassiveQueueBase::initialize();
queue.setName("l2queue");
avgQlenVec.setName("avg queue length");
qlenVec.setName("queue length");
dropVec.setName("drops");
// configuration
wq = par("wq");
minth = par("minth");
maxth = par("maxth");
maxp = par("maxp");
pkrate = par("pkrate");
outGate = gate("out");
// state
avg = 0;
q_time = 0;
count = -1;
numEarlyDrops = 0;
WATCH(avg);
WATCH(q_time);
WATCH(count);
WATCH(numEarlyDrops);
}
| void REDQueue::sendOut | ( | cMessage * | msg | ) | [protected, virtual] |
Redefined from PassiveQueueBase.
Implements PassiveQueueBase.
Definition at line 156 of file REDQueue.cc.
{
send(msg, outGate);
}
double REDQueue::avg [protected] |
Definition at line 40 of file REDQueue.h.
Referenced by enqueue(), and initialize().
cOutVector REDQueue::avgQlenVec [protected] |
Definition at line 47 of file REDQueue.h.
Referenced by enqueue(), and initialize().
int REDQueue::count [protected] |
Definition at line 42 of file REDQueue.h.
Referenced by enqueue(), and initialize().
cOutVector REDQueue::dropVec [protected] |
Definition at line 49 of file REDQueue.h.
Referenced by enqueue(), and initialize().
double REDQueue::maxp [protected] |
Definition at line 35 of file REDQueue.h.
Referenced by enqueue(), and initialize().
double REDQueue::maxth [protected] |
Definition at line 34 of file REDQueue.h.
Referenced by enqueue(), and initialize().
double REDQueue::minth [protected] |
Definition at line 33 of file REDQueue.h.
Referenced by enqueue(), and initialize().
long REDQueue::numEarlyDrops [protected] |
Definition at line 50 of file REDQueue.h.
Referenced by enqueue(), finish(), and initialize().
cGate* REDQueue::outGate [protected] |
Definition at line 44 of file REDQueue.h.
Referenced by initialize(), and sendOut().
double REDQueue::pkrate [protected] |
Definition at line 36 of file REDQueue.h.
Referenced by enqueue(), and initialize().
simtime_t REDQueue::q_time [protected] |
Definition at line 41 of file REDQueue.h.
Referenced by dequeue(), enqueue(), and initialize().
cOutVector REDQueue::qlenVec [protected] |
Definition at line 48 of file REDQueue.h.
Referenced by dequeue(), enqueue(), and initialize().
cQueue REDQueue::queue [protected] |
Definition at line 39 of file REDQueue.h.
Referenced by dequeue(), enqueue(), and initialize().
double REDQueue::wq [protected] |
Definition at line 32 of file REDQueue.h.
Referenced by enqueue(), and initialize().
1.7.1