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"