INET Framework for OMNeT++/OMNEST
WeightedFairQueue.h
Go to the documentation of this file.
00001 
00002 
00003 #ifndef __ANSA_WFQ_H
00004 #define __ANSA_WFQ_H
00005 
00006 #include <vector>
00007 #include <iostream>
00008 #include <omnetpp.h>
00009 #include "PassiveQueueBase.h"
00010 #include "IPDatagram.h"
00011 #include "TCPSegment.h"
00012 #include "UDPPacket.h"
00013 
00014 namespace WFQ {
00015 
00016 class SNPacket {
00017 
00018 private:
00019     cMessage *msg;
00020     //uint64_t sn;
00021     int sn;
00022 
00023 public:
00024     SNPacket() {msg = NULL; sn = 0;}
00025     SNPacket(cMessage *c_msg, int c_sn) {msg = c_msg; sn = c_sn;}
00026     
00027     int getSn() {return sn;}
00028     void setSn(int n_sn) {sn = n_sn;}
00029     void substractSn(int subNum) {sn = sn - subNum;}
00030     
00031     cMessage *getMsg() {return msg;}
00032     void setMsg(cMessage *n_msg) {msg = n_msg;}
00033 };
00034 
00035 class Flow {
00036 
00037 public:
00038     IPAddress srcAddress;
00039     IPAddress destAddress;
00040     int transportProtocol;
00041     unsigned char diffServCodePoint;
00042     int srcPort;
00043     int destPort;
00044 
00045 
00046     bool operator==(const Flow& flow) const;
00047 
00048 };
00049 
00050 
00051 
00052 class QueueRecord {
00053 
00054 private:
00055     Flow queueID;
00056 
00057     int lastSn;
00058     std::vector<SNPacket> snPackets;
00059 
00060 public:
00061     QueueRecord() {lastSn = 0;}
00062     ~QueueRecord();
00063     
00064     void setLastSn(int n_sn) {lastSn = n_sn;}
00065     int getLastSn() {return lastSn;}
00066     int getQueueLength() {return snPackets.size();}
00067     bool isQueueEmpty();
00068     bool isFromThisFlow(const Flow& flow);
00069     void setQueueID(const Flow& packetInfo);
00070     void enqueue(SNPacket& newSNPacket);
00071     void substractSnFromAll(int subNum);
00072     int getLowestSn() {return (snPackets.front()).getSn();}
00073     cMessage *dequeue();
00074 
00075 };
00076 
00077 }
00078 
00079 
00080 
00081 class INET_API WeightedFairQueue : public PassiveQueueBase
00082 {
00083   protected:
00084     // configuration
00085     int numQueues;
00086     int holdCapacity;
00087     int currentHold;
00088     int cdt;
00089 
00090     // state
00091     WFQ::QueueRecord **queues;
00092     cGate *outGate;
00093     
00094 
00095   public:
00096     WeightedFairQueue();
00097     WeightedFairQueue(int c_hold, int c_flows, int c_cdt);
00098     ~WeightedFairQueue();
00099 
00100   protected:
00101 
00102     virtual void initialize();
00103 
00107     virtual bool enqueue(cMessage *msg);
00108 
00112     virtual cMessage *dequeue();
00113 
00117     virtual void sendOut(cMessage *msg);
00118     
00119   private:
00120     bool putIntoQueue(const WFQ::Flow& packetInfo, cMessage * msg);
00121     int findQueueIndex(const WFQ::Flow& packetInfo);
00122     
00123     
00124 };
00125 
00126 
00127 #endif
00128 
00129