1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * This program is free software; you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License version 2 as
5  * published by the Free Software Foundation;
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software
14  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15  */
16 
17 // Network topology
18 //
19 //       n0    n1   n2   n3
20 //       |     |    |    |
21 //       =================
22 //              LAN
23 //
24 // - UDP flows from n0 to n1 and back
25 // - DropTail queues
26 // - Tracing of queues and packet receptions to file "udp-echo.tr"
27 
28 #include <fstream>
29 #include "ns3/core-module.h"
30 #include "ns3/csma-module.h"
31 #include "ns3/applications-module.h"
32 #include "ns3/internet-module.h"
33 
34 using namespace ns3;
35 
36 NS_LOG_COMPONENT_DEFINE ("RealtimeUdpEchoExample");
37 
38 int
main(int argc,char * argv[])39 main (int argc, char *argv[])
40 {
41   //
42   // Allow the user to override any of the defaults and the above Bind() at
43   // run-time, via command-line arguments
44   //
45   CommandLine cmd (__FILE__);
46   cmd.Parse (argc, argv);
47 
48   //
49   // But since this is a realtime script, don't allow the user to mess with
50   // that.
51   //
52   GlobalValue::Bind ("SimulatorImplementationType",
53                      StringValue ("ns3::RealtimeSimulatorImpl"));
54 
55   //
56   // Explicitly create the nodes required by the topology (shown above).
57   //
58   NS_LOG_INFO ("Create nodes.");
59   NodeContainer n;
60   n.Create (4);
61 
62   InternetStackHelper internet;
63   internet.Install (n);
64 
65   //
66   // Explicitly create the channels required by the topology (shown above).
67   //
68   NS_LOG_INFO ("Create channels.");
69   CsmaHelper csma;
70   csma.SetChannelAttribute ("DataRate", DataRateValue (DataRate (5000000)));
71   csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
72   csma.SetDeviceAttribute ("Mtu", UintegerValue (1400));
73   NetDeviceContainer d = csma.Install (n);
74 
75   //
76   // We've got the "hardware" in place.  Now we need to add IP addresses.
77   //
78   NS_LOG_INFO ("Assign IP Addresses.");
79   Ipv4AddressHelper ipv4;
80   ipv4.SetBase ("10.1.1.0", "255.255.255.0");
81   Ipv4InterfaceContainer i = ipv4.Assign (d);
82 
83   NS_LOG_INFO ("Create Applications.");
84 
85   //
86   // Create a UdpEchoServer application on node one.
87   //
88   uint16_t port = 9;  // well-known echo port number
89   UdpEchoServerHelper server (port);
90   ApplicationContainer apps = server.Install (n.Get (1));
91   apps.Start (Seconds (1.0));
92   apps.Stop (Seconds (10.0));
93 
94   //
95   // Create a UdpEchoClient application to send UDP datagrams from node zero to
96   // node one.
97   //
98   uint32_t packetSize = 1024;
99   uint32_t maxPacketCount = 500;
100   Time interPacketInterval = Seconds (0.01);
101   UdpEchoClientHelper client (i.GetAddress (1), port);
102   client.SetAttribute ("MaxPackets", UintegerValue (maxPacketCount));
103   client.SetAttribute ("Interval", TimeValue (interPacketInterval));
104   client.SetAttribute ("PacketSize", UintegerValue (packetSize));
105   apps = client.Install (n.Get (0));
106   apps.Start (Seconds (2.0));
107   apps.Stop (Seconds (10.0));
108 
109   AsciiTraceHelper ascii;
110   csma.EnableAsciiAll (ascii.CreateFileStream ("realtime-udp-echo.tr"));
111   csma.EnablePcapAll ("realtime-udp-echo", false);
112 
113   //
114   // Now, do the actual simulation.
115   //
116   Simulator::Stop (Seconds (11.0));
117   NS_LOG_INFO ("Run Simulation.");
118   Simulator::Run ();
119   Simulator::Destroy ();
120   NS_LOG_INFO ("Done.");
121 }
122