blob: 52eb9f813a99dffc135120e44164c0d781ae8461 [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"
30#include "ns3/ndn-content-object.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 Afanasyev59314802012-11-26 14:56:04 -080044boost::tuple< boost::shared_ptr<std::ostream>, std::list<Ptr<L3AggregateTracer> > >
45L3AggregateTracer::InstallAll (const std::string &file, Time averagingPeriod/* = Seconds (0.5)*/)
46{
47 using namespace boost;
48 using namespace std;
Alexander Afanasyev37b84c52013-04-26 13:38:52 -070049
Alexander Afanasyev59314802012-11-26 14:56:04 -080050 std::list<Ptr<L3AggregateTracer> > tracers;
51 boost::shared_ptr<std::ofstream> outputStream (new std::ofstream ());
52 outputStream->open (file.c_str (), std::ios_base::out | std::ios_base::trunc);
53
54 if (!outputStream->is_open ())
55 return boost::make_tuple (outputStream, tracers);
56
57 for (NodeList::Iterator node = NodeList::Begin ();
58 node != NodeList::End ();
59 node++)
60 {
61 NS_LOG_DEBUG ("Node: " << (*node)->GetId ());
62
63 Ptr<L3AggregateTracer> trace = Create<L3AggregateTracer> (outputStream, *node);
64 trace->SetAveragingPeriod (averagingPeriod);
65 tracers.push_back (trace);
66 }
67
68 if (tracers.size () > 0)
69 {
70 // *m_l3RateTrace << "# "; // not necessary for R's read.table
71 tracers.front ()->PrintHeader (*outputStream);
72 *outputStream << "\n";
73 }
74
75 return boost::make_tuple (outputStream, tracers);
76}
77
78
79
80L3AggregateTracer::L3AggregateTracer (boost::shared_ptr<std::ostream> os, Ptr<Node> node)
81 : L3Tracer (node)
82 , m_os (os)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -080083{
84 Reset ();
85}
86
Alexander Afanasyev59314802012-11-26 14:56:04 -080087L3AggregateTracer::L3AggregateTracer (boost::shared_ptr<std::ostream> os, const std::string &node)
88 : L3Tracer (node)
89 , m_os (os)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -080090{
91 Reset ();
92}
93
94L3AggregateTracer::~L3AggregateTracer ()
95{
96};
97
98void
Alexander Afanasyev59314802012-11-26 14:56:04 -080099L3AggregateTracer::SetAveragingPeriod (const Time &period)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800100{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800101 m_period = period;
102 m_printEvent.Cancel ();
103 m_printEvent = Simulator::Schedule (m_period, &L3AggregateTracer::PeriodicPrinter, this);
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800104}
105
Alexander Afanasyev59314802012-11-26 14:56:04 -0800106void
107L3AggregateTracer::PeriodicPrinter ()
108{
109 Print (*m_os);
110 Reset ();
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700111
Alexander Afanasyev59314802012-11-26 14:56:04 -0800112 m_printEvent = Simulator::Schedule (m_period, &L3AggregateTracer::PeriodicPrinter, this);
113}
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800114
115void
116L3AggregateTracer::PrintHeader (std::ostream &os) const
117{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800118 os << "Time" << "\t"
119
120 << "Node" << "\t"
121 << "FaceId" << "\t"
122 << "FaceDescr" << "\t"
123
124 << "Type" << "\t"
125 << "Packets" << "\t"
126 << "Kilobytes";
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800127}
128
129void
Alexander Afanasyev59314802012-11-26 14:56:04 -0800130L3AggregateTracer::Reset ()
131{
132 for (std::map<Ptr<const Face>, boost::tuple<Stats, Stats> >::iterator stats = m_stats.begin ();
133 stats != m_stats.end ();
134 stats++)
135 {
136 stats->second.get<0> ().Reset ();
137 stats->second.get<1> ().Reset ();
138 }
139}
140
141
142#define STATS(INDEX) stats->second.get<INDEX> ()
143
144#define PRINTER(printName, fieldName) \
145 os << time.ToDouble (Time::S) << "\t" \
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700146 << m_node << "\t"; \
147 if (stats->first) \
148 { \
149 os \
150 << stats->first->GetId () << "\t" \
151 << *stats->first << "\t"; \
152 } \
153 else \
154 { \
155 os << "-1\tall\t"; \
156 } \
157 os \
Alexander Afanasyev59314802012-11-26 14:56:04 -0800158 << printName << "\t" \
159 << STATS(0).fieldName << "\t" \
160 << STATS(1).fieldName / 1024.0 << "\n";
161
162
163void
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800164L3AggregateTracer::Print (std::ostream &os) const
165{
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700166 Time time = Simulator::Now ();
167
Alexander Afanasyev59314802012-11-26 14:56:04 -0800168 for (std::map<Ptr<const Face>, boost::tuple<Stats, Stats> >::iterator stats = m_stats.begin ();
169 stats != m_stats.end ();
170 stats++)
171 {
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700172 if (!stats->first)
173 continue;
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800174
Alexander Afanasyev59314802012-11-26 14:56:04 -0800175 PRINTER ("InInterests", m_inInterests);
176 PRINTER ("OutInterests", m_outInterests);
Alexander Afanasyevf1a4f1e2013-03-18 08:37:49 -0600177 PRINTER ("DropInterests", m_dropInterests);
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700178
Alexander Afanasyev59314802012-11-26 14:56:04 -0800179 PRINTER ("InNacks", m_inNacks);
180 PRINTER ("OutNacks", m_outNacks);
Alexander Afanasyevf1a4f1e2013-03-18 08:37:49 -0600181 PRINTER ("DropNacks", m_dropNacks);
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800182
Alexander Afanasyev59314802012-11-26 14:56:04 -0800183 PRINTER ("InData", m_inData);
184 PRINTER ("OutData", m_outData);
Alexander Afanasyevf1a4f1e2013-03-18 08:37:49 -0600185 PRINTER ("DropData", m_dropData);
Alexander Afanasyev59314802012-11-26 14:56:04 -0800186 }
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700187
188 {
189 std::map<Ptr<const Face>, boost::tuple<Stats, Stats> >::iterator stats = m_stats.find (Ptr<const Face> (0));
190 PRINTER ("SatisfiedInterests", m_satisfiedInterests);
191 PRINTER ("TimedOutInterests", m_timedOutInterests);
192 }
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800193}
194
195void
196L3AggregateTracer::OutInterests (std::string context,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700197 Ptr<const Interest> header, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800198{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800199 m_stats[face].get<0> ().m_outInterests ++;
200 m_stats[face].get<1> ().m_outInterests += header->GetSerializedSize ();
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800201}
202
203void
204L3AggregateTracer::InInterests (std::string context,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700205 Ptr<const Interest> header, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800206{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800207 m_stats[face].get<0> ().m_inInterests ++;
208 m_stats[face].get<1> ().m_inInterests += header->GetSerializedSize ();
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800209}
210
211void
212L3AggregateTracer::DropInterests (std::string context,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700213 Ptr<const Interest> header, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800214{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800215 m_stats[face].get<0> ().m_dropInterests ++;
216 m_stats[face].get<1> ().m_dropInterests += header->GetSerializedSize ();
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800217}
218
219void
220L3AggregateTracer::OutNacks (std::string context,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700221 Ptr<const Interest> header, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800222{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800223 m_stats[face].get<0> ().m_outNacks ++;
224 m_stats[face].get<1> ().m_outNacks += header->GetSerializedSize ();
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800225}
226
227void
228L3AggregateTracer::InNacks (std::string context,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700229 Ptr<const Interest> header, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800230{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800231 m_stats[face].get<0> ().m_inNacks ++;
232 m_stats[face].get<1> ().m_inNacks += header->GetSerializedSize ();
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800233}
234
235void
236L3AggregateTracer::DropNacks (std::string context,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700237 Ptr<const Interest> header, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800238{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800239 m_stats[face].get<0> ().m_dropNacks ++;
240 m_stats[face].get<1> ().m_dropNacks += header->GetSerializedSize ();
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800241}
242
243void
244L3AggregateTracer::OutData (std::string context,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700245 Ptr<const ContentObject> header, Ptr<const Packet> payload,
Alexander Afanasyev59314802012-11-26 14:56:04 -0800246 bool fromCache, Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800247{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800248 m_stats[face].get<0> ().m_outData ++;
249 m_stats[face].get<1> ().m_outData += header->GetSerializedSize () + payload->GetSize ();
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800250}
251
252void
253L3AggregateTracer::InData (std::string context,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700254 Ptr<const ContentObject> header, Ptr<const Packet> payload,
Alexander Afanasyev59314802012-11-26 14:56:04 -0800255 Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800256{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800257 m_stats[face].get<0> ().m_inData ++;
258 m_stats[face].get<1> ().m_inData += header->GetSerializedSize () + payload->GetSize ();
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800259}
260
261void
262L3AggregateTracer::DropData (std::string context,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700263 Ptr<const ContentObject> header, Ptr<const Packet> payload,
Alexander Afanasyev59314802012-11-26 14:56:04 -0800264 Ptr<const Face> face)
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800265{
Alexander Afanasyev59314802012-11-26 14:56:04 -0800266 m_stats[face].get<0> ().m_dropData ++;
267 m_stats[face].get<1> ().m_dropData += header->GetSerializedSize () + payload->GetSize ();
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800268}
269
Alexander Afanasyev37b84c52013-04-26 13:38:52 -0700270void
271L3AggregateTracer::SatisfiedInterests (Ptr<const pit::Entry>)
272{
273 m_stats[0].get<0> ().m_satisfiedInterests ++;
274 // no "size" stats
275}
276
277void
278L3AggregateTracer::TimedOutInterests (Ptr<const pit::Entry>)
279{
280 m_stats[0].get<0> ().m_timedOutInterests ++;
281 // no "size" stats
282}
283
Alexander Afanasyevc9d5c1a2012-11-21 18:00:26 -0800284} // namespace ndn
285} // namespace ns3