00001 /********************************************************** 00002 * Filename: aggreg.h 00003 * 00004 * Description: This file contains declarations for 00005 * class Trace 00006 * class Generator 00007 * 00008 * Author: Glen Kramer (kramer@cs.ucdavis.edu) 00009 * University of California @ Davis 00010 *********************************************************/ 00011 00012 #if !defined(_AGGREG_H_INCLUDED_) 00013 #define _AGGREG_H_INCLUDED_ 00014 00015 #include <iostream> 00016 #include <iomanip> 00017 #include "_types.h" 00018 #include "source.h" 00019 00020 //#define NEXT_SOURCE( P ) P = (Source*)P->GetNext() 00021 00023 00024 class Generator 00025 { 00026 private: 00027 DList SRC; /* Doubly-linked list of sources */ 00028 Trace NextPacket; /* Future packet */ 00029 bytestamp_t TotalBytes; /* Total bytes generated */ 00030 int32s TotalPackets; /* Total packets generated */ 00031 bytestamp_t Elapsed; /* Elapsed time (expressed in ByteTime units) 00032 since the beginning of the trace */ 00033 bytestamp_t ByteStamp; 00034 00036 // FUNCTION: void InsertInOrder( Source* pSrc ) 00037 // DESCRIPTION: Inserts Source of packet into linked list of Sources 00038 // ordered by packet arrival times 00039 // NOTES: 00041 Source* InsertInOrder( Source* pSrc ) 00042 { 00043 bytestamp_t arrival = pSrc->GetArrival(); 00044 //ev<<"arrival de InsertInOrder: "<<arrival<<endl; 00045 DLinkable* pPrv = NULL; 00046 DLinkable* pNxt = SRC.GetHead(); 00047 00048 for( ; pNxt && arrival > ((Source*)pNxt)->GetArrival(); pNxt = pNxt->GetNext()) 00049 pPrv = pNxt; 00050 00051 SRC.Insert( pPrv, pSrc, pNxt ); /* insert new source */ 00052 NextPacket = ((Source*)SRC.GetHead())->GetTrace(); /* get the next packet */ 00053 ByteStamp= NextPacket.Append( Elapsed + Preamble ); /* prevent overlap with previous packet */ 00054 return pSrc; 00055 } 00056 00058 00059 public: 00060 int16u Preamble; /* minimum interpacket gap */ 00061 00063 // FUNCTION: Generator() 00064 // DESCRIPTION: Constructor 00066 Generator(void) 00067 { 00068 Preamble = PREAMBLE; 00069 Reset(); 00070 } 00071 00073 // FUNCTION: ~Generator() 00074 // DESCRIPTION: Destructor 00075 // NOTES: 00077 virtual ~Generator() {} 00078 00080 // FUNCTION: void Reset( void ) 00081 // DESCRIPTION: resets all statistic variables and elapsed time 00082 // NOTES: Reset should be called to generate multiple traces with same 00083 // set of sources 00085 void Reset( void ) 00086 { 00087 TotalBytes = 0.0; 00088 Elapsed = 0.0; 00089 TotalPackets = 0; 00090 00091 DList lst = SRC; 00092 SRC.Clear(); 00093 00094 Source* ptr; 00095 while( ( ptr = (Source*)lst.RemoveHead() ) != NULL ) 00096 { 00097 ptr->Reset(); 00098 InsertInOrder( ptr ); 00099 } 00100 } 00101 00103 00104 inline int32s GetPackets(void) { return TotalPackets; } 00105 inline bytestamp_t GetBytes(void) { return TotalBytes; } 00106 inline bytestamp_t GetTime(void) { return Elapsed; } 00107 inline bytestamp_t GetByteStamp(void){ return ByteStamp; } 00108 inline DOUBLE GetLoad(void) { return TotalBytes / Elapsed; } 00109 inline int32s GetSources(void) { return SRC.GetCount(); } 00110 00111 00113 // FUNCTION: inline void AddSource( Source* ) 00114 // DESCRIPTION: Adds a new source of to the Generator. 00116 inline void AddSource( Source* pSrc ) { if(pSrc) InsertInOrder( pSrc ); } 00117 00119 // FUNCTION: RemoveSource( Source* ) 00120 // DESCRIPTION: Removes source 00121 // NOTES: 00123 inline void RemoveSource( Source* pSrc ) { SRC.Remove(pSrc); } 00124 inline Source* RemoveSource( void ) { return (Source*)SRC.RemoveHead(); } 00125 00127 // FUNCTION: SetLoad( DOUBLE load ) 00128 // DESCRIPTION: Sets total node load (all sources are to have equal load) 00129 // NOTES: 00131 void SetLoad( DOUBLE load ) 00132 { 00133 if( SRC.GetCount() > 0 ) 00134 { 00135 load /= SRC.GetCount(); 00136 for( DLinkable* ptr = SRC.GetHead(); ptr; ptr = ptr->GetNext()) 00137 ((Source*)ptr)->SetLoad( load ); 00138 } 00139 } 00140 00142 // FUNCTION: Trace PeekNextPacket(void) 00143 // DESCRIPTION: Peek at next packet before it arrives 00144 // NOTES: 00146 inline Trace PeekNextPacket(void) { return NextPacket; } 00147 00149 // FUNCTION: Trace GetNextPacket(void) 00150 // DESCRIPTION: Return the next packet from the aggregated traffic 00151 // NOTES: 00153 Trace GetNextPacket(void) 00154 { 00155 Trace trc = NextPacket; 00156 if( SRC.GetHead() ) 00157 { 00158 Elapsed = NextPacket.ByteStamp; 00159 //ev<<"Elapsed de GetNextPacket: "<<Elapsed<<endl; 00160 TotalBytes += NextPacket.PacketSize; 00161 //ev<<"TotalBytes: "<<TotalBytes<<endl; 00162 TotalPackets++; 00163 //ev<<"TotalPackets: "<<TotalPackets<<endl; // TOTAL DE PAQUETES QUE GENERA LA FUENTE 00164 00165 Source* pSrc = (Source*)SRC.RemoveHead(); /* Extract packet from the first source */ 00166 pSrc->ExtractPacket(); /* receive new packet */ 00167 InsertInOrder( pSrc ); /* place the source in the linked list */ 00168 } 00169 return trc; 00170 } 00171 00173 }; 00174 00175 #endif // _AGGREG_H_INCLUDED_