NetAnim: Tentative support for LTE

This commit is contained in:
John Abraham
2012-03-07 05:49:01 -08:00
parent 91a0402e0d
commit 64c53bbd2a
2 changed files with 101 additions and 1 deletions

View File

@@ -192,6 +192,11 @@ bool AnimationInterface::WimaxPacketIsPending (uint64_t AnimUid)
return (pendingWimaxPackets.find (AnimUid) != pendingWimaxPackets.end ());
}
bool AnimationInterface::LtePacketIsPending (uint64_t AnimUid)
{
return (pendingLtePackets.find (AnimUid) != pendingLtePackets.end ());
}
void AnimationInterface::SetMobilityPollInterval (Time t)
{
mobilitypollinterval = t;
@@ -297,6 +302,33 @@ void AnimationInterface::PurgePendingWimax ()
}
void AnimationInterface::PurgePendingLte ()
{
if (pendingLtePackets.empty ())
return;
std::vector <uint64_t> purgeList;
for (std::map<uint64_t, AnimPacketInfo>::iterator i = pendingLtePackets.begin ();
i != pendingLtePackets.end ();
++i)
{
AnimPacketInfo pktInfo = i->second;
double delta = (Simulator::Now ().GetSeconds () - pktInfo.m_fbTx);
if (delta > PURGE_INTERVAL)
{
purgeList.push_back (i->first);
}
}
for (std::vector <uint64_t>::iterator i = purgeList.begin ();
i != purgeList.end ();
++i)
{
pendingLtePackets.erase (*i);
}
}
void AnimationInterface::PurgePendingCsma ()
{
if (pendingCsmaPackets.empty ())
@@ -459,6 +491,10 @@ void AnimationInterface::ConnectCallbacks ()
MakeCallback (&AnimationInterface::WimaxTxTrace, this));
Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WimaxNetDevice/Rx",
MakeCallback (&AnimationInterface::WimaxRxTrace, this));
Config::Connect ("/NodeList/*/DeviceList/*/$ns3::LteNetDevice/Tx",
MakeCallback (&AnimationInterface::LteTxTrace, this));
Config::Connect ("/NodeList/*/DeviceList/*/$ns3::LteNetDevice/Rx",
MakeCallback (&AnimationInterface::LteRxTrace, this));
Config::Connect ("/NodeList/*/DeviceList/*/$ns3::CsmaNetDevice/PhyTxBegin",
MakeCallback (&AnimationInterface::CsmaPhyTxBeginTrace, this));
Config::Connect ("/NodeList/*/DeviceList/*/$ns3::CsmaNetDevice/PhyTxEnd",
@@ -670,6 +706,11 @@ void AnimationInterface::AddPendingWimaxPacket (uint64_t AnimUid, AnimPacketInfo
pendingWimaxPackets[AnimUid] = pktinfo;
}
void AnimationInterface::AddPendingLtePacket (uint64_t AnimUid, AnimPacketInfo &pktinfo)
{
NS_ASSERT (pktinfo.m_txnd);
pendingLtePackets[AnimUid] = pktinfo;
}
void AnimationInterface::AddPendingCsmaPacket (uint64_t AnimUid, AnimPacketInfo &pktinfo)
{
@@ -826,6 +867,7 @@ void AnimationInterface::WimaxRxTrace (std::string context, Ptr<const Packet> p,
Ptr <Node> n = ndev->GetNode ();
NS_ASSERT (n);
uint64_t AnimUid = GetAnimUidFromPacket (p);
NS_LOG_INFO ("WimaxRxTrace for packet:" << gAnimUid);
NS_ASSERT (WimaxPacketIsPending (AnimUid) == true);
AnimPacketInfo& pktInfo = pendingWimaxPackets[AnimUid];
pktInfo.ProcessRxBegin (ndev, Simulator::Now ());
@@ -835,6 +877,49 @@ void AnimationInterface::WimaxRxTrace (std::string context, Ptr<const Packet> p,
OutputWirelessPacket (pktInfo, pktrxInfo);
}
void AnimationInterface::LteTxTrace (std::string context, Ptr<const Packet> p, const Mac48Address & m)
{
if (!m_started)
return;
Ptr <NetDevice> ndev = GetNetDeviceFromContext (context);
NS_ASSERT (ndev);
Ptr <Node> n = ndev->GetNode ();
NS_ASSERT (n);
gAnimUid++;
NS_LOG_INFO ("LteTxTrace for packet:" << gAnimUid);
AnimPacketInfo pktinfo (ndev, Simulator::Now (), Simulator::Now () + Seconds (0.001), UpdatePosition (n));
//TODO 0.0001 is used until Lte implements TxBegin and TxEnd traces
AnimByteTag tag;
tag.Set (gAnimUid);
p->AddByteTag (tag);
AddPendingLtePacket (gAnimUid, pktinfo);
}
void AnimationInterface::LteRxTrace (std::string context, Ptr<const Packet> p, const Mac48Address & m)
{
if (!m_started)
return;
Ptr <NetDevice> ndev = GetNetDeviceFromContext (context);
NS_ASSERT (ndev);
Ptr <Node> n = ndev->GetNode ();
NS_ASSERT (n);
uint64_t AnimUid = GetAnimUidFromPacket (p);
NS_LOG_INFO ("LteRxTrace for packet:" << gAnimUid);
if (!LtePacketIsPending (AnimUid))
{
NS_LOG_WARN ("LteRxTrace: unknown Uid");
return;
}
AnimPacketInfo& pktInfo = pendingLtePackets[AnimUid];
pktInfo.ProcessRxBegin (ndev, Simulator::Now ());
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);
}
void AnimationInterface::CsmaPhyTxBeginTrace (std::string context, Ptr<const Packet> p)
{
if (!m_started)
@@ -980,6 +1065,7 @@ void AnimationInterface::MobilityAutoCheck ()
{
PurgePendingWifi ();
PurgePendingWimax ();
PurgePendingLte ();
PurgePendingCsma ();
Simulator::Schedule (mobilitypollinterval, &AnimationInterface::MobilityAutoCheck, this);
}

View File

@@ -208,7 +208,7 @@ public:
* \param z Z co-ordinate of the node
*
*/
void SetConstantPosition (Ptr <Node> n, double x, double y, double z=0);
static void SetConstantPosition (Ptr <Node> n, double x, double y, double z=0);
/**
* \brief Is AnimationInterface started
@@ -267,6 +267,15 @@ private:
Ptr<const Packet> p);
void CsmaMacRxTrace (std::string context,
Ptr<const Packet> p);
void LteTxTrace (std::string context,
Ptr<const Packet> p,
const Mac48Address &);
void LteRxTrace (std::string context,
Ptr<const Packet> p,
const Mac48Address &);
void MobilityCourseChangeTrace (Ptr <const MobilityModel> mob);
// Write a string to the specified handle;
@@ -286,6 +295,10 @@ private:
void AddPendingWimaxPacket (uint64_t AnimUid, AnimPacketInfo&);
bool WimaxPacketIsPending (uint64_t AnimUid);
std::map<uint64_t, AnimPacketInfo> pendingLtePackets;
void AddPendingLtePacket (uint64_t AnimUid, AnimPacketInfo&);
bool LtePacketIsPending (uint64_t AnimUid);
std::map<uint64_t, AnimPacketInfo> pendingCsmaPackets;
void AddPendingCsmaPacket (uint64_t AnimUid, AnimPacketInfo&);
bool CsmaPacketIsPending (uint64_t AnimUid);
@@ -302,6 +315,7 @@ private:
void PurgePendingWifi ();
void PurgePendingWimax ();
void PurgePendingLte ();
void PurgePendingCsma ();
// Recalculate topology bounds