|
INET Framework for OMNeT++/OMNEST
|
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