define and implement IUdp
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Thu, 03 May 2007 14:20:04 +0200
changeset 519 b045a3ab4595
parent 518 b38047b0e7ab
child 520 92160600f7f2
define and implement IUdp
SConstruct
examples/simple-p2p.cc
samples/main-p2p-net-device-if.cc
samples/main-simple-p2p.cc
samples/main-simple.cc
src/node/i-udp-impl.cc
src/node/i-udp-impl.h
src/node/i-udp.cc
src/node/i-udp.h
src/node/internet-node.cc
src/node/onoff-application.cc
--- a/SConstruct	Thu May 03 13:49:24 2007 +0200
+++ b/SConstruct	Thu May 03 14:20:04 2007 +0200
@@ -221,6 +221,8 @@
     'udp-socket.cc',
     'pcap-trace.cc',
     'ipv4-end-point-demux.cc',
+    'i-udp.cc',
+    'i-udp-impl.cc',
     ])
 node.add_headers ([
     'ipv4-header.h',
@@ -239,6 +241,8 @@
     'queue.h',
     'arp-ipv4-interface.h',
     'udp-socket.h',
+    'i-udp-impl.h',
+    'udp.h',
     ])
 node.add_inst_headers ([
     'node.h',
@@ -263,12 +267,12 @@
     'onoff-application.h',
     'ascii-trace.h',
     'socket.h',
-    'udp.h',
     'ipv4-l4-protocol.h',
     'ipv4-l4-demux.h',
     'ipv4-end-point-demux.h',
     'ipv4-end-point.h',
     'pcap-trace.h',
+    'i-udp.h',
     ])
 
 p2p = build.Ns3Module ('p2p', 'src/devices/p2p')
@@ -359,24 +363,12 @@
 sample_test.add_dep('core')
 sample_test.add_source('main-test.cc')
 
-sample_p2p_net_device_if = build.Ns3Module ('sample-p2p-net-device-if', 'samples')
-sample_p2p_net_device_if.set_executable ()
-ns3.add (sample_p2p_net_device_if)
-sample_p2p_net_device_if.add_deps (['common', 'node', 'p2p'])
-sample_p2p_net_device_if.add_source ('main-p2p-net-device-if.cc')
-
 sample_simple = build.Ns3Module('sample-simple', 'samples')
 sample_simple.set_executable()
 ns3.add(sample_simple)
 sample_simple.add_deps(['core', 'simulator', 'node'])
 sample_simple.add_source('main-simple.cc')
 
-sample_sp2p = build.Ns3Module('sample-simple-p2p', 'samples')
-sample_sp2p.set_executable()
-#n3.add(sample_sp2p)
-sample_sp2p.add_deps(['core', 'simulator', 'node', 'p2p'])
-sample_sp2p.add_source('main-simple-p2p.cc')
-
 # examples
 example_simple_p2p = build.Ns3Module('simple-p2p', 'examples')
 example_simple_p2p.set_executable()
--- a/examples/simple-p2p.cc	Thu May 03 13:49:24 2007 +0200
+++ b/examples/simple-p2p.cc	Thu May 03 14:20:04 2007 +0200
@@ -56,7 +56,6 @@
 #include "ns3/mac-address.h"
 #include "ns3/ipv4-address.h"
 #include "ns3/ipv4.h"
-#include "ns3/udp.h"
 #include "ns3/socket.h"
 #include "ns3/ipv4-route.h"
 #include "ns3/drop-tail.h"
--- a/samples/main-p2p-net-device-if.cc	Thu May 03 13:49:24 2007 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,225 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2007 University of Washington
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <fstream>
-
-#include "ns3/debug.h"
-#include "ns3/internet-node.h"
-#include "ns3/packet.h"
-#include "ns3/ipv4-address.h"
-#include "ns3/p2p-channel.h"
-#include "ns3/p2p-net-device.h"
-#include "ns3/drop-tail.h"
-#include "ns3/ipv4.h"
-#include "ns3/udp.h"
-#include "ns3/trace-context.h"
-#include "ns3/socket.h"
-#include "ns3/simulator.h"
-#include "ns3/node-list.h"
-#include "ns3/trace-root.h"
-
-
-using namespace ns3;
-
-class Logger {
-public:
-
-  Logger (std::string const &filename) 
-  {
-    m_filestr.open (filename.c_str ());
-    NS_DEBUG_UNCOND("**** Logger(string const &)");
-  }
-
-  ~Logger () {}
-
-  void Log (TraceContext const &context, const Packet &p)
-  {
-    NodeList::NodeIndex nodeIndex;
-    context.Get (nodeIndex);
-    m_filestr << "node=" << NodeList::PeekNode (nodeIndex)->GetId () << " ";
-    Ipv4::InterfaceIndex interfaceIndex;
-    context.Get (interfaceIndex);
-    m_filestr << "interface=" << interfaceIndex << " ";
-    enum Queue::TraceType type;
-    context.Get (type);
-    switch (type) 
-      {
-      case Queue::ENQUEUE:
-        m_filestr << "enqueue";
-        break;
-      case Queue::DEQUEUE:
-        m_filestr << "dequeue";
-        break;
-      case Queue::DROP:
-        m_filestr << "drop";
-        break;
-      }
-    m_filestr << " bytes=" << p.GetSize () << std::endl;
-  }
-
-protected:
-  std::ofstream m_filestr;;
-};
-
-static void
-GenerateTraffic (Socket *socket, uint32_t size)
-{
-  std::cout << "Node: " << socket->PeekNode()->GetId () 
-            << " at=" << Simulator::Now ().GetSeconds () << "s,"
-            << " tx bytes=" << size << std::endl;
-  socket->Send (0, size);
-  if (size > 50)
-    {
-      Simulator::Schedule (Seconds (0.5), &GenerateTraffic, socket, size - 50);
-    }
-}
-
-static void
-SocketPrinter (Socket *socket, uint32_t size, const Ipv4Address &from, uint16_t fromPort)
-{
-  std::cout << "Node: " << socket->PeekNode()->GetId () 
-            << " at=" << Simulator::Now ().GetSeconds () << "s,"
-            << " rx bytes=" << size << std::endl;
-}
-
-static void
-PrintTraffic (Socket *socket)
-{
-  socket->RecvDummy (MakeCallback (&SocketPrinter));
-}
-
-
-int main (int argc, char *argv[])
-{
-  NS_DEBUG_UNCOND("PointToPoint Net Device Test");
-
-  // create two nodes and a simple PointToPointChannel
-  InternetNode a;
-  InternetNode b;
-  PointToPointChannel ch = PointToPointChannel ("Test Channel", 1000, 
-    Seconds (0.1));
-
-  NodeList::Add (&a);
-  NodeList::Add (&b);
-
-  // create two NetDevices and assign one to each node
-  // Note:  this would normally be done also in conjunction with
-  //        creating a Channel
-   
-  PointToPointNetDevice neta(&a);
-  a.AddDevice (&neta);
-
-  neta.AddQueue(new DropTailQueue () );
-  neta.SetName("a.eth0"); 
-
-  PointToPointNetDevice netb(&b);
-  b.AddDevice (&netb);
-
-  neta.AddQueue(new DropTailQueue () );
-  netb.SetName("b.eth0"); 
-
-  // bind the two NetDevices together by using a simple Channel
-  // this method changed to do a bidirectional binding
-  neta.Attach (&ch);
-  netb.Attach (&ch);
-
-  // Some simple prints to see whether it is working
-  NS_DEBUG_UNCOND("neta.GetMtu() <= " << neta.GetMtu());
-  NS_DEBUG_UNCOND("netb.GetMtu() <= " << netb.GetMtu());
-  NS_DEBUG_UNCOND("neta.GetAddress() <= " << neta.GetAddress());
-  NS_DEBUG_UNCOND("netb.GetAddress() <= " << netb.GetAddress());
-
-  // Note:  InternetNode constructor instantiates multiple Layer-3
-  // protocols and registers them with the L3Demux object.
-  // This takes care of Layer-2 -> Layer-3 bindings.
-  //  XXX TODO:  will need to create a dummy IPv4 object for insertion
-  //             into the Demux
-
-  // We now need to bind the InternetNode to the various interfaces.
-  // to get the Layer-3 -> Layer-2 bindings.
-
-  // We do this by calling an "AddArpIpv4Interface(neta)" function on node a.
-  // This should:  
-  // i) create an Ipv4ArpInterface object (subclass of pure virtual
-  //    Ipv4Interface object)
-  // ii) add the Ipv4ArpInterface object to the InternetNode's internal
-  //     vector of Ipv4Interfaces (keyed off of ifIndex)
-
-  NS_DEBUG_UNCOND("Adding ARP Interface to InternetNode a");
-  Ipv4 *ipa = (&a)->GetIpv4 ();
-  uint32_t indexA = ipa->AddInterface (&neta);
-  NS_DEBUG_UNCOND("Adding Interface " << indexA);
-
-
-  // iii) give the interface an IP address
-
-  NS_DEBUG_UNCOND("Giving IP address to ARP Interface");
-  ipa->SetAddress(indexA, Ipv4Address("10.1.1.1"));
-  ipa->SetNetworkMask(indexA, Ipv4Mask("255.255.255.0"));
-
-  // iv) set the interface's state to "UP"
-
-  NS_DEBUG_UNCOND("Setting ARP interface to UP");
-  ipa->SetUp(indexA);
-
-  ipa->SetDefaultRoute (Ipv4Address ("10.1.1.2"), 1);
-
-
-  NS_DEBUG_UNCOND("Adding ARP Interface to InternetNode b");
-  Ipv4 *ipb = (&b)->GetIpv4 ();
-  uint32_t indexB = ipb->AddInterface (&netb);
-  NS_DEBUG_UNCOND("Adding Interface " << indexB);
-
-
-  // iii) give the interface an IP address
-
-  NS_DEBUG_UNCOND("Giving IP address to ARP Interface");
-  ipb->SetAddress(indexB, Ipv4Address("10.1.1.2"));
-  ipb->SetNetworkMask(indexB, Ipv4Mask("255.255.255.0"));
-
-  // iv) set the interface's state to "UP"
-
-  NS_DEBUG_UNCOND("Setting ARP interface to UP");
-  ipb->SetUp(indexB);
-
-  ipb->SetDefaultRoute (Ipv4Address ("10.1.1.1"), 1);
-
-
-  Socket *source = a.GetUdp ()->CreateSocket ();
-  Socket *sink = b.GetUdp ()->CreateSocket ();
-  sink->Bind (80);
-  source->Connect (Ipv4Address ("10.1.1.2"), 80);
-
-  Logger logger("p2p-net-test.log");
-
-  TraceRoot::Connect ("/nodes/*/ipv4/interfaces/*/netdevice/queue/*", 
-                      MakeCallback (&Logger::Log, &logger));
-
-  PrintTraffic (sink);
-  GenerateTraffic (source, 100);
-
-  Simulator::Run ();
-
-  Simulator::Destroy ();
-
-  delete source;
-  delete sink;
-
-  return 0;
-}
--- a/samples/main-simple-p2p.cc	Thu May 03 13:49:24 2007 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,116 +0,0 @@
-#include <iostream>
-#include <string>
-
-#include "ns3/internet-node.h"
-#include "ns3/simulator.h"
-#include "ns3/datagram-socket.h"
-#include "ns3/nstime.h"
-#include "ns3/p2p-channel.h"
-#include "ns3/p2p-net-device.h"
-#include "ns3/ipv4.h"
-#include "ns3/arp-ipv4-interface.h"
-#include "ns3/ipv4-route.h"
-
-using namespace ns3;
-
-
-static void
-GenerateTraffic (DatagramSocket *socket, uint32_t size)
-{
-  std::cout << "at=" << Simulator::Now ().GetSeconds () << "s, tx bytes=" << size << std::endl;
-  socket->SendDummy (size);
-  if (size > 0)
-    {
-      Simulator::Schedule (Seconds (0.5), &GenerateTraffic, socket, size - 50);
-    }
-}
-
-static void
-DatagramSocketPrinter (DatagramSocket *socket, uint32_t size, Ipv4Address from, uint16_t fromPort)
-{
-  std::cout << "at=" << Simulator::Now ().GetSeconds () << "s, rx bytes=" << size << std::endl;
-}
-
-static void
-PrintTraffic (DatagramSocket *socket)
-{
-  socket->SetDummyRxCallback (MakeCallback (&DatagramSocketPrinter));
-}
-
-static void
-DestroyP2PNetDevice (P2PNetDevice *dev)
-{
-  delete dev;
-}
-
-static void
-PrintRoutingTable (InternetNode *a, std::string name)
-{
-  Ipv4 *ipv4 = a->GetIpv4 ();
-  std::cout << "routing table start node=" << name << std::endl;
-  for (uint32_t i = 0; i < ipv4->GetNRoutes (); i++)
-    {
-      Ipv4Route *route = ipv4->GetRoute (i);
-      std::cout << (*route) << std::endl;
-    }
-  std::cout << "routing table end" << std::endl;
-}
-
-static void
-AddP2PLink (InternetNode *a, InternetNode *b)
-{
-  P2PChannel * channel = new P2PChannel (MilliSeconds (20), 10000);
-  P2PNetDevice *devA = channel->CreateNetDevice (a, MacAddress ("00:00:00:00:00:01"));
-  P2PNetDevice *devB = channel->CreateNetDevice (b, MacAddress ("00:00:00:00:00:02"));
-  Simulator::ScheduleDestroy (&DestroyP2PNetDevice, devA);
-  Simulator::ScheduleDestroy (&DestroyP2PNetDevice, devB);
-  Ipv4Interface *interfA = new ArpIpv4Interface (a, devA);
-  Ipv4Interface *interfB = new ArpIpv4Interface (b, devB);
-  uint32_t indexA = a->GetIpv4 ()->AddInterface (interfA);
-  uint32_t indexB = b->GetIpv4 ()->AddInterface (interfB);
-  Ipv4Address ipa = Ipv4Address ("192.168.0.2");
-  Ipv4Address ipb = Ipv4Address ("192.168.0.3");
-  Ipv4Mask netmask = Ipv4Mask ("255.255.255.0");
-  a->GetIpv4 ()->AddHostRouteTo (ipb, indexA);
-  b->GetIpv4 ()->AddHostRouteTo (ipa, indexB);
-
-  interfA->SetAddress (ipa);
-  interfA->SetNetworkMask (netmask);
-  interfA->SetUp ();
-
-  interfB->SetAddress (ipb);
-  interfB->SetNetworkMask (netmask);
-  interfB->SetUp ();
-
-  PrintRoutingTable (a, "a");
-  PrintRoutingTable (b, "b");
-}
-
-int main (int argc, char *argv[])
-{
-
-  InternetNode *a = new InternetNode ();
-  InternetNode *b = new InternetNode ();
-
-  AddP2PLink (a, b);
-  
-  DatagramSocket *sink = new DatagramSocket (a);
-  sink->Bind (80);
-  DatagramSocket *source = new DatagramSocket (b);
-  source->SetDefaultDestination (Ipv4Address ("192.168.0.2"), 80);
-
-  GenerateTraffic (source, 500);
-  PrintTraffic (sink);
-
-
-  Simulator::Run ();
-
-  Simulator::Destroy ();
-
-
-  delete a;
-  delete source;
-  delete sink;
-
-  return 0;
-}
--- a/samples/main-simple.cc	Thu May 03 13:49:24 2007 +0200
+++ b/samples/main-simple.cc	Thu May 03 14:20:04 2007 +0200
@@ -2,7 +2,7 @@
 
 #include "ns3/internet-node.h"
 #include "ns3/simulator.h"
-#include "ns3/udp.h"
+#include "ns3/i-udp.h"
 #include "ns3/socket.h"
 #include "ns3/nstime.h"
 
@@ -39,8 +39,8 @@
 {
   InternetNode *a = new InternetNode ();
 
-  Udp *udp;
-  udp = a->GetUdp ();
+  IUdp *udp;
+  udp = a->QueryInterface<IUdp> (IUdp::iid);
 
   Socket *sink = udp->CreateSocket ();
   sink->Bind (80);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/i-udp-impl.cc	Thu May 03 14:20:04 2007 +0200
@@ -0,0 +1,54 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 INRIA
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+#include "i-udp-impl.h"
+#include "udp.h"
+#include "ns3/assert.h"
+
+namespace ns3 {
+
+IUdpImpl::IUdpImpl (Udp *udp)
+  : m_udp (udp)
+{
+  m_udp->Ref ();
+}
+IUdpImpl::~IUdpImpl ()
+{
+  NS_ASSERT (m_udp == 0);
+}
+
+Socket *
+IUdpImpl::CreateSocket (void)
+{
+  return m_udp->CreateSocket ();
+}
+
+void 
+IUdpImpl::DoDispose (void)
+{
+  if (m_udp != 0)
+    {
+      m_udp->Unref ();
+      m_udp = 0;
+    }
+  IUdp::DoDispose ();
+}
+
+} // namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/i-udp-impl.h	Thu May 03 14:20:04 2007 +0200
@@ -0,0 +1,46 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 INRIA
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+#ifndef I_UDP_IMPL_H
+#define I_UDP_IMPL_H
+
+#include "i-udp.h"
+
+namespace ns3 {
+
+class Udp;
+
+class IUdpImpl : public IUdp
+{
+public:
+  IUdpImpl (Udp *udp);
+  virtual ~IUdpImpl ();
+
+  virtual Socket *CreateSocket (void);
+
+protected:
+  virtual void DoDispose (void);
+private:
+  Udp *m_udp;
+};
+
+} // namespace ns3
+
+#endif /* I_UDP_IMPL_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/i-udp.cc	Thu May 03 14:20:04 2007 +0200
@@ -0,0 +1,32 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 INRIA
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+#include "i-udp.h"
+#include "ns3/iid-manager.h"
+
+namespace ns3 {
+
+const uint32_t IUdp::iid = IidManager::Allocate ("IUdp");
+
+IUdp::IUdp ()
+  : NsUnknown (IUdp::iid)
+{}
+
+} // namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node/i-udp.h	Thu May 03 14:20:04 2007 +0200
@@ -0,0 +1,42 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 INRIA
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+#ifndef I_UDP_H
+#define I_UDP_H
+
+#include "ns3/ns-unknown.h"
+
+namespace ns3 {
+
+class Socket;
+
+class IUdp : public NsUnknown
+{
+public:
+  static const uint32_t iid;
+
+  IUdp ();
+
+  virtual Socket *CreateSocket (void) = 0;
+};
+
+} // namespace ns3
+
+#endif /* I_UDP_H */
--- a/src/node/internet-node.cc	Thu May 03 13:49:24 2007 +0200
+++ b/src/node/internet-node.cc	Thu May 03 14:20:04 2007 +0200
@@ -31,28 +31,34 @@
 #include "ipv4.h"
 #include "arp.h"
 #include "net-device.h"
+#include "i-udp-impl.h"
 
 namespace ns3 {
 
 
 InternetNode::InternetNode()
 {
+  Ipv4 *ipv4 = new Ipv4 (this);
+  Arp *arp = new Arp (this);
+  Udp *udp = new Udp (this);
+
+
   // Instantiate the capabilities
   ApplicationList *applicationList = new ApplicationList(this);
   L3Demux *l3Demux = new L3Demux(this);
   Ipv4L4Demux *ipv4L4Demux = new Ipv4L4Demux(this);
 
+  l3Demux->Insert (ipv4);
+  l3Demux->Insert (arp);
+  ipv4L4Demux->Insert (udp);
+
+  IUdpImpl *udpImpl = new IUdpImpl (udp);
+
+  NsUnknown::AddInterface (udpImpl);
   NsUnknown::AddInterface (applicationList);
   NsUnknown::AddInterface (l3Demux);
   NsUnknown::AddInterface (ipv4L4Demux);
 
-  Ipv4 *ipv4 = new Ipv4 (this);
-  Arp *arp = new Arp (this);
-  Udp *udp = new Udp (this);
-
-  l3Demux->Insert (ipv4);
-  l3Demux->Insert (arp);
-  ipv4L4Demux->Insert (udp);
 
   applicationList->Unref ();
   l3Demux->Unref ();
@@ -60,6 +66,7 @@
   ipv4->Unref ();
   arp->Unref ();
   udp->Unref ();
+  udpImpl->Unref ();
 }
 
 InternetNode::~InternetNode ()
--- a/src/node/onoff-application.cc	Thu May 03 13:49:24 2007 +0200
+++ b/src/node/onoff-application.cc	Thu May 03 14:20:04 2007 +0200
@@ -30,7 +30,7 @@
 #include "ns3/random-variable.h"
 #include "socket.h"
 #include "ns3/simulator.h"
-#include "udp.h"
+#include "i-udp.h"
 
 using namespace std;
 
@@ -170,7 +170,7 @@
                                      this));
 #endif
       
-      Udp *udp = PeekNode ()->GetUdp ();
+      IUdp *udp = PeekNode ()->QueryInterface<IUdp> (IUdp::iid);
       m_socket = udp->CreateSocket ();
       udp->Unref ();
       m_socket->Connect (m_peerIP, m_peerPort);