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 <ndn-cxx/lp/tags.hpp>    37 #include <boost/lexical_cast.hpp>    38 #include <boost/ref.hpp>    40 NS_LOG_COMPONENT_DEFINE(
"ndn.Consumer");
    51     TypeId(
"ns3::ndn::Consumer")
    54       .AddAttribute(
"StartSeq", 
"Initial sequence number", IntegerValue(0),
    57       .AddAttribute(
"Prefix", 
"Name of the Interest", StringValue(
"/"),
    59       .AddAttribute(
"LifeTime", 
"LifeTime for interest packet", StringValue(
"2s"),
    62       .AddAttribute(
"RetxTimer",
    63                     "Timeout defining how frequent retransmission timeouts should be checked",
    68       .AddTraceSource(
"LastRetransmittedInterestDataDelay",
    69                       "Delay between last retransmitted Interest and received Data",
    70                       MakeTraceSourceAccessor(&Consumer::m_lastRetransmittedInterestDataDelay),
    71                       "ns3::ndn::Consumer::LastRetransmittedInterestDataDelayCallback")
    73       .AddTraceSource(
"FirstInterestDataDelay",
    74                       "Delay between first transmitted Interest and received Data",
    75                       MakeTraceSourceAccessor(&Consumer::m_firstInterestDataDelay),
    76                       "ns3::ndn::Consumer::FirstInterestDataDelayCallback");
    82   : 
m_rand(CreateObject<UniformRandomVariable>())
    86   NS_LOG_FUNCTION_NOARGS();
    88   m_rtt = CreateObject<RttMeanDeviation>();
   113   Time now = Simulator::Now();
   115   Time rto = 
m_rtt->RetransmitTimeout();
   118   while (!m_seqTimeouts.empty()) {
   120       m_seqTimeouts.get<i_timestamp>().begin();
   121     if (entry->time + rto <= now) 
   123       uint32_t seqNo = entry->seq;
   124       m_seqTimeouts.get<i_timestamp>().erase(entry);
   138   NS_LOG_FUNCTION_NOARGS();
   149   NS_LOG_FUNCTION_NOARGS();
   164   NS_LOG_FUNCTION_NOARGS();
   166   uint32_t seq = std::numeric_limits<uint32_t>::max(); 
   168   while (m_retxSeqs.size()) {
   169     seq = *m_retxSeqs.begin();
   170     m_retxSeqs.erase(m_retxSeqs.begin());
   174   if (seq == std::numeric_limits<uint32_t>::max()) {
   175     if (
m_seqMax != std::numeric_limits<uint32_t>::max()) {
   185   shared_ptr<Name> nameWithSequence = make_shared<Name>(
m_interestName);
   186   nameWithSequence->appendSequenceNumber(seq);
   190   shared_ptr<Interest> interest = make_shared<Interest>();
   191   interest->setNonce(
m_rand->GetValue(0, std::numeric_limits<uint32_t>::max()));
   192   interest->setName(*nameWithSequence);
   194   interest->setInterestLifetime(interestLifeTime);
   197   NS_LOG_INFO(
"> Interest for " << seq);
   219   NS_LOG_FUNCTION(
this << data);
   224   uint32_t seq = data->getName().at(-1).toSequenceNumber();
   225   NS_LOG_INFO(
"< DATA for " << seq);
   229   if (hopCountTag != 
nullptr) { 
   230     hopCount = *hopCountTag;
   232   NS_LOG_DEBUG(
"Hop count: " << hopCount);
   235   if (entry != m_seqLastDelay.end()) {
   236     m_lastRetransmittedInterestDataDelay(
this, seq, Simulator::Now() - entry->time, hopCount);
   239   entry = m_seqFullDelay.find(seq);
   240   if (entry != m_seqFullDelay.end()) {
   241     m_firstInterestDataDelay(
this, seq, Simulator::Now() - entry->time, m_seqRetxCounts[seq], hopCount);
   244   m_seqRetxCounts.erase(seq);
   245   m_seqFullDelay.erase(seq);
   246   m_seqLastDelay.erase(seq);
   248   m_seqTimeouts.erase(seq);
   249   m_retxSeqs.erase(seq);
   251   m_rtt->AckSeq(SequenceNumber32(seq));
   260   NS_LOG_INFO(
"NACK received for: " << nack->getInterest().getName()
   261               << 
", reason: " << nack->getReason());
   267   NS_LOG_FUNCTION(sequenceNumber);
   271   m_rtt->IncreaseMultiplier(); 
   272   m_rtt->SentSeq(SequenceNumber32(sequenceNumber),
   274   m_retxSeqs.insert(sequenceNumber);
   281   NS_LOG_DEBUG(
"Trying to add " << sequenceNumber << 
" with " << Simulator::Now() << 
". already "   282                                 << m_seqTimeouts.size() << 
" items");
   284   m_seqTimeouts.insert(SeqTimeout(sequenceNumber, Simulator::Now()));
   285   m_seqFullDelay.insert(SeqTimeout(sequenceNumber, Simulator::Now()));
   287   m_seqLastDelay.erase(sequenceNumber);
   288   m_seqLastDelay.insert(SeqTimeout(sequenceNumber, Simulator::Now()));
   290   m_seqRetxCounts[sequenceNumber]++;
   292   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. 
 
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 
 
boost::posix_time::time_duration milliseconds(long duration)
 
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...
 
provides a tag type for simple types 
 
Table::const_iterator iterator
 
virtual void OnNack(shared_ptr< const lp::Nack > nack)
Method that will be called every time new Nack arrives. 
 
virtual void OnNack(shared_ptr< const lp::Nack > nack)
Method that will be called every time new Nack arrives. 
 
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)
 
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.