From 89d089c506cfb77f67bba834fbce0adb57f72996 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Wed, 26 Mar 2008 13:51:07 -0700 Subject: [PATCH 01/10] introduce Ipv4InterfaceContainer and make Ipv4AddressHelper::Allocate return it. --- src/helper/ipv4-address-helper.cc | 5 +++- src/helper/ipv4-address-helper.h | 5 ++-- src/helper/ipv4-interface-container.cc | 27 ++++++++++++++++++ src/helper/ipv4-interface-container.h | 38 ++++++++++++++++++++++++++ src/helper/wscript | 2 ++ 5 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 src/helper/ipv4-interface-container.cc create mode 100644 src/helper/ipv4-interface-container.h diff --git a/src/helper/ipv4-address-helper.cc b/src/helper/ipv4-address-helper.cc index 246bee911..ac88ee608 100644 --- a/src/helper/ipv4-address-helper.cc +++ b/src/helper/ipv4-address-helper.cc @@ -120,10 +120,11 @@ Ipv4AddressHelper::NewNetwork (void) 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 device = c.Get (i); @@ -145,7 +146,9 @@ Ipv4AddressHelper::Allocate (const NetDeviceContainer &c) ipv4->SetNetworkMask (ifIndex, m_mask); ipv4->SetMetric (ifIndex, 1); ipv4->SetUp (ifIndex); + retval.Add (ipv4, ifIndex); } + return retval; } const uint32_t N_BITS = 32; diff --git a/src/helper/ipv4-address-helper.h b/src/helper/ipv4-address-helper.h index b27bd397f..55374be08 100644 --- a/src/helper/ipv4-address-helper.h +++ b/src/helper/ipv4-address-helper.h @@ -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 @@ public: * @see SetBase * @see NewNetwork */ - void Allocate (const NetDeviceContainer &c); + Ipv4InterfaceContainer Allocate (const NetDeviceContainer &c); private: uint32_t NumAddressBits (uint32_t maskbits) const; diff --git a/src/helper/ipv4-interface-container.cc b/src/helper/ipv4-interface-container.cc new file mode 100644 index 000000000..19d54d01e --- /dev/null +++ b/src/helper/ipv4-interface-container.cc @@ -0,0 +1,27 @@ +#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 = m_interfaces[i].first; + uint32_t interface = m_interfaces[i].second; + return ipv4->GetAddress (interface); +} +void +Ipv4InterfaceContainer::Add (Ptr ipv4, uint32_t interface) +{ + m_interfaces.push_back (std::make_pair (ipv4, interface)); +} + +} // namespace ns3 diff --git a/src/helper/ipv4-interface-container.h b/src/helper/ipv4-interface-container.h new file mode 100644 index 000000000..c154babb8 --- /dev/null +++ b/src/helper/ipv4-interface-container.h @@ -0,0 +1,38 @@ +#ifndef IPV4_INTERFACE_CONTAINER_H +#define IPV4_INTERFACE_CONTAINER_H + +#include +#include +#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 Add (Ptr ipv4, uint32_t interface); + + private: + std::vector,uint32_t> > m_interfaces; +}; + +} // namespace ns3 + +#endif /* IPV4_INTERFACE_CONTAINER_H */ diff --git a/src/helper/wscript b/src/helper/wscript index 49283ac14..066b6a7e9 100644 --- a/src/helper/wscript +++ b/src/helper/wscript @@ -17,6 +17,7 @@ def build(bld): '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 @@ def build(bld): 'on-off-helper.h', 'packet-sink-helper.h', 'packet-socket-helper.h', + 'ipv4-interface-container.h', ] From 050af31b9566de875fce7dec874861694f657bc7 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Wed, 26 Mar 2008 13:51:24 -0700 Subject: [PATCH 02/10] use Ipv4InterfaceContainer to avoid hardcoding ip addresses. --- examples/tcp-large-transfer.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/tcp-large-transfer.cc b/examples/tcp-large-transfer.cc index 94f859c40..4d3d09179 100644 --- a/examples/tcp-large-transfer.cc +++ b/examples/tcp-large-transfer.cc @@ -149,7 +149,7 @@ int main (int argc, char *argv[]) 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 +177,7 @@ int main (int argc, char *argv[]) Ptr 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 From cb3bcff3a65ad649d94b6d9fef683840b5611c13 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Wed, 26 Mar 2008 14:17:58 -0700 Subject: [PATCH 03/10] fallout from gustavo's header inclusion policy change. --- examples/csma-broadcast.cc | 1 + examples/tcp-large-transfer.cc | 5 +++-- samples/main-random-topology.cc | 1 + samples/main-random-walk.cc | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/csma-broadcast.cc b/examples/csma-broadcast.cc index 17720716b..f0d4e24f3 100644 --- a/examples/csma-broadcast.cc +++ b/examples/csma-broadcast.cc @@ -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; diff --git a/examples/tcp-large-transfer.cc b/examples/tcp-large-transfer.cc index 4d3d09179..e9c661086 100644 --- a/examples/tcp-large-transfer.cc +++ b/examples/tcp-large-transfer.cc @@ -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"); diff --git a/samples/main-random-topology.cc b/samples/main-random-topology.cc index 7f72beb9a..022f02c6b 100644 --- a/samples/main-random-topology.cc +++ b/samples/main-random-topology.cc @@ -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; diff --git a/samples/main-random-walk.cc b/samples/main-random-walk.cc index e94dfa644..6a536d5fb 100644 --- a/samples/main-random-walk.cc +++ b/samples/main-random-walk.cc @@ -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; From 4e2a41ae85098931463c559da3f9ade367267256 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Wed, 26 Mar 2008 14:18:12 -0700 Subject: [PATCH 04/10] add SetMetric --- src/helper/ipv4-interface-container.cc | 7 +++++++ src/helper/ipv4-interface-container.h | 1 + 2 files changed, 8 insertions(+) diff --git a/src/helper/ipv4-interface-container.cc b/src/helper/ipv4-interface-container.cc index 19d54d01e..9b57609f3 100644 --- a/src/helper/ipv4-interface-container.cc +++ b/src/helper/ipv4-interface-container.cc @@ -19,6 +19,13 @@ Ipv4InterfaceContainer::GetAddress (uint32_t i) const return ipv4->GetAddress (interface); } void +Ipv4InterfaceContainer::SetMetric (uint32_t i, uint16_t metric) +{ + Ptr ipv4 = m_interfaces[i].first; + uint32_t interface = m_interfaces[i].second; + ipv4->SetMetric (interface, metric); +} +void Ipv4InterfaceContainer::Add (Ptr ipv4, uint32_t interface) { m_interfaces.push_back (std::make_pair (ipv4, interface)); diff --git a/src/helper/ipv4-interface-container.h b/src/helper/ipv4-interface-container.h index c154babb8..7c38fac15 100644 --- a/src/helper/ipv4-interface-container.h +++ b/src/helper/ipv4-interface-container.h @@ -26,6 +26,7 @@ public: uint32_t GetN (void) const; Ipv4Address GetAddress (uint32_t i) const; + void SetMetric (uint32_t i, uint16_t metric); void Add (Ptr ipv4, uint32_t interface); From 26fba17dc232a6fdd4cf9e751b759de122b8a785 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Wed, 26 Mar 2008 14:18:22 -0700 Subject: [PATCH 05/10] port to helper API --- examples/simple-alternate-routing.cc | 120 +++++++++++---------------- 1 file changed, 48 insertions(+), 72 deletions(-) diff --git a/examples/simple-alternate-routing.cc b/examples/simple-alternate-routing.cc index 678460813..d5c907544 100644 --- a/examples/simple-alternate-routing.cc +++ b/examples/simple-alternate-routing.cc @@ -37,32 +37,12 @@ #include #include -#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 @@ main (int argc, char *argv[]) // Here, we will explicitly create four nodes. In more sophisticated // topologies, we could configure a node factory. NS_LOG_INFO ("Create nodes."); - Ptr n0 = CreateObject (); - Ptr n1 = CreateObject (); - Ptr n2 = CreateObject (); - Ptr n3 = CreateObject (); + 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 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 channel1 = - PointToPointTopology::AddPointToPointLink ( - n1, n2, DataRate (5000000), MilliSeconds (2)); - - Ptr channel2 = - PointToPointTopology::AddPointToPointLink ( - n2, n3, DataRate (1500000), MilliSeconds (10)); - - Ptr channel3 = - PointToPointTopology::AddPointToPointLink ( - n1, n3, DataRate (1500000), MilliSeconds (100)); + NetDeviceContainer d1d2 = p2p.Build (n1n2); + + 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 @@ main (int argc, char *argv[]) uint16_t port = 9; // Discard port (RFC 863) // Create a flow from n3 to n1, starting at time 1.1 seconds - Ptr ooff = - CreateObject ("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 sink = - CreateObject ("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 From 011e2bbb70344e6f0f18a4ac86b6175a7ea1c0f2 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Wed, 26 Mar 2008 14:50:56 -0700 Subject: [PATCH 06/10] add extra convenience constructors --- src/helper/node-container.cc | 15 +++++++++++++++ src/helper/node-container.h | 3 +++ 2 files changed, 18 insertions(+) diff --git a/src/helper/node-container.cc b/src/helper/node-container.cc index 2d9722016..601c649a0 100644 --- a/src/helper/node-container.cc +++ b/src/helper/node-container.cc @@ -15,6 +15,21 @@ NodeContainer::NodeContainer (const NodeContainer &a, const NodeContainer &b) 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 diff --git a/src/helper/node-container.h b/src/helper/node-container.h index 1c99fe55d..9f3321c03 100644 --- a/src/helper/node-container.h +++ b/src/helper/node-container.h @@ -35,6 +35,9 @@ public: */ 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. */ From 80e0d082b4e7cde6900602f464e12b426c0954f9 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Wed, 26 Mar 2008 14:51:03 -0700 Subject: [PATCH 07/10] convert to helper API --- examples/mixed-global-routing.cc | 135 +++++++++++-------------------- 1 file changed, 45 insertions(+), 90 deletions(-) diff --git a/examples/mixed-global-routing.cc b/examples/mixed-global-routing.cc index 53c5505d6..39af05e14 100644 --- a/examples/mixed-global-routing.cc +++ b/examples/mixed-global-routing.cc @@ -36,36 +36,12 @@ #include #include -#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 @@ main (int argc, char *argv[]) cmd.Parse (argc, argv); NS_LOG_INFO ("Create nodes."); - Ptr n0 = CreateObject (); - Ptr n1 = CreateObject (); - Ptr n2 = CreateObject (); - Ptr n3 = CreateObject (); - Ptr n4 = CreateObject (); - Ptr n5 = CreateObject (); - Ptr n6 = CreateObject (); + 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 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 channel1 = - PointToPointTopology::AddPointToPointLink ( - n1, n2, DataRate (5000000), MilliSeconds (2)); - - Ptr 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 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 @@ main (int argc, char *argv[]) // 210 bytes at a rate of 448 Kb/s NS_LOG_INFO ("Create Applications."); uint16_t port = 9; // Discard port (RFC 863) - Ptr ooff = - CreateObject ("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 From 2fe2751c9e83c89218c1150b38eb33fab8c226be Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Wed, 26 Mar 2008 14:53:00 -0700 Subject: [PATCH 08/10] do not aggregate error model to device --- src/devices/point-to-point/point-to-point-net-device.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/devices/point-to-point/point-to-point-net-device.cc b/src/devices/point-to-point/point-to-point-net-device.cc index 2d57a8688..3fa4dd131 100644 --- a/src/devices/point-to-point/point-to-point-net-device.cc +++ b/src/devices/point-to-point/point-to-point-net-device.cc @@ -224,7 +224,6 @@ void PointToPointNetDevice::AddReceiveErrorModel (Ptr em) NS_LOG_PARAMS ("(" << em << ")"); m_receiveErrorModel = em; - AggregateObject (em); } void PointToPointNetDevice::Receive (Ptr packet) From 37f1478f00151e1137f6d9c4a006d0a100f20dc0 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Wed, 26 Mar 2008 16:12:36 -0700 Subject: [PATCH 09/10] use an attribute name which matches the member variable and method --- src/devices/point-to-point/point-to-point-net-device.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/point-to-point/point-to-point-net-device.cc b/src/devices/point-to-point/point-to-point-net-device.cc index 3fa4dd131..d52a01381 100644 --- a/src/devices/point-to-point/point-to-point-net-device.cc +++ b/src/devices/point-to-point/point-to-point-net-device.cc @@ -50,7 +50,7 @@ PointToPointNetDevice::GetTypeId (void) DataRate ("10Mb/s"), MakeDataRateAccessor (&PointToPointNetDevice::m_bps), MakeDataRateChecker ()) - .AddAttribute ("RxErrorModel", "XXX", + .AddAttribute ("ReceiveErrorModel", "XXX", Ptr (0), MakePtrAccessor (&PointToPointNetDevice::m_receiveErrorModel), MakePtrChecker ()) From 1d78ea62e84e8b1bedca84171a862b8696a94088 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Wed, 26 Mar 2008 16:12:46 -0700 Subject: [PATCH 10/10] port to helper API --- examples/simple-error-model.cc | 161 +++++++++++---------------------- 1 file changed, 55 insertions(+), 106 deletions(-) diff --git a/examples/simple-error-model.cc b/examples/simple-error-model.cc index eb1371dbd..6a2b74493 100644 --- a/examples/simple-error-model.cc +++ b/examples/simple-error-model.cc @@ -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 @@ main (int argc, char *argv[]) // Here, we will explicitly create four nodes. In more sophisticated // topologies, we could configure a node factory. NS_LOG_INFO ("Create nodes."); - Ptr n0 = CreateObject (); - Ptr n1 = CreateObject (); - Ptr n2 = CreateObject (); - Ptr n3 = CreateObject (); + 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 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 channel1 = - PointToPointTopology::AddPointToPointLink ( - n1, n2, DataRate(5000000), MilliSeconds(2)); - - Ptr 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")); + Ipv4AddressHelper ipv4; + ipv4.SetBase ("10.1.1.0", "255.255.255.0"); + ipv4.Allocate (d0d2); - PointToPointTopology::AddIpv4Addresses ( - channel1, n1, Ipv4Address("10.1.2.1"), - n2, Ipv4Address("10.1.2.2")); - - 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 ooff = - CreateObject ("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 sink = CreateObject ("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 ("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 ("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 = n0->GetObject (); - ipv4->SetDefaultRoute (Ipv4Address ("10.1.1.2"), 1); - ipv4 = n3->GetObject (); - 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 nd3 = PointToPointTopology::GetNetDevice - (n3, channel2); // Create an ErrorModel based on the implementation (constructor) // specified by the default classId Ptr em = CreateObject ("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 nd2 = PointToPointTopology::GetNetDevice - (n2, channel0); std::list sampleList; sampleList.push_back (11); sampleList.push_back (17); // This time, we'll explicitly create the error model we want Ptr pem = CreateObject (); 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