Extending CcnxConsumerCbr class. Now it supports option to randomize sending time (uniform or exponential distribution).
diff --git a/apps/ccnx-consumer-cbr.cc b/apps/ccnx-consumer-cbr.cc
index 1727bcd..abf4bc2 100644
--- a/apps/ccnx-consumer-cbr.cc
+++ b/apps/ccnx-consumer-cbr.cc
@@ -52,6 +52,10 @@
StringValue ("1.0"),
MakeDoubleAccessor (&CcnxConsumerCbr::m_frequency),
MakeDoubleChecker<double> ())
+ .AddAttribute ("Randomize", "Type of send time randomization: none (default), uniform, exponential",
+ StringValue ("none"),
+ MakeStringAccessor (&CcnxConsumerCbr::SetRandomize, &CcnxConsumerCbr::GetRandomize),
+ MakeStringChecker ())
;
return tid;
@@ -59,24 +63,67 @@
CcnxConsumerCbr::CcnxConsumerCbr ()
: m_frequency (1.0)
+ , m_firstTime (true)
+ , m_random (0)
{
NS_LOG_FUNCTION_NOARGS ();
m_seqMax = std::numeric_limits<uint32_t>::max ();
}
+CcnxConsumerCbr::~CcnxConsumerCbr ()
+{
+ if (m_random)
+ delete m_random;
+}
+
void
CcnxConsumerCbr::ScheduleNextPacket ()
{
// double mean = 8.0 * m_payloadSize / m_desiredRate.GetBitRate ();
// std::cout << "next: " << Simulator::Now().ToDouble(Time::S) + mean << "s\n";
- if (!m_sendEvent.IsRunning ())
+ if (m_firstTime)
+ {
+ m_sendEvent = Simulator::Schedule (Seconds (0.0),
+ &CcnxConsumer::SendPacket, this);
+ m_firstTime = false;
+ }
+ else if (!m_sendEvent.IsRunning ())
m_sendEvent = Simulator::Schedule (
- // Seconds(m_randExp.GetValue ()),
- Seconds(1.0 / m_frequency),
+ (m_random == 0) ?
+ Seconds(1.0 / m_frequency)
+ :
+ Seconds(m_random->GetValue ()),
&CcnxConsumer::SendPacket, this);
}
+void
+CcnxConsumerCbr::SetRandomize (const std::string &value)
+{
+ if (m_random)
+ delete m_random;
+
+ else if (value == "uniform")
+ {
+ m_random = new UniformVariable (0.0, 2 * 1.0 / m_frequency);
+ }
+ else if (value == "exponential")
+ {
+ m_random = new ExponentialVariable (1.0 / m_frequency, 50 * 1.0 / m_frequency);
+ }
+ else
+ m_random = 0;
+
+ m_randomType = value;
+}
+
+std::string
+CcnxConsumerCbr::GetRandomize () const
+{
+ return m_randomType;
+}
+
+
///////////////////////////////////////////////////
// Process incoming packets //
///////////////////////////////////////////////////