|
INET Framework for OMNeT++/OMNEST
|
#include <WeightedFairQueue.h>
Public Member Functions | |
| WeightedFairQueue () | |
| WeightedFairQueue (int c_hold, int c_flows, int c_cdt) | |
| ~WeightedFairQueue () | |
Protected Member Functions | |
| virtual void | initialize () |
| virtual bool | enqueue (cMessage *msg) |
| virtual cMessage * | dequeue () |
| virtual void | sendOut (cMessage *msg) |
Protected Attributes | |
| int | numQueues |
| int | holdCapacity |
| int | currentHold |
| int | cdt |
| WFQ::QueueRecord ** | queues |
| cGate * | outGate |
Private Member Functions | |
| bool | putIntoQueue (const WFQ::Flow &packetInfo, cMessage *msg) |
| int | findQueueIndex (const WFQ::Flow &packetInfo) |
Definition at line 81 of file WeightedFairQueue.h.
Definition at line 8 of file WeightedFairQueue.cc.
{
numQueues = 256;
holdCapacity = 1024;
cdt = 256;
currentHold = 0;
queues = NULL;
}
| WeightedFairQueue::WeightedFairQueue | ( | int | c_hold, |
| int | c_flows, | ||
| int | c_cdt | ||
| ) |
Definition at line 17 of file WeightedFairQueue.cc.
{
numQueues = c_flows;
holdCapacity = c_hold;
cdt = c_cdt;
currentHold = 0;
queues = NULL;
}
| cMessage * WeightedFairQueue::dequeue | ( | ) | [protected, virtual] |
Redefined from PassiveQueueBase.
Implements PassiveQueueBase.
Definition at line 117 of file WeightedFairQueue.cc.
{
if(currentHold <= 0)
{
return NULL;
}
int index = 0;
while (queues[index]->isQueueEmpty())
++index;
int sn = queues[index]->getLowestSn();
for (int i=0; i<numQueues; i++)
{
if(!queues[i]->isQueueEmpty() && queues[i]->getLowestSn() < sn )
{
sn = queues[i]->getLowestSn();
index = i;
}
}
--currentHold;
cMessage *msg = queues[index]->dequeue();
std::cout << "---- Dequeuing ---- " << std::endl;
std::cout << "Queue ID: " << index << " Queue Length: " << queues[index]->getQueueLength() << " SN: " << sn << std::endl;
std::cout << "Hold Queue Length: " << currentHold << std::endl << std::endl;
if(currentHold > 0)
{
index = 0;
while (queues[index]->isQueueEmpty())
++index;
sn = queues[index]->getLowestSn();
for (int i=0; i<numQueues; i++)
{
if(!queues[i]->isQueueEmpty() && queues[i]->getLowestSn() < sn )
{
sn = queues[i]->getLowestSn();
}
}
for (int i=0; i<numQueues; i++)
{
queues[i]->substractSnFromAll(sn);
}
}
return msg;
}
| bool WeightedFairQueue::enqueue | ( | cMessage * | msg | ) | [protected, virtual] |
Redefined from PassiveQueueBase.
Implements PassiveQueueBase.
Definition at line 52 of file WeightedFairQueue.cc.
{
WFQ::Flow packetInfo;
if(currentHold >= holdCapacity)
{
delete msg;
return true;
}
cMessage *copy = msg->dup();
if (dynamic_cast<IPDatagram *>(copy))
{
// IPv4 QoS: map DSCP to queue number
IPDatagram *datagram = (IPDatagram *)copy;
packetInfo.srcAddress = datagram->getSrcAddress();
packetInfo.destAddress = datagram->getDestAddress();
packetInfo.transportProtocol = datagram->getTransportProtocol();
packetInfo.diffServCodePoint = (unsigned char) datagram->getDiffServCodePoint()/32;
if(packetInfo.transportProtocol == IP_PROT_TCP)
{
TCPSegment *tcpSegm = dynamic_cast<TCPSegment *> (datagram->decapsulate());
packetInfo.srcPort = tcpSegm->getSrcPort();
packetInfo.destPort = tcpSegm->getDestPort();
delete tcpSegm;
}
else if(packetInfo.transportProtocol == IP_PROT_UDP)
{
UDPPacket *udpDatag = dynamic_cast<UDPPacket *> (datagram->decapsulate());
packetInfo.srcPort = udpDatag->getSourcePort();
packetInfo.destPort = udpDatag->getDestinationPort();
delete udpDatag;
}
else
{
packetInfo.srcPort = 0;
packetInfo.destPort = 0;
}
}
else
{
packetInfo.srcAddress = IPAddress::UNSPECIFIED_ADDRESS;
packetInfo.destAddress = IPAddress::UNSPECIFIED_ADDRESS;
packetInfo.transportProtocol = 0;
packetInfo.diffServCodePoint = 0;
packetInfo.srcPort = 0;
packetInfo.destPort = 0;
}
delete copy;
if(!putIntoQueue(packetInfo, msg))
{
delete msg;
return true;
}
return false;
}
| int WeightedFairQueue::findQueueIndex | ( | const WFQ::Flow & | packetInfo | ) | [private] |
| void WeightedFairQueue::initialize | ( | ) | [protected, virtual] |
Reimplemented from PassiveQueueBase.
Definition at line 34 of file WeightedFairQueue.cc.
{
PassiveQueueBase::initialize();
outGate = gate("out");
// configuration
queues = new WFQ::QueueRecord *[numQueues];
for (int i=0; i<numQueues; i++)
{
queues[i] = new WFQ::QueueRecord();
}
}
| bool WeightedFairQueue::putIntoQueue | ( | const WFQ::Flow & | packetInfo, |
| cMessage * | msg | ||
| ) | [private] |
Definition at line 180 of file WeightedFairQueue.cc.
Referenced by enqueue().
{
int index = findQueueIndex(packetInfo);
if(index >= 0 && queues[index]->getQueueLength() < cdt)
{
if(queues[index]->isQueueEmpty())
{
queues[index]->setQueueID(packetInfo);
queues[index]->setLastSn(0);
}
cPacket *pkt = dynamic_cast<cPacket *> (msg->dup());
int sn = queues[index]->getLastSn() + ((32384 / (packetInfo.diffServCodePoint + 1)) * pkt->getByteLength());
WFQ::SNPacket newSNPacket(msg, sn);
delete pkt;
queues[index]->enqueue(newSNPacket);
queues[index]->setLastSn(sn);
++currentHold;
std::cout << "---- Enqueuing ---- " << std::endl;
std::cout << "Flow = sIP:" << packetInfo.srcAddress.str();
std::cout << " dIP:" << packetInfo.destAddress.str();
std::cout << " Pre:" << packetInfo.diffServCodePoint;
std::cout << " Pro:" << packetInfo.transportProtocol;
std::cout << " sP:" << packetInfo.srcPort;
std::cout << " dP:" << packetInfo.destPort << std::endl;
std::cout << "Queue ID: " << index << " Queue Length: " << queues[index]->getQueueLength() << " SN: " << sn << std::endl << std::endl;
return true;
}
return false;
}
| void WeightedFairQueue::sendOut | ( | cMessage * | msg | ) | [protected, virtual] |
Redefined from PassiveQueueBase.
Implements PassiveQueueBase.
Definition at line 175 of file WeightedFairQueue.cc.
{
send(msg, outGate);
}
int WeightedFairQueue::cdt [protected] |
Definition at line 88 of file WeightedFairQueue.h.
Referenced by putIntoQueue(), and WeightedFairQueue().
int WeightedFairQueue::currentHold [protected] |
Definition at line 87 of file WeightedFairQueue.h.
Referenced by dequeue(), enqueue(), putIntoQueue(), and WeightedFairQueue().
int WeightedFairQueue::holdCapacity [protected] |
Definition at line 86 of file WeightedFairQueue.h.
Referenced by enqueue(), and WeightedFairQueue().
int WeightedFairQueue::numQueues [protected] |
Definition at line 85 of file WeightedFairQueue.h.
Referenced by dequeue(), findQueueIndex(), initialize(), WeightedFairQueue(), and ~WeightedFairQueue().
cGate* WeightedFairQueue::outGate [protected] |
Definition at line 92 of file WeightedFairQueue.h.
Referenced by initialize(), and sendOut().
WFQ::QueueRecord** WeightedFairQueue::queues [protected] |
Definition at line 91 of file WeightedFairQueue.h.
Referenced by dequeue(), findQueueIndex(), initialize(), putIntoQueue(), WeightedFairQueue(), and ~WeightedFairQueue().