--- a/examples/simple-error-model.cc Wed Mar 26 16:12:36 2008 -0700
+++ b/examples/simple-error-model.cc Wed Mar 26 16:12:46 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