#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().