00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "simlpy/interpreter_defs.h"
00032 #include "simlpy/interpreter_hooks.h"
00033
00034 #include "HeavyTailBundleMaker.h"
00035 #include "WrapNode.h"
00036 #include "MockBundle.h"
00037 #include "BundleEvent.h"
00038 #include "simlpy/Clock.h"
00039 #include "simlpy/SimulationException.h"
00040
00041 HeavyTailBundleMaker::HeavyTailBundleMaker( WrapNode* source,
00042 WrapNode* destination,
00043 const DTN::ByteString& app,
00044 unsigned int size,
00045 double alpha ) :
00046 m_source( source ),
00047 m_destination( destination ),
00048 m_app( app ),
00049 m_size( size ),
00050 m_alpha( alpha )
00051 {
00052 if ( 0 == m_source ) throw SimulationException( __FILE__ , __LINE__ );
00053 if ( 0 == m_destination ) throw SimulationException( __FILE__ , __LINE__ );
00054 }
00055
00056 HeavyTailBundleMaker::~HeavyTailBundleMaker()
00057 {
00058 }
00059
00060 void
00061 HeavyTailBundleMaker::generate()
00062 {
00063 Time now = Clock::time();
00064 Time expire = now + m_source->bundleLifetime();
00065 double r = prng();
00066 double lr = -1.0 * ::log(r) / m_alpha;
00067 double x = ::exp(lr);
00068 long int size = (long int) ::floor(m_size*x);
00069 DTN::Bundle* b = new MockBundle( m_source->node().nextSeq(),
00070 m_source->addr(),
00071 m_destination->addr(),
00072 size,
00073 now.tv,
00074 expire.tv,
00075 DTN::Bundle::kData,
00076 m_app );
00077 Clock::schedule( new BundleEvent(m_source,m_source,now,now,b,true) );
00078 }