blob: fabbe952df81740e340197595182d1ec17acbade [file] [log] [blame]
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -07001/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2011 University of California, Los Angeles
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
19 */
20
Alexander Afanasyev0c395372014-12-20 15:54:02 -080021#include "ndn-consumer.hpp"
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -070022#include "ns3/ptr.h"
Alexander Afanasyev19426ef2011-11-23 20:55:28 -080023#include "ns3/log.h"
24#include "ns3/simulator.h"
25#include "ns3/packet.h"
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -070026#include "ns3/callback.h"
Alexander Afanasyeva46844b2011-11-21 19:13:26 -080027#include "ns3/string.h"
Alexander Afanasyev19426ef2011-11-23 20:55:28 -080028#include "ns3/boolean.h"
29#include "ns3/uinteger.h"
Alexander Afanasyeva89bc102013-07-16 10:17:31 -070030#include "ns3/integer.h"
Alexander Afanasyevb3e4b852011-12-23 15:58:20 -080031#include "ns3/double.h"
Alexander Afanasyev19426ef2011-11-23 20:55:28 -080032
Alexander Afanasyev0c395372014-12-20 15:54:02 -080033#include "ns3/ndn-app-face.hpp"
34#include "ns3/ndn-interest.hpp"
35#include "ns3/ndn-data.hpp"
36#include "ns3/ndnSIM/utils/ndn-fw-hop-count-tag.hpp"
37#include "ns3/ndnSIM/utils/ndn-rtt-mean-deviation.hpp"
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -070038
Alexander Afanasyev19426ef2011-11-23 20:55:28 -080039#include <boost/ref.hpp>
Alexander Afanasyev781ea812011-12-15 22:42:09 -080040
Alexander Afanasyev3661e232012-01-20 17:36:15 -080041#include "ns3/names.h"
42
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080043NS_LOG_COMPONENT_DEFINE("ndn.Consumer");
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -070044
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070045namespace ns3 {
46namespace ndn {
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -080047
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080048NS_OBJECT_ENSURE_REGISTERED(Consumer);
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -080049
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -070050TypeId
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080051Consumer::GetTypeId(void)
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -070052{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080053 static TypeId tid =
54 TypeId("ns3::ndn::Consumer")
55 .SetGroupName("Ndn")
56 .SetParent<App>()
57 .AddAttribute("StartSeq", "Initial sequence number", IntegerValue(0),
58 MakeIntegerAccessor(&Consumer::m_seq), MakeIntegerChecker<int32_t>())
Alexander Afanasyev011b8592011-12-21 14:45:27 -080059
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080060 .AddAttribute("Prefix", "Name of the Interest", StringValue("/"),
61 MakeNameAccessor(&Consumer::m_interestName), MakeNameChecker())
62 .AddAttribute("LifeTime", "LifeTime for interest packet", StringValue("2s"),
63 MakeTimeAccessor(&Consumer::m_interestLifeTime), MakeTimeChecker())
Alexander Afanasyev781ea812011-12-15 22:42:09 -080064
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080065 .AddAttribute("RetxTimer",
66 "Timeout defining how frequent retransmission timeouts should be checked",
67 StringValue("50ms"),
68 MakeTimeAccessor(&Consumer::GetRetxTimer, &Consumer::SetRetxTimer),
69 MakeTimeChecker())
Alexander Afanasyev781ea812011-12-15 22:42:09 -080070
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080071 .AddTraceSource("LastRetransmittedInterestDataDelay",
72 "Delay between last retransmitted Interest and received Data",
73 MakeTraceSourceAccessor(&Consumer::m_lastRetransmittedInterestDataDelay))
Alexander Afanasyevedf24d92013-01-18 13:35:06 -080074
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080075 .AddTraceSource("FirstInterestDataDelay",
76 "Delay between first transmitted Interest and received Data",
77 MakeTraceSourceAccessor(&Consumer::m_firstInterestDataDelay));
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -070078
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080079 return tid;
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -070080}
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -080081
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080082Consumer::Consumer()
83 : m_rand(0, std::numeric_limits<uint32_t>::max())
84 , m_seq(0)
85 , m_seqMax(0) // don't request anything
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -070086{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080087 NS_LOG_FUNCTION_NOARGS();
Alexander Afanasyev011b8592011-12-21 14:45:27 -080088
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080089 m_rtt = CreateObject<RttMeanDeviation>();
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -070090}
Alexander Afanasyev781ea812011-12-15 22:42:09 -080091
92void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080093Consumer::SetRetxTimer(Time retxTimer)
Alexander Afanasyev781ea812011-12-15 22:42:09 -080094{
95 m_retxTimer = retxTimer;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080096 if (m_retxEvent.IsRunning()) {
97 // m_retxEvent.Cancel (); // cancel any scheduled cleanup events
98 Simulator::Remove(m_retxEvent); // slower, but better for memory
99 }
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800100
101 // schedule even with new timeout
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800102 m_retxEvent = Simulator::Schedule(m_retxTimer, &Consumer::CheckRetxTimeout, this);
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800103}
104
105Time
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800106Consumer::GetRetxTimer() const
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800107{
108 return m_retxTimer;
109}
110
111void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800112Consumer::CheckRetxTimeout()
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800113{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800114 Time now = Simulator::Now();
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800115
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800116 Time rto = m_rtt->RetransmitTimeout();
Alexander Afanasyev8a237522013-02-01 13:33:38 -0800117 // NS_LOG_DEBUG ("Current RTO: " << rto.ToDouble (Time::S) << "s");
Alexander Afanasyevbdc0d982011-12-16 01:15:26 -0800118
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800119 while (!m_seqTimeouts.empty()) {
120 SeqTimeoutsContainer::index<i_timestamp>::type::iterator entry =
121 m_seqTimeouts.get<i_timestamp>().begin();
122 if (entry->time + rto <= now) // timeout expired?
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800123 {
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800124 uint32_t seqNo = entry->seq;
125 m_seqTimeouts.get<i_timestamp>().erase(entry);
126 OnTimeout(seqNo);
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800127 }
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800128 else
129 break; // nothing else to do. All later packets need not be retransmitted
130 }
Alexander Afanasyev3183b5a2011-12-23 20:48:20 -0800131
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800132 m_retxEvent = Simulator::Schedule(m_retxTimer, &Consumer::CheckRetxTimeout, this);
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800133}
134
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700135// Application Methods
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -0800136void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800137Consumer::StartApplication() // Called at time specified by Start
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700138{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800139 NS_LOG_FUNCTION_NOARGS();
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700140
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800141 // do base stuff
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800142 App::StartApplication();
Alexander Afanasyev011b8592011-12-21 14:45:27 -0800143
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800144 ScheduleNextPacket();
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700145}
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -0800146
147void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800148Consumer::StopApplication() // Called at time specified by Stop
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700149{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800150 NS_LOG_FUNCTION_NOARGS();
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700151
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800152 // cancel periodic packet generation
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800153 Simulator::Cancel(m_sendEvent);
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700154
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800155 // cleanup base stuff
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800156 App::StopApplication();
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700157}
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -0800158
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700159void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800160Consumer::SendPacket()
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700161{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800162 if (!m_active)
163 return;
Alexander Afanasyev3183b5a2011-12-23 20:48:20 -0800164
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800165 NS_LOG_FUNCTION_NOARGS();
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800166
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800167 uint32_t seq = std::numeric_limits<uint32_t>::max(); // invalid
Alexander Afanasyev1ec705f2012-01-23 12:35:10 -0800168
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800169 while (m_retxSeqs.size()) {
170 seq = *m_retxSeqs.begin();
171 m_retxSeqs.erase(m_retxSeqs.begin());
172 break;
173 }
174
175 if (seq == std::numeric_limits<uint32_t>::max()) {
176 if (m_seqMax != std::numeric_limits<uint32_t>::max()) {
177 if (m_seq >= m_seqMax) {
178 return; // we are totally done
179 }
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800180 }
Alexander Afanasyev1ec705f2012-01-23 12:35:10 -0800181
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800182 seq = m_seq++;
183 }
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -0800184
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800185 //
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800186 Ptr<Name> nameWithSequence = Create<Name>(m_interestName);
187 nameWithSequence->appendSeqNum(seq);
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800188 //
189
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800190 Ptr<Interest> interest = Create<Interest>();
191 interest->SetNonce(m_rand.GetValue());
192 interest->SetName(nameWithSequence);
193 interest->SetInterestLifetime(m_interestLifeTime);
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -0800194
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700195 // NS_LOG_INFO ("Requesting Interest: \n" << *interest);
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800196 NS_LOG_INFO("> Interest for " << seq);
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700197
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800198 WillSendOutInterest(seq);
Alexander Afanasyeve1aa9b92012-10-11 10:40:02 -0700199
Alexander Afanasyev1a0fff62013-01-19 14:29:51 -0800200 FwHopCountTag hopCountTag;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800201 interest->GetPayload()->AddPacketTag(hopCountTag);
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -0800202
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800203 m_transmittedInterests(interest, this, m_face);
204 m_face->ReceiveInterest(interest);
Alexander Afanasyeve1aa9b92012-10-11 10:40:02 -0700205
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800206 ScheduleNextPacket();
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700207}
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700208
Alexander Afanasyev011b8592011-12-21 14:45:27 -0800209///////////////////////////////////////////////////
210// Process incoming packets //
211///////////////////////////////////////////////////
212
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700213void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800214Consumer::OnData(Ptr<const Data> data)
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700215{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800216 if (!m_active)
217 return;
Alexander Afanasyev3183b5a2011-12-23 20:48:20 -0800218
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800219 App::OnData(data); // tracing inside
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -0800220
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800221 NS_LOG_FUNCTION(this << data);
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800222
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700223 // NS_LOG_INFO ("Received content object: " << boost::cref(*data));
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -0800224
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800225 uint32_t seq = data->GetName().get(-1).toSeqNum();
226 NS_LOG_INFO("< DATA for " << seq);
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800227
Alexander Afanasyev1a0fff62013-01-19 14:29:51 -0800228 int hopCount = -1;
229 FwHopCountTag hopCountTag;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800230 if (data->GetPayload()->PeekPacketTag(hopCountTag)) {
231 hopCount = hopCountTag.Get();
232 }
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -0800233
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800234 SeqTimeoutsContainer::iterator entry = m_seqLastDelay.find(seq);
235 if (entry != m_seqLastDelay.end()) {
236 m_lastRetransmittedInterestDataDelay(this, seq, Simulator::Now() - entry->time, hopCount);
237 }
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800238
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800239 entry = m_seqFullDelay.find(seq);
240 if (entry != m_seqFullDelay.end()) {
241 m_firstInterestDataDelay(this, seq, Simulator::Now() - entry->time, m_seqRetxCounts[seq],
242 hopCount);
243 }
Alexander Afanasyev400aae12013-01-19 13:27:52 -0800244
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800245 m_seqRetxCounts.erase(seq);
246 m_seqFullDelay.erase(seq);
247 m_seqLastDelay.erase(seq);
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -0800248
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800249 m_seqTimeouts.erase(seq);
250 m_retxSeqs.erase(seq);
Alexander Afanasyev359bfb72012-01-09 18:42:50 -0800251
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800252 m_rtt->AckSeq(SequenceNumber32(seq));
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800253}
254
255void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800256Consumer::OnNack(Ptr<const Interest> interest)
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800257{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800258 if (!m_active)
259 return;
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -0800260
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800261 App::OnNack(interest); // tracing inside
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -0800262
Alexander Afanasyeve1b2a2d2012-11-16 11:53:42 -0800263 // NS_LOG_DEBUG ("Nack type: " << interest->GetNack ());
Alexander Afanasyev120bf312011-12-19 01:24:47 -0800264
Alexander Afanasyeve1b2a2d2012-11-16 11:53:42 -0800265 // NS_LOG_FUNCTION (interest->GetName ());
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800266
267 // NS_LOG_INFO ("Received NACK: " << boost::cref(*interest));
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800268 uint32_t seq = interest->GetName().get(-1).toSeqNum();
269 NS_LOG_INFO("< NACK for " << seq);
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -0800270 // std::cout << Simulator::Now ().ToDouble (Time::S) << "s -> " << "NACK for " << seq << "\n";
Alexander Afanasyev781ea812011-12-15 22:42:09 -0800271
272 // put in the queue of interests to be retransmitted
Alexander Afanasyeve1b2a2d2012-11-16 11:53:42 -0800273 // NS_LOG_INFO ("Before: " << m_retxSeqs.size ());
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800274 m_retxSeqs.insert(seq);
Alexander Afanasyeve1b2a2d2012-11-16 11:53:42 -0800275 // NS_LOG_INFO ("After: " << m_retxSeqs.size ());
Alexander Afanasyev3183b5a2011-12-23 20:48:20 -0800276
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800277 m_seqTimeouts.erase(seq);
Alexander Afanasyev3a3ce1a2013-01-31 11:26:11 -0800278
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800279 m_rtt->IncreaseMultiplier(); // Double the next RTO ??
280 ScheduleNextPacket();
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700281}
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700282
Alexander Afanasyev359bfb72012-01-09 18:42:50 -0800283void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800284Consumer::OnTimeout(uint32_t sequenceNumber)
Alexander Afanasyev359bfb72012-01-09 18:42:50 -0800285{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800286 NS_LOG_FUNCTION(sequenceNumber);
287 // std::cout << Simulator::Now () << ", TO: " << sequenceNumber << ", current RTO: " <<
288 // m_rtt->RetransmitTimeout ().ToDouble (Time::S) << "s\n";
Alexander Afanasyevb7ad2322012-01-17 22:54:49 -0800289
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800290 m_rtt->IncreaseMultiplier(); // Double the next RTO
291 m_rtt->SentSeq(SequenceNumber32(sequenceNumber),
292 1); // make sure to disable RTT calculation for this sample
293 m_retxSeqs.insert(sequenceNumber);
294 ScheduleNextPacket();
Alexander Afanasyev359bfb72012-01-09 18:42:50 -0800295}
296
Alexander Afanasyev79b2fb32013-04-12 11:24:55 -0700297void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800298Consumer::WillSendOutInterest(uint32_t sequenceNumber)
Alexander Afanasyev79b2fb32013-04-12 11:24:55 -0700299{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800300 NS_LOG_DEBUG("Trying to add " << sequenceNumber << " with " << Simulator::Now() << ". already "
301 << m_seqTimeouts.size() << " items");
Alexander Afanasyev79b2fb32013-04-12 11:24:55 -0700302
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800303 m_seqTimeouts.insert(SeqTimeout(sequenceNumber, Simulator::Now()));
304 m_seqFullDelay.insert(SeqTimeout(sequenceNumber, Simulator::Now()));
Alexander Afanasyev79b2fb32013-04-12 11:24:55 -0700305
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800306 m_seqLastDelay.erase(sequenceNumber);
307 m_seqLastDelay.insert(SeqTimeout(sequenceNumber, Simulator::Now()));
Alexander Afanasyev79b2fb32013-04-12 11:24:55 -0700308
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800309 m_seqRetxCounts[sequenceNumber]++;
Alexander Afanasyev79b2fb32013-04-12 11:24:55 -0700310
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800311 m_rtt->SentSeq(SequenceNumber32(sequenceNumber), 1);
Alexander Afanasyev79b2fb32013-04-12 11:24:55 -0700312}
313
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700314} // namespace ndn
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800315} // namespace ns3