blob: c6fc5e3875f491b89dd1f1606d190554f0ada3fc [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
21#include "ndn-l3-aggregate-tracer.h"
22
23#include "ns3/node.h"
24#include "ns3/packet.h"
25#include "ns3/config.h"
26#include "ns3/callback.h"
27#include "ns3/ndn-app.h"
28#include "ns3/ndn-face.h"
29#include "ns3/ndn-interest.h"
Alexander Afanasyev6eba36f2013-08-07 17:42:54 -070030#include "ns3/ndn-data.h"
Alexander Afanasyev37b84c52013-04-26 13:38:52 -070031#include "ns3/ndn-pit-entry.h"
32
Alexander Afanasyev59314802012-11-26 14:56:04 -080033#include "ns3/simulator.h"
34#include "ns3/node-list.h"
35#include "ns3/log.h"
36
37#include <fstream>
38
39NS_LOG_COMPONENT_DEFINE ("ndn.L3AggregateTracer");
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -080040
41namespace ns3 {
42namespace ndn {
43
Alexander Afanasyev3fe94dc2013-08-09 17:12:12 -070044static std::list< boost::tuple< boost::shared_ptr<std::ostream>, std::list<Ptr<L3AggregateTracer> > > > g_tracers;
45
Alexander Afanasyev5352af32013-07-15 09:51:28 -070046template<class T>
47static inline void
48NullDeleter (T *ptr)
49{
50}
51
Alexander Afanasyev3fe94dc2013-08-09 17:12:12 -070052void
Alexander Afanasyev59314802012-11-26 14:56:04 -080053L3AggregateTracer::InstallAll (const std::string &file, Time averagingPeriod/* = Seconds (0.5)*/)
54{
55 using namespace boost;
56 using namespace std;
Alexander Afanasyev37b84c52013-04-26 13:38:52 -070057
Alexander Afanasyev59314802012-11-26 14:56:04 -080058 std::list<Ptr<L3AggregateTracer> > tracers;
Alexander Afanasyev5352af32013-07-15 09:51:28 -070059 boost::shared_ptr<std::ostream> outputStream;
60 if (file != "-")
61 {
62 boost::shared_ptr<std::ofstream> os (new std::ofstream ());
63 os->open (file.c_str (), std::ios_base::out | std::ios_base::trunc);
Alexander Afanasyev59314802012-11-26 14:56:04 -080064
Alexander Afanasyev5352af32013-07-15 09:51:28 -070065 if (!os->is_open ())
Alexander Afanasyev3fe94dc2013-08-09 17:12:12 -070066 {
67 NS_LOG_ERROR ("File " << file << " cannot be opened for writing. Tracing disabled");
68 return;
69 }
Alexander Afanasyev5352af32013-07-15 09:51:28 -070070
71 outputStream = os;
72 }
73 else
74 {
75 outputStream = boost::shared_ptr<std::ostream> (&std::cout, NullDeleter<std::ostream>);
76 }
Alexander Afanasyev59314802012-11-26 14:56:04 -080077
78 for (NodeList::Iterator node = NodeList::Begin ();
79 node != NodeList::End ();
80 node++)
81 {
Alexander Afanasyeva68783a2013-06-27 13:39:04 -070082 Ptr<L3AggregateTracer> trace = Install (*node, outputStream, averagingPeriod);
Alexander Afanasyev59314802012-11-26 14:56:04 -080083 tracers.push_back (trace);
84 }
85
86 if (tracers.size () > 0)
87 {
88 // *m_l3RateTrace << "# "; // not necessary for R's read.table
89 tracers.front ()->PrintHeader (*outputStream);
90 *outputStream << "\n";
91 }
92
Alexander Afanasyev3fe94dc2013-08-09 17:12:12 -070093 g_tracers.push_back (boost::make_tuple (outputStream, tracers));
Alexander Afanasyev59314802012-11-26 14:56:04 -080094}
95
Alexander Afanasyev3fe94dc2013-08-09 17:12:12 -070096void
Alexander Afanasyeva68783a2013-06-27 13:39:04 -070097L3AggregateTracer::Install (const NodeContainer &nodes, const std::string &file, Time averagingPeriod/* = Seconds (0.5)*/)
98{
99 using namespace boost;
100 using namespace std;
Alexander Afanasyev59314802012-11-26 14:56:04 -0800101
Alexander Afanasyeva68783a2013-06-27 13:39:04 -0700102 std::list<Ptr<L3AggregateTracer> > tracers;
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700103 boost::shared_ptr<std::ostream> outputStream;
104 if (file != "-")
105 {
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 Afanasyeva68783a2013-06-27 13:39:04 -0700108
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700109 if (!os->is_open ())
Alexander Afanasyev3fe94dc2013-08-09 17:12:12 -0700110 {
111 NS_LOG_ERROR ("File " << file << " cannot be opened for writing. Tracing disabled");
112 return;
113 }
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700114
115 outputStream = os;
116 }
117 else
118 {
119 outputStream = boost::shared_ptr<std::ostream> (&std::cout, NullDeleter<std::ostream>);
120 }
Alexander Afanasyeva68783a2013-06-27 13:39:04 -0700121
122 for (NodeContainer::Iterator node = nodes.Begin ();
123 node != nodes.End ();
124 node++)
125 {
126 Ptr<L3AggregateTracer> trace = Install (*node, outputStream, averagingPeriod);
127 tracers.push_back (trace);
128 }
129
130 if (tracers.size () > 0)
131 {
132 // *m_l3RateTrace << "# "; // not necessary for R's read.table
133 tracers.front ()->PrintHeader (*outputStream);
134 *outputStream << "\n";
135 }
136
Alexander Afanasyev3fe94dc2013-08-09 17:12:12 -0700137 g_tracers.push_back (boost::make_tuple (outputStream, tracers));
Alexander Afanasyeva68783a2013-06-27 13:39:04 -0700138}
139
Alexander Afanasyev3fe94dc2013-08-09 17:12:12 -0700140void
Alexander Afanasyeva68783a2013-06-27 13:39:04 -0700141L3AggregateTracer::Install (Ptr<Node> node, const std::string &file, Time averagingPeriod/* = Seconds (0.5)*/)
142{
143 using namespace boost;
144 using namespace std;
145
146 std::list<Ptr<L3AggregateTracer> > tracers;
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700147 boost::shared_ptr<std::ostream> outputStream;
148 if (file != "-")
149 {
150 boost::shared_ptr<std::ofstream> os (new std::ofstream ());
151 os->open (file.c_str (), std::ios_base::out | std::ios_base::trunc);
Alexander Afanasyeva68783a2013-06-27 13:39:04 -0700152
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700153 if (!os->is_open ())
Alexander Afanasyev3fe94dc2013-08-09 17:12:12 -0700154 {
155 NS_LOG_ERROR ("File " << file << " cannot be opened for writing. Tracing disabled");
156 return;
157 }
Alexander Afanasyev5352af32013-07-15 09:51:28 -0700158
159 outputStream = os;
160 }
161 else
162 {
163 outputStream = boost::shared_ptr<std::ostream> (&std::cout, NullDeleter<std::ostream>);
164 }
Alexander Afanasyeva68783a2013-06-27 13:39:04 -0700165
166 Ptr<L3AggregateTracer> trace = Install (node, outputStream, averagingPeriod);
167 tracers.push_back (trace);
168
169 if (tracers.size () > 0)
170 {
171 // *m_l3RateTrace << "# "; // not necessary for R's read.table
172 tracers.front ()->PrintHeader (*outputStream);
173 *outputStream << "\n";
174 }
175
Alexander Afanasyev3fe94dc2013-08-09 17:12:12 -0700176 g_tracers.push_back (boost::make_tuple (outputStream, tracers));
Alexander Afanasyeva68783a2013-06-27 13:39:04 -0700177}
178
179
180Ptr<L3AggregateTracer>
181L3AggregateTracer::Install (Ptr<Node> node,
182 boost::shared_ptr<std::ostream> outputStream,
183 Time averagingPeriod/* = Seconds (0.5)*/)
184{
185 NS_LOG_DEBUG ("Node: " << node->GetId ());
186
187 Ptr<L3AggregateTracer> trace = Create<L3AggregateTracer> (outputStream, node);
188 trace->SetAveragingPeriod (averagingPeriod);
189
190 return trace;
191}
Alexander Afanasyev59314802012-11-26 14:56:04 -0800192
193L3AggregateTracer::L3AggregateTracer (boost::shared_ptr<std::ostream> os, Ptr<Node> node)
194 : L3Tracer (node)
195 , m_os (os)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800196{
197 Reset ();
198}
199
Alexander Afanasyev59314802012-11-26 14:56:04 -0800200L3AggregateTracer::L3AggregateTracer (boost::shared_ptr<std::ostream> os, const std::string &node)
201 : L3Tracer (node)
202 , m_os (os)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800203{
204 Reset ();
205}
206
207L3AggregateTracer::~L3AggregateTracer ()
208{
209};
210
211void
Alexander Afanasyev59314802012-11-26 14:56:04 -0800212L3AggregateTracer::SetAveragingPeriod (const Time &period)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800213{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800214 m_period = period;
215 m_printEvent.Cancel ();
216 m_printEvent = Simulator::Schedule (m_period, &L3AggregateTracer::PeriodicPrinter, this);
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800217}
218
Alexander Afanasyev59314802012-11-26 14:56:04 -0800219void
220L3AggregateTracer::PeriodicPrinter ()
221{
222 Print (*m_os);
223 Reset ();
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700224
Alexander Afanasyev59314802012-11-26 14:56:04 -0800225 m_printEvent = Simulator::Schedule (m_period, &L3AggregateTracer::PeriodicPrinter, this);
226}
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800227
228void
229L3AggregateTracer::PrintHeader (std::ostream &os) const
230{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800231 os << "Time" << "\t"
232
233 << "Node" << "\t"
234 << "FaceId" << "\t"
235 << "FaceDescr" << "\t"
236
237 << "Type" << "\t"
238 << "Packets" << "\t"
239 << "Kilobytes";
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800240}
241
242void
Alexander Afanasyev59314802012-11-26 14:56:04 -0800243L3AggregateTracer::Reset ()
244{
245 for (std::map<Ptr<const Face>, boost::tuple<Stats, Stats> >::iterator stats = m_stats.begin ();
246 stats != m_stats.end ();
247 stats++)
248 {
249 stats->second.get<0> ().Reset ();
250 stats->second.get<1> ().Reset ();
251 }
252}
253
254
255#define STATS(INDEX) stats->second.get<INDEX> ()
256
257#define PRINTER(printName, fieldName) \
258 os << time.ToDouble (Time::S) << "\t" \
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700259 << m_node << "\t"; \
260 if (stats->first) \
261 { \
262 os \
263 << stats->first->GetId () << "\t" \
264 << *stats->first << "\t"; \
265 } \
266 else \
267 { \
268 os << "-1\tall\t"; \
269 } \
270 os \
Alexander Afanasyev59314802012-11-26 14:56:04 -0800271 << printName << "\t" \
272 << STATS(0).fieldName << "\t" \
273 << STATS(1).fieldName / 1024.0 << "\n";
274
275
276void
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800277L3AggregateTracer::Print (std::ostream &os) const
278{
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700279 Time time = Simulator::Now ();
280
Alexander Afanasyev59314802012-11-26 14:56:04 -0800281 for (std::map<Ptr<const Face>, boost::tuple<Stats, Stats> >::iterator stats = m_stats.begin ();
282 stats != m_stats.end ();
283 stats++)
284 {
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700285 if (!stats->first)
286 continue;
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800287
Alexander Afanasyev59314802012-11-26 14:56:04 -0800288 PRINTER ("InInterests", m_inInterests);
289 PRINTER ("OutInterests", m_outInterests);
Alexander Afanasyevf1a4f1e2013-03-18 08:37:49 -0600290 PRINTER ("DropInterests", m_dropInterests);
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700291
Alexander Afanasyev59314802012-11-26 14:56:04 -0800292 PRINTER ("InNacks", m_inNacks);
293 PRINTER ("OutNacks", m_outNacks);
Alexander Afanasyevf1a4f1e2013-03-18 08:37:49 -0600294 PRINTER ("DropNacks", m_dropNacks);
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800295
Alexander Afanasyev59314802012-11-26 14:56:04 -0800296 PRINTER ("InData", m_inData);
297 PRINTER ("OutData", m_outData);
Alexander Afanasyevf1a4f1e2013-03-18 08:37:49 -0600298 PRINTER ("DropData", m_dropData);
Alexander Afanasyev59314802012-11-26 14:56:04 -0800299 }
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700300
301 {
302 std::map<Ptr<const Face>, boost::tuple<Stats, Stats> >::iterator stats = m_stats.find (Ptr<const Face> (0));
Alexander Afanasyev6692e0b2013-05-06 10:38:50 -0700303 if (stats != m_stats.end ())
304 {
305 PRINTER ("SatisfiedInterests", m_satisfiedInterests);
306 PRINTER ("TimedOutInterests", m_timedOutInterests);
307 }
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700308 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800309}
310
311void
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700312L3AggregateTracer::OutInterests (Ptr<const Interest> interest, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800313{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800314 m_stats[face].get<0> ().m_outInterests ++;
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700315 if (interest->GetWire ())
316 {
317 m_stats[face].get<1> ().m_outInterests += interest->GetWire ()->GetSize ();
318 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800319}
320
321void
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700322L3AggregateTracer::InInterests (Ptr<const Interest> interest, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800323{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800324 m_stats[face].get<0> ().m_inInterests ++;
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700325 if (interest->GetWire ())
326 {
327 m_stats[face].get<1> ().m_inInterests += interest->GetWire ()->GetSize ();
328 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800329}
330
331void
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700332L3AggregateTracer::DropInterests (Ptr<const Interest> interest, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800333{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800334 m_stats[face].get<0> ().m_dropInterests ++;
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700335 if (interest->GetWire ())
336 {
337 m_stats[face].get<1> ().m_dropInterests += interest->GetWire ()->GetSize ();
338 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800339}
340
341void
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700342L3AggregateTracer::OutNacks (Ptr<const Interest> nack, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800343{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800344 m_stats[face].get<0> ().m_outNacks ++;
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700345 if (nack->GetWire ())
346 {
347 m_stats[face].get<1> ().m_outNacks += nack->GetWire ()->GetSize ();
348 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800349}
350
351void
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700352L3AggregateTracer::InNacks (Ptr<const Interest> nack, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800353{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800354 m_stats[face].get<0> ().m_inNacks ++;
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700355 if (nack->GetWire ())
356 {
357 m_stats[face].get<1> ().m_inNacks += nack->GetWire ()->GetSize ();
358 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800359}
360
361void
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700362L3AggregateTracer::DropNacks (Ptr<const Interest> nack, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800363{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800364 m_stats[face].get<0> ().m_dropNacks ++;
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700365 if (nack->GetWire ())
366 {
367 m_stats[face].get<1> ().m_dropNacks += nack->GetWire ()->GetSize ();
368 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800369}
370
371void
Alexander Afanasyev772f51b2013-08-01 18:53:25 -0700372L3AggregateTracer::OutData (Ptr<const Data> data,
Alexander Afanasyev59314802012-11-26 14:56:04 -0800373 bool fromCache, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800374{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800375 m_stats[face].get<0> ().m_outData ++;
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700376 if (data->GetWire ())
377 {
378 m_stats[face].get<1> ().m_outData += data->GetWire ()->GetSize ();
379 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800380}
381
382void
Alexander Afanasyev772f51b2013-08-01 18:53:25 -0700383L3AggregateTracer::InData (Ptr<const Data> data,
Alexander Afanasyev59314802012-11-26 14:56:04 -0800384 Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800385{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800386 m_stats[face].get<0> ().m_inData ++;
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700387 if (data->GetWire ())
388 {
389 m_stats[face].get<1> ().m_inData += data->GetWire ()->GetSize ();
390 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800391}
392
393void
Alexander Afanasyev772f51b2013-08-01 18:53:25 -0700394L3AggregateTracer::DropData (Ptr<const Data> data,
Alexander Afanasyev59314802012-11-26 14:56:04 -0800395 Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800396{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800397 m_stats[face].get<0> ().m_dropData ++;
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700398 if (data->GetWire ())
399 {
400 m_stats[face].get<1> ().m_dropData += data->GetWire ()->GetSize ();
401 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800402}
403
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700404void
405L3AggregateTracer::SatisfiedInterests (Ptr<const pit::Entry>)
406{
407 m_stats[0].get<0> ().m_satisfiedInterests ++;
408 // no "size" stats
409}
410
411void
412L3AggregateTracer::TimedOutInterests (Ptr<const pit::Entry>)
413{
414 m_stats[0].get<0> ().m_timedOutInterests ++;
415 // no "size" stats
416}
417
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800418} // namespace ndn
419} // namespace ns3