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" 29 #include "ns3/integer.h" 30 #include "ns3/double.h" 36 #include <boost/lexical_cast.hpp> 37 #include <boost/ref.hpp> 39 NS_LOG_COMPONENT_DEFINE(
"ndn.Consumer");
50 TypeId(
"ns3::ndn::Consumer")
53 .AddAttribute(
"StartSeq",
"Initial sequence number", IntegerValue(0),
56 .AddAttribute(
"Prefix",
"Name of the Interest", StringValue(
"/"),
58 .AddAttribute(
"LifeTime",
"LifeTime for interest packet", StringValue(
"2s"),
61 .AddAttribute(
"RetxTimer",
62 "Timeout defining how frequent retransmission timeouts should be checked",
67 .AddTraceSource(
"LastRetransmittedInterestDataDelay",
68 "Delay between last retransmitted Interest and received Data",
69 MakeTraceSourceAccessor(&Consumer::m_lastRetransmittedInterestDataDelay),
70 "ns3::ndn::Consumer::LastRetransmittedInterestDataDelayCallback")
72 .AddTraceSource(
"FirstInterestDataDelay",
73 "Delay between first transmitted Interest and received Data",
74 MakeTraceSourceAccessor(&Consumer::m_firstInterestDataDelay),
75 "ns3::ndn::Consumer::FirstInterestDataDelayCallback");
81 :
m_rand(CreateObject<UniformRandomVariable>())
85 NS_LOG_FUNCTION_NOARGS();
87 m_rtt = CreateObject<RttMeanDeviation>();
112 Time now = Simulator::Now();
114 Time rto =
m_rtt->RetransmitTimeout();
117 while (!m_seqTimeouts.empty()) {
119 m_seqTimeouts.get<i_timestamp>().begin();
120 if (entry->time + rto <= now)
122 uint32_t seqNo = entry->seq;
123 m_seqTimeouts.get<i_timestamp>().erase(entry);
137 NS_LOG_FUNCTION_NOARGS();
148 NS_LOG_FUNCTION_NOARGS();
163 NS_LOG_FUNCTION_NOARGS();
165 uint32_t seq = std::numeric_limits<uint32_t>::max();
167 while (m_retxSeqs.size()) {
168 seq = *m_retxSeqs.begin();
169 m_retxSeqs.erase(m_retxSeqs.begin());
173 if (seq == std::numeric_limits<uint32_t>::max()) {
174 if (
m_seqMax != std::numeric_limits<uint32_t>::max()) {
184 shared_ptr<Name> nameWithSequence = make_shared<Name>(
m_interestName);
185 nameWithSequence->appendSequenceNumber(seq);
189 shared_ptr<Interest> interest = make_shared<Interest>();
190 interest->setNonce(
m_rand->GetValue(0, std::numeric_limits<uint32_t>::max()));
191 interest->setName(*nameWithSequence);
193 interest->setInterestLifetime(interestLifeTime);
196 NS_LOG_INFO(
"> Interest for " << seq);
201 m_face->onReceiveInterest(*interest);
218 NS_LOG_FUNCTION(
this << data);
223 uint32_t seq = data->getName().at(-1).toSequenceNumber();
224 NS_LOG_INFO(
"< DATA for " << seq);
228 if (ns3PacketTag !=
nullptr) {
230 if (ns3PacketTag->getPacket()->PeekPacketTag(hopCountTag)) {
231 hopCount = hopCountTag.
Get();
232 NS_LOG_DEBUG(
"Hop count: " << hopCount);
237 if (entry != m_seqLastDelay.end()) {
238 m_lastRetransmittedInterestDataDelay(
this, seq, Simulator::Now() - entry->time, hopCount);
241 entry = m_seqFullDelay.find(seq);
242 if (entry != m_seqFullDelay.end()) {
243 m_firstInterestDataDelay(
this, seq, Simulator::Now() - entry->time, m_seqRetxCounts[seq], hopCount);
246 m_seqRetxCounts.erase(seq);
247 m_seqFullDelay.erase(seq);
248 m_seqLastDelay.erase(seq);
250 m_seqTimeouts.erase(seq);
251 m_retxSeqs.erase(seq);
253 m_rtt->AckSeq(SequenceNumber32(seq));
259 NS_LOG_FUNCTION(sequenceNumber);
263 m_rtt->IncreaseMultiplier();
264 m_rtt->SentSeq(SequenceNumber32(sequenceNumber),
266 m_retxSeqs.insert(sequenceNumber);
273 NS_LOG_DEBUG(
"Trying to add " << sequenceNumber <<
" with " << Simulator::Now() <<
". already " 274 << m_seqTimeouts.size() <<
" items");
276 m_seqTimeouts.insert(SeqTimeout(sequenceNumber, Simulator::Now()));
277 m_seqFullDelay.insert(SeqTimeout(sequenceNumber, Simulator::Now()));
279 m_seqLastDelay.erase(sequenceNumber);
280 m_seqLastDelay.insert(SeqTimeout(sequenceNumber, Simulator::Now()));
282 m_seqRetxCounts[sequenceNumber]++;
284 m_rtt->SentSeq(SequenceNumber32(sequenceNumber), 1);
Time m_interestLifeTime
LifeTime for interest packet.
virtual void OnTimeout(uint32_t sequenceNumber)
Timeout event.
uint32_t m_seqMax
maximum number of sequence number
Copyright (c) 2011-2015 Regents of the University of California.
Packet tag that is used to track hop count for Interest-Data pairs.
virtual void StopApplication()
Called at time specified by Stop.
void SetRetxTimer(Time retxTimer)
Modifies the frequency of checking the retransmission timeouts.
ndn Consumer
Copyright (c) 2011-2015 Regents of the University of California.
NS_OBJECT_ENSURE_REGISTERED(ContentStore)
uint32_t m_seq
currently requested sequence number
virtual void StartApplication()
Called at time specified by Start.
Time m_retxTimer
Currently estimated retransmission timer.
shared_ptr< AppFace > m_face
automatically created application face through which application communicates
Ptr< RttEstimator > m_rtt
RTT estimator.
Name m_interestName
NDN Name of the Interest (use Name)
void CheckRetxTimeout()
Checks if the packet need to be retransmitted becuase of retransmission timer expiration.
virtual void OnData(shared_ptr< const Data > contentObject)
Method that will be called every time new Data arrives.
void SendPacket()
Actually send packet.
virtual void ScheduleNextPacket()=0
Constructs the Interest packet and sends it using a callback to the underlying NDN protocol...
Table::const_iterator iterator
Copyright (c) 2011-2015 Regents of the University of California.
uint32_t Get() const
Get value of hop count.
TracedCallback< shared_ptr< const Interest >, Ptr< App >, shared_ptr< Face > > m_transmittedInterests
App-level trace of transmitted Interests.
Base class that all NDN applications should be derived from.
Ptr< UniformRandomVariable > m_rand
nonce generator
Consumer()
Default constructor Sets up randomizer function and packet sequence number.
Ptr< const AttributeChecker > MakeNameChecker(void)
virtual void StopApplication()
Called at time specified by Stop.
EventId m_sendEvent
EventId of pending "send packet" event.
virtual void WillSendOutInterest(uint32_t sequenceNumber)
An event that is fired just before an Interest packet is actually send out (send is inevitable) ...
Ptr< const AttributeAccessor > MakeNameAccessor(T1 a1)
EventId m_retxEvent
Event to check whether or not retransmission should be performed.
bool m_active
Flag to indicate that application is active (set by StartApplication and StopApplication) ...
static TypeId GetTypeId()
Time GetRetxTimer() const
Returns the frequency of checking the retransmission timeouts.
virtual void OnData(shared_ptr< const Data > data)
Method that will be called every time new Data arrives.
virtual void StartApplication()
Called at time specified by Start.