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" 35 #include <boost/lexical_cast.hpp> 36 #include <boost/ref.hpp> 38 NS_LOG_COMPONENT_DEFINE(
"ndn.Consumer");
49 TypeId(
"ns3::ndn::Consumer")
52 .AddAttribute(
"StartSeq",
"Initial sequence number", IntegerValue(0),
55 .AddAttribute(
"Prefix",
"Name of the Interest", StringValue(
"/"),
57 .AddAttribute(
"LifeTime",
"LifeTime for interest packet", StringValue(
"2s"),
60 .AddAttribute(
"RetxTimer",
61 "Timeout defining how frequent retransmission timeouts should be checked",
66 .AddTraceSource(
"LastRetransmittedInterestDataDelay",
67 "Delay between last retransmitted Interest and received Data",
68 MakeTraceSourceAccessor(&Consumer::m_lastRetransmittedInterestDataDelay),
69 "ns3::ndn::Consumer::LastRetransmittedInterestDataDelayCallback")
71 .AddTraceSource(
"FirstInterestDataDelay",
72 "Delay between first transmitted Interest and received Data",
73 MakeTraceSourceAccessor(&Consumer::m_firstInterestDataDelay),
74 "ns3::ndn::Consumer::FirstInterestDataDelayCallback");
80 :
m_rand(CreateObject<UniformRandomVariable>())
84 NS_LOG_FUNCTION_NOARGS();
86 m_rtt = CreateObject<RttMeanDeviation>();
111 Time now = Simulator::Now();
113 Time rto =
m_rtt->RetransmitTimeout();
116 while (!m_seqTimeouts.empty()) {
118 m_seqTimeouts.get<i_timestamp>().begin();
119 if (entry->time + rto <= now)
121 uint32_t seqNo = entry->seq;
122 m_seqTimeouts.get<i_timestamp>().erase(entry);
136 NS_LOG_FUNCTION_NOARGS();
147 NS_LOG_FUNCTION_NOARGS();
162 NS_LOG_FUNCTION_NOARGS();
164 uint32_t seq = std::numeric_limits<uint32_t>::max();
166 while (m_retxSeqs.size()) {
167 seq = *m_retxSeqs.begin();
168 m_retxSeqs.erase(m_retxSeqs.begin());
172 if (seq == std::numeric_limits<uint32_t>::max()) {
173 if (
m_seqMax != std::numeric_limits<uint32_t>::max()) {
183 shared_ptr<Name> nameWithSequence = make_shared<Name>(
m_interestName);
184 nameWithSequence->appendSequenceNumber(seq);
188 shared_ptr<Interest> interest = make_shared<Interest>();
189 interest->setNonce(
m_rand->GetValue(0, std::numeric_limits<uint32_t>::max()));
190 interest->setName(*nameWithSequence);
192 interest->setInterestLifetime(interestLifeTime);
195 NS_LOG_INFO(
"> Interest for " << seq);
217 NS_LOG_FUNCTION(
this << data);
222 uint32_t seq = data->getName().at(-1).toSequenceNumber();
223 NS_LOG_INFO(
"< DATA for " << seq);
227 if (ns3PacketTag !=
nullptr) {
229 if (ns3PacketTag->getPacket()->PeekPacketTag(hopCountTag)) {
230 hopCount = hopCountTag.
Get();
231 NS_LOG_DEBUG(
"Hop count: " << hopCount);
236 if (entry != m_seqLastDelay.end()) {
237 m_lastRetransmittedInterestDataDelay(
this, seq, Simulator::Now() - entry->time, hopCount);
240 entry = m_seqFullDelay.find(seq);
241 if (entry != m_seqFullDelay.end()) {
242 m_firstInterestDataDelay(
this, seq, Simulator::Now() - entry->time, m_seqRetxCounts[seq], hopCount);
245 m_seqRetxCounts.erase(seq);
246 m_seqFullDelay.erase(seq);
247 m_seqLastDelay.erase(seq);
249 m_seqTimeouts.erase(seq);
250 m_retxSeqs.erase(seq);
252 m_rtt->AckSeq(SequenceNumber32(seq));
258 NS_LOG_FUNCTION(sequenceNumber);
262 m_rtt->IncreaseMultiplier();
263 m_rtt->SentSeq(SequenceNumber32(sequenceNumber),
265 m_retxSeqs.insert(sequenceNumber);
272 NS_LOG_DEBUG(
"Trying to add " << sequenceNumber <<
" with " << Simulator::Now() <<
". already " 273 << m_seqTimeouts.size() <<
" items");
275 m_seqTimeouts.insert(SeqTimeout(sequenceNumber, Simulator::Now()));
276 m_seqFullDelay.insert(SeqTimeout(sequenceNumber, Simulator::Now()));
278 m_seqLastDelay.erase(sequenceNumber);
279 m_seqLastDelay.insert(SeqTimeout(sequenceNumber, Simulator::Now()));
281 m_seqRetxCounts[sequenceNumber]++;
283 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.
void onReceiveInterest(const Interest &interest)
Time m_retxTimer
Currently estimated retransmission timer.
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
Time GetRetxTimer() const
Returns the frequency of checking the retransmission timeouts.
Copyright (c) 2011-2015 Regents of the University of California.
TracedCallback< shared_ptr< const Interest >, Ptr< App >, shared_ptr< Face > > m_transmittedInterests
App-level trace of transmitted Interests.
shared_ptr< Face > m_face
AppLinkService * m_appLink
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)
uint32_t Get() const
Get value of hop count.
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()
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.