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             //
 ///////////////////////////////////////////////////