INET Framework for OMNeT++/OMNEST
TrafGen.h
Go to the documentation of this file.
00001 //
00002 // Copyright 2011 Martin Danko
00003 //
00004 // This library is free software, you can redistribute it and/or modify
00005 // it under  the terms of the GNU Lesser General Public License
00006 // as published by the Free Software Foundation;
00007 // either version 2 of the License, or any later version.
00008 // The library is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00011 // See the GNU Lesser General Public License for more details.
00012 //
00013 
00014 #ifndef __ANSA_TRAFGEN_H
00015 #define __ANSA_TRAFGEN_H
00016 
00017 #include <omnetpp.h>
00018 #include "INETDefs.h"
00019 #include "IPvXAddress.h"
00020 #include "ITrafGenApplication.h"
00021 #include "TCPSocket.h"
00022 #include "TCPCommand_m.h"
00023 #include "UDPSocket.h"
00024 #include "IPControlInfo.h"
00025 #include "UDPControlInfo_m.h"
00026 #include "TrafGenPacket_m.h"
00027 #include "TCPSegment.h"
00028 #include "UDPPacket.h"
00029 
00030 namespace TG {
00031 
00032 /* Trieda zaznamenanie casu a velkosti paketu */
00033 class PktRec
00034 {
00035   private:
00036     double time;
00037     int length;
00038   
00039   public:
00040     PktRec(double t, int l) {time = t; length = l;}
00041     double getTime() {return time;}
00042     int getLength() {return length;}
00043     
00044 }; 
00045 
00046 /* Trieda pre ukladanie statistik o prijatych paketoch toku */ 
00047 class RcvFlowRecord
00048 {
00049 private:
00050     std::string id;          // identifikator toku
00051     double startTime;        // cas prichodu prveho paketu
00052     double endTime;          // cas prichodu posledneho paketu
00053     long  totalSentPkts;     // celkovy pocet zaslanych paketov
00054     long  totalRcvPkts;      // celkovy pocet prijatych paketov
00055     double minDelay;         // minimalne onesekorenie
00056     double maxDelay;         // maximalne oneskorenie
00057     double totalDelay;       // celkove oneskorenie
00058     double totalJitter;      // celkovy jitter
00059     long totalBytes;         // celkovy pocet prijatych bajtov
00060     std::vector<PktRec> actStat; // vektor s paketmi za poslednu sekundu
00061     
00062 
00063 public:
00064     RcvFlowRecord();
00065 
00066     std::string getId() {return id;}
00067     void setId(std::string n_id) {id = n_id;}
00068     double getStartTime() {return startTime;}
00069     void setStartTime(double n_startTime) {startTime = n_startTime;}
00070     double getEndTime() {return endTime;}
00071     void setEndTime(double n_endTime) {endTime = n_endTime;}
00072 
00073     void addTotalSentPkts() {++totalSentPkts;}
00074     void addTotalRcvPkts() {++totalRcvPkts;}
00075     void setMinDelay(double del) {minDelay = del;}
00076     void setMaxDelay(double del) {maxDelay = del;}
00077     void addTotalDelay(double del) {totalDelay += del;}
00078     void addTotalJitter(double jit) {totalJitter += jit;}
00079     void addTotalBytes(long bytes) {totalBytes += bytes;}
00080     long getTotalSentPkts() {return totalSentPkts;}
00081     long getTotalRcvPkts() {return totalRcvPkts;}
00082     double getMinDelay() {return minDelay;}
00083     double getMaxDelay() {return maxDelay;}
00084     double getTotalDelay() {return totalDelay;}
00085     double getTotalJitter() {return totalJitter;}
00086     long getTotalBytes() {return totalBytes;}
00087     void updateActVec(double t, int l) {actStat.push_back(PktRec(t,l));}
00088     int getActualPacketrate() {actualizeVector(); return actStat.size();} 
00089     double getActBitrate();
00090     void actualizeVector();
00091     
00092 
00093 };
00094 
00095 typedef std::vector<RcvFlowRecord> RcvStats;
00096 
00097 /* Trieda pre ukladanie statistik o prijatych paketoch toku */ 
00098 class SntFlowRecord {
00099 
00100 private:
00101     std::string id;          // identifikator toku
00102     double startTime;        // cas odoslania prveho paketu
00103     long  totalSentPkts;     // celkovy pocet zaslanych paketov
00104     long totalBytes;         // celkovy pocet zaslanych bajtov
00105 
00106 public:
00107     SntFlowRecord() {totalSentPkts = 0; totalBytes = 0;}
00108     
00109     std::string getId() {return id;}
00110     void setId(std::string n_id) {id = n_id;}
00111     double getStartTime() {return startTime;}
00112     void setStartTime(double n_startTime) {startTime = n_startTime;}
00113     
00114 
00115     void addTotalSentPkts() {++totalSentPkts;}
00116     void addTotalBytes(long bytes) {totalBytes += bytes;}
00117     long getTotalSentPkts() {return totalSentPkts;}
00118     long getTotalBytes() {return totalBytes;}
00119 
00120 };
00121 
00122 typedef std::vector<SntFlowRecord> SntStats;  
00123 
00124 /* Trieda reprezentujuca zaznam o jedenom toku */ 
00125 class FlowRecord
00126 {
00127 private:
00128     std::string id;           // identifikator toku
00129     double startTime;         // cas sa ma tok zacat generovat 
00130     double duration;          // doba generovania toku
00131     IPvXAddress srcIP;        // zdrojova IP adresa toku
00132     IPvXAddress dstIP;        // cielova IP adresa toku
00133     unsigned char tos;        // ToS (type of service)
00134     short ttl;                // TTL (time to live)
00135     short protocol;           // trasportny protokol
00136     int srcPort;              // zdrojovy port
00137     int dstPort;              // cielovy port
00138     
00139     std::string appName;                // nazov aplikacie toku
00140     ITrafGenApplication *pApplication;  // ukazovatel na objekt aplikacie 
00141     
00142     bool generating;          // urcuje ci dany modul tok generuje
00143     bool analyzing;           // urcuje ci dany modul tok analyzuje
00144     
00145     RcvStats::iterator rcvModStatsIt;   // iterator na statistiky prijemcu
00146     
00147     TCPSocket *socket;        // TCP socket v pripade pouzitia TCP trasportu 
00148     
00149 
00150 public:
00151     FlowRecord();
00152     
00153     std::string getId() {return id;}
00154     void setId(std::string n_id) {id = n_id;}
00155     double getStartTime() {return startTime;}
00156     void setStartTime(double n_startTime) {startTime = n_startTime;}
00157     double getDuration() {return duration;}
00158     void setDuration(double n_duration) {duration = n_duration;}
00159     IPvXAddress getSrcIP() {return srcIP;}
00160     void setSrcIP(IPvXAddress n_srcIP) {srcIP = n_srcIP;}
00161     IPvXAddress getDstIP() {return dstIP;}
00162     void setDstIP(IPvXAddress n_dstIP) {dstIP = n_dstIP;}
00163     unsigned char getTos() {return tos;}
00164     void setTos(unsigned char n_tos) {tos = n_tos;}
00165     short getTtl() {return ttl;}
00166     void setTtl(short n_ttl) {ttl = n_ttl;}
00167     short getProtocol() {return protocol;}
00168     void setProtocol(short n_protocol) {protocol = n_protocol;}
00169     int getSrcPort() {return srcPort;}
00170     void setSrcPort(int n_srcPort) {srcPort = n_srcPort;}
00171     int getDstPort() {return dstPort;}
00172     void setDstPort(int n_dstPort) {dstPort = n_dstPort;}
00173     
00174     ITrafGenApplication * getPApplication() {return pApplication;}
00175     std::string getAppName() {return appName;}
00176     bool setApplication(const cXMLElement& appConfig);
00177     
00178     bool isGenerating() {return generating; }
00179     void setGenerating(bool n_gen) {generating = n_gen;}
00180     bool isAnalyzing() {return analyzing; }
00181     void setAnalyzing(bool n_ana) {analyzing = n_ana;}
00182     
00183     RcvStats::iterator getRcvModStatsIt() {return rcvModStatsIt;}
00184     void setRcvModStatsIt(RcvStats::iterator n_it) {rcvModStatsIt = n_it;}
00185     
00186     void tcpConnect(cGate *toTcp);
00187     void tcpClose() {socket->close();}
00188     void sendTcpPacket(cMessage *msg) {socket->send(msg);}
00189     bool isSocketCreated() {return socket != NULL;}
00190     bool isTcpConnected() { return (this->isSocketCreated() && socket->getState() != TCPSocket::CONNECTED); }
00191     int getSocketConId() {return socket->getConnectionId();}
00192     
00193 };
00194 
00195 typedef std::vector<FlowRecord> Flows;
00196 
00197 /*
00198  * Pretazenie operatoru "<<" pre vypis statistiky odoslanych paketov 
00199  * do grafickeho rozhrania 
00200  */
00201 inline std::ostream& operator<< (std::ostream& ostr, SntFlowRecord& rec)
00202 {
00203     double time = simTime().dbl() - rec.getStartTime();
00204     ostr << "Flow " << rec.getId() << " : " ;
00205     if(rec.getTotalSentPkts() > 0)
00206     {
00207       ostr << "Pkts sent: " << rec.getTotalSentPkts() << ", ";
00208       ostr << "Bytes sent: " << rec.getTotalBytes() << ", ";
00209       ostr << "Avg bitrate: " << (rec.getTotalBytes() * 8)/(time * 1000) << " Kbit/s, ";
00210       ostr << "Avg pkts: " << rec.getTotalSentPkts()/time << " pkt/s";
00211     }
00212     else
00213       ostr << "no sent data yet";
00214        
00215     return ostr;
00216 }
00217 
00218 /*
00219  * Pretazenie operatoru "<<" pre vypis statistiky prijatych paketov 
00220  * do grafickeho rozhrania 
00221  */
00222 inline std::ostream& operator<< (std::ostream& ostr, RcvFlowRecord& rec)
00223 {
00224     double time = simTime().dbl() - rec.getStartTime();
00225     ostr << "Flow " << rec.getId() << " : " ;
00226     if(rec.getTotalRcvPkts() > 0)
00227     {
00228       ostr << "Pkts rcv: " << rec.getTotalRcvPkts() << ", ";
00229       ostr << "Bytes rcv: " << rec.getTotalBytes() << ", ";
00230       ostr << "Avg bitrate: " << (rec.getTotalBytes() * 8)/(time * 1000) << " Kbit/s, ";
00231       ostr << "Avg pkts: " << rec.getTotalRcvPkts()/time << " pkt/s, ";
00232       ostr << "Min delay: " << rec.getMinDelay() << " s, ";
00233       ostr << "Max delay: " << rec.getMaxDelay() << " s, ";
00234       ostr << "Avg delay: " << rec.getTotalDelay() / rec.getTotalRcvPkts() << " s, ";
00235       ostr << "Avg jitter: " << rec.getTotalJitter() / rec.getTotalRcvPkts() << " s, ";
00236     }
00237     else
00238       ostr << "no received data yet";
00239      
00240     return ostr;
00241 }
00242 
00243 }
00244 
00245 /* Trieda reprezentujuca modul generatora datovych tokov */ 
00246 class INET_API TrafGen : public cSimpleModule
00247 {
00248   protected:
00249   
00250     TG::Flows flows;                       // definovane toky
00251     TG::SntStats sentStatistics;           // statistiky o generovanych tokoch 
00252     TG::RcvStats receivedStatistics;       // statistiky o analyzovanych tokoch
00253     std::vector<int> tcpListenPort;        // zoznam tcp nasluchajucich portov
00254     std::vector<int> udpListenPort;        // zoznam udp nasluchajucich portov
00255     
00256     std::map<std::string, cOutVector*> actBitrateVec; //vektory pre zaznam aktualej bitovej rychlosti
00257     std::map<std::string, cOutVector*> actPacketrateVec; //vektory pre zaznam aktualej paketovej rychlosti  
00258   
00259     int numSent;           // pocet zaslanych paketov
00260     int numReceived;       // pocet prijatych paketov
00261     int counter;           // citac
00262     
00263     
00264     cPacket *createPacket(TG::Flows::iterator flowIt);
00265     bool sendPacket(TG::Flows::iterator flowIt);
00266     void processPacket(cMessage *msg);
00267     
00268     bool LoadFlowsFromXML(const char * filename);
00269     void parseFlow(const cXMLElement& flowConfig);
00270     bool isValidFlow(TG::FlowRecord &flw);
00271     unsigned char readDscp(std::string dscpString);
00272     void detectRoles();
00273     void installRcvStatIts(); 
00274     void initTimers();
00275     void bindSockets();
00276     void initStats();
00277     bool isLocalTcpOrig(int id);
00278     bool isListening(short prot, int port);
00279     void updateActVectorStats();
00280     
00281     TG::Flows::iterator getFlowById(std::string s_id);
00282     TG::SntStats::iterator getSntFlowStatById(std::string s_id);
00283     TG::RcvStats::iterator getRcvFlowStatById(std::string r_id);
00284     
00285   public:
00286     ~TrafGen();
00287     unsigned char getDscpByFlowInfo(IPAddress &srcAdd,IPAddress &destAdd, short prot, int srcPort, int destPort);
00288     short getTtlByFlowInfo(IPAddress &srcAdd,IPAddress &destAdd, short prot, int srcPort, int destPort);
00289     void updateSentStats(cPacket * payload);
00290 
00291 
00292   protected:
00293     virtual int numInitStages() const {return 6;}
00294     virtual void initialize(int stage);
00295     virtual void handleMessage(cMessage *msg);
00296     virtual void finish();
00297 };
00298 
00299 #endif
00300 
00301