blob: 38170bce5b9d428acb2962ac2e936ca756dc5132 [file] [log] [blame]
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/*
3 * Copyright (c) 2011 UCLA
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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
19 */
20
Alexander Afanasyev0c395372014-12-20 15:54:02 -080021#include "ndn-l3-rate-tracer.hpp"
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -080022#include "ns3/node.h"
23#include "ns3/packet.h"
24#include "ns3/config.h"
25#include "ns3/callback.h"
26#include "ns3/simulator.h"
27#include "ns3/log.h"
28#include "ns3/node-list.h"
29
Alexander Afanasyev0c395372014-12-20 15:54:02 -080030#include "ns3/ndn-app.hpp"
31#include "ns3/ndn-face.hpp"
32#include "ns3/ndn-interest.hpp"
33#include "ns3/ndn-data.hpp"
34#include "ns3/ndn-pit-entry.hpp"
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -080035
36#include <fstream>
37#include <boost/lexical_cast.hpp>
38
39using namespace boost;
40using namespace std;
41
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080042NS_LOG_COMPONENT_DEFINE("ndn.L3RateTracer");
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -080043
44namespace ns3 {
45namespace ndn {
46
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080047static std::list<boost::tuple<boost::shared_ptr<std::ostream>, std::list<Ptr<L3RateTracer>>>>
48 g_tracers;
Alexander Afanasyev3fe94dc2013-08-09 17:12:12 -070049
Alexander Afanasyev5352af32013-07-15 09:51:28 -070050template<class T>
51static inline void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080052NullDeleter(T* ptr)
Alexander Afanasyev5352af32013-07-15 09:51:28 -070053{
54}
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -080055
Alexander Afanasyev3fe94dc2013-08-09 17:12:12 -070056void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080057L3RateTracer::Destroy()
Alexander Afanasyevdb5f3b62013-08-09 17:42:12 -070058{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080059 g_tracers.clear();
Alexander Afanasyevdb5f3b62013-08-09 17:42:12 -070060}
61
62void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080063L3RateTracer::InstallAll(const std::string& file, Time averagingPeriod /* = Seconds (0.5)*/)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -080064{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080065 std::list<Ptr<L3RateTracer>> tracers;
Alexander Afanasyev5352af32013-07-15 09:51:28 -070066 boost::shared_ptr<std::ostream> outputStream;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080067 if (file != "-") {
68 boost::shared_ptr<std::ofstream> os(new std::ofstream());
69 os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -080070
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080071 if (!os->is_open()) {
72 NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
73 return;
Alexander Afanasyev5352af32013-07-15 09:51:28 -070074 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -080075
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080076 outputStream = os;
77 }
78 else {
79 outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
80 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -080081
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080082 for (NodeList::Iterator node = NodeList::Begin(); node != NodeList::End(); node++) {
83 Ptr<L3RateTracer> trace = Install(*node, outputStream, averagingPeriod);
84 tracers.push_back(trace);
85 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -080086
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080087 if (tracers.size() > 0) {
88 // *m_l3RateTrace << "# "; // not necessary for R's read.table
89 tracers.front()->PrintHeader(*outputStream);
90 *outputStream << "\n";
91 }
92
93 g_tracers.push_back(boost::make_tuple(outputStream, tracers));
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -080094}
95
Alexander Afanasyev3fe94dc2013-08-09 17:12:12 -070096void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080097L3RateTracer::Install(const NodeContainer& nodes, const std::string& file,
98 Time averagingPeriod /* = Seconds (0.5)*/)
Alexander Afanasyev5352af32013-07-15 09:51:28 -070099{
100 using namespace boost;
101 using namespace std;
102
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800103 std::list<Ptr<L3RateTracer>> tracers;
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700104 boost::shared_ptr<std::ostream> outputStream;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800105 if (file != "-") {
106 boost::shared_ptr<std::ofstream> os(new std::ofstream());
107 os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700108
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800109 if (!os->is_open()) {
110 NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
111 return;
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700112 }
113
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800114 outputStream = os;
115 }
116 else {
117 outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
118 }
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700119
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800120 for (NodeContainer::Iterator node = nodes.Begin(); node != nodes.End(); node++) {
121 Ptr<L3RateTracer> trace = Install(*node, outputStream, averagingPeriod);
122 tracers.push_back(trace);
123 }
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700124
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800125 if (tracers.size() > 0) {
126 // *m_l3RateTrace << "# "; // not necessary for R's read.table
127 tracers.front()->PrintHeader(*outputStream);
128 *outputStream << "\n";
129 }
130
131 g_tracers.push_back(boost::make_tuple(outputStream, tracers));
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700132}
133
Alexander Afanasyev3fe94dc2013-08-09 17:12:12 -0700134void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800135L3RateTracer::Install(Ptr<Node> node, const std::string& file,
136 Time averagingPeriod /* = Seconds (0.5)*/)
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700137{
138 using namespace boost;
139 using namespace std;
140
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800141 std::list<Ptr<L3RateTracer>> tracers;
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700142 boost::shared_ptr<std::ostream> outputStream;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800143 if (file != "-") {
144 boost::shared_ptr<std::ofstream> os(new std::ofstream());
145 os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700146
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800147 if (!os->is_open()) {
148 NS_LOG_ERROR("File " << file << " cannot be opened for writing. Tracing disabled");
149 return;
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700150 }
151
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800152 outputStream = os;
153 }
154 else {
155 outputStream = boost::shared_ptr<std::ostream>(&std::cout, NullDeleter<std::ostream>);
156 }
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700157
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800158 Ptr<L3RateTracer> trace = Install(node, outputStream, averagingPeriod);
159 tracers.push_back(trace);
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700160
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800161 if (tracers.size() > 0) {
162 // *m_l3RateTrace << "# "; // not necessary for R's read.table
163 tracers.front()->PrintHeader(*outputStream);
164 *outputStream << "\n";
165 }
166
167 g_tracers.push_back(boost::make_tuple(outputStream, tracers));
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700168}
169
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700170Ptr<L3RateTracer>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800171L3RateTracer::Install(Ptr<Node> node, boost::shared_ptr<std::ostream> outputStream,
172 Time averagingPeriod /* = Seconds (0.5)*/)
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700173{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800174 NS_LOG_DEBUG("Node: " << node->GetId());
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700175
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800176 Ptr<L3RateTracer> trace = Create<L3RateTracer>(outputStream, node);
177 trace->SetAveragingPeriod(averagingPeriod);
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700178
179 return trace;
180}
181
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800182L3RateTracer::L3RateTracer(boost::shared_ptr<std::ostream> os, Ptr<Node> node)
183 : L3Tracer(node)
184 , m_os(os)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800185{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800186 SetAveragingPeriod(Seconds(1.0));
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800187}
188
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800189L3RateTracer::L3RateTracer(boost::shared_ptr<std::ostream> os, const std::string& node)
190 : L3Tracer(node)
191 , m_os(os)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800192{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800193 SetAveragingPeriod(Seconds(1.0));
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800194}
195
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800196L3RateTracer::~L3RateTracer()
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800197{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800198 m_printEvent.Cancel();
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800199}
200
201void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800202L3RateTracer::SetAveragingPeriod(const Time& period)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800203{
204 m_period = period;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800205 m_printEvent.Cancel();
206 m_printEvent = Simulator::Schedule(m_period, &L3RateTracer::PeriodicPrinter, this);
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800207}
208
209void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800210L3RateTracer::PeriodicPrinter()
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800211{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800212 Print(*m_os);
213 Reset();
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700214
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800215 m_printEvent = Simulator::Schedule(m_period, &L3RateTracer::PeriodicPrinter, this);
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800216}
217
218void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800219L3RateTracer::PrintHeader(std::ostream& os) const
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800220{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800221 os << "Time"
222 << "\t"
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800223
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800224 << "Node"
225 << "\t"
226 << "FaceId"
227 << "\t"
228 << "FaceDescr"
229 << "\t"
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800230
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800231 << "Type"
232 << "\t"
233 << "Packets"
234 << "\t"
235 << "Kilobytes"
236 << "\t"
237 << "PacketRaw"
238 << "\t"
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800239 << "KilobytesRaw";
240}
241
242void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800243L3RateTracer::Reset()
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800244{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800245 for (std::map<Ptr<const Face>, boost::tuple<Stats, Stats, Stats, Stats>>::iterator stats =
246 m_stats.begin();
247 stats != m_stats.end(); stats++) {
248 stats->second.get<0>().Reset();
249 stats->second.get<1>().Reset();
250 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800251}
252
253const double alpha = 0.8;
254
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800255#define STATS(INDEX) stats->second.get<INDEX>()
256#define RATE(INDEX, fieldName) STATS(INDEX).fieldName / m_period.ToDouble(Time::S)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800257
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800258#define PRINTER(printName, fieldName) \
259 STATS(2).fieldName = \
260 /*new value*/ alpha * RATE(0, fieldName) + /*old value*/ (1 - alpha) * STATS(2).fieldName; \
261 STATS(3).fieldName = /*new value*/ alpha * RATE(1, fieldName) / 1024.0 \
262 + /*old value*/ (1 - alpha) * STATS(3).fieldName; \
263 \
264 os << time.ToDouble(Time::S) << "\t" << m_node << "\t"; \
265 if (stats->first) { \
266 os << stats->first->GetId() << "\t" << *stats->first << "\t"; \
267 } \
268 else { \
269 os << "-1\tall\t"; \
270 } \
271 os << printName << "\t" << STATS(2).fieldName << "\t" << STATS(3).fieldName << "\t" \
272 << STATS(0).fieldName << "\t" << STATS(1).fieldName / 1024.0 << "\n";
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800273
274void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800275L3RateTracer::Print(std::ostream& os) const
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800276{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800277 Time time = Simulator::Now();
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700278
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800279 for (std::map<Ptr<const Face>, boost::tuple<Stats, Stats, Stats, Stats>>::iterator stats =
280 m_stats.begin();
281 stats != m_stats.end(); stats++) {
282 if (!stats->first)
283 continue;
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800284
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800285 PRINTER("InInterests", m_inInterests);
286 PRINTER("OutInterests", m_outInterests);
287 PRINTER("DropInterests", m_dropInterests);
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700288
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800289 PRINTER("InNacks", m_inNacks);
290 PRINTER("OutNacks", m_outNacks);
291 PRINTER("DropNacks", m_dropNacks);
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800292
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800293 PRINTER("InData", m_inData);
294 PRINTER("OutData", m_outData);
295 PRINTER("DropData", m_dropData);
Alexander Afanasyevbf939292013-07-15 10:10:01 -0700296
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800297 PRINTER("InSatisfiedInterests", m_satisfiedInterests);
298 PRINTER("InTimedOutInterests", m_timedOutInterests);
Alexander Afanasyevbf939292013-07-15 10:10:01 -0700299
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800300 PRINTER("OutSatisfiedInterests", m_outSatisfiedInterests);
301 PRINTER("OutTimedOutInterests", m_outTimedOutInterests);
302 }
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700303
304 {
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800305 std::map<Ptr<const Face>, boost::tuple<Stats, Stats, Stats, Stats>>::iterator stats =
306 m_stats.find(Ptr<const Face>(0));
307 if (stats != m_stats.end()) {
308 PRINTER("SatisfiedInterests", m_satisfiedInterests);
309 PRINTER("TimedOutInterests", m_timedOutInterests);
310 }
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700311 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800312}
313
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800314void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800315L3RateTracer::OutInterests(Ptr<const Interest> interest, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800316{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800317 m_stats[face].get<0>().m_outInterests++;
318 if (interest->GetWire()) {
319 m_stats[face].get<1>().m_outInterests += interest->GetWire()->GetSize();
320 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800321}
322
323void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800324L3RateTracer::InInterests(Ptr<const Interest> interest, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800325{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800326 m_stats[face].get<0>().m_inInterests++;
327 if (interest->GetWire()) {
328 m_stats[face].get<1>().m_inInterests += interest->GetWire()->GetSize();
329 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800330}
331
332void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800333L3RateTracer::DropInterests(Ptr<const Interest> interest, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800334{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800335 m_stats[face].get<0>().m_dropInterests++;
336 if (interest->GetWire()) {
337 m_stats[face].get<1>().m_dropInterests += interest->GetWire()->GetSize();
338 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800339}
340
341void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800342L3RateTracer::OutNacks(Ptr<const Interest> interest, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800343{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800344 m_stats[face].get<0>().m_outNacks++;
345 if (interest->GetWire()) {
346 m_stats[face].get<1>().m_outNacks += interest->GetWire()->GetSize();
347 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800348}
349
350void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800351L3RateTracer::InNacks(Ptr<const Interest> interest, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800352{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800353 m_stats[face].get<0>().m_inNacks++;
354 if (interest->GetWire()) {
355 m_stats[face].get<1>().m_inNacks += interest->GetWire()->GetSize();
356 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800357}
358
359void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800360L3RateTracer::DropNacks(Ptr<const Interest> interest, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800361{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800362 m_stats[face].get<0>().m_dropNacks++;
363 if (interest->GetWire()) {
364 m_stats[face].get<1>().m_dropNacks += interest->GetWire()->GetSize();
365 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800366}
367
368void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800369L3RateTracer::OutData(Ptr<const Data> data, bool fromCache, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800370{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800371 m_stats[face].get<0>().m_outData++;
372 if (data->GetWire()) {
373 m_stats[face].get<1>().m_outData += data->GetWire()->GetSize();
374 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800375}
376
377void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800378L3RateTracer::InData(Ptr<const Data> data, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800379{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800380 m_stats[face].get<0>().m_inData++;
381 if (data->GetWire()) {
382 m_stats[face].get<1>().m_inData += data->GetWire()->GetSize();
383 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800384}
385
386void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800387L3RateTracer::DropData(Ptr<const Data> data, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800388{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800389 m_stats[face].get<0>().m_dropData++;
390 if (data->GetWire()) {
391 m_stats[face].get<1>().m_dropData += data->GetWire()->GetSize();
392 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800393}
394
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700395void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800396L3RateTracer::SatisfiedInterests(Ptr<const pit::Entry> entry)
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700397{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800398 m_stats[0].get<0>().m_satisfiedInterests++;
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700399 // no "size" stats
Alexander Afanasyevbf939292013-07-15 10:10:01 -0700400
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800401 for (pit::Entry::in_container::const_iterator i = entry->GetIncoming().begin();
402 i != entry->GetIncoming().end(); i++) {
403 m_stats[i->m_face].get<0>().m_satisfiedInterests++;
404 }
Alexander Afanasyevbf939292013-07-15 10:10:01 -0700405
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800406 for (pit::Entry::out_container::const_iterator i = entry->GetOutgoing().begin();
407 i != entry->GetOutgoing().end(); i++) {
408 m_stats[i->m_face].get<0>().m_outSatisfiedInterests++;
409 }
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700410}
411
412void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800413L3RateTracer::TimedOutInterests(Ptr<const pit::Entry> entry)
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700414{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800415 m_stats[0].get<0>().m_timedOutInterests++;
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700416 // no "size" stats
Alexander Afanasyevbf939292013-07-15 10:10:01 -0700417
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800418 for (pit::Entry::in_container::const_iterator i = entry->GetIncoming().begin();
419 i != entry->GetIncoming().end(); i++) {
420 m_stats[i->m_face].get<0>().m_timedOutInterests++;
421 }
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700422
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800423 for (pit::Entry::out_container::const_iterator i = entry->GetOutgoing().begin();
424 i != entry->GetOutgoing().end(); i++) {
425 m_stats[i->m_face].get<0>().m_outTimedOutInterests++;
426 }
427}
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700428
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800429} // namespace ndn
430} // namespace ns3