Enabling app-layer tracing

Network-layer tracing is not working yet (needs a couple of attributes
to be implemented)
diff --git a/examples/abilene-topology.cc b/examples/abilene-topology.cc
index c0c1f16..8c83930 100644
--- a/examples/abilene-topology.cc
+++ b/examples/abilene-topology.cc
@@ -26,25 +26,27 @@
 #include "ns3/point-to-point-grid.h"
 #include "ns3/ipv4-global-routing-helper.h"
 #include "ns3/animation-interface.h"
-#include "ns3/ccnx-l3-protocol.h"
+// #include "ns3/ccnx-l3-protocol.h"
 
 #include <iostream>
 #include <sstream>
 #include "ns3/annotated-topology-reader.h"
 #include "../utils/spring-mobility-helper.h"
 
+#include "ns3/config-store.h"
+
 using namespace ns3;
 using namespace std;
 
 NS_LOG_COMPONENT_DEFINE ("CcnxAbileneTopology");
 
-int transmittedInterests = 0;
-int receivedInterests = 0;
-int droppedInterests = 0;
+// int transmittedInterests = 0;
+// int receivedInterests = 0;
+// int droppedInterests = 0;
 
-int transmittedData = 0;
-int receivedData = 0;
-int droppedData = 0;
+// int transmittedData = 0;
+// int receivedData = 0;
+// int droppedData = 0;
 
 void PrintTime ()
 {
@@ -69,49 +71,118 @@
     }
 }
 
-static void OnTransmittedInterest (std::string context, Ptr<const CcnxInterestHeader> header, 
-                                   Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
+
+struct AggregateTrace
 {
-  transmittedInterests++;
+  AggregateTrace ()
+    : m_transmittedInterests (0)
+    , m_transmittedData (0)
+    , m_receivedInterests (0)
+    , m_receivedNacks (0)
+    , m_receivedData (0)
+  {
+  }
+  
+  void
+  TransmittedInterests (std::string context,
+                        Ptr<const CcnxInterestHeader>, Ptr<CcnxApp>, Ptr<CcnxFace>)
+  {
+    m_transmittedInterests++;
+  }
+
+  void
+  TransmittedData (std::string context,
+                   Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
+                   Ptr<CcnxApp>, Ptr<CcnxFace>)
+  {
+    m_transmittedData++;
+  }
+
+  void
+  ReceivedInterests (std::string context,
+                     Ptr<const CcnxInterestHeader>,
+                     Ptr<CcnxApp>, Ptr<CcnxFace>)
+  {
+    m_receivedInterests++;
+  }
+
+  void
+  ReceivedNacks (std::string context,
+                 Ptr<const CcnxInterestHeader>,
+                 Ptr<CcnxApp>, Ptr<CcnxFace>)
+  {
+    m_receivedNacks++;
+  }
+  
+  void
+  ReceivedData (std::string context,
+                Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
+                Ptr<CcnxApp>, Ptr<CcnxFace>)
+  {
+    m_receivedData++;
+  }
+
+  uint64_t m_transmittedInterests;
+  uint64_t m_transmittedData;
+  uint64_t m_receivedInterests;
+  uint64_t m_receivedNacks;
+  uint64_t m_receivedData;
+};
+
+ostream&
+operator << (ostream &os, const AggregateTrace &trace)
+{
+  os << ">> (i): " << trace.m_transmittedInterests << "\n";
+  os << ">> (d): " << trace.m_transmittedData << "\n";
+  os << "<< (i): " << trace.m_receivedInterests << "\n";
+  os << "<< (d): " << trace.m_receivedData << "\n";
+  os << "<< (n): " << trace.m_receivedNacks << "\n";
+  return os;
 }
 
-static void OnReceivedInterest (std::string context, Ptr<const CcnxInterestHeader> header, 
-                                Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-{
-  receivedInterests++;
-}
+// static void OnTransmittedInterest (std::string context, Ptr<const CcnxInterestHeader> header, 
+//                                    Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
+// {
+//   transmittedInterests++;
+// }
 
-static void OnDroppedInterest (std::string context, Ptr<const CcnxInterestHeader> header, CcnxL3Protocol::DropReason reason,
-                               Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-{
-  droppedInterests++;
-}
+// static void OnReceivedInterest (std::string context, Ptr<const CcnxInterestHeader> header, 
+//                                 Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
+// {
+//   receivedInterests++;
+// }
 
-static void OnTransmittedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
-                               CcnxL3Protocol::ContentObjectSource source, Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-{
-    transmittedData++;    
-}
+// static void OnDroppedInterest (std::string context, Ptr<const CcnxInterestHeader> header, CcnxL3Protocol::DropReason reason,
+//                                Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
+// {
+//   droppedInterests++;
+// }
 
-static void OnReceivedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
-                            Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
-{
-    receivedData++;
-}
+// static void OnTransmittedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
+//                                CcnxL3Protocol::ContentObjectSource source, Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
+// {
+//     transmittedData++;    
+// }
 
-static void OnDroppedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
-                           CcnxL3Protocol::DropReason reason, Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face )
-{
-    droppedData++;
-}
+// static void OnReceivedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
+//                             Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face)
+// {
+//     receivedData++;
+// }
+
+// static void OnDroppedData (std::string context, Ptr<const CcnxContentObjectHeader> header, Ptr<const Packet> packet,
+//                            CcnxL3Protocol::DropReason reason, Ptr<Ccnx> ccnx, Ptr<const CcnxFace> face )
+// {
+//     droppedData++;
+// }
 
 int 
 main (int argc, char *argv[])
 {
-  Packet::EnableChecking();
-  Packet::EnablePrinting();
+  // Packet::EnableChecking();
+  // Packet::EnablePrinting();
   string input ("./src/NDNabstraction/examples/abilene-topology.txt");
-    
+
   Time finishTime = Seconds (20.0);
   string animationFile;
   string strategy = "ns3::CcnxFloodingStrategy";
@@ -121,6 +192,9 @@
   cmd.AddValue ("strategy", "CCNx forwarding strategy", strategy);
   cmd.Parse (argc, argv);
     
+  ConfigStore config;
+  config.ConfigureDefaults ();
+    
   // ------------------------------------------------------------
   // -- Read topology data.
   // --------------------------------------------
@@ -137,13 +211,6 @@
       return -1;
     }
 
-  int droppedInterests[nodes.GetN()];
-  int congestedInterests[nodes.GetN()];
-  int sentInterests[nodes.GetN()];
-  (void)droppedInterests;
-  (void)sentInterests;
-  (void)congestedInterests;
-    
   SpringMobilityHelper::InstallSprings (reader.LinksBegin (), reader.LinksEnd ());
 
   // InternetStackHelper stack;
@@ -168,8 +235,8 @@
   CcnxConsumerHelper consumerHelper ("/5");
   ApplicationContainer consumers = consumerHelper.Install (Names::Find<Node> ("/abilene", "ATLAng"));
     
-  CcnxProducerHelper producerHelper ("/5",1024);
-  ApplicationContainer producers = producerHelper.Install (Names::Find<Node> ("/abilene", "IPLSng"));
+  // CcnxProducerHelper producerHelper ("/5",1024);
+  // ApplicationContainer producers = producerHelper.Install (Names::Find<Node> ("/abilene", "IPLSng"));
 
   // // Populate FIB based on IPv4 global routing controller
   // ccnxHelper.InstallFakeGlobalRoutes ();
@@ -178,7 +245,7 @@
   // Simulator::Schedule (Seconds (1.0), PrintFIBs);
   // PrintFIBs ();
 
-  Simulator::Schedule (Seconds (10.0), PrintTime);
+  // Simulator::Schedule (Seconds (10.0), PrintTime);
 
   Simulator::Stop (finishTime);
 
@@ -189,38 +256,50 @@
       anim->SetMobilityPollInterval (Seconds (1));
     }
 
-  NS_LOG_INFO ("Configure Tracing.");
-  // first, pcap tracing in non-promiscuous mode
-  //ccnxHelper.EnablePcapAll ("csma-ping", false);
-  // then, print what the packet sink receives.
-  //Config::ConnectWithoutContext ("/NodeList/3/ApplicationList/0/$ns3::PacketSink/Rx", 
-  //                                 MakeCallback (&SinkRx));
-  // finally, print the ping rtts.
-    //Packet::EnablePrinting ();
-  Config::Connect("/NodeList/*/ns3::CcnxL3Protocol/TransmittedInterestTrace",
-                                 MakeCallback (&OnTransmittedInterest));
-  Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/ReceivedInterestTrace",
-                     MakeCallback (&OnReceivedInterest));
-  Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/DroppedInterestTrace",
-                     MakeCallback (&OnDroppedInterest));
-    
-  Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/ReceivedDataTrace",
-                     MakeCallback (&OnReceivedData));
-  Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/TransmittedDataTrace",
-                     MakeCallback (&OnTransmittedData));
-  Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/DroppedDataTrace",
-                     MakeCallback (&OnDroppedData));
+  // NS_LOG_INFO ("Configure Tracing.");
+  AggregateTrace trace;
+  Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxConsumer/TransmittedInterests",
+                   MakeCallback (&AggregateTrace::TransmittedInterests, &trace));
 
+  Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxConsumer/ReceivedNacks",
+                   MakeCallback (&AggregateTrace::ReceivedNacks, &trace));
+
+  Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxProducer/ReceivedInterests",
+                   MakeCallback (&AggregateTrace::ReceivedInterests, &trace));
+  
+  Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxProducer/TransmittedContentObjects",
+                   MakeCallback (&AggregateTrace::TransmittedData, &trace));
+
+  Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::CcnxConsumer/ReceivedContentObjects",
+                   MakeCallback (&AggregateTrace::ReceivedData, &trace));
+
+  // Config::Connect("/NodeList/*/ns3::CcnxL3Protocol/TransmittedInterestTrace",
+  //                                MakeCallback (&OnTransmittedInterest));
+  // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/ReceivedInterestTrace",
+  //                    MakeCallback (&OnReceivedInterest));
+  // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/DroppedInterestTrace",
+  //                    MakeCallback (&OnDroppedInterest));
+    
+  // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/ReceivedDataTrace",
+  //                    MakeCallback (&OnReceivedData));
+  // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/TransmittedDataTrace",
+  //                    MakeCallback (&OnTransmittedData));
+  // Config::Connect ("/NodeList/*/ns3::CcnxL3Protocol/DroppedDataTrace",
+  //                    MakeCallback (&OnDroppedData));
+  
+  config.ConfigureAttributes ();  
+  
   NS_LOG_INFO ("Run Simulation.");
   Simulator::Run ();
   Simulator::Destroy ();
   NS_LOG_INFO ("Done.");
 
-  NS_LOG_INFO("Total received interests = " << receivedInterests);
-  NS_LOG_INFO("Total transmitted interests = " << transmittedInterests);
-  NS_LOG_INFO("Total dropped interests = " << droppedInterests);
-  NS_LOG_INFO("Total received data = " << receivedData);
-  NS_LOG_INFO("Total transmitted data = " << transmittedData);
-  NS_LOG_INFO("Total dropped data = " << droppedData);
+  // NS_LOG_INFO("Total received interests = " << receivedInterests);
+  // NS_LOG_INFO("Total transmitted interests = " << transmittedInterests);
+  // NS_LOG_INFO("Total dropped interests = " << droppedInterests);
+  // NS_LOG_INFO("Total received data = " << receivedData);
+  // NS_LOG_INFO("Total transmitted data = " << transmittedData);
+  // NS_LOG_INFO("Total dropped data = " << droppedData);
+  NS_LOG_INFO (trace);
   return 0;
 }