utils: Porting several new IPv4 tracers from the old code. Extending ndn-app-delay-tracer
diff --git a/utils/tracers/ipv4-app-tracer.cc b/utils/tracers/ipv4-app-tracer.cc
index 57fb612..75c8b87 100644
--- a/utils/tracers/ipv4-app-tracer.cc
+++ b/utils/tracers/ipv4-app-tracer.cc
@@ -31,10 +31,9 @@
using namespace boost;
namespace ns3 {
-
-Ipv4AppTracer::Ipv4AppTracer (Ptr<Node> node, const std::string &appId)
- : m_appId (appId)
- , m_nodePtr (node)
+
+Ipv4AppTracer::Ipv4AppTracer (Ptr<Node> node)
+ : m_nodePtr (node)
{
m_node = boost::lexical_cast<string> (m_nodePtr->GetId ());
@@ -55,15 +54,6 @@
Config::Connect ("/NodeList/"+m_node+"/$ns3::Ipv4L3Protocol/LocalDeliver",
MakeCallback (&Ipv4AppTracer::Rx, this));
-
- // Config::Connect ("/NodeList/"+m_node+"/$ns3::Ipv4L3Protocol/Tx",
- // MakeCallback (&Ipv4AppTracer::Rx, this));
-
- // Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$ns3::PacketSink/Rx",
- // MakeCallback (&Ipv4AppTracer::InData, this));
-
- // Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$ns3::BulkSendApplication/Tx",
- // MakeCallback (&Ipv4AppTracer::OutData, this));
}
diff --git a/utils/tracers/ipv4-app-tracer.h b/utils/tracers/ipv4-app-tracer.h
index f24c6c3..0322d96 100644
--- a/utils/tracers/ipv4-app-tracer.h
+++ b/utils/tracers/ipv4-app-tracer.h
@@ -32,7 +32,7 @@
class Ipv4AppTracer : public SimpleRefCount<Ipv4AppTracer>
{
public:
- Ipv4AppTracer (Ptr<Node> node, const std::string &appId = "*");
+ Ipv4AppTracer (Ptr<Node> node);
virtual ~Ipv4AppTracer () { };
void
@@ -40,21 +40,19 @@
virtual void
PrintHeader (std::ostream &os) const = 0;
-
+
virtual void
Print (std::ostream &os) const = 0;
virtual void
Rx (std::string context,
const Ipv4Header &, Ptr<const Packet>, uint32_t) = 0;
-
+
virtual void
Tx (std::string context,
const Ipv4Header &, Ptr<const Packet>, uint32_t) = 0;
-
+
protected:
- std::string m_app;
- std::string m_appId;
std::string m_node;
Ptr<Node> m_nodePtr;
};
diff --git a/utils/tracers/ipv4-seqs-app-tracer.cc b/utils/tracers/ipv4-seqs-app-tracer.cc
index 3147ed0..170f280 100644
--- a/utils/tracers/ipv4-seqs-app-tracer.cc
+++ b/utils/tracers/ipv4-seqs-app-tracer.cc
@@ -24,19 +24,60 @@
#include "ns3/config.h"
#include "ns3/callback.h"
#include "ns3/simulator.h"
+#include "ns3/node-list.h"
+#include "ns3/node.h"
+#include "ns3/log.h"
#include "ns3/tcp-l4-protocol.h"
#include "ns3/tcp-header.h"
#include "ns3/ipv4-header.h"
+#include <boost/lexical_cast.hpp>
+#include <fstream>
+
+NS_LOG_COMPONENT_DEFINE ("Ipv4SeqsAppTracer");
+
+using namespace boost;
+using namespace std;
+
namespace ns3 {
-
-Ipv4SeqsAppTracer::Ipv4SeqsAppTracer (std::ostream &os, Ptr<Node> node, const std::string &appId)
- : Ipv4AppTracer (node, appId)
+
+Ipv4SeqsAppTracer::Ipv4SeqsAppTracer (boost::shared_ptr<std::ostream> os, Ptr<Node> node)
+ : Ipv4AppTracer (node)
, m_os (os)
{
}
+boost::tuple< boost::shared_ptr<std::ostream>, std::list<Ptr<Ipv4SeqsAppTracer> > >
+Ipv4SeqsAppTracer::InstallAll (const std::string &file)
+{
+ std::list<Ptr<Ipv4SeqsAppTracer> > tracers;
+ boost::shared_ptr<std::ofstream> outputStream (new std::ofstream ());
+ outputStream->open (file.c_str (), std::ios_base::out | std::ios_base::trunc);
+
+ if (!outputStream->is_open ())
+ return boost::make_tuple (outputStream, tracers);
+
+ for (NodeList::Iterator node = NodeList::Begin ();
+ node != NodeList::End ();
+ node++)
+ {
+ NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
+
+ Ptr<Ipv4SeqsAppTracer> trace = Create<Ipv4SeqsAppTracer> (outputStream, *node);
+ tracers.push_back (trace);
+ }
+
+ if (tracers.size () > 0)
+ {
+ // *m_l3RateTrace << "# "; // not necessary for R's read.table
+ tracers.front ()->PrintHeader (*outputStream);
+ *outputStream << "\n";
+ }
+
+ return boost::make_tuple (outputStream, tracers);
+}
+
void
Ipv4SeqsAppTracer::Reset ()
{
@@ -47,8 +88,6 @@
{
os << "Time\t"
<< "Node\t"
- << "AppName\t"
- << "AppId\t"
<< "Type\t"
<< "SeqNo";
}
@@ -59,13 +98,11 @@
}
#define PRINTER(type,size) \
- m_os \
+ *m_os \
<< Simulator::Now ().ToDouble (Time::S) << "\t" \
<< m_node << "\t" \
- << m_app << "\t" \
- << m_appId << "\t" \
<< type << "\t" \
- << size / 1040.0 << std::endl;
+ << static_cast<uint32_t> (size / 1040.0) << std::endl;
void
Ipv4SeqsAppTracer::Tx (std::string context,
@@ -86,25 +123,11 @@
if (tcp.GetFlags () | TcpHeader::ACK)
{
- PRINTER("InAck", tcp.GetAckNumber ().GetValue ());
+ if (tcp.GetAckNumber ().GetValue () > 1000) // a little bit more cheating
+ {
+ PRINTER("InAck", tcp.GetAckNumber ().GetValue ());
+ }
}
}
-
-
-// void
-// Ipv4SeqsAppTracer::InData (std::string context,
-// Ptr<const Packet> packet, const Address &address)
-// {
-// PRINTER ("InData", m_inSeq);
-// m_inSeq += packet->GetSize ();
-// }
-
-// void
-// Ipv4SeqsAppTracer::OutData (std::string context,
-// Ptr<const Packet> packet)
-// {
-// PRINTER ("OutData", m_outSeq);
-// m_outSeq += packet->GetSize ();
-// }
} // namespace ns3
diff --git a/utils/tracers/ipv4-seqs-app-tracer.h b/utils/tracers/ipv4-seqs-app-tracer.h
index 9ae24ac..5baa9f5 100644
--- a/utils/tracers/ipv4-seqs-app-tracer.h
+++ b/utils/tracers/ipv4-seqs-app-tracer.h
@@ -22,15 +22,30 @@
#define IPV4_SEQS_APP_TRACER_H
#include "ipv4-app-tracer.h"
+#include <boost/shared_ptr.hpp>
+#include <boost/tuple/tuple.hpp>
namespace ns3 {
class Ipv4SeqsAppTracer : public Ipv4AppTracer
{
public:
- Ipv4SeqsAppTracer (std::ostream &os, Ptr<Node> node, const std::string &appId = "*");
+ Ipv4SeqsAppTracer (boost::shared_ptr<std::ostream> os, Ptr<Node> node);
virtual ~Ipv4SeqsAppTracer () { };
+ /**
+ * @brief Helper method to install tracers on all simulation nodes
+ *
+ * @param file File to which traces will be written
+ *
+ * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This tuple needs to be preserved
+ * for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+ *
+ */
+ static boost::tuple< boost::shared_ptr<std::ostream>, std::list<Ptr<Ipv4SeqsAppTracer> > >
+ InstallAll (const std::string &file);
+
+
virtual void
PrintHeader (std::ostream &os) const;
@@ -50,7 +65,7 @@
Reset ();
protected:
- std::ostream& m_os;
+ boost::shared_ptr<std::ostream> m_os;
};
} // namespace ns3
diff --git a/utils/tracers/ndn-app-delay-tracer.cc b/utils/tracers/ndn-app-delay-tracer.cc
index 3893d33..d659247 100644
--- a/utils/tracers/ndn-app-delay-tracer.cc
+++ b/utils/tracers/ndn-app-delay-tracer.cc
@@ -50,7 +50,7 @@
{
using namespace boost;
using namespace std;
-
+
std::list<Ptr<AppDelayTracer> > tracers;
boost::shared_ptr<std::ofstream> outputStream = make_shared<std::ofstream> ();
@@ -122,7 +122,8 @@
void
AppDelayTracer::PrintHeader (std::ostream &os) const
{
- os << "Node" << "\t"
+ os << "Time" << "\t"
+ << "Node" << "\t"
<< "AppId" << "\t"
<< "SeqNo" << "\t"
@@ -133,10 +134,11 @@
<< "HopCount" << "";
}
-void
+void
AppDelayTracer::LastRetransmittedInterestDataDelay (Ptr<App> app, uint32_t seqno, Time delay, int32_t hopCount)
{
- *m_os << m_node << "\t"
+ *m_os << Simulator::Now ().ToDouble (Time::S) << "\t"
+ << m_node << "\t"
<< app->GetId () << "\t"
<< seqno << "\t"
<< "LastDelay" << "\t"
@@ -145,11 +147,12 @@
<< 1 << "\t"
<< hopCount << "\n";
}
-
-void
+
+void
AppDelayTracer::FirstInterestDataDelay (Ptr<App> app, uint32_t seqno, Time delay, uint32_t retxCount, int32_t hopCount)
{
- *m_os << m_node << "\t"
+ *m_os << Simulator::Now ().ToDouble (Time::S) << "\t"
+ << m_node << "\t"
<< app->GetId () << "\t"
<< seqno << "\t"
<< "FullDelay" << "\t"