diff --git a/CHANGES.html b/CHANGES.html
index 15654cb01..d2269f231 100644
--- a/CHANGES.html
+++ b/CHANGES.html
@@ -109,6 +109,13 @@ router solicitation, DAD
WifiMode
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().
+NetDevice
+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:
+
+- virtual void SetLinkChangeCallback (Callback<void> callback);
++ virtual void AddLinkChangeCallback (Callback<void> callback);
+Now each NetDevice subclasses have a TracedCallback<> object (list of callbacks) instead of Callback<void> ones.
+
diff --git a/src/devices/bridge/bridge-net-device.cc b/src/devices/bridge/bridge-net-device.cc
index b22356f9e..544690db9 100644
--- a/src/devices/bridge/bridge-net-device.cc
+++ b/src/devices/bridge/bridge-net-device.cc
@@ -317,7 +317,7 @@ BridgeNetDevice::IsLinkUp (void) const
void
-BridgeNetDevice::SetLinkChangeCallback (Callback callback)
+BridgeNetDevice::AddLinkChangeCallback (Callback callback)
{}
diff --git a/src/devices/bridge/bridge-net-device.h b/src/devices/bridge/bridge-net-device.h
index b7c2650a5..c63a2db07 100644
--- a/src/devices/bridge/bridge-net-device.h
+++ b/src/devices/bridge/bridge-net-device.h
@@ -96,7 +96,7 @@ public:
virtual bool SetMtu (const uint16_t mtu);
virtual uint16_t GetMtu (void) const;
virtual bool IsLinkUp (void) const;
- virtual void SetLinkChangeCallback (Callback callback);
+ virtual void AddLinkChangeCallback (Callback callback);
virtual bool IsBroadcast (void) const;
virtual Address GetBroadcast (void) const;
virtual bool IsMulticast (void) const;
diff --git a/src/devices/csma/csma-net-device.cc b/src/devices/csma/csma-net-device.cc
index e39052681..2d9d1cb5b 100644
--- a/src/devices/csma/csma-net-device.cc
+++ b/src/devices/csma/csma-net-device.cc
@@ -839,12 +839,8 @@ CsmaNetDevice::GetQueue (void) const
CsmaNetDevice::NotifyLinkUp (void)
{
NS_LOG_FUNCTION_NOARGS ();
-
m_linkUp = true;
- if (m_linkChangeCallback.IsNull () == false)
- {
- m_linkChangeCallback ();
- }
+ m_linkChangeCallbacks ();
}
void
@@ -890,10 +886,10 @@ CsmaNetDevice::IsLinkUp (void) const
}
void
-CsmaNetDevice::SetLinkChangeCallback (Callback callback)
+CsmaNetDevice::AddLinkChangeCallback (Callback callback)
{
NS_LOG_FUNCTION (&callback);
- m_linkChangeCallback = callback;
+ m_linkChangeCallbacks.ConnectWithoutContext (callback);
}
bool
diff --git a/src/devices/csma/csma-net-device.h b/src/devices/csma/csma-net-device.h
index 1cff9f69b..aa94d1f98 100644
--- a/src/devices/csma/csma-net-device.h
+++ b/src/devices/csma/csma-net-device.h
@@ -306,7 +306,7 @@ public:
virtual void SetAddress (Address address);
virtual Address GetAddress (void) const;
virtual bool IsLinkUp (void) const;
- virtual void SetLinkChangeCallback (Callback callback);
+ virtual void AddLinkChangeCallback (Callback callback);
virtual bool IsBroadcast (void) const;
virtual Address GetBroadcast (void) const;
virtual bool IsMulticast (void) const;
@@ -806,9 +806,9 @@ private:
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 m_linkChangeCallback;
+ TracedCallback<> m_linkChangeCallbacks;
static const uint16_t DEFAULT_FRAME_SIZE = 1518;
static const uint16_t ETHERNET_OVERHEAD = 18;
diff --git a/src/devices/emu/emu-net-device.cc b/src/devices/emu/emu-net-device.cc
index 6eb4b4179..efcce72db 100644
--- a/src/devices/emu/emu-net-device.cc
+++ b/src/devices/emu/emu-net-device.cc
@@ -869,10 +869,7 @@ void
EmuNetDevice::NotifyLinkUp (void)
{
m_linkUp = true;
- if (!m_linkChangeCallback.IsNull ())
- {
- m_linkChangeCallback ();
- }
+ m_linkChangeCallbacks ();
}
void
@@ -943,9 +940,9 @@ EmuNetDevice::IsLinkUp (void) const
}
void
-EmuNetDevice::SetLinkChangeCallback (Callback callback)
+EmuNetDevice::AddLinkChangeCallback (Callback callback)
{
- m_linkChangeCallback = callback;
+ m_linkChangeCallbacks.ConnectWithoutContext (callback);
}
bool
diff --git a/src/devices/emu/emu-net-device.h b/src/devices/emu/emu-net-device.h
index 10644d4d1..9ac035672 100644
--- a/src/devices/emu/emu-net-device.h
+++ b/src/devices/emu/emu-net-device.h
@@ -110,7 +110,7 @@ public:
virtual bool IsLinkUp (void) const;
- virtual void SetLinkChangeCallback (Callback callback);
+ virtual void AddLinkChangeCallback (Callback callback);
virtual bool IsBroadcast (void) const;
virtual Address GetBroadcast (void) const;
@@ -459,9 +459,9 @@ private:
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 m_linkChangeCallback;
+ TracedCallback<> m_linkChangeCallbacks;
/**
* The unix/linux name of the underlying device (e.g., eth0)
diff --git a/src/devices/point-to-point/point-to-point-net-device.cc b/src/devices/point-to-point/point-to-point-net-device.cc
index 6ccda7ebc..ff6ec3693 100644
--- a/src/devices/point-to-point/point-to-point-net-device.cc
+++ b/src/devices/point-to-point/point-to-point-net-device.cc
@@ -366,10 +366,7 @@ PointToPointNetDevice::GetQueue(void) const
PointToPointNetDevice::NotifyLinkUp (void)
{
m_linkUp = true;
- if (!m_linkChangeCallback.IsNull ())
- {
- m_linkChangeCallback ();
- }
+ m_linkChangeCallbacks ();
}
void
@@ -415,9 +412,9 @@ PointToPointNetDevice::IsLinkUp (void) const
}
void
-PointToPointNetDevice::SetLinkChangeCallback (Callback callback)
+PointToPointNetDevice::AddLinkChangeCallback (Callback callback)
{
- m_linkChangeCallback = callback;
+ m_linkChangeCallbacks.ConnectWithoutContext (callback);
}
//
diff --git a/src/devices/point-to-point/point-to-point-net-device.h b/src/devices/point-to-point/point-to-point-net-device.h
index efca761da..c13bd66d8 100644
--- a/src/devices/point-to-point/point-to-point-net-device.h
+++ b/src/devices/point-to-point/point-to-point-net-device.h
@@ -231,7 +231,7 @@ public:
virtual bool IsLinkUp (void) const;
- virtual void SetLinkChangeCallback (Callback callback);
+ virtual void AddLinkChangeCallback (Callback callback);
virtual bool IsBroadcast (void) const;
virtual Address GetBroadcast (void) const;
@@ -520,7 +520,7 @@ private:
NetDevice::PromiscReceiveCallback m_promiscCallback;
uint32_t m_ifIndex;
bool m_linkUp;
- Callback m_linkChangeCallback;
+ TracedCallback<> m_linkChangeCallbacks;
static const uint16_t DEFAULT_MTU = 1500;
static const uint16_t PPP_OVERHEAD = 2;
diff --git a/src/devices/tap-bridge/tap-bridge.cc b/src/devices/tap-bridge/tap-bridge.cc
index bd238882d..2097e076b 100644
--- a/src/devices/tap-bridge/tap-bridge.cc
+++ b/src/devices/tap-bridge/tap-bridge.cc
@@ -1026,7 +1026,7 @@ TapBridge::IsLinkUp (void) const
}
void
-TapBridge::SetLinkChangeCallback (Callback callback)
+TapBridge::AddLinkChangeCallback (Callback callback)
{
NS_LOG_FUNCTION_NOARGS ();
}
diff --git a/src/devices/tap-bridge/tap-bridge.h b/src/devices/tap-bridge/tap-bridge.h
index 9654ebc6c..c6d62729a 100644
--- a/src/devices/tap-bridge/tap-bridge.h
+++ b/src/devices/tap-bridge/tap-bridge.h
@@ -181,7 +181,7 @@ public:
virtual bool SetMtu (const uint16_t mtu);
virtual uint16_t GetMtu (void) const;
virtual bool IsLinkUp (void) const;
- virtual void SetLinkChangeCallback (Callback callback);
+ virtual void AddLinkChangeCallback (Callback callback);
virtual bool IsBroadcast (void) const;
virtual Address GetBroadcast (void) const;
virtual bool IsMulticast (void) const;
diff --git a/src/devices/virtual-net-device/virtual-net-device.cc b/src/devices/virtual-net-device/virtual-net-device.cc
index 2c7412c42..0058cd136 100644
--- a/src/devices/virtual-net-device/virtual-net-device.cc
+++ b/src/devices/virtual-net-device/virtual-net-device.cc
@@ -194,7 +194,7 @@ VirtualNetDevice::IsLinkUp (void) const
}
void
-VirtualNetDevice::SetLinkChangeCallback (Callback callback)
+VirtualNetDevice::AddLinkChangeCallback (Callback callback)
{
}
diff --git a/src/devices/virtual-net-device/virtual-net-device.h b/src/devices/virtual-net-device/virtual-net-device.h
index da84e8b9f..cf8a1c1ed 100644
--- a/src/devices/virtual-net-device/virtual-net-device.h
+++ b/src/devices/virtual-net-device/virtual-net-device.h
@@ -122,7 +122,7 @@ public:
virtual Address GetAddress (void) const;
virtual uint16_t GetMtu (void) const;
virtual bool IsLinkUp (void) const;
- virtual void SetLinkChangeCallback (Callback callback);
+ virtual void AddLinkChangeCallback (Callback callback);
virtual bool IsBroadcast (void) const;
virtual Address GetBroadcast (void) const;
virtual bool IsMulticast (void) const;
diff --git a/src/devices/wifi/wifi-net-device.cc b/src/devices/wifi/wifi-net-device.cc
index c0ca4adab..e155ce752 100644
--- a/src/devices/wifi/wifi-net-device.cc
+++ b/src/devices/wifi/wifi-net-device.cc
@@ -196,9 +196,9 @@ WifiNetDevice::IsLinkUp (void) const
return m_phy != 0 && m_linkUp;
}
void
-WifiNetDevice::SetLinkChangeCallback (Callback callback)
+WifiNetDevice::AddLinkChangeCallback (Callback callback)
{
- m_linkChange = callback;
+ m_linkChanges.ConnectWithoutContext (callback);
}
bool
WifiNetDevice::IsBroadcast (void) const
@@ -312,19 +312,13 @@ void
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
diff --git a/src/devices/wifi/wifi-net-device.h b/src/devices/wifi/wifi-net-device.h
index a395eeb14..63190e340 100644
--- a/src/devices/wifi/wifi-net-device.h
+++ b/src/devices/wifi/wifi-net-device.h
@@ -83,7 +83,7 @@ public:
virtual bool SetMtu (const uint16_t mtu);
virtual uint16_t GetMtu (void) const;
virtual bool IsLinkUp (void) const;
- virtual void SetLinkChangeCallback (Callback callback);
+ virtual void AddLinkChangeCallback (Callback callback);
virtual bool IsBroadcast (void) const;
virtual Address GetBroadcast (void) const;
virtual bool IsMulticast (void) const;
@@ -123,7 +123,7 @@ private:
uint32_t m_ifIndex;
bool m_linkUp;
- Callback m_linkChange;
+ TracedCallback<> m_linkChanges;
mutable uint16_t m_mtu;
bool m_configComplete;
};
diff --git a/src/internet-stack/arp-l3-protocol.cc b/src/internet-stack/arp-l3-protocol.cc
index da46e9c3b..041d97fc6 100644
--- a/src/internet-stack/arp-l3-protocol.cc
+++ b/src/internet-stack/arp-l3-protocol.cc
@@ -116,7 +116,7 @@ ArpL3Protocol::CreateCache (Ptr device, Ptr interface)
Ptr cache = CreateObject ();
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;
diff --git a/src/internet-stack/icmpv6-l4-protocol.cc b/src/internet-stack/icmpv6-l4-protocol.cc
index fb28dd0d3..71d6016b3 100644
--- a/src/internet-stack/icmpv6-l4-protocol.cc
+++ b/src/internet-stack/icmpv6-l4-protocol.cc
@@ -1076,12 +1076,9 @@ Ptr Icmpv6L4Protocol::CreateCache (Ptr device, Ptr ipv6 = m_node->GetObject ();
Ptr cache = CreateObject ();
+
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;
}
diff --git a/src/internet-stack/loopback-net-device.cc b/src/internet-stack/loopback-net-device.cc
index 351b3431b..f34540e87 100644
--- a/src/internet-stack/loopback-net-device.cc
+++ b/src/internet-stack/loopback-net-device.cc
@@ -125,7 +125,7 @@ LoopbackNetDevice::IsLinkUp (void) const
}
void
-LoopbackNetDevice::SetLinkChangeCallback (Callback callback)
+LoopbackNetDevice::AddLinkChangeCallback (Callback callback)
{}
bool
diff --git a/src/internet-stack/loopback-net-device.h b/src/internet-stack/loopback-net-device.h
index 105940bfa..084fa5bd0 100644
--- a/src/internet-stack/loopback-net-device.h
+++ b/src/internet-stack/loopback-net-device.h
@@ -50,7 +50,7 @@ public:
virtual bool SetMtu (const uint16_t mtu);
virtual uint16_t GetMtu (void) const;
virtual bool IsLinkUp (void) const;
- virtual void SetLinkChangeCallback (Callback callback);
+ virtual void AddLinkChangeCallback (Callback callback);
virtual bool IsBroadcast (void) const;
virtual Address GetBroadcast (void) const;
virtual bool IsMulticast (void) const;
diff --git a/src/node/net-device.h b/src/node/net-device.h
index 3c065912f..787dab714 100644
--- a/src/node/net-device.h
+++ b/src/node/net-device.h
@@ -128,12 +128,12 @@ public:
/**
* \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 callback) = 0;
+ virtual void AddLinkChangeCallback (Callback callback) = 0;
/**
* \return true if this interface supports a broadcast address,
* false otherwise.
diff --git a/src/node/simple-net-device.cc b/src/node/simple-net-device.cc
index 7e9ffae0d..dcc5968d1 100644
--- a/src/node/simple-net-device.cc
+++ b/src/node/simple-net-device.cc
@@ -121,7 +121,7 @@ SimpleNetDevice::IsLinkUp (void) const
return true;
}
void
-SimpleNetDevice::SetLinkChangeCallback (Callback callback)
+SimpleNetDevice::AddLinkChangeCallback (Callback callback)
{}
bool
SimpleNetDevice::IsBroadcast (void) const
diff --git a/src/node/simple-net-device.h b/src/node/simple-net-device.h
index 5d98b7f6d..f7f763aaf 100644
--- a/src/node/simple-net-device.h
+++ b/src/node/simple-net-device.h
@@ -53,7 +53,7 @@ public:
virtual bool SetMtu (const uint16_t mtu);
virtual uint16_t GetMtu (void) const;
virtual bool IsLinkUp (void) const;
- virtual void SetLinkChangeCallback (Callback callback);
+ virtual void AddLinkChangeCallback (Callback callback);
virtual bool IsBroadcast (void) const;
virtual Address GetBroadcast (void) const;
virtual bool IsMulticast (void) const;