INET Framework for OMNeT++/OMNEST
WeightedFairQueue Class Reference

#include <WeightedFairQueue.h>

Inheritance diagram for WeightedFairQueue:
PassiveQueueBase IPassiveQueue

List of all members.

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)

Detailed Description

Definition at line 81 of file WeightedFairQueue.h.


Constructor & Destructor Documentation

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;
}

Definition at line 26 of file WeightedFairQueue.cc.

{
    for (int i=0; i<numQueues; i++)
        delete queues[i];
    delete [] queues;
}

Member Function Documentation

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]

Definition at line 217 of file WeightedFairQueue.cc.

Referenced by putIntoQueue().

{
    int empty = -1;
    
    for (int i=0; i<numQueues; i++)
    {
        if(empty == -1)
        {
            if(queues[i]->isQueueEmpty())
                empty = i;
        }
        
        if(queues[i]->isFromThisFlow(packetInfo))
            return i;
    }
    
    return empty;

}
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);
}

Member Data Documentation

int WeightedFairQueue::cdt [protected]

Definition at line 88 of file WeightedFairQueue.h.

Referenced by putIntoQueue(), and WeightedFairQueue().

Definition at line 87 of file WeightedFairQueue.h.

Referenced by dequeue(), enqueue(), putIntoQueue(), and WeightedFairQueue().

Definition at line 86 of file WeightedFairQueue.h.

Referenced by enqueue(), and WeightedFairQueue().

cGate* WeightedFairQueue::outGate [protected]

Definition at line 92 of file WeightedFairQueue.h.

Referenced by initialize(), and sendOut().


The documentation for this class was generated from the following files: