[Bug 653] NetDevice link change callback (SetLinkChangeCallback -> AddLinkChangeCallback).
authorSebastien Vincent <vincent@clarinet.u-strasbg.fr>
Tue, 08 Sep 2009 06:29:26 +0200
changeset 4764 e90e1ef585b0
parent 4763 19573adf3665
child 4765 150f48a226c3
[Bug 653] NetDevice link change callback (SetLinkChangeCallback -> AddLinkChangeCallback).
CHANGES.html
src/devices/bridge/bridge-net-device.cc
src/devices/bridge/bridge-net-device.h
src/devices/csma/csma-net-device.cc
src/devices/csma/csma-net-device.h
src/devices/emu/emu-net-device.cc
src/devices/emu/emu-net-device.h
src/devices/point-to-point/point-to-point-net-device.cc
src/devices/point-to-point/point-to-point-net-device.h
src/devices/tap-bridge/tap-bridge.cc
src/devices/tap-bridge/tap-bridge.h
src/devices/virtual-net-device/virtual-net-device.cc
src/devices/virtual-net-device/virtual-net-device.h
src/devices/wifi/wifi-net-device.cc
src/devices/wifi/wifi-net-device.h
src/internet-stack/arp-l3-protocol.cc
src/internet-stack/icmpv6-l4-protocol.cc
src/internet-stack/loopback-net-device.cc
src/internet-stack/loopback-net-device.h
src/node/net-device.h
src/node/simple-net-device.cc
src/node/simple-net-device.h
--- a/CHANGES.html	Mon Sep 07 18:27:40 2009 +0200
+++ b/CHANGES.html	Tue Sep 08 06:29:26 2009 +0200
@@ -109,6 +109,13 @@
 <li><b>WifiMode</b>
 <p>WifiMode now has a WifiPhyStandard attribute which identifies the standard the WifiMode belongs to. To properly set this attribute when creating a new WifiMode, it is now required to explicitly pass a WifiPhyStandard parameter to all WifiModeFactory::CreateXXXX() methods. The WifiPhyStandard value of an existing WifiMode can be retrieved using the new method WifiMode::GetStandard().</p>
 </li>
+<li><b>NetDevice</b>
+<p>In order to have multiple link change callback in NetDevice (i.e. to flush ARP and IPv6 neighbor discovery caches), the following member method has been renamed:</p>
+<pre>
+- virtual void SetLinkChangeCallback (Callback&lt;void&gt; callback);
++ virtual void AddLinkChangeCallback (Callback&lt;void&gt; callback);</pre>
+Now each NetDevice subclasses have a TracedCallback&lt;&gt; object (list of callbacks) instead of Callback&lt;void&gt; ones.
+</li>
 </ul>
 
 <hr>
--- a/src/devices/bridge/bridge-net-device.cc	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/devices/bridge/bridge-net-device.cc	Tue Sep 08 06:29:26 2009 +0200
@@ -317,7 +317,7 @@
 
 
 void 
-BridgeNetDevice::SetLinkChangeCallback (Callback<void> callback)
+BridgeNetDevice::AddLinkChangeCallback (Callback<void> callback)
 {}
 
 
--- a/src/devices/bridge/bridge-net-device.h	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/devices/bridge/bridge-net-device.h	Tue Sep 08 06:29:26 2009 +0200
@@ -96,7 +96,7 @@
   virtual bool SetMtu (const uint16_t mtu);
   virtual uint16_t GetMtu (void) const;
   virtual bool IsLinkUp (void) const;
-  virtual void SetLinkChangeCallback (Callback<void> callback);
+  virtual void AddLinkChangeCallback (Callback<void> callback);
   virtual bool IsBroadcast (void) const;
   virtual Address GetBroadcast (void) const;
   virtual bool IsMulticast (void) const;
--- a/src/devices/csma/csma-net-device.cc	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/devices/csma/csma-net-device.cc	Tue Sep 08 06:29:26 2009 +0200
@@ -839,12 +839,8 @@
 CsmaNetDevice::NotifyLinkUp (void)
 {
   NS_LOG_FUNCTION_NOARGS ();
-
   m_linkUp = true;
-  if (m_linkChangeCallback.IsNull () == false)
-    {
-      m_linkChangeCallback ();
-    }
+  m_linkChangeCallbacks ();
 }
 
   void 
@@ -890,10 +886,10 @@
 }
 
   void 
-CsmaNetDevice::SetLinkChangeCallback (Callback<void> callback)
+CsmaNetDevice::AddLinkChangeCallback (Callback<void> callback)
 {
   NS_LOG_FUNCTION (&callback);
-  m_linkChangeCallback = callback;
+  m_linkChangeCallbacks.ConnectWithoutContext (callback);
 }
 
   bool 
--- a/src/devices/csma/csma-net-device.h	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/devices/csma/csma-net-device.h	Tue Sep 08 06:29:26 2009 +0200
@@ -306,7 +306,7 @@
   virtual void SetAddress (Address address);
   virtual Address GetAddress (void) const;
   virtual bool IsLinkUp (void) const;
-  virtual void SetLinkChangeCallback (Callback<void> callback);
+  virtual void AddLinkChangeCallback (Callback<void> callback);
   virtual bool IsBroadcast (void) const;
   virtual Address GetBroadcast (void) const;
   virtual bool IsMulticast (void) const;
@@ -806,9 +806,9 @@
   bool m_linkUp;
 
   /**
-   * Callback to fire if the link changes state (up or down).
+   * List of callbacks to fire if the link changes state (up or down).
    */
-  Callback<void> m_linkChangeCallback;
+  TracedCallback<> m_linkChangeCallbacks;
 
   static const uint16_t DEFAULT_FRAME_SIZE = 1518;
   static const uint16_t ETHERNET_OVERHEAD = 18;
--- a/src/devices/emu/emu-net-device.cc	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/devices/emu/emu-net-device.cc	Tue Sep 08 06:29:26 2009 +0200
@@ -869,10 +869,7 @@
 EmuNetDevice::NotifyLinkUp (void)
 {
   m_linkUp = true;
-  if (!m_linkChangeCallback.IsNull ())
-    {
-      m_linkChangeCallback ();
-    }
+  m_linkChangeCallbacks ();
 }
 
 void 
@@ -943,9 +940,9 @@
 }
 
 void 
-EmuNetDevice::SetLinkChangeCallback (Callback<void> callback)
+EmuNetDevice::AddLinkChangeCallback (Callback<void> callback)
 {
-  m_linkChangeCallback = callback;
+  m_linkChangeCallbacks.ConnectWithoutContext (callback);
 }
 
 bool 
--- a/src/devices/emu/emu-net-device.h	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/devices/emu/emu-net-device.h	Tue Sep 08 06:29:26 2009 +0200
@@ -110,7 +110,7 @@
 
   virtual bool IsLinkUp (void) const;
 
-  virtual void SetLinkChangeCallback (Callback<void> callback);
+  virtual void AddLinkChangeCallback (Callback<void> callback);
 
   virtual bool IsBroadcast (void) const;
   virtual Address GetBroadcast (void) const;
@@ -459,9 +459,9 @@
   bool m_isMulticast;
 
   /**
-   * Callback to fire if the link changes state (up or down).
+   * Callbacks to fire if the link changes state (up or down).
    */
-  Callback<void> m_linkChangeCallback;
+  TracedCallback<> m_linkChangeCallbacks;
 
   /**
    * The unix/linux name of the underlying device (e.g., eth0)
--- a/src/devices/point-to-point/point-to-point-net-device.cc	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/devices/point-to-point/point-to-point-net-device.cc	Tue Sep 08 06:29:26 2009 +0200
@@ -366,10 +366,7 @@
 PointToPointNetDevice::NotifyLinkUp (void)
 {
   m_linkUp = true;
-  if (!m_linkChangeCallback.IsNull ())
-    {
-      m_linkChangeCallback ();
-    }
+  m_linkChangeCallbacks ();
 }
 
   void 
@@ -415,9 +412,9 @@
 }
 
   void 
-PointToPointNetDevice::SetLinkChangeCallback (Callback<void> callback)
+PointToPointNetDevice::AddLinkChangeCallback (Callback<void> callback)
 {
-  m_linkChangeCallback = callback;
+  m_linkChangeCallbacks.ConnectWithoutContext (callback);
 }
 
 //
--- a/src/devices/point-to-point/point-to-point-net-device.h	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/devices/point-to-point/point-to-point-net-device.h	Tue Sep 08 06:29:26 2009 +0200
@@ -231,7 +231,7 @@
 
   virtual bool IsLinkUp (void) const;
 
-  virtual void SetLinkChangeCallback (Callback<void> callback);
+  virtual void AddLinkChangeCallback (Callback<void> callback);
 
   virtual bool IsBroadcast (void) const;
   virtual Address GetBroadcast (void) const;
@@ -520,7 +520,7 @@
   NetDevice::PromiscReceiveCallback m_promiscCallback;
   uint32_t m_ifIndex;
   bool m_linkUp;
-  Callback<void> m_linkChangeCallback;
+  TracedCallback<> m_linkChangeCallbacks;
 
   static const uint16_t DEFAULT_MTU = 1500;
   static const uint16_t PPP_OVERHEAD = 2;
--- a/src/devices/tap-bridge/tap-bridge.cc	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/devices/tap-bridge/tap-bridge.cc	Tue Sep 08 06:29:26 2009 +0200
@@ -1026,7 +1026,7 @@
 }
 
 void 
-TapBridge::SetLinkChangeCallback (Callback<void> callback)
+TapBridge::AddLinkChangeCallback (Callback<void> callback)
 {
   NS_LOG_FUNCTION_NOARGS ();
 }
--- a/src/devices/tap-bridge/tap-bridge.h	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/devices/tap-bridge/tap-bridge.h	Tue Sep 08 06:29:26 2009 +0200
@@ -181,7 +181,7 @@
   virtual bool SetMtu (const uint16_t mtu);
   virtual uint16_t GetMtu (void) const;
   virtual bool IsLinkUp (void) const;
-  virtual void SetLinkChangeCallback (Callback<void> callback);
+  virtual void AddLinkChangeCallback (Callback<void> callback);
   virtual bool IsBroadcast (void) const;
   virtual Address GetBroadcast (void) const;
   virtual bool IsMulticast (void) const;
--- a/src/devices/virtual-net-device/virtual-net-device.cc	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/devices/virtual-net-device/virtual-net-device.cc	Tue Sep 08 06:29:26 2009 +0200
@@ -194,7 +194,7 @@
 }
 
 void
-VirtualNetDevice::SetLinkChangeCallback (Callback<void> callback)
+VirtualNetDevice::AddLinkChangeCallback (Callback<void> callback)
 {
 }
 
--- a/src/devices/virtual-net-device/virtual-net-device.h	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/devices/virtual-net-device/virtual-net-device.h	Tue Sep 08 06:29:26 2009 +0200
@@ -122,7 +122,7 @@
   virtual Address GetAddress (void) const;
   virtual uint16_t GetMtu (void) const;
   virtual bool IsLinkUp (void) const;
-  virtual void SetLinkChangeCallback (Callback<void> callback);
+  virtual void AddLinkChangeCallback (Callback<void> callback);
   virtual bool IsBroadcast (void) const;
   virtual Address GetBroadcast (void) const;
   virtual bool IsMulticast (void) const;
--- a/src/devices/wifi/wifi-net-device.cc	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/devices/wifi/wifi-net-device.cc	Tue Sep 08 06:29:26 2009 +0200
@@ -196,9 +196,9 @@
   return m_phy != 0 && m_linkUp;
 }
 void 
-WifiNetDevice::SetLinkChangeCallback (Callback<void> callback)
+WifiNetDevice::AddLinkChangeCallback (Callback<void> callback)
 {
-  m_linkChange = callback;
+  m_linkChanges.ConnectWithoutContext (callback);
 }
 bool 
 WifiNetDevice::IsBroadcast (void) const
@@ -312,19 +312,13 @@
 WifiNetDevice::LinkUp (void)
 {
   m_linkUp = true;
-  if (!m_linkChange.IsNull ())
-    {
-      m_linkChange ();
-    }
+  m_linkChanges ();
 }
 void
 WifiNetDevice::LinkDown (void)
 {
   m_linkUp = false;
-  if (!m_linkChange.IsNull ())
-    {
-      m_linkChange ();
-    }
+  m_linkChanges ();
 }
 
 bool
--- a/src/devices/wifi/wifi-net-device.h	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/devices/wifi/wifi-net-device.h	Tue Sep 08 06:29:26 2009 +0200
@@ -83,7 +83,7 @@
   virtual bool SetMtu (const uint16_t mtu);
   virtual uint16_t GetMtu (void) const;
   virtual bool IsLinkUp (void) const;
-  virtual void SetLinkChangeCallback (Callback<void> callback);
+  virtual void AddLinkChangeCallback (Callback<void> callback);
   virtual bool IsBroadcast (void) const;
   virtual Address GetBroadcast (void) const;
   virtual bool IsMulticast (void) const;
@@ -123,7 +123,7 @@
 
   uint32_t m_ifIndex;
   bool m_linkUp;
-  Callback<void> m_linkChange;
+  TracedCallback<> m_linkChanges;
   mutable uint16_t m_mtu;
   bool m_configComplete;
 };
--- a/src/internet-stack/arp-l3-protocol.cc	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/internet-stack/arp-l3-protocol.cc	Tue Sep 08 06:29:26 2009 +0200
@@ -116,7 +116,7 @@
   Ptr<ArpCache> cache = CreateObject<ArpCache> ();
   cache->SetDevice (device, interface);
   NS_ASSERT (device->IsBroadcast ());
-  device->SetLinkChangeCallback (MakeCallback (&ArpCache::Flush, cache));
+  device->AddLinkChangeCallback (MakeCallback (&ArpCache::Flush, cache));
   cache->SetArpRequestCallback (MakeCallback (&ArpL3Protocol::SendArpRequest, this));
   m_cacheList.push_back (cache);
   return cache;
--- a/src/internet-stack/icmpv6-l4-protocol.cc	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/internet-stack/icmpv6-l4-protocol.cc	Tue Sep 08 06:29:26 2009 +0200
@@ -1076,12 +1076,9 @@
 {
   Ptr<Ipv6L3Protocol> ipv6 = m_node->GetObject<Ipv6L3Protocol> ();
   Ptr<NdiscCache> cache = CreateObject<NdiscCache> ();
+  
   cache->SetDevice (device, interface);
-
-  /* XXX : make a list of callback in net-device.cc
-   * else we override IPv4 flushing ARP table...
-   */
-/* device->SetLinkChangeCallback (MakeCallback (&NdiscCache::Flush, cache)); */
+  device->AddLinkChangeCallback (MakeCallback (&NdiscCache::Flush, cache));
   m_cacheList.push_back (cache);
   return cache;
 }
--- a/src/internet-stack/loopback-net-device.cc	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/internet-stack/loopback-net-device.cc	Tue Sep 08 06:29:26 2009 +0200
@@ -125,7 +125,7 @@
 }
 
 void 
-LoopbackNetDevice::SetLinkChangeCallback (Callback<void> callback)
+LoopbackNetDevice::AddLinkChangeCallback (Callback<void> callback)
 {}
 
 bool 
--- a/src/internet-stack/loopback-net-device.h	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/internet-stack/loopback-net-device.h	Tue Sep 08 06:29:26 2009 +0200
@@ -50,7 +50,7 @@
   virtual bool SetMtu (const uint16_t mtu);
   virtual uint16_t GetMtu (void) const;
   virtual bool IsLinkUp (void) const;
-  virtual void SetLinkChangeCallback (Callback<void> callback);
+  virtual void AddLinkChangeCallback (Callback<void> callback);
   virtual bool IsBroadcast (void) const;
   virtual Address GetBroadcast (void) const;
   virtual bool IsMulticast (void) const;
--- a/src/node/net-device.h	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/node/net-device.h	Tue Sep 08 06:29:26 2009 +0200
@@ -128,12 +128,12 @@
   /**
    * \param callback the callback to invoke
    *
-   * Register a callback invoked whenever the link 
+   * Add a callback invoked whenever the link 
    * status changes to UP. This callback is typically used
-   * by the IP/ARP layer to flush the ARP cache 
-   * whenever the link goes up.
+   * by the IP/ARP layer to flush the ARP cache and by IPv6 stack
+   * to flush NDISC cache whenever the link goes up.
    */
-  virtual void SetLinkChangeCallback (Callback<void> callback) = 0;
+  virtual void AddLinkChangeCallback (Callback<void> callback) = 0;
   /**
    * \return true if this interface supports a broadcast address,
    *         false otherwise.
--- a/src/node/simple-net-device.cc	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/node/simple-net-device.cc	Tue Sep 08 06:29:26 2009 +0200
@@ -121,7 +121,7 @@
   return true;
 }
 void 
-SimpleNetDevice::SetLinkChangeCallback (Callback<void> callback)
+SimpleNetDevice::AddLinkChangeCallback (Callback<void> callback)
 {}
 bool 
 SimpleNetDevice::IsBroadcast (void) const
--- a/src/node/simple-net-device.h	Mon Sep 07 18:27:40 2009 +0200
+++ b/src/node/simple-net-device.h	Tue Sep 08 06:29:26 2009 +0200
@@ -53,7 +53,7 @@
   virtual bool SetMtu (const uint16_t mtu);
   virtual uint16_t GetMtu (void) const;
   virtual bool IsLinkUp (void) const;
-  virtual void SetLinkChangeCallback (Callback<void> callback);
+  virtual void AddLinkChangeCallback (Callback<void> callback);
   virtual bool IsBroadcast (void) const;
   virtual Address GetBroadcast (void) const;
   virtual bool IsMulticast (void) const;