Bug 2190 - Add LrWpan support to NetAnim
authorTommaso Pecorella <tommaso.pecorella@unifi.it>
Sun, 12 Mar 2017 14:16:09 +0100
changeset 12762 2d47f478b889
parent 12761 637ded88b485
child 12763 7236a2c72b37
Bug 2190 - Add LrWpan support to NetAnim
src/lr-wpan/model/lr-wpan-phy.cc
src/netanim/model/animation-interface.cc
src/netanim/model/animation-interface.h
src/netanim/wscript
--- a/src/lr-wpan/model/lr-wpan-phy.cc	Sat Mar 11 21:49:29 2017 -0800
+++ b/src/lr-wpan/model/lr-wpan-phy.cc	Sun Mar 12 14:16:09 2017 +0100
@@ -546,6 +546,10 @@
           LrWpanLqiTag lqiTag;
           p->RemovePacketTag (lqiTag);
 
+          m_phyTxBeginTrace (p);
+          m_currentTxPacket.first = p;
+          m_currentTxPacket.second = false;
+
           Ptr<LrWpanSpectrumSignalParameters> txParams = Create<LrWpanSpectrumSignalParameters> ();
           txParams->duration = CalculateTxTime (p);
           txParams->txPhy = GetObject<SpectrumPhy> ();
@@ -557,9 +561,6 @@
           m_channel->StartTx (txParams);
           m_pdDataRequest = Simulator::Schedule (txParams->duration, &LrWpanPhy::EndTx, this);
           ChangeTrxState (IEEE_802_15_4_PHY_BUSY_TX);
-          m_phyTxBeginTrace (p);
-          m_currentTxPacket.first = p;
-          m_currentTxPacket.second = false;
           return;
         }
       else if ((m_trxState == IEEE_802_15_4_PHY_RX_ON)
--- a/src/netanim/model/animation-interface.cc	Sat Mar 11 21:49:29 2017 -0800
+++ b/src/netanim/model/animation-interface.cc	Sun Mar 12 14:16:09 2017 +0100
@@ -44,6 +44,8 @@
 #include "ns3/wimax-mac-header.h"
 #include "ns3/wifi-net-device.h"
 #include "ns3/wifi-mac.h"
+#include "ns3/lr-wpan-mac-header.h"
+#include "ns3/lr-wpan-net-device.h"
 #include "ns3/constant-position-mobility-model.h"
 #include "ns3/lte-ue-phy.h"
 #include "ns3/lte-enb-phy.h"
@@ -454,6 +456,7 @@
       PurgePendingPackets (AnimationInterface::WIMAX);
       PurgePendingPackets (AnimationInterface::LTE);
       PurgePendingPackets (AnimationInterface::CSMA);
+      PurgePendingPackets (AnimationInterface::LRWPAN);
       Simulator::Schedule (m_mobilityPollInterval, &AnimationInterface::MobilityAutoCheck, this);
     }
 }
@@ -691,6 +694,34 @@
 }
 
 void
+AnimationInterface::LrWpanMacTxTrace (std::string context, Ptr<const Packet> p)
+{
+  const Ptr <const Node> node = GetNodeFromContext (context);
+  ++m_nodeLrWpanMacTx[node->GetId ()];
+}
+
+void
+AnimationInterface::LrWpanMacTxDropTrace (std::string context, Ptr<const Packet> p)
+{
+  const Ptr <const Node> node = GetNodeFromContext (context);
+  ++m_nodeLrWpanMacTxDrop[node->GetId ()];
+}
+
+void
+AnimationInterface::LrWpanMacRxTrace (std::string context, Ptr<const Packet> p)
+{
+  const Ptr <const Node> node = GetNodeFromContext (context);
+  ++m_nodeLrWpanMacRx[node->GetId ()];
+}
+
+void
+AnimationInterface::LrWpanMacRxDropTrace (std::string context, Ptr<const Packet> p)
+{
+  const Ptr <const Node> node = GetNodeFromContext (context);
+  ++m_nodeLrWpanMacRxDrop[node->GetId ()];
+}
+
+void
 AnimationInterface::Ipv4TxTrace (std::string context, Ptr<const Packet> p, Ptr<Ipv4> ipv4, uint32_t interfaceIndex)
 {
   const Ptr <const Node> node = GetNodeFromContext (context);
@@ -878,6 +909,87 @@
 }
 
 void 
+AnimationInterface::LrWpanPhyTxBeginTrace (std::string context,
+                                           Ptr<const Packet> p)
+{
+  if (!m_started || !IsInTimeWindow () || !m_trackPackets)
+    return;
+
+  Ptr <NetDevice> ndev = GetNetDeviceFromContext (context);
+  NS_ASSERT (ndev);
+  Ptr<LrWpanNetDevice> netDevice = DynamicCast<LrWpanNetDevice> (ndev);
+
+  Ptr <Node> n = ndev->GetNode ();
+  NS_ASSERT (n);
+
+  UpdatePosition (n);
+
+  LrWpanMacHeader hdr;
+  if (!p->PeekHeader (hdr))
+  {
+    NS_LOG_WARN ("LrWpanMacHeader not present");
+    return;
+  }
+
+  std::ostringstream oss;
+  if (hdr.GetSrcAddrMode () == 2)
+    {
+      Mac16Address nodeAddr = netDevice->GetMac ()->GetShortAddress ();
+      oss << nodeAddr;
+    }
+  else if (hdr.GetSrcAddrMode () == 3)
+    {
+      Mac64Address nodeAddr = netDevice->GetMac ()->GetExtendedAddress ();
+      oss << nodeAddr;
+    }
+  else
+    {
+      NS_LOG_WARN ("LrWpanMacHeader without source address");
+      return;
+    }
+  m_macToNodeIdMap[oss.str ()] = n->GetId ();
+  NS_LOG_INFO ("Added Mac" << oss.str () << " node:" <<m_macToNodeIdMap[oss.str ()]);
+
+  ++gAnimUid;
+  NS_LOG_INFO ("LrWpan TxBeginTrace for packet:" << gAnimUid);
+  AddByteTag (gAnimUid, p);
+
+  AnimPacketInfo pktInfo (ndev, Simulator::Now ());
+  AddPendingPacket (AnimationInterface::LRWPAN, gAnimUid, pktInfo);
+
+  OutputWirelessPacketTxInfo (p, m_pendingLrWpanPackets[gAnimUid], gAnimUid);
+}
+
+void
+AnimationInterface::LrWpanPhyRxBeginTrace (std::string context,
+                                           Ptr<const Packet> p)
+{
+  if (!m_started || !IsInTimeWindow () || !m_trackPackets)
+    return;
+  Ptr <NetDevice> ndev = GetNetDeviceFromContext (context);
+  NS_ASSERT (ndev);
+  Ptr <Node> n = ndev->GetNode ();
+  NS_ASSERT (n);
+
+  AnimByteTag tag;
+  if (!p->FindFirstMatchingByteTag (tag))
+    {
+      return;
+    }
+
+  uint64_t animUid = GetAnimUidFromPacket (p);
+  NS_LOG_INFO ("LrWpan RxBeginTrace for packet:" << animUid);
+  if (!IsPacketPending (animUid, AnimationInterface::LRWPAN))
+    {
+      NS_LOG_WARN ("LrWpanPhyRxBeginTrace: unknown Uid - most probably it's an ACK.");
+    }
+
+  UpdatePosition (n);
+  m_pendingLrWpanPackets[animUid].ProcessRxBegin (ndev, Simulator::Now ().GetSeconds ());
+  OutputWirelessPacketRxInfo (p, m_pendingLrWpanPackets[animUid], animUid);
+}
+
+void
 AnimationInterface::WimaxTxTrace (std::string context, Ptr<const Packet> p, const Mac48Address & m)
 {
   NS_LOG_FUNCTION (this);
@@ -1172,6 +1284,11 @@
           pendingPackets = &m_pendingLtePackets;
           break;
         }
+      case AnimationInterface::LRWPAN:
+        {
+          pendingPackets = &m_pendingLrWpanPackets;
+          break;
+        }
     }
   return pendingPackets;
 
@@ -1208,6 +1325,11 @@
           result = "LTE";
           break;
         }
+      case AnimationInterface::LRWPAN:
+        {
+          result = "LRWPAN";
+          break;
+        }
     }
   return result;
 }
@@ -1494,6 +1616,20 @@
                    MakeCallback (&AnimationInterface::WifiPhyTxDropTrace, this));
   Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyRxDrop",
                    MakeCallback (&AnimationInterface::WifiPhyRxDropTrace, this));
+
+  // LrWpan
+  Config::Connect ("NodeList/*/DeviceList/*/$ns3::LrWpanNetDevice/Phy/PhyTxBegin",
+                   MakeCallback (&AnimationInterface::LrWpanPhyTxBeginTrace, this));
+  Config::Connect ("NodeList/*/DeviceList/*/$ns3::LrWpanNetDevice/Phy/PhyRxBegin",
+                   MakeCallback (&AnimationInterface::LrWpanPhyRxBeginTrace, this));
+  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::LrWpanNetDevice/Mac/MacTx",
+                   MakeCallback (&AnimationInterface::LrWpanMacTxTrace, this));
+  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::LrWpanNetDevice/Mac/MacTxDrop",
+                   MakeCallback (&AnimationInterface::LrWpanMacTxDropTrace, this));
+  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::LrWpanNetDevice/Mac/MacRx",
+                   MakeCallback (&AnimationInterface::LrWpanMacRxTrace, this));
+  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::LrWpanNetDevice/Mac/MacRxDrop",
+                   MakeCallback (&AnimationInterface::LrWpanMacRxDropTrace, this));
 }
 
 Vector 
--- a/src/netanim/model/animation-interface.h	Sat Mar 11 21:49:29 2017 -0800
+++ b/src/netanim/model/animation-interface.h	Sun Mar 12 14:16:09 2017 +0100
@@ -497,7 +497,8 @@
       LTE,
       WIFI,
       WIMAX,
-      CSMA
+      CSMA,
+      LRWPAN
     } ProtocolType;
 
   typedef struct
@@ -590,6 +591,7 @@
   
   AnimUidPacketInfoMap m_pendingWifiPackets;
   AnimUidPacketInfoMap m_pendingWimaxPackets;
+  AnimUidPacketInfoMap m_pendingLrWpanPackets;
   AnimUidPacketInfoMap m_pendingLtePackets;
   AnimUidPacketInfoMap m_pendingCsmaPackets;
   AnimUidPacketInfoMap m_pendingUanPackets;
@@ -623,6 +625,10 @@
   NodeCounterMap64 m_nodeWifiMacRxDrop;
   NodeCounterMap64 m_nodeWifiPhyTxDrop;
   NodeCounterMap64 m_nodeWifiPhyRxDrop;
+  NodeCounterMap64 m_nodeLrWpanMacTx;
+  NodeCounterMap64 m_nodeLrWpanMacTxDrop;
+  NodeCounterMap64 m_nodeLrWpanMacRx;
+  NodeCounterMap64 m_nodeLrWpanMacRxDrop;
 
   const std::vector<std::string> GetElementsFromContext (const std::string& context) const;
   Ptr <Node> GetNodeFromContext (const std::string& context) const;
@@ -698,9 +704,17 @@
   void WifiMacRxDropTrace (std::string context,
                            Ptr<const Packet>);
   void WifiPhyTxDropTrace (std::string context,
-                       Ptr<const Packet>);
+                           Ptr<const Packet>);
   void WifiPhyRxDropTrace (std::string context,
-                       Ptr<const Packet>);
+                           Ptr<const Packet>);
+  void LrWpanMacTxTrace (std::string context,
+                         Ptr<const Packet>);
+  void LrWpanMacTxDropTrace (std::string context,
+                             Ptr<const Packet>);
+  void LrWpanMacRxTrace (std::string context,
+                         Ptr<const Packet>);
+  void LrWpanMacRxDropTrace (std::string context,
+                             Ptr<const Packet>);
   void DevTxTrace (std::string context,
                    Ptr<const Packet> p,
                    Ptr<NetDevice> tx,
@@ -711,9 +725,13 @@
                             Ptr<const Packet> p);
   void WifiPhyRxBeginTrace (std::string context,
                             Ptr<const Packet> p);
+  void LrWpanPhyTxBeginTrace (std::string context,
+                              Ptr<const Packet> p);
+  void LrWpanPhyRxBeginTrace (std::string context,
+                              Ptr<const Packet> p);
   void WimaxTxTrace (std::string context,
                      Ptr<const Packet> p,
-		     const Mac48Address &);
+                     const Mac48Address &);
   void WimaxRxTrace (std::string context,
                      Ptr<const Packet> p,
                      const Mac48Address &);
--- a/src/netanim/wscript	Sat Mar 11 21:49:29 2017 -0800
+++ b/src/netanim/wscript	Sun Mar 12 14:16:09 2017 +0100
@@ -6,7 +6,7 @@
 NETANIM_RELEASE_NAME = "netanim-3.108"
 
 def build (bld) :
-    module = bld.create_ns3_module ('netanim', ['internet', 'mobility', 'wimax', 'wifi', 'csma', 'lte', 'uan', 'energy'])
+    module = bld.create_ns3_module ('netanim', ['internet', 'mobility', 'wimax', 'wifi', 'csma', 'lte', 'uan', 'lr-wpan', 'energy'])
     module.includes = '.'
     module.source = [ 'model/animation-interface.cc', ]
     netanim_test = bld.create_ns3_module_test_library('netanim')