diff -r 6cd5056a8fe0 src/devices/bridge/bridge-net-device.cc --- a/src/devices/bridge/bridge-net-device.cc Sun Jul 26 07:25:19 2009 -0700 +++ b/src/devices/bridge/bridge-net-device.cc Mon Jul 27 17:56:54 2009 +0200 @@ -317,7 +317,7 @@ void -BridgeNetDevice::SetLinkChangeCallback (Callback callback) +BridgeNetDevice::AddLinkChangeCallback (Callback callback) {} diff -r 6cd5056a8fe0 src/devices/bridge/bridge-net-device.h --- a/src/devices/bridge/bridge-net-device.h Sun Jul 26 07:25:19 2009 -0700 +++ b/src/devices/bridge/bridge-net-device.h Mon Jul 27 17:56:54 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 callback); + virtual void AddLinkChangeCallback (Callback callback); virtual bool IsBroadcast (void) const; virtual Address GetBroadcast (void) const; virtual bool IsMulticast (void) const; diff -r 6cd5056a8fe0 src/devices/csma/csma-net-device.cc --- a/src/devices/csma/csma-net-device.cc Sun Jul 26 07:25:19 2009 -0700 +++ b/src/devices/csma/csma-net-device.cc Mon Jul 27 17:56:54 2009 +0200 @@ -841,10 +841,14 @@ NS_LOG_FUNCTION_NOARGS (); m_linkUp = true; - if (m_linkChangeCallback.IsNull () == false) - { - m_linkChangeCallback (); - } + for (std::list >::const_iterator it = m_linkChangeCallbacks.begin () ; + it != m_linkChangeCallbacks.end () ; ++it) + { + if ((*it).IsNull () == false) + { + (*it) (); + } + } } void @@ -890,10 +894,10 @@ } void -CsmaNetDevice::SetLinkChangeCallback (Callback callback) +CsmaNetDevice::AddLinkChangeCallback (Callback callback) { NS_LOG_FUNCTION (&callback); - m_linkChangeCallback = callback; + m_linkChangeCallbacks.push_back (callback); } bool diff -r 6cd5056a8fe0 src/devices/csma/csma-net-device.h --- a/src/devices/csma/csma-net-device.h Sun Jul 26 07:25:19 2009 -0700 +++ b/src/devices/csma/csma-net-device.h Mon Jul 27 17:56:54 2009 +0200 @@ -22,6 +22,7 @@ #define CSMA_NET_DEVICE_H #include +#include #include "ns3/node.h" #include "ns3/backoff.h" #include "ns3/address.h" @@ -306,7 +307,7 @@ 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; @@ -808,7 +809,7 @@ /** * Callback to fire if the link changes state (up or down). */ - Callback m_linkChangeCallback; + std::list > m_linkChangeCallbacks; static const uint16_t DEFAULT_FRAME_SIZE = 1518; static const uint16_t ETHERNET_OVERHEAD = 18; diff -r 6cd5056a8fe0 src/devices/emu/emu-net-device.cc --- a/src/devices/emu/emu-net-device.cc Sun Jul 26 07:25:19 2009 -0700 +++ b/src/devices/emu/emu-net-device.cc Mon Jul 27 17:56:54 2009 +0200 @@ -869,10 +869,14 @@ EmuNetDevice::NotifyLinkUp (void) { m_linkUp = true; - if (!m_linkChangeCallback.IsNull ()) - { - m_linkChangeCallback (); - } + for (std::list >::const_iterator it = m_linkChangeCallbacks.begin () ; + it != m_linkChangeCallbacks.end () ; ++it) + { + if ((*it).IsNull () == false) + { + (*it) (); + } + } } void @@ -943,9 +947,9 @@ } void -EmuNetDevice::SetLinkChangeCallback (Callback callback) +EmuNetDevice::AddLinkChangeCallback (Callback callback) { - m_linkChangeCallback = callback; + m_linkChangeCallbacks.push_back (callback); } bool diff -r 6cd5056a8fe0 src/devices/emu/emu-net-device.h --- a/src/devices/emu/emu-net-device.h Sun Jul 26 07:25:19 2009 -0700 +++ b/src/devices/emu/emu-net-device.h Mon Jul 27 17:56:54 2009 +0200 @@ -20,6 +20,7 @@ #define EMU_NET_DEVICE_H #include +#include #include "ns3/address.h" #include "ns3/net-device.h" #include "ns3/node.h" @@ -110,7 +111,7 @@ 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; @@ -461,7 +462,7 @@ /** * Callback to fire if the link changes state (up or down). */ - Callback m_linkChangeCallback; + std::list > m_linkChangeCallbacks; /** * The unix/linux name of the underlying device (e.g., eth0) diff -r 6cd5056a8fe0 src/devices/point-to-point/point-to-point-net-device.cc --- a/src/devices/point-to-point/point-to-point-net-device.cc Sun Jul 26 07:25:19 2009 -0700 +++ b/src/devices/point-to-point/point-to-point-net-device.cc Mon Jul 27 17:56:54 2009 +0200 @@ -366,10 +366,14 @@ PointToPointNetDevice::NotifyLinkUp (void) { m_linkUp = true; - if (!m_linkChangeCallback.IsNull ()) - { - m_linkChangeCallback (); - } + for (std::list >::const_iterator it = m_linkChangeCallbacks.begin () ; + it != m_linkChangeCallbacks.end () ; ++it) + { + if (!(*it).IsNull ()) + { + (*it) (); + } + } } void @@ -415,9 +419,9 @@ } void -PointToPointNetDevice::SetLinkChangeCallback (Callback callback) +PointToPointNetDevice::AddLinkChangeCallback (Callback callback) { - m_linkChangeCallback = callback; + m_linkChangeCallbacks.push_back (callback); } // diff -r 6cd5056a8fe0 src/devices/point-to-point/point-to-point-net-device.h --- a/src/devices/point-to-point/point-to-point-net-device.h Sun Jul 26 07:25:19 2009 -0700 +++ b/src/devices/point-to-point/point-to-point-net-device.h Mon Jul 27 17:56:54 2009 +0200 @@ -20,6 +20,7 @@ #define POINT_TO_POINT_NET_DEVICE_H #include +#include #include "ns3/address.h" #include "ns3/node.h" #include "ns3/net-device.h" @@ -231,7 +232,7 @@ 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 +521,7 @@ NetDevice::PromiscReceiveCallback m_promiscCallback; uint32_t m_ifIndex; bool m_linkUp; - Callback m_linkChangeCallback; + std::list > m_linkChangeCallbacks; static const uint16_t DEFAULT_MTU = 1500; static const uint16_t PPP_OVERHEAD = 2; diff -r 6cd5056a8fe0 src/devices/tap-bridge/tap-bridge.cc --- a/src/devices/tap-bridge/tap-bridge.cc Sun Jul 26 07:25:19 2009 -0700 +++ b/src/devices/tap-bridge/tap-bridge.cc Mon Jul 27 17:56:54 2009 +0200 @@ -1026,7 +1026,7 @@ } void -TapBridge::SetLinkChangeCallback (Callback callback) +TapBridge::AddLinkChangeCallback (Callback callback) { NS_LOG_FUNCTION_NOARGS (); } diff -r 6cd5056a8fe0 src/devices/tap-bridge/tap-bridge.h --- a/src/devices/tap-bridge/tap-bridge.h Sun Jul 26 07:25:19 2009 -0700 +++ b/src/devices/tap-bridge/tap-bridge.h Mon Jul 27 17:56:54 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 callback); + virtual void AddLinkChangeCallback (Callback callback); virtual bool IsBroadcast (void) const; virtual Address GetBroadcast (void) const; virtual bool IsMulticast (void) const; diff -r 6cd5056a8fe0 src/devices/virtual-net-device/virtual-net-device.cc --- a/src/devices/virtual-net-device/virtual-net-device.cc Sun Jul 26 07:25:19 2009 -0700 +++ b/src/devices/virtual-net-device/virtual-net-device.cc Mon Jul 27 17:56:54 2009 +0200 @@ -194,7 +194,7 @@ } void -VirtualNetDevice::SetLinkChangeCallback (Callback callback) +VirtualNetDevice::AddLinkChangeCallback (Callback callback) { } diff -r 6cd5056a8fe0 src/devices/virtual-net-device/virtual-net-device.h --- a/src/devices/virtual-net-device/virtual-net-device.h Sun Jul 26 07:25:19 2009 -0700 +++ b/src/devices/virtual-net-device/virtual-net-device.h Mon Jul 27 17:56:54 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 callback); + virtual void AddLinkChangeCallback (Callback callback); virtual bool IsBroadcast (void) const; virtual Address GetBroadcast (void) const; virtual bool IsMulticast (void) const; diff -r 6cd5056a8fe0 src/devices/wifi/wifi-net-device.cc --- a/src/devices/wifi/wifi-net-device.cc Sun Jul 26 07:25:19 2009 -0700 +++ b/src/devices/wifi/wifi-net-device.cc Mon Jul 27 17:56:54 2009 +0200 @@ -196,9 +196,9 @@ return m_phy != 0 && m_linkUp; } void -WifiNetDevice::SetLinkChangeCallback (Callback callback) +WifiNetDevice::AddLinkChangeCallback (Callback callback) { - m_linkChange = callback; + m_linkChanges.push_back (callback); } bool WifiNetDevice::IsBroadcast (void) const @@ -312,19 +312,27 @@ WifiNetDevice::LinkUp (void) { m_linkUp = true; - if (!m_linkChange.IsNull ()) - { - m_linkChange (); - } + for (std::list >::const_iterator it = m_linkChanges.begin () ; + it != m_linkChanges.end () ; ++it) + { + if (!(*it).IsNull ()) + { + (*it) (); + } + } } void WifiNetDevice::LinkDown (void) { m_linkUp = false; - if (!m_linkChange.IsNull ()) - { - m_linkChange (); - } + for (std::list >::const_iterator it = m_linkChanges.begin () ; + it != m_linkChanges.end () ; ++it) + { + if (!(*it).IsNull ()) + { + (*it) (); + } + } } bool diff -r 6cd5056a8fe0 src/devices/wifi/wifi-net-device.h --- a/src/devices/wifi/wifi-net-device.h Sun Jul 26 07:25:19 2009 -0700 +++ b/src/devices/wifi/wifi-net-device.h Mon Jul 27 17:56:54 2009 +0200 @@ -27,6 +27,7 @@ #include "ns3/mac48-address.h" #include "wifi-remote-station-manager.h" #include +#include namespace ns3 { @@ -83,7 +84,7 @@ 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 +124,7 @@ uint32_t m_ifIndex; bool m_linkUp; - Callback m_linkChange; + std::list > m_linkChanges; mutable uint16_t m_mtu; bool m_configComplete; }; diff -r 6cd5056a8fe0 src/internet-stack/arp-l3-protocol.cc --- a/src/internet-stack/arp-l3-protocol.cc Sun Jul 26 07:25:19 2009 -0700 +++ b/src/internet-stack/arp-l3-protocol.cc Mon Jul 27 17:56:54 2009 +0200 @@ -116,7 +116,7 @@ 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 -r 6cd5056a8fe0 src/internet-stack/loopback-net-device.cc --- a/src/internet-stack/loopback-net-device.cc Sun Jul 26 07:25:19 2009 -0700 +++ b/src/internet-stack/loopback-net-device.cc Mon Jul 27 17:56:54 2009 +0200 @@ -125,7 +125,7 @@ } void -LoopbackNetDevice::SetLinkChangeCallback (Callback callback) +LoopbackNetDevice::AddLinkChangeCallback (Callback callback) {} bool diff -r 6cd5056a8fe0 src/internet-stack/loopback-net-device.h --- a/src/internet-stack/loopback-net-device.h Sun Jul 26 07:25:19 2009 -0700 +++ b/src/internet-stack/loopback-net-device.h Mon Jul 27 17:56:54 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 callback); + virtual void AddLinkChangeCallback (Callback callback); virtual bool IsBroadcast (void) const; virtual Address GetBroadcast (void) const; virtual bool IsMulticast (void) const; diff -r 6cd5056a8fe0 src/node/net-device.h --- a/src/node/net-device.h Sun Jul 26 07:25:19 2009 -0700 +++ b/src/node/net-device.h Mon Jul 27 17:56:54 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 callback) = 0; + virtual void AddLinkChangeCallback (Callback callback) = 0; /** * \return true if this interface supports a broadcast address, * false otherwise. diff -r 6cd5056a8fe0 src/node/simple-net-device.cc --- a/src/node/simple-net-device.cc Sun Jul 26 07:25:19 2009 -0700 +++ b/src/node/simple-net-device.cc Mon Jul 27 17:56:54 2009 +0200 @@ -121,7 +121,7 @@ return true; } void -SimpleNetDevice::SetLinkChangeCallback (Callback callback) +SimpleNetDevice::AddLinkChangeCallback (Callback callback) {} bool SimpleNetDevice::IsBroadcast (void) const diff -r 6cd5056a8fe0 src/node/simple-net-device.h --- a/src/node/simple-net-device.h Sun Jul 26 07:25:19 2009 -0700 +++ b/src/node/simple-net-device.h Mon Jul 27 17:56:54 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 callback); + virtual void AddLinkChangeCallback (Callback callback); virtual bool IsBroadcast (void) const; virtual Address GetBroadcast (void) const; virtual bool IsMulticast (void) const;