A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
dynamic-global-routing.cc
Go to the documentation of this file.
1/*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License version 2 as
4 * published by the Free Software Foundation;
5 *
6 * This program is distributed in the hope that it will be useful,
7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 * GNU General Public License for more details.
10 *
11 * You should have received a copy of the GNU General Public License
12 * along with this program; if not, write to the Free Software
13 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
14 *
15 * Contributed by: Luis Cortes (cortes@gatech.edu)
16 */
17
18// This script exercises global routing code in a mixed point-to-point
19// and csma/cd environment. We bring up and down interfaces and observe
20// the effect on global routing. We explicitly enable the attribute
21// to respond to interface events, so that routes are recomputed
22// automatically.
23//
24// Network topology
25//
26// n0
27// \ p-p
28// \ (shared csma/cd)
29// n2 -------------------------n3
30// / | |
31// / p-p n4 n5 ---------- n6
32// n1 p-p
33// | |
34// ----------------------------------------
35// p-p
36//
37// - at time 1 CBR/UDP flow from n1 to n6's IP address on the n5/n6 link
38// - at time 10, start similar flow from n1 to n6's address on the n1/n6 link
39//
40// Order of events
41// At pre-simulation time, configure global routes. Shortest path from
42// n1 to n6 is via the direct point-to-point link
43// At time 1s, start CBR traffic flow from n1 to n6
44// At time 2s, set the n1 point-to-point interface to down. Packets
45// will be diverted to the n1-n2-n5-n6 path
46// At time 4s, re-enable the n1/n6 interface to up. n1-n6 route restored.
47// At time 6s, set the n6-n1 point-to-point Ipv4 interface to down (note, this
48// keeps the point-to-point link "up" from n1's perspective). Traffic will
49// flow through the path n1-n2-n5-n6
50// At time 8s, bring the interface back up. Path n1-n6 is restored
51// At time 10s, stop the first flow.
52// At time 11s, start a new flow, but to n6's other IP address (the one
53// on the n1/n6 p2p link)
54// At time 12s, bring the n1 interface down between n1 and n6. Packets
55// will be diverted to the alternate path
56// At time 14s, re-enable the n1/n6 interface to up. This will change
57// routing back to n1-n6 since the interface up notification will cause
58// a new local interface route, at higher priority than global routing
59// At time 16s, stop the second flow.
60
61// - Tracing of queues and packet receptions to file "dynamic-global-routing.tr"
62
63#include "ns3/applications-module.h"
64#include "ns3/core-module.h"
65#include "ns3/csma-module.h"
66#include "ns3/internet-module.h"
67#include "ns3/ipv4-global-routing-helper.h"
68#include "ns3/network-module.h"
69#include "ns3/point-to-point-module.h"
70
71#include <cassert>
72#include <fstream>
73#include <iostream>
74#include <string>
75
76using namespace ns3;
77
78NS_LOG_COMPONENT_DEFINE("DynamicGlobalRoutingExample");
79
80int
81main(int argc, char* argv[])
82{
83 // The below value configures the default behavior of global routing.
84 // By default, it is disabled. To respond to interface events, set to true
85 Config::SetDefault("ns3::Ipv4GlobalRouting::RespondToInterfaceEvents", BooleanValue(true));
86
87 // Allow the user to override any of the defaults and the above
88 // Bind ()s at run-time, via command-line arguments
89 CommandLine cmd(__FILE__);
90 cmd.Parse(argc, argv);
91
92 NS_LOG_INFO("Create nodes.");
94 c.Create(7);
97 NodeContainer n5n6 = NodeContainer(c.Get(5), c.Get(6));
98 NodeContainer n1n6 = NodeContainer(c.Get(1), c.Get(6));
99 NodeContainer n2345 = NodeContainer(c.Get(2), c.Get(3), c.Get(4), c.Get(5));
100
102 internet.Install(c);
103
104 // We create the channels first without any IP addressing information
105 NS_LOG_INFO("Create channels.");
107 p2p.SetDeviceAttribute("DataRate", StringValue("5Mbps"));
108 p2p.SetChannelAttribute("Delay", StringValue("2ms"));
109 NetDeviceContainer d0d2 = p2p.Install(n0n2);
110 NetDeviceContainer d1d6 = p2p.Install(n1n6);
111
112 NetDeviceContainer d1d2 = p2p.Install(n1n2);
113
114 p2p.SetDeviceAttribute("DataRate", StringValue("1500kbps"));
115 p2p.SetChannelAttribute("Delay", StringValue("10ms"));
116 NetDeviceContainer d5d6 = p2p.Install(n5n6);
117
118 // We create the channels first without any IP addressing information
120 csma.SetChannelAttribute("DataRate", StringValue("5Mbps"));
121 csma.SetChannelAttribute("Delay", StringValue("2ms"));
122 NetDeviceContainer d2345 = csma.Install(n2345);
123
124 // Later, we add IP addresses.
125 NS_LOG_INFO("Assign IP Addresses.");
127 ipv4.SetBase("10.1.1.0", "255.255.255.0");
128 ipv4.Assign(d0d2);
129
130 ipv4.SetBase("10.1.2.0", "255.255.255.0");
131 ipv4.Assign(d1d2);
132
133 ipv4.SetBase("10.1.3.0", "255.255.255.0");
134 Ipv4InterfaceContainer i5i6 = ipv4.Assign(d5d6);
135
136 ipv4.SetBase("10.250.1.0", "255.255.255.0");
137 ipv4.Assign(d2345);
138
139 ipv4.SetBase("172.16.1.0", "255.255.255.0");
140 Ipv4InterfaceContainer i1i6 = ipv4.Assign(d1d6);
141
142 // Create router nodes, initialize routing database and set up the routing
143 // tables in the nodes.
145
146 // Create the OnOff application to send UDP datagrams of size
147 // 210 bytes at a rate of 448 Kb/s
148 NS_LOG_INFO("Create Applications.");
149 uint16_t port = 9; // Discard port (RFC 863)
150 OnOffHelper onoff("ns3::UdpSocketFactory", InetSocketAddress(i5i6.GetAddress(1), port));
151 onoff.SetConstantRate(DataRate("2kbps"));
152 onoff.SetAttribute("PacketSize", UintegerValue(50));
153
154 ApplicationContainer apps = onoff.Install(c.Get(1));
155 apps.Start(Seconds(1.0));
156 apps.Stop(Seconds(10.0));
157
158 // Create a second OnOff application to send UDP datagrams of size
159 // 210 bytes at a rate of 448 Kb/s
160 OnOffHelper onoff2("ns3::UdpSocketFactory", InetSocketAddress(i1i6.GetAddress(1), port));
161 onoff2.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
162 onoff2.SetAttribute("OffTime", StringValue("ns3::ConstantRandomVariable[Constant=0]"));
163 onoff2.SetAttribute("DataRate", StringValue("2kbps"));
164 onoff2.SetAttribute("PacketSize", UintegerValue(50));
165
166 ApplicationContainer apps2 = onoff2.Install(c.Get(1));
167 apps2.Start(Seconds(11.0));
168 apps2.Stop(Seconds(16.0));
169
170 // Create an optional packet sink to receive these packets
171 PacketSinkHelper sink("ns3::UdpSocketFactory",
173 apps = sink.Install(c.Get(6));
174 apps.Start(Seconds(1.0));
175 apps.Stop(Seconds(10.0));
176
177 PacketSinkHelper sink2("ns3::UdpSocketFactory",
179 apps2 = sink2.Install(c.Get(6));
180 apps2.Start(Seconds(11.0));
181 apps2.Stop(Seconds(16.0));
182
183 AsciiTraceHelper ascii;
184 Ptr<OutputStreamWrapper> stream = ascii.CreateFileStream("dynamic-global-routing.tr");
185 p2p.EnableAsciiAll(stream);
186 csma.EnableAsciiAll(stream);
187 internet.EnableAsciiIpv4All(stream);
188
189 p2p.EnablePcapAll("dynamic-global-routing");
190 csma.EnablePcapAll("dynamic-global-routing", false);
191
192 Ptr<Node> n1 = c.Get(1);
193 Ptr<Ipv4> ipv41 = n1->GetObject<Ipv4>();
194 // The first ifIndex is 0 for loopback, then the first p2p is numbered 1,
195 // then the next p2p is numbered 2
196 uint32_t ipv4ifIndex1 = 2;
197
198 Simulator::Schedule(Seconds(2), &Ipv4::SetDown, ipv41, ipv4ifIndex1);
199 Simulator::Schedule(Seconds(4), &Ipv4::SetUp, ipv41, ipv4ifIndex1);
200
201 Ptr<Node> n6 = c.Get(6);
202 Ptr<Ipv4> ipv46 = n6->GetObject<Ipv4>();
203 // The first ifIndex is 0 for loopback, then the first p2p is numbered 1,
204 // then the next p2p is numbered 2
205 uint32_t ipv4ifIndex6 = 2;
206 Simulator::Schedule(Seconds(6), &Ipv4::SetDown, ipv46, ipv4ifIndex6);
207 Simulator::Schedule(Seconds(8), &Ipv4::SetUp, ipv46, ipv4ifIndex6);
208
209 Simulator::Schedule(Seconds(12), &Ipv4::SetDown, ipv41, ipv4ifIndex1);
210 Simulator::Schedule(Seconds(14), &Ipv4::SetUp, ipv41, ipv4ifIndex1);
211
212 // Trace routing tables
213 Ptr<OutputStreamWrapper> routingStream =
214 Create<OutputStreamWrapper>("dynamic-global-routing.routes", std::ios::out);
216
217 NS_LOG_INFO("Run Simulation.");
220 NS_LOG_INFO("Done.");
221
222 return 0;
223}
NodeContainer n1n2
Nodecontainer n1 + n2.
NodeContainer n0n2
Nodecontainer n0 + n2.
a polymophic address class
Definition: address.h:101
holds a vector of ns3::Application pointers.
void Start(Time start) const
Start all of the Applications in this container at the start time given as a parameter.
void Stop(Time stop) const
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
Manage ASCII trace files for device models.
Definition: trace-helper.h:174
Ptr< OutputStreamWrapper > CreateFileStream(std::string filename, std::ios::openmode filemode=std::ios::out)
Create and initialize an output stream object we'll use to write the traced bits.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
Parse command-line arguments.
Definition: command-line.h:232
build a set of CsmaNetDevice objects
Definition: csma-helper.h:48
Class for representing data rates.
Definition: data-rate.h:89
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
static Ipv4Address GetAny()
static void PopulateRoutingTables()
Build a routing database and initialize the routing tables of the nodes in the simulation.
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition: ipv4.h:80
virtual void SetUp(uint32_t interface)=0
virtual void SetDown(uint32_t interface)=0
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
static void PrintRoutingTableAllAt(Time printTime, Ptr< OutputStreamWrapper > stream, Time::Unit unit=Time::S)
prints the routing tables of all nodes at a particular time.
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:37
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
Build a set of PointToPointNetDevice objects.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition: simulator.h:571
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:142
static void Run()
Run the simulation.
Definition: simulator.cc:178
Hold variables of type string.
Definition: string.h:56
Hold an unsigned integer type.
Definition: uinteger.h:45
uint16_t port
Definition: dsdv-manet.cc:44
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:894
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:275
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1326
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns cmd
Definition: second.py:40
ns csma
Definition: second.py:63
Ptr< PacketSink > sink
Pointer to the packet sink application.
Definition: wifi-tcp.cc:55