22 #include "ns3/packet.h" 23 #include "ns3/config.h" 24 #include "ns3/callback.h" 25 #include "ns3/simulator.h" 27 #include "ns3/node-list.h" 28 #include "ns3/ndnSIM/model/ndn-l3-protocol.hpp" 33 #include <boost/lexical_cast.hpp> 35 NS_LOG_COMPONENT_DEFINE(
"ndn.L3RateTracer");
40 static std::list<std::tuple<shared_ptr<std::ostream>, std::list<Ptr<L3RateTracer>>>>
52 std::list<Ptr<L3RateTracer>> tracers;
53 shared_ptr<std::ostream> outputStream;
55 shared_ptr<std::ofstream> os(
new std::ofstream());
56 os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
59 NS_LOG_ERROR(
"File " << file <<
" cannot be opened for writing. Tracing disabled");
66 outputStream = shared_ptr<std::ostream>(&std::cout, std::bind([]{}));
69 for (NodeList::Iterator node = NodeList::Begin(); node != NodeList::End(); node++) {
70 Ptr<L3RateTracer> trace =
Install(*node, outputStream, averagingPeriod);
71 tracers.push_back(trace);
74 if (tracers.size() > 0) {
76 tracers.front()->PrintHeader(*outputStream);
77 *outputStream <<
"\n";
80 g_tracers.push_back(std::make_tuple(outputStream, tracers));
85 Time averagingPeriod )
87 using namespace boost;
90 std::list<Ptr<L3RateTracer>> tracers;
91 shared_ptr<std::ostream> outputStream;
93 shared_ptr<std::ofstream> os(
new std::ofstream());
94 os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
97 NS_LOG_ERROR(
"File " << file <<
" cannot be opened for writing. Tracing disabled");
104 outputStream = shared_ptr<std::ostream>(&std::cout, std::bind([]{}));
107 for (NodeContainer::Iterator node = nodes.Begin(); node != nodes.End(); node++) {
108 Ptr<L3RateTracer> trace =
Install(*node, outputStream, averagingPeriod);
109 tracers.push_back(trace);
112 if (tracers.size() > 0) {
114 tracers.front()->PrintHeader(*outputStream);
115 *outputStream <<
"\n";
118 g_tracers.push_back(std::make_tuple(outputStream, tracers));
123 Time averagingPeriod )
125 using namespace boost;
128 std::list<Ptr<L3RateTracer>> tracers;
129 shared_ptr<std::ostream> outputStream;
131 shared_ptr<std::ofstream> os(
new std::ofstream());
132 os->open(file.c_str(), std::ios_base::out | std::ios_base::trunc);
134 if (!os->is_open()) {
135 NS_LOG_ERROR(
"File " << file <<
" cannot be opened for writing. Tracing disabled");
142 outputStream = shared_ptr<std::ostream>(&std::cout, std::bind([]{}));
145 Ptr<L3RateTracer> trace =
Install(node, outputStream, averagingPeriod);
146 tracers.push_back(trace);
148 if (tracers.size() > 0) {
150 tracers.front()->PrintHeader(*outputStream);
151 *outputStream <<
"\n";
154 g_tracers.push_back(std::make_tuple(outputStream, tracers));
159 Time averagingPeriod )
161 NS_LOG_DEBUG(
"Node: " << node->GetId());
163 Ptr<L3RateTracer> trace = Create<L3RateTracer>(outputStream, node);
164 trace->SetAveragingPeriod(averagingPeriod);
173 SetAveragingPeriod(Seconds(1.0));
180 SetAveragingPeriod(Seconds(1.0));
185 m_printEvent.Cancel();
189 L3RateTracer::SetAveragingPeriod(
const Time& period)
192 m_printEvent.Cancel();
193 m_printEvent = Simulator::Schedule(m_period, &L3RateTracer::PeriodicPrinter,
this);
197 L3RateTracer::PeriodicPrinter()
202 m_printEvent = Simulator::Schedule(m_period, &L3RateTracer::PeriodicPrinter,
this);
230 L3RateTracer::Reset()
232 for (
auto& stats : m_stats) {
233 std::get<0>(stats.second).Reset();
234 std::get<1>(stats.second).Reset();
240 #define STATS(INDEX) std::get<INDEX>(stats.second) 241 #define RATE(INDEX, fieldName) STATS(INDEX).fieldName / m_period.ToDouble(Time::S) 243 #define PRINTER(printName, fieldName) \ 244 STATS(2).fieldName = \ 245 alpha * RATE(0, fieldName) + (1 - alpha) * STATS(2).fieldName; \ 246 STATS(3).fieldName = alpha * RATE(1, fieldName) / 1024.0 \ 247 + (1 - alpha) * STATS(3).fieldName; \ 249 os << time.ToDouble(Time::S) << "\t" << m_node << "\t"; \ 250 if (stats.first != nfd::face::INVALID_FACEID) { \ 251 os << stats.first << "\t"; \ 252 NS_ASSERT(m_faceInfos.find(stats.first) != m_faceInfos.end()); \ 253 os << m_faceInfos.find(stats.first)->second << "\t"; \ 258 os << printName << "\t" << STATS(2).fieldName << "\t" << STATS(3).fieldName << "\t" \ 259 << STATS(0).fieldName << "\t" << STATS(1).fieldName / 1024.0 << "\n"; 264 Time
time = Simulator::Now();
266 for (
auto& stats : m_stats) {
270 PRINTER(
"InInterests", m_inInterests);
271 PRINTER(
"OutInterests", m_outInterests);
277 PRINTER(
"OutNacks", m_outNack);
279 PRINTER(
"InSatisfiedInterests", m_satisfiedInterests);
280 PRINTER(
"InTimedOutInterests", m_timedOutInterests);
282 PRINTER(
"OutSatisfiedInterests", m_outSatisfiedInterests);
283 PRINTER(
"OutTimedOutInterests", m_outTimedOutInterests);
288 if (i != m_stats.end()) {
290 PRINTER(
"SatisfiedInterests", m_satisfiedInterests);
291 PRINTER(
"TimedOutInterests", m_timedOutInterests);
300 std::get<0>(m_stats[face.getId()]).m_outInterests++;
301 if (interest.hasWire()) {
302 std::get<1>(m_stats[face.getId()]).m_outInterests +=
303 interest.wireEncode().size();
311 std::get<0>(m_stats[face.getId()]).m_inInterests++;
312 if (interest.hasWire()) {
313 std::get<1>(m_stats[face.getId()]).m_inInterests +=
314 interest.wireEncode().size();
322 std::get<0>(m_stats[face.getId()]).m_outData++;
323 if (data.hasWire()) {
324 std::get<1>(m_stats[face.getId()]).m_outData +=
325 data.wireEncode().size();
333 std::get<0>(m_stats[face.getId()]).m_inData++;
334 if (data.hasWire()) {
335 std::get<1>(m_stats[face.getId()]).m_inData +=
336 data.wireEncode().size();
344 std::get<0>(m_stats[face.getId()]).m_outNack++;
346 std::get<1>(m_stats[face.getId()]).m_outNack +=
355 std::get<0>(m_stats[face.getId()]).m_inNack++;
357 std::get<1>(m_stats[face.getId()]).m_inNack +=
369 AddInfo(in.getFace());
370 std::get<0>(m_stats[(in.getFace()).getId()]).m_satisfiedInterests ++;
374 AddInfo(out.getFace());
375 std::get<0>(m_stats[(out.getFace()).getId()]).m_outSatisfiedInterests ++;
386 AddInfo(in.getFace());
387 std::get<0>(m_stats[(in.getFace()).getId()]).m_timedOutInterests++;
391 AddInfo(out.getFace());
392 std::get<0>(m_stats[(out.getFace()).getId()]).m_outTimedOutInterests++;
397 L3RateTracer::AddInfo(
const Face&
face)
399 if (m_faceInfos.find(face.getId()) == m_faceInfos.end()) {
400 m_faceInfos.insert(make_pair(face.getId(), boost::lexical_cast<std::string>(face.getLocalUri())));
virtual ~L3RateTracer()
Destructor.
Copyright (c) 2011-2015 Regents of the University of California.
static void Destroy()
Explicit request to remove all statically created tracers.
Copyright (c) 2013-2017 Regents of the University of California.
virtual void Print(std::ostream &os) const
Print current trace data.
virtual void SatisfiedInterests(const nfd::pit::Entry &, const Face &, const Data &)
bool hasWire() const
Check if already has wire.
const Interest & getInterest() const
const InRecordCollection & getInRecords() const
virtual void OutNack(const lp::Nack &nack, const Face &face)
Base class for network-layer (incoming/outgoing Interests and Data) tracing of NDN stack...
represents a Network Nack
static std::list< std::tuple< shared_ptr< std::ostream >, std::list< Ptr< AppDelayTracer > > > > g_tracers
Copyright (c) 2011-2015 Regents of the University of California.
size_t wireEncode(EncodingImpl< TAG > &encoder) const
Fast encoding or block size estimation.
static void Install(const NodeContainer &nodes, const std::string &file, Time averagingPeriod=Seconds(0.5))
Helper method to install tracers on the selected simulation nodes.
virtual void InInterests(const Interest &interest, const Face &face)
virtual void OutData(const Data &data, const Face &face)
virtual void TimedOutInterests(const nfd::pit::Entry &)
#define PRINTER(printName, fieldName)
virtual void PrintHeader(std::ostream &os) const
Print head of the trace (e.g., for post-processing)
L3RateTracer(shared_ptr< std::ostream > os, Ptr< Node > node)
Trace constructor that attaches to the node using node pointer.
static void InstallAll(const std::string &file, Time averagingPeriod=Seconds(0.5))
Helper method to install tracers on all simulation nodes.
const FaceId INVALID_FACEID
indicates an invalid FaceId
const OutRecordCollection & getOutRecords() const
virtual void OutInterests(const Interest &interest, const Face &face)
virtual void InNack(const lp::Nack &nack, const Face &face)
virtual void InData(const Data &data, const Face &face)