Fixes Click bug from using microsecond precision for scheduling click events
authorSascha Alexander Jopen
Fri, 30 Dec 2011 18:45:18 +0100
changeset 7668 e87369a823eb
parent 7667 42dda4375d79
child 7669 09c7110e277d
Fixes Click bug from using microsecond precision for scheduling click events
src/click/model/ipv4-click-routing.cc
src/click/model/ipv4-click-routing.h
--- a/src/click/model/ipv4-click-routing.cc	Fri Dec 30 15:37:31 2011 +0000
+++ b/src/click/model/ipv4-click-routing.cc	Fri Dec 30 18:45:18 2011 +0100
@@ -256,11 +256,48 @@
   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 @@
 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
--- a/src/click/model/ipv4-click-routing.h	Fri Dec 30 15:37:31 2011 +0000
+++ b/src/click/model/ipv4-click-routing.h	Fri Dec 30 18:45:18 2011 +0100
@@ -181,6 +181,11 @@
   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
    */
   void RunClickEvent ();