branch merge
authorCraig Dowell <craigdo@ee.washington.edu>
Wed, 26 Mar 2008 21:28:27 -0700
changeset 2852 30000484443d
parent 2851 3d683ff1543a (current diff)
parent 2760 d745bd7a18e8 (diff)
child 2853 1cff5dd98f63
branch merge
--- a/examples/csma-broadcast.cc	Wed Mar 26 21:28:13 2008 -0700
+++ b/examples/csma-broadcast.cc	Wed Mar 26 21:28:27 2008 -0700
@@ -35,6 +35,7 @@
 #include "ns3/core-module.h"
 #include "ns3/helper-module.h"
 #include "ns3/internet-node-module.h"
+#include "ns3/simulator-module.h"
 
 using namespace ns3;
 
--- a/examples/mixed-global-routing.cc	Wed Mar 26 21:28:13 2008 -0700
+++ b/examples/mixed-global-routing.cc	Wed Mar 26 21:28:27 2008 -0700
@@ -36,36 +36,12 @@
 #include <string>
 #include <cassert>
 
-#include "ns3/log.h"
-
-#include "ns3/command-line.h"
-#include "ns3/ptr.h"
-#include "ns3/random-variable.h"
-#include "ns3/config.h"
-
-#include "ns3/simulator.h"
-#include "ns3/nstime.h"
-#include "ns3/data-rate.h"
-
+#include "ns3/core-module.h"
+#include "ns3/helper-module.h"
+#include "ns3/simulator-module.h"
 #include "ns3/ascii-trace.h"
 #include "ns3/pcap-trace.h"
-#include "ns3/internet-node.h"
-#include "ns3/point-to-point-channel.h"
-#include "ns3/point-to-point-net-device.h"
-#include "ns3/csma-channel.h"
-#include "ns3/csma-net-device.h"
-#include "ns3/csma-topology.h"
-#include "ns3/csma-ipv4-topology.h"
-#include "ns3/mac48-address.h"
-#include "ns3/ipv4-address.h"
-#include "ns3/ipv4.h"
-#include "ns3/socket.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/ipv4-route.h"
-#include "ns3/point-to-point-topology.h"
-#include "ns3/onoff-application.h"
 #include "ns3/global-route-manager.h"
-#include "ns3/uinteger.h"
 
 using namespace ns3;
 
@@ -114,68 +90,49 @@
   cmd.Parse (argc, argv);
 
   NS_LOG_INFO ("Create nodes.");
-  Ptr<Node> n0 = CreateObject<InternetNode> ();
-  Ptr<Node> n1 = CreateObject<InternetNode> (); 
-  Ptr<Node> n2 = CreateObject<InternetNode> (); 
-  Ptr<Node> n3 = CreateObject<InternetNode> ();
-  Ptr<Node> n4 = CreateObject<InternetNode> (); 
-  Ptr<Node> n5 = CreateObject<InternetNode> (); 
-  Ptr<Node> n6 = CreateObject<InternetNode> ();
+  NodeContainer c;
+  c.Create (7);
+  NodeContainer n0n2 = NodeContainer (c.Get (0), c.Get (2));
+  NodeContainer n1n2 = NodeContainer (c.Get (1), c.Get (2));
+  NodeContainer n5n6 = NodeContainer (c.Get (5), c.Get (6));
+  NodeContainer n2345 = NodeContainer (c.Get (2), c.Get (3), c.Get (4), c.Get (5));
+
+  InternetStackHelper internet;
+  internet.Build (c);
 
   // We create the channels first without any IP addressing information
   NS_LOG_INFO ("Create channels.");
-  Ptr<PointToPointChannel> channel0 = 
-    PointToPointTopology::AddPointToPointLink (
-      n0, n2, DataRate (5000000), MilliSeconds (2));
+  PointToPointHelper p2p;
+  p2p.SetChannelParameter ("BitRate", DataRate (5000000));
+  p2p.SetChannelParameter ("Delay", MilliSeconds (2));
+  NetDeviceContainer d0d2 = p2p.Build (n0n2);
 
-  Ptr<PointToPointChannel> channel1 = 
-    PointToPointTopology::AddPointToPointLink (
-      n1, n2, DataRate (5000000), MilliSeconds (2));
-  
-  Ptr<PointToPointChannel> channel2 = 
-    PointToPointTopology::AddPointToPointLink (
-      n5, n6, DataRate (1500000), MilliSeconds (10));
+  NetDeviceContainer d1d2 = p2p.Build (n1n2);
+
+  p2p.SetChannelParameter ("BitRate", DataRate (1500000));
+  p2p.SetChannelParameter ("Delay", MilliSeconds (10));
+  NetDeviceContainer d5d6 = p2p.Build (n5n6);
 
   // We create the channels first without any IP addressing information
-  Ptr<CsmaChannel> channelc0 = 
-    CsmaTopology::CreateCsmaChannel(
-      DataRate(5000000), MilliSeconds(2));
-
-  NS_LOG_INFO ("Build Topology.");
-  uint32_t n2ifIndex = CsmaIpv4Topology::AddIpv4CsmaNetDevice (n2, channelc0,
-                                         Mac48Address("10:54:23:54:23:50"));
-  uint32_t n3ifIndex = CsmaIpv4Topology::AddIpv4CsmaNetDevice (n3, channelc0,
-                                         Mac48Address("10:54:23:54:23:51"));
-  uint32_t n4ifIndex = CsmaIpv4Topology::AddIpv4CsmaNetDevice (n4, channelc0,
-                                         Mac48Address("10:54:23:54:23:52"));
-  uint32_t n5ifIndex = CsmaIpv4Topology::AddIpv4CsmaNetDevice (n5, channelc0,
-                                         Mac48Address("10:54:23:54:23:53"));
-
+  CsmaHelper csma;
+  csma.SetChannelParameter ("BitRate", DataRate (5000000));
+  csma.SetChannelParameter ("Delay", MilliSeconds (2));
+  NetDeviceContainer d2345 = csma.Build (n2345);
+  
   // Later, we add IP addresses.  
   NS_LOG_INFO ("Assign IP Addresses.");
-  PointToPointTopology::AddIpv4Addresses (
-      channel0, n0, Ipv4Address ("10.1.1.1"),
-      n2, Ipv4Address ("10.1.1.2"));
-  
-  PointToPointTopology::AddIpv4Addresses (
-      channel1, n1, Ipv4Address ("10.1.2.1"),
-      n2, Ipv4Address ("10.1.2.2"));
-  
-  PointToPointTopology::AddIpv4Addresses (
-      channel2, n5, Ipv4Address ("10.1.3.1"),
-      n6, Ipv4Address ("10.1.3.2"));
+  Ipv4AddressHelper ipv4;
+  ipv4.SetBase ("10.1.1.0", "255.255.255.0");
+  ipv4.Allocate (d0d2);
 
-  CsmaIpv4Topology::AddIpv4Address (
-      n2, n2ifIndex, Ipv4Address("10.250.1.1"), Ipv4Mask("255.255.255.0"));
+  ipv4.SetBase ("10.1.2.0", "255.255.255.0");
+  ipv4.Allocate (d1d2);
 
-  CsmaIpv4Topology::AddIpv4Address (
-      n3, n3ifIndex, Ipv4Address("10.250.1.2"), Ipv4Mask("255.255.255.0"));
-  
-  CsmaIpv4Topology::AddIpv4Address (
-      n4, n4ifIndex, Ipv4Address("10.250.1.3"), Ipv4Mask("255.255.255.0"));
-  
-  CsmaIpv4Topology::AddIpv4Address (
-      n5, n5ifIndex, Ipv4Address("10.250.1.4"), Ipv4Mask("255.255.255.0"));
+  ipv4.SetBase ("10.1.3.0", "255.255.255.0");
+  Ipv4InterfaceContainer i5i6 = ipv4.Allocate (d5d6);
+
+  ipv4.SetBase ("10.250.1.0", "255.255.255.0");
+  ipv4.Allocate (d2345);
 
   // Create router nodes, initialize routing database and set up the routing
   // tables in the nodes.
@@ -185,17 +142,15 @@
   // 210 bytes at a rate of 448 Kb/s
   NS_LOG_INFO ("Create Applications.");
   uint16_t port = 9;   // Discard port (RFC 863)
-  Ptr<OnOffApplication> ooff = 
-    CreateObject<OnOffApplication> ("Remote", Address (InetSocketAddress ("10.1.3.2", port)), 
-                                    "Protocol", TypeId::LookupByName ("ns3::Udp"),
-                                    "OnTime", ConstantVariable (1), 
-                                    "OffTime", ConstantVariable (0),
-                                    "DataRate", DataRate("300bps"),
-                                    "PacketSize", Uinteger (50));
-  n0->AddApplication (ooff);
-  // Start the application
-  ooff->Start (Seconds (1.0));
-  ooff->Stop (Seconds (10.0));
+  OnOffHelper onoff;
+  onoff.SetAppAttribute ("OnTime", ConstantVariable (1));
+  onoff.SetAppAttribute ("OffTime", ConstantVariable (0));
+  onoff.SetAppAttribute ("DataRate", DataRate("300bps"));
+  onoff.SetAppAttribute ("PacketSize", Uinteger (50));
+  onoff.SetUdpRemote (i5i6.GetAddress (1), port);
+  ApplicationContainer apps = onoff.Build (c.Get (0));
+  apps.Start (Seconds (1.0));
+  apps.Stop (Seconds (10.0));
 
   // Configure tracing of all enqueue, dequeue, and NetDevice receive events
   // Trace output will be sent to the simple-global-routing.tr file
--- a/examples/simple-alternate-routing.cc	Wed Mar 26 21:28:13 2008 -0700
+++ b/examples/simple-alternate-routing.cc	Wed Mar 26 21:28:27 2008 -0700
@@ -37,32 +37,12 @@
 #include <string>
 #include <cassert>
 
-#include "ns3/log.h"
-
-#include "ns3/command-line.h"
-#include "ns3/ptr.h"
-#include "ns3/random-variable.h"
-#include "ns3/config.h"
-#include "ns3/uinteger.h"
-
-#include "ns3/simulator.h"
-#include "ns3/nstime.h"
-#include "ns3/data-rate.h"
-
+#include "ns3/core-module.h"
+#include "ns3/simulator-module.h"
+#include "ns3/helper-module.h"
+#include "ns3/global-route-manager.h"
 #include "ns3/ascii-trace.h"
 #include "ns3/pcap-trace.h"
-#include "ns3/internet-node.h"
-#include "ns3/point-to-point-channel.h"
-#include "ns3/point-to-point-net-device.h"
-#include "ns3/ipv4-address.h"
-#include "ns3/ipv4.h"
-#include "ns3/socket.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/ipv4-route.h"
-#include "ns3/point-to-point-topology.h"
-#include "ns3/onoff-application.h"
-#include "ns3/packet-sink.h"
-#include "ns3/global-route-manager.h"
 
 using namespace ns3;
 
@@ -128,50 +108,50 @@
   // Here, we will explicitly create four nodes.  In more sophisticated
   // topologies, we could configure a node factory.
   NS_LOG_INFO ("Create nodes.");
-  Ptr<Node> n0 = CreateObject<InternetNode> ();
-  Ptr<Node> n1 = CreateObject<InternetNode> (); 
-  Ptr<Node> n2 = CreateObject<InternetNode> (); 
-  Ptr<Node> n3 = CreateObject<InternetNode> ();
+  NodeContainer c;
+  c.Create (4);
+  NodeContainer n0n2 = NodeContainer (c.Get (0), c.Get (2));
+  NodeContainer n1n2 = NodeContainer (c.Get (1), c.Get (2));
+  NodeContainer n3n2 = NodeContainer (c.Get (3), c.Get (2));
+  NodeContainer n1n3 = NodeContainer (c.Get (1), c.Get (3));
 
   // We create the channels first without any IP addressing information
   NS_LOG_INFO ("Create channels.");
-  Ptr<PointToPointChannel> channel0 = 
-    PointToPointTopology::AddPointToPointLink (
-      n0, n2, DataRate (5000000), MilliSeconds (2));
+  PointToPointHelper p2p;
+  p2p.SetChannelParameter ("BitRate", DataRate (5000000));
+  p2p.SetChannelParameter ("Delay", MilliSeconds (2));
+  NetDeviceContainer d0d2 = p2p.Build (n0n2);
+
+  NetDeviceContainer d1d2 = p2p.Build (n1n2);
 
-  Ptr<PointToPointChannel> channel1 = 
-    PointToPointTopology::AddPointToPointLink (
-      n1, n2, DataRate (5000000), MilliSeconds (2));
-  
-  Ptr<PointToPointChannel> channel2 = 
-    PointToPointTopology::AddPointToPointLink (
-      n2, n3, DataRate (1500000), MilliSeconds (10));
-  
-  Ptr<PointToPointChannel> channel3 = 
-    PointToPointTopology::AddPointToPointLink (
-      n1, n3, DataRate (1500000), MilliSeconds (100));
+  p2p.SetChannelParameter ("BitRate", DataRate(1500000));
+  p2p.SetChannelParameter ("Delay", MilliSeconds (10));
+  NetDeviceContainer d3d2 = p2p.Build (n3n2);
+
+  p2p.SetChannelParameter ("Delay", MilliSeconds (100));
+  NetDeviceContainer d1d3 = p2p.Build (n1n3);
+
+  InternetStackHelper internet;
+  internet.Build (c);
   
   // Later, we add IP addresses.  The middle two octets correspond to 
  // the channel number.  
   NS_LOG_INFO ("Assign IP Addresses.");
-  PointToPointTopology::AddIpv4Addresses (
-      channel0, n0, Ipv4Address ("10.0.0.1"),
-      n2, Ipv4Address ("10.0.0.2"));
+  Ipv4AddressHelper ipv4;
+  ipv4.SetBase ("10.0.0.0", "255.255.255.0");
+  ipv4.Allocate (d0d2);
   
-  PointToPointTopology::AddIpv4Addresses (
-      channel1, n1, Ipv4Address ("10.1.1.1"),
-      n2, Ipv4Address ("10.1.1.2"));
+  ipv4.SetBase ("10.1.1.0", "255.255.255.0");
+  Ipv4InterfaceContainer i1i2 = ipv4.Allocate (d1d2);
   
-  PointToPointTopology::AddIpv4Addresses (
-      channel2, n2, Ipv4Address ("10.2.2.1"),
-      n3, Ipv4Address ("10.2.2.2"));
+  ipv4.SetBase ("10.2.2.0", "255.255.255.0");
+  ipv4.Allocate (d3d2);
 
-  PointToPointTopology::AddIpv4Addresses (
-      channel3, n1, Ipv4Address ("10.3.3.1"),
-      n3, Ipv4Address ("10.3.3.2"));
+  ipv4.SetBase ("10.3.3.0", "255.255.255.0");
+  Ipv4InterfaceContainer i1i3 = ipv4.Allocate (d1d3);
 
-  PointToPointTopology::SetIpv4Metric (
-      channel3, n1, n3, sampleMetric);
+  i1i3.SetMetric (0, sampleMetric);
+  i1i3.SetMetric (1, sampleMetric);
 
   // Create router nodes, initialize routing database and set up the routing
   // tables in the nodes.
@@ -182,24 +162,20 @@
   uint16_t port = 9;   // Discard port (RFC 863)
 
   // Create a flow from n3 to n1, starting at time 1.1 seconds
-  Ptr<OnOffApplication> ooff = 
-    CreateObject<OnOffApplication> ("Remote", Address (InetSocketAddress ("10.1.1.1", port)),
-                                    "Protocol", TypeId::LookupByName ("ns3::Udp"),
-                                    "OnTime", ConstantVariable (1), 
-                                    "OffTime", ConstantVariable (0));
-  n3->AddApplication (ooff);
-  // Start the application
-  ooff->Start (Seconds (1.1));
-  ooff->Stop (Seconds (10.0));
+  OnOffHelper onoff;
+  onoff.SetAppAttribute ("OnTime", ConstantVariable (1));
+  onoff.SetAppAttribute ("OffTime", ConstantVariable (0));
+  onoff.SetUdpRemote (i1i2.GetAddress (0), port);
+  ApplicationContainer apps = onoff.Build (c.Get (3));
+  apps.Start (Seconds (1.1));
+  apps.Start (Seconds (10.0));
 
   // Create a packet sink to receive these packets
-  Ptr<PacketSink> sink = 
-    CreateObject<PacketSink> ("Remote", Address (InetSocketAddress (Ipv4Address::GetAny (), port)), 
-                              "Protocol", TypeId::LookupByName ("ns3::Udp"));
-  n1->AddApplication (sink);
-  // Start the sink
-  sink->Start (Seconds (1.1));
-  sink->Stop (Seconds (10.0));
+  PacketSinkHelper sink;
+  sink.SetupUdp (Ipv4Address::GetAny (), port);
+  apps = sink.Build (c.Get (1));
+  apps.Start (Seconds (1.1));
+  apps.Stop (Seconds (10.0));
 
   // Configure tracing of all enqueue, dequeue, and NetDevice receive events
   // Trace output will be sent to the simple-alternate-routing.tr file
--- a/examples/simple-error-model.cc	Wed Mar 26 21:28:13 2008 -0700
+++ b/examples/simple-error-model.cc	Wed Mar 26 21:28:27 2008 -0700
@@ -38,34 +38,13 @@
 // - Tracing of queues and packet receptions to file 
 //   "simple-error-model.tr"
 
-#include "ns3/log.h"
-#include "ns3/assert.h"
-#include "ns3/command-line.h"
-#include "ns3/ptr.h"
-#include "ns3/config.h"
-#include "ns3/uinteger.h"
-#include "ns3/string.h"
-
-#include "ns3/simulator.h"
-#include "ns3/nstime.h"
-#include "ns3/data-rate.h"
-
+#include "ns3/core-module.h"
+#include "ns3/common-module.h"
+#include "ns3/simulator-module.h"
+#include "ns3/helper-module.h"
 #include "ns3/ascii-trace.h"
 #include "ns3/pcap-trace.h"
-#include "ns3/internet-node.h"
-#include "ns3/random-variable.h"
-#include "ns3/point-to-point-channel.h"
-#include "ns3/point-to-point-net-device.h"
-#include "ns3/ipv4-address.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/ipv4.h"
-#include "ns3/socket.h"
-#include "ns3/ipv4-route.h"
-#include "ns3/point-to-point-topology.h"
-#include "ns3/onoff-application.h"
-#include "ns3/packet-sink.h"
-#include "ns3/error-model.h"
-#include "ns3/double.h"
+#include "ns3/global-route-manager.h"
 
 using namespace ns3;
 
@@ -96,122 +75,92 @@
   // Here, we will explicitly create four nodes.  In more sophisticated
   // topologies, we could configure a node factory.
   NS_LOG_INFO ("Create nodes.");
-  Ptr<Node> n0 = CreateObject<InternetNode> ();
-  Ptr<Node> n1 = CreateObject<InternetNode> (); 
-  Ptr<Node> n2 = CreateObject<InternetNode> (); 
-  Ptr<Node> n3 = CreateObject<InternetNode> ();
+  NodeContainer c;
+  c.Create (4);
+  NodeContainer n0n2 = NodeContainer (c.Get (0), c.Get (2));
+  NodeContainer n1n2 = NodeContainer (c.Get (1), c.Get (2));
+  NodeContainer n3n2 = NodeContainer (c.Get (3), c.Get (2));
+
+  InternetStackHelper internet;
+  internet.Build (c);
 
   // We create the channels first without any IP addressing information
   NS_LOG_INFO ("Create channels.");
-  Ptr<PointToPointChannel> channel0 = 
-    PointToPointTopology::AddPointToPointLink (
-      n0, n2, DataRate(5000000), MilliSeconds(2));
+  PointToPointHelper p2p;
+  p2p.SetChannelParameter ("BitRate", DataRate (5000000));
+  p2p.SetChannelParameter ("Delay", MilliSeconds (2));
+  NetDeviceContainer d0d2 = p2p.Build (n0n2);
 
-  Ptr<PointToPointChannel> channel1 = 
-    PointToPointTopology::AddPointToPointLink (
-      n1, n2, DataRate(5000000), MilliSeconds(2));
-  
-  Ptr<PointToPointChannel> channel2 = 
-    PointToPointTopology::AddPointToPointLink (
-      n2, n3, DataRate(1500000), MilliSeconds(10));
+  NetDeviceContainer d1d2 = p2p.Build (n1n2);
+
+  p2p.SetChannelParameter ("BitRate", DataRate (1500000));
+  p2p.SetChannelParameter ("Delay", MilliSeconds (10));
+  NetDeviceContainer d3d2 = p2p.Build (n3n2);
   
   // Later, we add IP addresses.  
   NS_LOG_INFO ("Assign IP Addresses.");
-  PointToPointTopology::AddIpv4Addresses (
-      channel0, n0, Ipv4Address("10.1.1.1"),
-      n2, Ipv4Address("10.1.1.2"));
-  
-  PointToPointTopology::AddIpv4Addresses (
-      channel1, n1, Ipv4Address("10.1.2.1"),
-      n2, Ipv4Address("10.1.2.2"));
+  Ipv4AddressHelper ipv4;
+  ipv4.SetBase ("10.1.1.0", "255.255.255.0");
+  ipv4.Allocate (d0d2);
   
-  PointToPointTopology::AddIpv4Addresses (
-      channel2, n2, Ipv4Address("10.1.3.1"),
-      n3, Ipv4Address("10.1.3.2"));
+  ipv4.SetBase ("10.1.2.0", "255.255.255.0");
+  Ipv4InterfaceContainer i1i2 = ipv4.Allocate (d1d2);
 
-  // Finally, we add static routes.  These three steps (Channel and
-  // NetDevice creation, IP Address assignment, and routing) are 
-  // separated because there may be a need to postpone IP Address
-  // assignment (emulation) or modify to use dynamic routing
-  NS_LOG_INFO ("Add Static Routes.");
-  PointToPointTopology::AddIpv4Routes(n0, n2, channel0);
-  PointToPointTopology::AddIpv4Routes(n1, n2, channel1);
-  PointToPointTopology::AddIpv4Routes(n2, n3, channel2);
+  ipv4.SetBase ("10.1.3.0", "255.255.255.0");
+  Ipv4InterfaceContainer i3i2 = ipv4.Allocate (d3d2);
+
+  NS_LOG_INFO ("Use global routing.");
+  GlobalRouteManager::PopulateRoutingTables ();
 
   // Create the OnOff application to send UDP datagrams of size
   // 210 bytes at a rate of 448 Kb/s
   NS_LOG_INFO ("Create Applications.");
   uint16_t port = 9;   // Discard port (RFC 863)
-  Ptr<OnOffApplication> ooff = 
-    CreateObject<OnOffApplication> ("Remote", Address (InetSocketAddress ("10.1.3.2", port)), 
-                                    "Protocol", TypeId::LookupByName ("ns3::Udp"),
-                                    "OnTime", ConstantVariable(1), 
-                                    "OffTime", ConstantVariable(0));
-  n0->AddApplication (ooff);
-  // Start the application
-  ooff->Start(Seconds(1.0));
-  ooff->Stop (Seconds(10.0));
+  OnOffHelper onoff;
+  onoff.SetUdpRemote (i3i2.GetAddress (1), port);
+  onoff.SetAppAttribute ("OnTime", ConstantVariable(1));
+  onoff.SetAppAttribute ("OffTime", ConstantVariable(0));
+  ApplicationContainer apps = onoff.Build (c.Get (0));
+  apps.Start(Seconds(1.0));
+  apps.Stop (Seconds(10.0));
 
   // Create an optional packet sink to receive these packets
-  Ptr<PacketSink> sink = CreateObject<PacketSink> ("Local", Address (InetSocketAddress (Ipv4Address::GetAny (), port)),
-                                                   "Protocol", TypeId::LookupByName ("ns3::Udp"));
-  n3->AddApplication (sink);
-  // Start the sink
-  sink->Start (Seconds (1.0));
-  sink->Stop (Seconds (10.0));
+  PacketSinkHelper sink;
+  sink.SetupUdp (Ipv4Address::GetAny (), port);
+  apps = sink.Build (c.Get (3));
+  apps.Start (Seconds (1.0));
+  apps.Stop (Seconds (10.0));
 
   // Create a similar flow from n3 to n1, starting at time 1.1 seconds
-  ooff = CreateObject<OnOffApplication> ("Remote", Address (InetSocketAddress ("10.1.2.1", port)), 
-                                         "Protocol", TypeId::LookupByName ("ns3::Udp"),
-                                         "OnTime", ConstantVariable(1), 
-                                         "OffTime", ConstantVariable(0));
-  n3->AddApplication (ooff);
-  // Start the application
-  ooff->Start(Seconds(1.1));
-  ooff->Stop (Seconds(10.0));
+  onoff.SetUdpRemote (i1i2.GetAddress (0), port);
+  apps = onoff.Build (c.Get (3));
+  apps.Start(Seconds(1.1));
+  apps.Stop (Seconds(10.0));
 
   // Create a packet sink to receive these packets
-  sink = CreateObject<PacketSink> ("Local", Address (InetSocketAddress (Ipv4Address::GetAny (), port)),
-                                   "Protocol", TypeId::LookupByName ("ns3::Udp"));
-  n1->AddApplication (sink);
-  // Start the sink
-  sink->Start (Seconds (1.1));
-  sink->Stop (Seconds (10.0));
-
-  // Here, finish off packet routing configuration
-  // This will likely set by some global StaticRouting object in the future
-  NS_LOG_INFO ("Set Default Routes.");
-  Ptr<Ipv4> ipv4;
-  ipv4 = n0->GetObject<Ipv4> ();
-  ipv4->SetDefaultRoute (Ipv4Address ("10.1.1.2"), 1);
-  ipv4 = n3->GetObject<Ipv4> ();
-  ipv4->SetDefaultRoute (Ipv4Address ("10.1.3.1"), 1);
+  sink.SetupUdp (Ipv4Address::GetAny (), port);
+  apps = sink.Build (c.Get (1));
+  apps.Start (Seconds (1.1));
+  apps.Stop (Seconds (10.0));
 
   //
   // Error model
   //
-  // We want to add an error model to node 3's NetDevice
-  // We can obtain a handle to the NetDevice via the channel and node 
-  // pointers
-  Ptr<PointToPointNetDevice> nd3 = PointToPointTopology::GetNetDevice
-    (n3, channel2);
   // Create an ErrorModel based on the implementation (constructor)
   // specified by the default classId
   Ptr<RateErrorModel> em = CreateObject<RateErrorModel> ("RanVar", UniformVariable (0.0, 1.0),
-                                                             "Rate", Double (0.001));
-  nd3->AddReceiveErrorModel (em);
+                                                         "ErrorRate", Double (0.001));
+  d3d2.Get (0)->SetAttribute ("ReceiveErrorModel", em);
 
   // Now, let's use the ListErrorModel and explicitly force a loss
   // of the packets with pkt-uids = 11 and 17 on node 2, device 0
-  Ptr<PointToPointNetDevice> nd2 = PointToPointTopology::GetNetDevice
-    (n2, channel0);
   std::list<uint32_t> sampleList;
   sampleList.push_back (11);
   sampleList.push_back (17);
   // This time, we'll explicitly create the error model we want
   Ptr<ListErrorModel> pem = CreateObject<ListErrorModel> ();
   pem->SetList (sampleList);
-  nd2->AddReceiveErrorModel (pem);
+  d0d2.Get (1)->SetAttribute ("ReceiveErrorModel", pem);
 
   // Configure tracing of all enqueue, dequeue, and NetDevice receive events
   // Trace output will be sent to the simple-error-model.tr file
--- a/examples/tcp-large-transfer.cc	Wed Mar 26 21:28:13 2008 -0700
+++ b/examples/tcp-large-transfer.cc	Wed Mar 26 21:28:27 2008 -0700
@@ -36,12 +36,13 @@
 
 #include "ns3/core-module.h"
 #include "ns3/helper-module.h"
+#include "ns3/node-module.h"
+#include "ns3/global-route-manager.h"
+#include "ns3/simulator-module.h"
 
 #include "ns3/ascii-trace.h"
 #include "ns3/pcap-trace.h"
 
-#include "ns3/internet-node-module.h"
-
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE ("TcpLargeTransfer");
@@ -149,7 +150,7 @@
   ipv4.SetBase ("10.1.3.0", "255.255.255.0");
   ipv4.Allocate (dev0);
   ipv4.SetBase ("10.1.2.0", "255.255.255.0");
-  ipv4.Allocate (dev1);
+  Ipv4InterfaceContainer ipInterfs = ipv4.Allocate (dev1);
 
   // and setup ip routing tables to get total ip-level connectivity.
   GlobalRouteManager::PopulateRoutingTables ();
@@ -177,7 +178,7 @@
   Ptr<Socket> localSocket = socketFactory->CreateSocket ();
   localSocket->Bind ();
   Simulator::ScheduleNow (&StartFlow, localSocket, nBytes,
-                          Ipv4Address ("10.1.2.2"), servPort);
+                          ipInterfs.GetAddress (1), servPort);
 
   // Configure tracing of all enqueue, dequeue, and NetDevice receive events
   // Trace output will be sent to the simple-examples.tr file
--- a/samples/main-random-topology.cc	Wed Mar 26 21:28:13 2008 -0700
+++ b/samples/main-random-topology.cc	Wed Mar 26 21:28:27 2008 -0700
@@ -3,6 +3,7 @@
 #include "ns3/core-module.h"
 #include "ns3/mobility-module.h"
 #include "ns3/helper-module.h"
+#include "ns3/simulator-module.h"
 
 using namespace ns3;
 
--- a/samples/main-random-walk.cc	Wed Mar 26 21:28:13 2008 -0700
+++ b/samples/main-random-walk.cc	Wed Mar 26 21:28:27 2008 -0700
@@ -3,6 +3,7 @@
 #include "ns3/core-module.h"
 #include "ns3/helper-module.h"
 #include "ns3/mobility-module.h"
+#include "ns3/simulator-module.h"
 
 using namespace ns3;
 
--- a/src/devices/point-to-point/point-to-point-net-device.cc	Wed Mar 26 21:28:13 2008 -0700
+++ b/src/devices/point-to-point/point-to-point-net-device.cc	Wed Mar 26 21:28:27 2008 -0700
@@ -50,7 +50,7 @@
                    DataRate ("10Mb/s"),
                    MakeDataRateAccessor (&PointToPointNetDevice::m_bps),
                    MakeDataRateChecker ())
-    .AddAttribute ("RxErrorModel", "XXX",
+    .AddAttribute ("ReceiveErrorModel", "XXX",
                    Ptr<ErrorModel> (0),
                    MakePtrAccessor (&PointToPointNetDevice::m_receiveErrorModel),
                    MakePtrChecker<ErrorModel> ())
@@ -224,7 +224,6 @@
   NS_LOG_PARAMS ("(" << em << ")");
 
   m_receiveErrorModel = em;
-  AggregateObject (em);
 }
 
 void PointToPointNetDevice::Receive (Ptr<Packet> packet)
--- a/src/helper/ipv4-address-helper.cc	Wed Mar 26 21:28:13 2008 -0700
+++ b/src/helper/ipv4-address-helper.cc	Wed Mar 26 21:28:27 2008 -0700
@@ -120,10 +120,11 @@
   return Ipv4Address (m_network << m_shift);
 }
 
-  void
+Ipv4InterfaceContainer
 Ipv4AddressHelper::Allocate (const NetDeviceContainer &c)
 {
   NS_LOG_FUNCTION;
+  Ipv4InterfaceContainer retval;
   for (uint32_t i = 0; i < c.GetN (); ++i) {
     Ptr<NetDevice> device = c.Get (i);
 
@@ -145,7 +146,9 @@
     ipv4->SetNetworkMask (ifIndex, m_mask);
     ipv4->SetMetric (ifIndex, 1);
     ipv4->SetUp (ifIndex);
+    retval.Add (ipv4, ifIndex);
   }
+  return retval;
 }
 
 const uint32_t N_BITS = 32;
--- a/src/helper/ipv4-address-helper.h	Wed Mar 26 21:28:13 2008 -0700
+++ b/src/helper/ipv4-address-helper.h	Wed Mar 26 21:28:27 2008 -0700
@@ -20,7 +20,8 @@
 #define IPV4_ADDRESS_HELPER_H
 
 #include "ns3/ipv4-address.h"
-#include "ns3/net-device-container.h"
+#include "net-device-container.h"
+#include "ipv4-interface-container.h"
 
 namespace ns3 {
 
@@ -164,7 +165,7 @@
  * @see SetBase
  * @see NewNetwork
  */
-  void Allocate (const NetDeviceContainer &c);
+  Ipv4InterfaceContainer Allocate (const NetDeviceContainer &c);
 
 private:
   uint32_t NumAddressBits (uint32_t maskbits) const;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/helper/ipv4-interface-container.cc	Wed Mar 26 21:28:27 2008 -0700
@@ -0,0 +1,34 @@
+#include "ipv4-interface-container.h"
+#include "ns3/node-list.h"
+
+namespace ns3 {
+
+Ipv4InterfaceContainer::Ipv4InterfaceContainer ()
+{}
+
+uint32_t 
+Ipv4InterfaceContainer::GetN (void) const
+{
+  return m_interfaces.size ();
+}
+Ipv4Address 
+Ipv4InterfaceContainer::GetAddress (uint32_t i) const
+{
+  Ptr<Ipv4> ipv4 = m_interfaces[i].first;
+  uint32_t interface = m_interfaces[i].second;
+  return ipv4->GetAddress (interface);
+}
+void 
+Ipv4InterfaceContainer::SetMetric (uint32_t i, uint16_t metric)
+{
+  Ptr<Ipv4> ipv4 = m_interfaces[i].first;
+  uint32_t interface = m_interfaces[i].second;
+  ipv4->SetMetric (interface, metric);
+}
+void 
+Ipv4InterfaceContainer::Add (Ptr<Ipv4> ipv4, uint32_t interface)
+{
+  m_interfaces.push_back (std::make_pair (ipv4, interface));
+}
+
+} // namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/helper/ipv4-interface-container.h	Wed Mar 26 21:28:27 2008 -0700
@@ -0,0 +1,39 @@
+#ifndef IPV4_INTERFACE_CONTAINER_H
+#define IPV4_INTERFACE_CONTAINER_H
+
+#include <stdint.h>
+#include <vector>
+#include "ns3/ipv4.h"
+#include "ns3/ipv4-address.h"
+
+namespace ns3 {
+
+/**
+ * \brief keep track of a set of ipv4 interfaces.
+ *
+ */
+class Ipv4InterfaceContainer
+{
+public:
+  /**
+   * Create an empty Ipv4InterfaceContainer.
+   */
+  Ipv4InterfaceContainer ();
+
+  /**
+   * \returns the number of interfaces stored in this Ipv4InterfaceContainer.
+   */
+  uint32_t GetN (void) const;
+
+  Ipv4Address GetAddress (uint32_t i) const;
+  void SetMetric (uint32_t i, uint16_t metric);
+
+  void Add (Ptr<Ipv4> ipv4, uint32_t interface);
+
+ private:
+  std::vector<std::pair<Ptr<Ipv4>,uint32_t> > m_interfaces;
+};
+
+} // namespace ns3
+
+#endif /* IPV4_INTERFACE_CONTAINER_H */
--- a/src/helper/node-container.cc	Wed Mar 26 21:28:13 2008 -0700
+++ b/src/helper/node-container.cc	Wed Mar 26 21:28:27 2008 -0700
@@ -15,6 +15,21 @@
   Add (a);
   Add (b);
 }
+NodeContainer::NodeContainer (const NodeContainer &a, const NodeContainer &b, 
+			      const NodeContainer &c)
+{
+  Add (a);
+  Add (b);
+  Add (c);
+}
+NodeContainer::NodeContainer (const NodeContainer &a, const NodeContainer &b, 
+			      const NodeContainer &c, const NodeContainer &d)
+{
+  Add (a);
+  Add (b);
+  Add (c);
+  Add (d);
+}
 
 NodeContainer::Iterator 
 NodeContainer::Begin (void) const
--- a/src/helper/node-container.h	Wed Mar 26 21:28:13 2008 -0700
+++ b/src/helper/node-container.h	Wed Mar 26 21:28:27 2008 -0700
@@ -35,6 +35,9 @@
    */
   NodeContainer (const NodeContainer &a, const NodeContainer &b);
 
+  NodeContainer (const NodeContainer &a, const NodeContainer &b, const NodeContainer &c);
+  NodeContainer (const NodeContainer &a, const NodeContainer &b, const NodeContainer &c, const NodeContainer &d);
+
   /**
    * \returns an iterator to the start of the vector of node pointers.
    */
--- a/src/helper/wscript	Wed Mar 26 21:28:13 2008 -0700
+++ b/src/helper/wscript	Wed Mar 26 21:28:27 2008 -0700
@@ -17,6 +17,7 @@
         'on-off-helper.cc',
         'packet-sink-helper.cc',
         'packet-socket-helper.cc',
+        'ipv4-interface-container.cc',
         ]
 
     headers = bld.create_obj('ns3header')
@@ -36,4 +37,5 @@
         'on-off-helper.h',
         'packet-sink-helper.h',
         'packet-socket-helper.h',
+        'ipv4-interface-container.h',
         ]