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