From 8cbdcd69c11a7bb83082ceff921abbc38c1c976c Mon Sep 17 00:00:00 2001 From: Sebastien Vincent Date: Tue, 8 Sep 2009 06:29:26 +0200 Subject: [PATCH] [Bug 653] NetDevice link change callback (SetLinkChangeCallback -> AddLinkChangeCallback). --- CHANGES.html | 7 +++++++ src/devices/bridge/bridge-net-device.cc | 2 +- src/devices/bridge/bridge-net-device.h | 2 +- src/devices/csma/csma-net-device.cc | 10 +++------- src/devices/csma/csma-net-device.h | 6 +++--- src/devices/emu/emu-net-device.cc | 9 +++------ src/devices/emu/emu-net-device.h | 6 +++--- .../point-to-point/point-to-point-net-device.cc | 9 +++------ .../point-to-point/point-to-point-net-device.h | 4 ++-- src/devices/tap-bridge/tap-bridge.cc | 2 +- src/devices/tap-bridge/tap-bridge.h | 2 +- .../virtual-net-device/virtual-net-device.cc | 2 +- .../virtual-net-device/virtual-net-device.h | 2 +- src/devices/wifi/wifi-net-device.cc | 14 ++++---------- src/devices/wifi/wifi-net-device.h | 4 ++-- src/internet-stack/arp-l3-protocol.cc | 2 +- src/internet-stack/icmpv6-l4-protocol.cc | 7 ++----- src/internet-stack/loopback-net-device.cc | 2 +- src/internet-stack/loopback-net-device.h | 2 +- src/node/net-device.h | 8 ++++---- src/node/simple-net-device.cc | 2 +- src/node/simple-net-device.h | 2 +- 22 files changed, 47 insertions(+), 59 deletions(-) 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;