blob: c5fbf8868cd4df37a1ceeacbdfef90ed3086a22e [file] [log] [blame]
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2011-2015 Regents of the University of California.
Alexander Afanasyev029d38d2012-01-09 13:50:50 -08004 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08005 * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
6 * contributors.
Alexander Afanasyev029d38d2012-01-09 13:50:50 -08007 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08008 * ndnSIM is free software: you can redistribute it and/or modify it under the terms
9 * of the GNU General Public License as published by the Free Software Foundation,
10 * either version 3 of the License, or (at your option) any later version.
Alexander Afanasyev029d38d2012-01-09 13:50:50 -080011 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -080012 * ndnSIM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
Alexander Afanasyev029d38d2012-01-09 13:50:50 -080015 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -080016 * You should have received a copy of the GNU General Public License along with
17 * ndnSIM, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 **/
Alexander Afanasyev029d38d2012-01-09 13:50:50 -080019
Alexander Afanasyev0c395372014-12-20 15:54:02 -080020#include "ndn-consumer-cbr.hpp"
Alexander Afanasyev029d38d2012-01-09 13:50:50 -080021#include "ns3/ptr.h"
22#include "ns3/log.h"
23#include "ns3/simulator.h"
24#include "ns3/packet.h"
25#include "ns3/callback.h"
26#include "ns3/string.h"
27#include "ns3/boolean.h"
28#include "ns3/uinteger.h"
Alexander Afanasyeva89bc102013-07-16 10:17:31 -070029#include "ns3/integer.h"
Alexander Afanasyev029d38d2012-01-09 13:50:50 -080030#include "ns3/double.h"
31
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080032NS_LOG_COMPONENT_DEFINE("ndn.ConsumerCbr");
Alexander Afanasyev029d38d2012-01-09 13:50:50 -080033
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070034namespace ns3 {
35namespace ndn {
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080036
37NS_OBJECT_ENSURE_REGISTERED(ConsumerCbr);
38
Alexander Afanasyev029d38d2012-01-09 13:50:50 -080039TypeId
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080040ConsumerCbr::GetTypeId(void)
Alexander Afanasyev029d38d2012-01-09 13:50:50 -080041{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080042 static TypeId tid =
43 TypeId("ns3::ndn::ConsumerCbr")
44 .SetGroupName("Ndn")
45 .SetParent<Consumer>()
46 .AddConstructor<ConsumerCbr>()
Alexander Afanasyev029d38d2012-01-09 13:50:50 -080047
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080048 .AddAttribute("Frequency", "Frequency of interest packets", StringValue("1.0"),
49 MakeDoubleAccessor(&ConsumerCbr::m_frequency), MakeDoubleChecker<double>())
Alexander Afanasyevf8b0f712012-12-28 19:25:12 -080050
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080051 .AddAttribute("Randomize",
52 "Type of send time randomization: none (default), uniform, exponential",
53 StringValue("none"),
54 MakeStringAccessor(&ConsumerCbr::SetRandomize, &ConsumerCbr::GetRandomize),
55 MakeStringChecker())
56
57 .AddAttribute("MaxSeq", "Maximum sequence number to request",
58 IntegerValue(std::numeric_limits<uint32_t>::max()),
59 MakeIntegerAccessor(&ConsumerCbr::m_seqMax), MakeIntegerChecker<uint32_t>())
Alexander Afanasyevf8b0f712012-12-28 19:25:12 -080060
Alexander Afanasyev029d38d2012-01-09 13:50:50 -080061 ;
62
63 return tid;
64}
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080065
66ConsumerCbr::ConsumerCbr()
67 : m_frequency(1.0)
68 , m_firstTime(true)
Alexander Afanasyev029d38d2012-01-09 13:50:50 -080069{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080070 NS_LOG_FUNCTION_NOARGS();
71 m_seqMax = std::numeric_limits<uint32_t>::max();
Alexander Afanasyev029d38d2012-01-09 13:50:50 -080072}
73
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080074ConsumerCbr::~ConsumerCbr()
Alexander Afanasyev59e67712012-02-07 11:49:34 -080075{
Alexander Afanasyev59e67712012-02-07 11:49:34 -080076}
77
Alexander Afanasyev029d38d2012-01-09 13:50:50 -080078void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080079ConsumerCbr::ScheduleNextPacket()
Alexander Afanasyev029d38d2012-01-09 13:50:50 -080080{
Alexander Afanasyevb7ad2322012-01-17 22:54:49 -080081 // double mean = 8.0 * m_payloadSize / m_desiredRate.GetBitRate ();
Alexander Afanasyev94cebd02012-01-16 12:22:34 -080082 // std::cout << "next: " << Simulator::Now().ToDouble(Time::S) + mean << "s\n";
Alexander Afanasyev359bfb72012-01-09 18:42:50 -080083
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080084 if (m_firstTime) {
85 m_sendEvent = Simulator::Schedule(Seconds(0.0), &Consumer::SendPacket, this);
86 m_firstTime = false;
87 }
88 else if (!m_sendEvent.IsRunning())
89 m_sendEvent = Simulator::Schedule((m_random == 0) ? Seconds(1.0 / m_frequency)
90 : Seconds(m_random->GetValue()),
91 &Consumer::SendPacket, this);
Alexander Afanasyev029d38d2012-01-09 13:50:50 -080092}
93
Alexander Afanasyev59e67712012-02-07 11:49:34 -080094void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080095ConsumerCbr::SetRandomize(const std::string& value)
Alexander Afanasyev59e67712012-02-07 11:49:34 -080096{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080097 if (value == "uniform") {
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -070098 m_random = CreateObject<UniformRandomVariable>();
99 m_random->SetAttribute("Min", DoubleValue(0.0));
100 m_random->SetAttribute("Max", DoubleValue(2 * 1.0 / m_frequency));
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800101 }
102 else if (value == "exponential") {
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -0700103 m_random = CreateObject<ExponentialRandomVariable>();
104 m_random->SetAttribute("Mean", DoubleValue(1.0 / m_frequency));
105 m_random->SetAttribute("Bound", DoubleValue(50 * 1.0 / m_frequency));
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800106 }
Alexander Afanasyev59e67712012-02-07 11:49:34 -0800107 else
108 m_random = 0;
109
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800110 m_randomType = value;
Alexander Afanasyev59e67712012-02-07 11:49:34 -0800111}
112
113std::string
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800114ConsumerCbr::GetRandomize() const
Alexander Afanasyev59e67712012-02-07 11:49:34 -0800115{
116 return m_randomType;
117}
118
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700119} // namespace ndn
Alexander Afanasyev029d38d2012-01-09 13:50:50 -0800120} // namespace ns3