From ab714db3a9b1a823ab5bf2f1f0c3bef7278484fb Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Fri, 4 Jul 2008 19:15:00 +0100 Subject: [PATCH] Try to preserve API compatibility, after SendFrom / promiscuous mode changes. --- src/devices/csma/csma-net-device.cc | 6 ++++++ src/devices/csma/csma-net-device.h | 1 + src/node/net-device.cc | 21 +++++++++++++++++++++ src/node/net-device.h | 9 +++++++-- src/node/node.cc | 9 ++++++++- 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/devices/csma/csma-net-device.cc b/src/devices/csma/csma-net-device.cc index 5cf20ac52..809bbb3c6 100644 --- a/src/devices/csma/csma-net-device.cc +++ b/src/devices/csma/csma-net-device.cc @@ -833,4 +833,10 @@ CsmaNetDevice::SetPromiscuousReceiveCallback (NetDevice::PromiscuousReceiveCallb m_promiscRxCallback = cb; } +bool +CsmaNetDevice::SupportsPromiscuousReceiveCallback (void) const +{ + return true; +} + } // namespace ns3 diff --git a/src/devices/csma/csma-net-device.h b/src/devices/csma/csma-net-device.h index bc7a205b3..a8733adad 100644 --- a/src/devices/csma/csma-net-device.h +++ b/src/devices/csma/csma-net-device.h @@ -286,6 +286,7 @@ public: */ virtual void SetReceiveCallback (NetDevice::ReceiveCallback cb); virtual void SetPromiscuousReceiveCallback (PromiscuousReceiveCallback cb); + virtual bool SupportsPromiscuousReceiveCallback (void) const; protected: /** diff --git a/src/node/net-device.cc b/src/node/net-device.cc index 410cc3f49..8d9c43209 100644 --- a/src/node/net-device.cc +++ b/src/node/net-device.cc @@ -21,6 +21,7 @@ #include "ns3/object.h" #include "ns3/log.h" #include "net-device.h" +#include "ns3/packet.h" NS_LOG_COMPONENT_DEFINE ("NetDevice"); @@ -38,4 +39,24 @@ TypeId NetDevice::GetTypeId (void) NetDevice::~NetDevice () {} +bool +NetDevice::SupportsPromiscuousReceiveCallback (void) const +{ + return false; +} + +void +NetDevice::SetPromiscuousReceiveCallback (PromiscuousReceiveCallback cb) +{ + NS_FATAL_ERROR ("promiscuous receive callback not supported for this device"); +} + +bool +NetDevice::SendFrom(Ptr packet, const Address& source, const Address& dest, uint16_t protocolNumber) +{ + NS_FATAL_ERROR ("NetDevice " << GetInstanceTypeId ().GetName () << " does not support SendFrom."); + return false; +} + + } // namespace ns3 diff --git a/src/node/net-device.h b/src/node/net-device.h index 66b91de45..c6eb8dfc8 100644 --- a/src/node/net-device.h +++ b/src/node/net-device.h @@ -228,7 +228,7 @@ public: * * \return whether the Send operation succeeded */ - virtual bool SendFrom(Ptr packet, const Address& source, const Address& dest, uint16_t protocolNumber) = 0; + virtual bool SendFrom(Ptr packet, const Address& source, const Address& dest, uint16_t protocolNumber); /** * \returns the node base class which contains this network * interface. @@ -297,7 +297,12 @@ public: * it. In that sense, it receives a superset of packets * received by the normal ReceivedCallback. */ - virtual void SetPromiscuousReceiveCallback (PromiscuousReceiveCallback cb) = 0; + virtual void SetPromiscuousReceiveCallback (PromiscuousReceiveCallback cb); + + /** + * \returns true if device supports promiscuous receive callback + */ + virtual bool SupportsPromiscuousReceiveCallback (void) const; }; diff --git a/src/node/node.cc b/src/node/node.cc index 3646c8edb..9209f8653 100644 --- a/src/node/node.cc +++ b/src/node/node.cc @@ -96,7 +96,10 @@ Node::AddDevice (Ptr device) device->SetNode (this); device->SetIfIndex(index); device->SetReceiveCallback (MakeCallback (&Node::ReceiveFromDevice, this)); - device->SetPromiscuousReceiveCallback (MakeCallback (&Node::PromiscuousReceiveFromDevice, this)); + if (device->SupportsPromiscuousReceiveCallback ()) + { + device->SetPromiscuousReceiveCallback (MakeCallback (&Node::PromiscuousReceiveFromDevice, this)); + } NotifyDeviceAdded (device); return index; } @@ -191,6 +194,10 @@ Node::RegisterPromiscuousProtocolHandler (PromiscuousProtocolHandler handler, entry.handler = handler; entry.protocol = protocolType; entry.device = device; + if (device) + { + NS_ASSERT (device->SupportsPromiscuousReceiveCallback ()); + } m_promiscuousHandlers.push_back (entry); }