fix for bug451-- arp cache
authorTom Henderson <tomh@tomh.org>
Tue, 30 Dec 2008 11:35:31 -0800
changeset 4084 dd514b5e0bc6
parent 4083 5a5d8b94047a
child 4087 1c88eb82a9b0
child 4218 debf1a8a96d3
fix for bug451-- arp cache
src/internet-stack/arp-cache.cc
src/internet-stack/arp-cache.h
--- a/src/internet-stack/arp-cache.cc	Mon Jan 12 18:46:28 2009 +0000
+++ b/src/internet-stack/arp-cache.cc	Tue Dec 30 11:35:31 2008 -0800
@@ -185,7 +185,7 @@
   for (CacheI i = m_arpCache.begin (); i != m_arpCache.end (); i++) 
     {
       entry = (*i).second;
-      if (entry != 0 && entry->IsWaitReply () && entry->IsExpired ())
+      if (entry != 0 && entry->IsWaitReply () && entry->IsExpiring () )
           {
           if (entry->GetRetries () < m_maxRetries)
             {
@@ -358,37 +358,47 @@
   NS_LOG_FUNCTION (this << destination);
   m_ipv4Address = destination;
 }
-
-bool 
-ArpCache::Entry::IsExpired (void)
+Time
+ArpCache::Entry::GetTimeout (void) const
 {
-  NS_LOG_FUNCTION_NOARGS ();
-  Time timeout;
   switch (m_state) {
   case ArpCache::Entry::WAIT_REPLY:
-    timeout = m_arp->GetWaitReplyTimeout ();
-    break;
+    return m_arp->GetWaitReplyTimeout ();
   case ArpCache::Entry::DEAD:
-    timeout = m_arp->GetDeadTimeout ();
-    break;
+    return m_arp->GetDeadTimeout ();
   case ArpCache::Entry::ALIVE:
-    timeout = m_arp->GetAliveTimeout ();
-    break;
+    return m_arp->GetAliveTimeout ();
   default:
     NS_ASSERT (false);
-    timeout = Seconds (0);
+    return Seconds (0);
     /* NOTREACHED */
-    break;
   }
+}
+bool
+ArpCache::Entry::IsExpiring (void) const
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  Time timeout = GetTimeout ();
   Time delta = Simulator::Now () - m_lastSeen;
-  if (delta >= timeout) 
+  NS_LOG_DEBUG ("delta=" << delta.GetSeconds () << "s");
+  if (delta >= timeout)
+    {
+      return true;
+    }
+  return false;
+}
+bool 
+ArpCache::Entry::IsExpired (void) const
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  Time timeout = GetTimeout ();
+  Time delta = Simulator::Now () - m_lastSeen;
+  NS_LOG_DEBUG ("delta=" << delta.GetSeconds () << "s");
+  if (delta > timeout) 
     {
       return true;
     } 
-  else 
-    {
-      return false;
-    }
+  return false;
 }
 Ptr<Packet> 
 ArpCache::Entry::DequeuePending (void)
@@ -408,13 +418,13 @@
 void 
 ArpCache::Entry::UpdateSeen (void)
 {
-  NS_LOG_FUNCTION_NOARGS ();
+  NS_LOG_FUNCTION (m_macAddress << m_ipv4Address);
   m_lastSeen = Simulator::Now ();
 }
 uint32_t
 ArpCache::Entry::GetRetries (void) const
 {
-  NS_LOG_FUNCTION_NOARGS ();
+  NS_LOG_FUNCTION (m_macAddress << m_ipv4Address);
   return m_retries;
 }
 void
--- a/src/internet-stack/arp-cache.h	Mon Jan 12 18:46:28 2009 +0000
+++ b/src/internet-stack/arp-cache.h	Tue Dec 30 11:35:31 2008 -0800
@@ -160,9 +160,25 @@
      */
     void SetIpv4Address (Ipv4Address destination);
     /**
-     * \return True if this entry has timedout; false otherwise.
+     * \return True if this entry has timed out; false otherwise.
+     *
+     * This function returns true if the time elapsed strictly exceeds
+     * the timeout value (i.e., is not less than or equal to the timeout).
+     * Differs from IsExpiring() only in the boundary condition 
+     * delta == timeout.
+     * \see IsExpiring
      */
-    bool IsExpired (void);
+    bool IsExpired (void) const;
+    /**
+     * \return True if this entry is timing out or has already timed out; 
+     * false otherwise.
+     *
+     * This function returns true if the time elapsed is equal to or exceeds
+     * the timeout value.  Differs from IsExpired() only in the boundary 
+     * condition delta == timeout.
+     * \see IsExpired
+     */
+    bool IsExpiring (void) const;
 
     /**
      * \returns 0 is no packet is pending, the next packet to send if 
@@ -191,6 +207,7 @@
     };
 
     void UpdateSeen (void);
+    Time GetTimeout (void) const;
     ArpCache *m_arp;
     ArpCacheEntryState_e m_state;
     Time m_lastSeen;