NetAnim: enable packet meta data
authorJohn Abraham <john.abraham@gatech.edu>
Mon, 19 Mar 2012 13:20:16 -0700
changeset 7769 ccd721b6a755
parent 7768 7d43ccc63a96
child 7770 a192064b0af6
NetAnim: enable packet meta data
src/netanim/model/animation-interface.cc
src/netanim/model/animation-interface.h
--- a/src/netanim/model/animation-interface.cc	Sun Mar 18 20:43:18 2012 +0100
+++ b/src/netanim/model/animation-interface.cc	Mon Mar 19 13:20:16 2012 -0700
@@ -61,7 +61,8 @@
   : m_fHandle (STDOUT_FILENO), m_xml (false), mobilitypollinterval (Seconds(0.25)),
     usingSockets (false), mport (0), outputfilename (""),
     OutputFileSet (false), ServerPortSet (false), gAnimUid (0),randomPosition (true),
-    m_writeCallback (0), m_started (false), m_enforceWifiMacRx (true)
+    m_writeCallback (0), m_started (false), m_enforceWifiMacRx (true),
+    m_enablePacketMetadata (false)
 {
   initialized = true;
   StartAnimation ();
@@ -71,7 +72,8 @@
   : m_fHandle (STDOUT_FILENO), m_xml (usingXML), mobilitypollinterval (Seconds(0.25)), 
     usingSockets (false), mport (0), outputfilename (fn),
     OutputFileSet (false), ServerPortSet (false), gAnimUid (0), randomPosition (true),
-    m_writeCallback (0), m_started (false), m_enforceWifiMacRx (true)
+    m_writeCallback (0), m_started (false), m_enforceWifiMacRx (true),
+    m_enablePacketMetadata (false)
 {
   initialized = true;
   StartAnimation ();
@@ -81,7 +83,8 @@
   : m_fHandle (STDOUT_FILENO), m_xml (usingXML), mobilitypollinterval (Seconds(0.25)), 
     usingSockets (true), mport (port), outputfilename (""),
     OutputFileSet (false), ServerPortSet (false), gAnimUid (0), randomPosition (true),
-    m_writeCallback (0), m_started (false), m_enforceWifiMacRx (true)
+    m_writeCallback (0), m_started (false), m_enforceWifiMacRx (true),
+    m_enablePacketMetadata (false)
 {
   initialized = true;
   StartAnimation ();
@@ -123,6 +126,13 @@
   return true;
 }
 
+void AnimationInterface::EnablePacketMetadata (bool enable)
+{
+   m_enablePacketMetadata = enable;
+   if (enable)
+     Packet::EnablePrinting ();
+}
+
 bool AnimationInterface::IsInitialized ()
 {
   return initialized;
@@ -642,8 +652,8 @@
   double lbRx = now.GetSeconds ();
   if (m_xml)
     {
-      oss << GetXMLOpen_packet (0,0,fbTx,lbTx,"DummyPktIgnoreThis");
-      oss << GetXMLOpenClose_rx (0,0,fbRx,lbRx);
+      oss << GetXMLOpen_packet (0, 0, fbTx, lbTx, "DummyPktIgnoreThis");
+      oss << GetXMLOpenClose_rx (0, 0, fbRx, lbRx);
       oss << GetXMLClose ("packet");
     }
   WriteN (m_fHandle, oss.str ());
@@ -666,8 +676,10 @@
   double lbRx = (now + rxTime).GetSeconds ();
   if (m_xml)
     {
-      oss << GetXMLOpen_packet (0,tx->GetNode ()->GetId (),fbTx,lbTx);
-      oss << GetXMLOpenClose_rx (0,rx->GetNode ()->GetId (),fbRx,lbRx); 
+      oss << GetXMLOpen_packet (0, tx->GetNode ()->GetId (), fbTx, lbTx);
+      oss << GetXMLOpenClose_rx (0, rx->GetNode ()->GetId (), fbRx, lbRx); 
+      if (m_enablePacketMetadata)
+        oss << GetXMLOpenClose_meta (GetPacketMetadata (p));
       oss << GetXMLClose ("packet");
     }
   else
@@ -794,7 +806,7 @@
   if (m_enforceWifiMacRx)
     return;
   pendingWifiPackets[AnimUid].ProcessRxEnd (ndev, Simulator::Now (), UpdatePosition (n));
-  OutputWirelessPacket (pendingWifiPackets[AnimUid], pendingWifiPackets[AnimUid].GetRxInfo (ndev));
+  OutputWirelessPacket (p, pendingWifiPackets[AnimUid], pendingWifiPackets[AnimUid].GetRxInfo (ndev));
 }
 
 
@@ -841,7 +853,7 @@
   if (pktrxInfo.IsPhyRxComplete ())
     {
       NS_LOG_INFO ("MacRxTrace for packet:" << AnimUid << " complete");
-      OutputWirelessPacket (pktInfo, pktrxInfo);
+      OutputWirelessPacket (p, pktInfo, pktrxInfo);
     }
 
 }
@@ -885,7 +897,7 @@
   pktInfo.ProcessRxEnd (ndev, Simulator::Now () + Seconds (0.001), UpdatePosition (n));
   //TODO 0.001 is used until Wimax implements RxBegin and RxEnd traces
   AnimRxInfo pktrxInfo = pktInfo.GetRxInfo (ndev);
-  OutputWirelessPacket (pktInfo, pktrxInfo);
+  OutputWirelessPacket (p, pktInfo, pktrxInfo);
 }
 
 void AnimationInterface::LteTxTrace (std::string context, Ptr<const Packet> p, const Mac48Address & m)
@@ -927,7 +939,7 @@
   pktInfo.ProcessRxEnd (ndev, Simulator::Now () + Seconds (0.001), UpdatePosition (n));
   //TODO 0.001 is used until Lte implements RxBegin and RxEnd traces
   AnimRxInfo pktrxInfo = pktInfo.GetRxInfo (ndev);
-  OutputWirelessPacket (pktInfo, pktrxInfo);
+  OutputWirelessPacket (p, pktInfo, pktrxInfo);
 }
 
 
@@ -1011,7 +1023,7 @@
   if (pktrxInfo.IsPhyRxComplete ())
     {
       NS_LOG_INFO ("MacRxTrace for packet:" << AnimUid << " complete");
-      OutputCsmaPacket (pktInfo, pktrxInfo);
+      OutputCsmaPacket (p, pktInfo, pktrxInfo);
     }
 }
 
@@ -1082,6 +1094,12 @@
     }
 }
 
+std::string AnimationInterface::GetPacketMetadata (Ptr<const Packet> p)
+{
+  std::ostringstream oss;
+  p->Print (oss);
+  return oss.str ();
+}
 
 // Helper to output a wireless packet.
 // For now, only the XML interface is supported
@@ -1134,7 +1152,7 @@
 return s;
 }
 
-void AnimationInterface::OutputWirelessPacket (AnimPacketInfo &pktInfo, AnimRxInfo pktrxInfo)
+void AnimationInterface::OutputWirelessPacket (Ptr<const Packet> p, AnimPacketInfo &pktInfo, AnimRxInfo pktrxInfo)
 {
   NS_ASSERT (m_xml);
   std::ostringstream oss;
@@ -1146,12 +1164,14 @@
 
   uint32_t rxId = pktrxInfo.m_rxnd->GetNode ()->GetId ();
   oss << GetXMLOpenClose_rx (0, rxId, pktrxInfo.m_fbRx, pktrxInfo.m_lbRx);
+  if (m_enablePacketMetadata)
+    oss << GetXMLOpenClose_meta (GetPacketMetadata (p));
 
   oss << GetXMLClose ("wpacket");
   WriteN (m_fHandle, oss.str ());
 }
 
-void AnimationInterface::OutputCsmaPacket (AnimPacketInfo &pktInfo, AnimRxInfo pktrxInfo)
+void AnimationInterface::OutputCsmaPacket (Ptr<const Packet> p, AnimPacketInfo &pktInfo, AnimRxInfo pktrxInfo)
 {
   NS_ASSERT (m_xml);
   std::ostringstream oss;
@@ -1161,6 +1181,8 @@
   oss << GetXMLOpen_packet (0, nodeId, pktInfo.m_fbTx, pktInfo.m_lbTx);
   uint32_t rxId = pktrxInfo.m_rxnd->GetNode ()->GetId ();
   oss << GetXMLOpenClose_rx (0, rxId, pktrxInfo.m_fbRx, pktrxInfo.m_lbRx);
+  if (m_enablePacketMetadata)
+    oss << GetXMLOpenClose_meta (GetPacketMetadata (p));
   oss << GetXMLClose ("packet");
   WriteN (m_fHandle, oss.str ());
 }
@@ -1251,6 +1273,14 @@
   return oss.str ();
 }
 
+std::string AnimationInterface::GetXMLOpenClose_meta (std::string metaInfo)
+{
+  std::ostringstream oss;
+  oss << "<meta info=\""
+      << metaInfo << " />" << std::endl;
+  return oss.str ();      
+}
+
 std::vector<std::string> AnimationInterface::GetElementsFromContext (std::string context)
 {
   std::vector <std::string> elements;
--- a/src/netanim/model/animation-interface.h	Sun Mar 18 20:43:18 2012 +0100
+++ b/src/netanim/model/animation-interface.h	Mon Mar 19 13:20:16 2012 -0700
@@ -225,6 +225,14 @@
    */
   void ShowAll802_11 (bool showAll); 
 
+  /**
+   *
+   * \brief Enable Packet metadata
+   * \param enable if true enables writing the packet metadata to the XML trace file
+   *        if false disables writing the packet metadata
+   */
+  void EnablePacketMetadata (bool enable);
+
 private:
 #ifndef WIN32
   int m_fHandle;  // File handle for output (-1 if none)
@@ -289,8 +297,8 @@
   // Write a string to the specified handle;
   int  WriteN (int, const std::string&);
 
-  void OutputWirelessPacket (AnimPacketInfo& pktInfo, AnimRxInfo pktrxInfo);
-  void OutputCsmaPacket (AnimPacketInfo& pktInfo, AnimRxInfo pktrxInfo);
+  void OutputWirelessPacket (Ptr<const Packet> p, AnimPacketInfo& pktInfo, AnimRxInfo pktrxInfo);
+  void OutputCsmaPacket (Ptr<const Packet> p, AnimPacketInfo& pktInfo, AnimRxInfo pktrxInfo);
   void MobilityAutoCheck ();
   
   uint64_t gAnimUid ;    // Packet unique identifier used by Animtion
@@ -336,6 +344,7 @@
 
   bool m_started;
   bool m_enforceWifiMacRx;
+  bool m_enablePacketMetadata; 
 
   // Path helper
   std::vector<std::string> GetElementsFromContext (std::string context);
@@ -349,6 +358,8 @@
   double topo_maxX;
   double topo_maxY;
 
+  std::string GetPacketMetadata (Ptr<const Packet> p);
+
   std::string GetXMLOpen_anim (uint32_t lp);
   std::string GetXMLOpen_topology (double minX,double minY,double maxX,double maxY);
   std::string GetXMLOpenClose_node (uint32_t lp,uint32_t id,double locX,double locY);
@@ -357,6 +368,7 @@
   std::string GetXMLOpenClose_rx (uint32_t toLp, uint32_t toId, double fbRx, double lbRx);
   std::string GetXMLOpen_wpacket (uint32_t fromLp,uint32_t fromId, double fbTx, double lbTx, double range);
   std::string GetXMLClose (std::string name) {return "</" + name + ">\n"; }
+  std::string GetXMLOpenClose_meta (std::string metaInfo);
 
 };