From 8065a03fdd78735aa8f2ecb12966c74f84f3b966 Mon Sep 17 00:00:00 2001 From: Sascha Alexander Jopen Date: Fri, 30 Dec 2011 18:45:18 +0100 Subject: [PATCH 1/2] Fixes Click bug from using microsecond precision for scheduling click events --- src/click/model/ipv4-click-routing.cc | 44 ++++++++++++++++++++++++--- src/click/model/ipv4-click-routing.h | 5 +++ 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/click/model/ipv4-click-routing.cc b/src/click/model/ipv4-click-routing.cc index 374e0e304..faf74292e 100644 --- a/src/click/model/ipv4-click-routing.cc +++ b/src/click/model/ipv4-click-routing.cc @@ -256,11 +256,48 @@ Ipv4ClickRouting::GetClickInstanceFromSimNode (simclick_node_t *simnode) return m_clickInstanceFromSimNode[simnode]; } +struct timeval +Ipv4ClickRouting::GetTimevalFromNow () const +{ + struct timeval curtime; + uint64_t remainder = 0; + + curtime.tv_sec = Simulator::Now ().GetSeconds (); + curtime.tv_usec = Simulator::Now ().GetMicroSeconds () % 1000000; + + switch (Simulator::Now ().GetResolution()) + { + case Time::NS: + remainder = Simulator::Now ().GetNanoSeconds () % 1000; + break; + case Time::PS: + remainder = Simulator::Now ().GetPicoSeconds () % 1000000; + break; + case Time::FS: + remainder = Simulator::Now ().GetFemtoSeconds () % 1000000000; + break; + default: + break; + } + + if (remainder) + { + ++curtime.tv_usec; + if (curtime.tv_usec == 1000000) + { + ++curtime.tv_sec; + curtime.tv_usec = 0; + } + } + + return curtime; +} + void Ipv4ClickRouting::RunClickEvent () { - m_simNode->curtime.tv_sec = Simulator::Now ().GetSeconds (); - m_simNode->curtime.tv_usec = Simulator::Now ().GetMicroSeconds () % 1000000; + m_simNode->curtime = GetTimevalFromNow (); + NS_LOG_DEBUG ("RunClickEvent at " << m_simNode->curtime.tv_sec << " " << m_simNode->curtime.tv_usec << " " << Simulator::Now ()); simclick_click_run (m_simNode); @@ -311,8 +348,7 @@ void Ipv4ClickRouting::SendPacketToClick (int ifid, int ptype, const unsigned char* data, int len) { NS_LOG_FUNCTION (this << ifid); - m_simNode->curtime.tv_sec = Simulator::Now ().GetSeconds (); - m_simNode->curtime.tv_usec = Simulator::Now ().GetMicroSeconds () % 1000000; + m_simNode->curtime = GetTimevalFromNow (); // Since packets in ns-3 don't have global Packet ID's and Flow ID's, we // feed dummy values into pinfo. This avoids the need to make changes in the Click code diff --git a/src/click/model/ipv4-click-routing.h b/src/click/model/ipv4-click-routing.h index d15be9339..bce625be3 100644 --- a/src/click/model/ipv4-click-routing.h +++ b/src/click/model/ipv4-click-routing.h @@ -180,6 +180,11 @@ private: */ void AddSimNodeToClickMapping (); + /** + * \brief Get current simulation time as a timeval + */ + struct timeval GetTimevalFromNow () const; + /** * \brief This method has to be scheduled everytime Click calls SIMCLICK_SCHEDULE */ From b015a80073b9ac07716b37511d62944e00127010 Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Fri, 30 Dec 2011 15:39:36 -0800 Subject: [PATCH 2/2] align test.py with waf-1.6.10 changes --- test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test.py b/test.py index 7fee5e8fb..ec4ca4847 100755 --- a/test.py +++ b/test.py @@ -500,7 +500,7 @@ def sigint_hook(signal, frame): # and use that result. # def read_waf_config(): - for line in open(".lock-wafbuild", "rt"): + for line in open(".lock-waf_" + sys.platform + "_build", "rt"): if line.startswith("out_dir ="): key, val = line.split('=') out_dir = eval(val.strip())