diff -r a67df503c7bc -r 99698bc858e8 src/node/node.cc --- a/src/node/node.cc Wed Jul 16 14:33:44 2008 +0100 +++ b/src/node/node.cc Wed Jul 16 16:06:50 2008 +0100 @@ -26,6 +26,9 @@ #include "ns3/simulator.h" #include "ns3/object-vector.h" #include "ns3/uinteger.h" +#include "ns3/log.h" + +NS_LOG_COMPONENT_DEFINE ("Node"); namespace ns3{ @@ -95,7 +98,7 @@ m_devices.push_back (device); device->SetNode (this); device->SetIfIndex(index); - device->SetReceiveCallback (MakeCallback (&Node::ReceiveFromDevice, this)); + device->SetReceiveCallback (MakeCallback (&Node::NonPromiscReceiveFromDevice, this)); NotifyDeviceAdded (device); return index; } @@ -170,12 +173,44 @@ void Node::RegisterProtocolHandler (ProtocolHandler handler, uint16_t protocolType, - Ptr device) + Ptr device, + bool promiscuous) { struct Node::ProtocolHandlerEntry entry; entry.handler = handler; entry.protocol = protocolType; entry.device = device; + entry.promiscuous = promiscuous; + + // On demand enable promiscuous mode in netdevices + if (promiscuous) + { + if (device == 0) + { + for (std::vector >::iterator i = m_devices.begin (); + i != m_devices.end (); i++) + { + Ptr dev = *i; + if (dev->SupportsPromiscuous ()) + { + dev->SetPromiscReceiveCallback (MakeCallback (&Node::PromiscReceiveFromDevice, this)); + } + } + } + else + { + if (device->SupportsPromiscuous ()) + { + device->SetPromiscReceiveCallback (MakeCallback (&Node::PromiscReceiveFromDevice, this)); + } + else + { + NS_LOG_WARN ("Protocol handler request promiscuous mode for a specific netdevice," + " but netdevice does not support promiscuous mode."); + } + } + } + m_handlers.push_back (entry); } @@ -194,9 +229,26 @@ } bool +Node::PromiscReceiveFromDevice (Ptr device, Ptr packet, uint16_t protocol, + const Address &from, const Address &to, NetDevice::PacketType packetType) +{ + NS_LOG_FUNCTION(device->GetName ()); + return ReceiveFromDevice (device, packet, protocol, from, to, packetType, true); +} + +bool +Node::NonPromiscReceiveFromDevice (Ptr device, Ptr packet, uint16_t protocol, + const Address &from) +{ + NS_LOG_FUNCTION(device->GetName ()); + return ReceiveFromDevice (device, packet, protocol, from, from, NetDevice::PacketType (0), false); +} + +bool Node::ReceiveFromDevice (Ptr device, Ptr packet, uint16_t protocol, - const Address &from, const Address &to, NetDevice::PacketType packetType) + const Address &from, const Address &to, NetDevice::PacketType packetType, bool promiscuous) { + NS_LOG_FUNCTION(device->GetName ()); bool found = false; // if there are (potentially) multiple handlers, we need to copy the // packet before passing it to each handler, because handlers may @@ -212,8 +264,11 @@ if (i->protocol == 0 || i->protocol == protocol) { - i->handler (device, (copyNeeded ? packet->Copy () : packet), protocol, from, to, packetType); - found = true; + if (promiscuous == i->promiscuous) + { + i->handler (device, (copyNeeded ? packet->Copy () : packet), protocol, from, to, packetType); + found = true; + } } } }