diff --git a/examples/mixed-wireless.cc b/examples/mixed-wireless.cc index aefde4816..eb46007df 100644 --- a/examples/mixed-wireless.cc +++ b/examples/mixed-wireless.cc @@ -338,9 +338,9 @@ main (int argc, char *argv[]) CsmaHelper::EnableAsciiAll (ascii); // Let's do a pcap trace on the backbone devices - WifiHelper::EnablePcap ("mixed-wireless.pcap", backboneDevices); + WifiHelper::EnablePcap ("mixed-wireless", backboneDevices); // Let's additionally trace the application Sink, ifIndex 0 - CsmaHelper::EnablePcap ("mixed-wireless.pcap", appSink->GetId (), 0); + CsmaHelper::EnablePcap ("mixed-wireless", appSink->GetId (), 0); #ifdef ENABLE_FOR_TRACING_EXAMPLE Config::Connect ("/NodeList/*/$MobilityModel/CourseChange", diff --git a/src/node/node.cc b/src/node/node.cc index 456e13a95..ef56ec6db 100644 --- a/src/node/node.cc +++ b/src/node/node.cc @@ -186,6 +186,11 @@ Node::ReceiveFromDevice (Ptr device, Ptr packet, uint16_t protocol, const Address &from) { bool found = false; + // if there are (potentially) multiple handlers, we need to copy the + // packet before passing it to each handler, because handlers may + // modify it. + bool copyNeeded = (m_handlers.size () > 1); + for (ProtocolHandlerList::iterator i = m_handlers.begin (); i != m_handlers.end (); i++) { @@ -195,7 +200,7 @@ Node::ReceiveFromDevice (Ptr device, Ptr packet, if (i->protocol == 0 || i->protocol == protocol) { - i->handler (device, packet, protocol, from); + i->handler (device, (copyNeeded ? packet->Copy () : packet), protocol, from); found = true; } } diff --git a/src/node/packet-socket.cc b/src/node/packet-socket.cc index 7d3578475..f45690ecf 100644 --- a/src/node/packet-socket.cc +++ b/src/node/packet-socket.cc @@ -111,11 +111,11 @@ PacketSocket::DoBind (const PacketSocketAddress &address) Ptr dev ; if (address.IsSingleDevice ()) { - dev = 0; + dev = m_node->GetDevice (address.GetSingleDevice ()); } else { - dev = m_node->GetDevice (address.GetSingleDevice ()); + dev = 0; } m_node->RegisterProtocolHandler (MakeCallback (&PacketSocket::ForwardUp, this), address.GetProtocol (), dev);