A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
sixth.cc
Go to the documentation of this file.
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 #include <fstream>
18 #include "ns3/core-module.h"
19 #include "ns3/network-module.h"
20 #include "ns3/internet-module.h"
21 #include "ns3/point-to-point-module.h"
22 #include "ns3/applications-module.h"
23 
24 using namespace ns3;
25 
26 NS_LOG_COMPONENT_DEFINE ("SixthScriptExample");
27 
28 // ===========================================================================
29 //
30 // node 0 node 1
31 // +----------------+ +----------------+
32 // | ns-3 TCP | | ns-3 TCP |
33 // +----------------+ +----------------+
34 // | 10.1.1.1 | | 10.1.1.2 |
35 // +----------------+ +----------------+
36 // | point-to-point | | point-to-point |
37 // +----------------+ +----------------+
38 // | |
39 // +---------------------+
40 // 5 Mbps, 2 ms
41 //
42 //
43 // We want to look at changes in the ns-3 TCP congestion window. We need
44 // to crank up a flow and hook the CongestionWindow attribute on the socket
45 // of the sender. Normally one would use an on-off application to generate a
46 // flow, but this has a couple of problems. First, the socket of the on-off
47 // application is not created until Application Start time, so we wouldn't be
48 // able to hook the socket (now) at configuration time. Second, even if we
49 // could arrange a call after start time, the socket is not public so we
50 // couldn't get at it.
51 //
52 // So, we can cook up a simple version of the on-off application that does what
53 // we want. On the plus side we don't need all of the complexity of the on-off
54 // application. On the minus side, we don't have a helper, so we have to get
55 // a little more involved in the details, but this is trivial.
56 //
57 // So first, we create a socket and do the trace connect on it; then we pass
58 // this socket into the constructor of our simple application which we then
59 // install in the source node.
60 // ===========================================================================
61 //
62 class MyApp : public Application
63 {
64 public:
65  MyApp ();
66  virtual ~MyApp ();
67 
68  void Setup (Ptr<Socket> socket, Address address, uint32_t packetSize, uint32_t nPackets, DataRate dataRate);
69 
70 private:
71  virtual void StartApplication (void);
72  virtual void StopApplication (void);
73 
74  void ScheduleTx (void);
75  void SendPacket (void);
76 
77  Ptr<Socket> m_socket;
78  Address m_peer;
79  uint32_t m_packetSize;
80  uint32_t m_nPackets;
81  DataRate m_dataRate;
82  EventId m_sendEvent;
83  bool m_running;
84  uint32_t m_packetsSent;
85 };
86 
87 MyApp::MyApp ()
88  : m_socket (0),
89  m_peer (),
90  m_packetSize (0),
91  m_nPackets (0),
92  m_dataRate (0),
93  m_sendEvent (),
94  m_running (false),
95  m_packetsSent (0)
96 {
97 }
98 
100 {
101  m_socket = 0;
102 }
103 
104 void
105 MyApp::Setup (Ptr<Socket> socket, Address address, uint32_t packetSize, uint32_t nPackets, DataRate dataRate)
106 {
107  m_socket = socket;
108  m_peer = address;
109  m_packetSize = packetSize;
110  m_nPackets = nPackets;
111  m_dataRate = dataRate;
112 }
113 
114 void
116 {
117  m_running = true;
118  m_packetsSent = 0;
119  m_socket->Bind ();
121  SendPacket ();
122 }
123 
124 void
126 {
127  m_running = false;
128 
129  if (m_sendEvent.IsRunning ())
130  {
131  Simulator::Cancel (m_sendEvent);
132  }
133 
134  if (m_socket)
135  {
136  m_socket->Close ();
137  }
138 }
139 
140 void
141 MyApp::SendPacket (void)
142 {
143  Ptr<Packet> packet = Create<Packet> (m_packetSize);
144  m_socket->Send (packet);
145 
146  if (++m_packetsSent < m_nPackets)
147  {
148  ScheduleTx ();
149  }
150 }
151 
152 void
153 MyApp::ScheduleTx (void)
154 {
155  if (m_running)
156  {
157  Time tNext (Seconds (m_packetSize * 8 / static_cast<double> (m_dataRate.GetBitRate ())));
158  m_sendEvent = Simulator::Schedule (tNext, &MyApp::SendPacket, this);
159  }
160 }
161 
162 static void
163 CwndChange (Ptr<OutputStreamWrapper> stream, uint32_t oldCwnd, uint32_t newCwnd)
164 {
165  NS_LOG_UNCOND (Simulator::Now ().GetSeconds () << "\t" << newCwnd);
166  *stream->GetStream () << Simulator::Now ().GetSeconds () << "\t" << oldCwnd << "\t" << newCwnd << std::endl;
167 }
168 
169 static void
171 {
172  NS_LOG_UNCOND ("RxDrop at " << Simulator::Now ().GetSeconds ());
173  file->Write (Simulator::Now (), p);
174 }
175 
176 int
177 main (int argc, char *argv[])
178 {
180  nodes.Create (2);
181 
183  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
184  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
185 
187  devices = pointToPoint.Install (nodes);
188 
189  Ptr<RateErrorModel> em = CreateObject<RateErrorModel> ();
190  em->SetAttribute ("ErrorRate", DoubleValue (0.00001));
191  devices.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (em));
192 
194  stack.Install (nodes);
195 
197  address.SetBase ("10.1.1.0", "255.255.255.252");
198  Ipv4InterfaceContainer interfaces = address.Assign (devices);
199 
200  uint16_t sinkPort = 8080;
201  Address sinkAddress (InetSocketAddress (interfaces.GetAddress (1), sinkPort));
202  PacketSinkHelper packetSinkHelper ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), sinkPort));
203  ApplicationContainer sinkApps = packetSinkHelper.Install (nodes.Get (1));
204  sinkApps.Start (Seconds (0.));
205  sinkApps.Stop (Seconds (20.));
206 
207  Ptr<Socket> ns3TcpSocket = Socket::CreateSocket (nodes.Get (0), TcpSocketFactory::GetTypeId ());
208 
209  Ptr<MyApp> app = CreateObject<MyApp> ();
210  app->Setup (ns3TcpSocket, sinkAddress, 1040, 1000, DataRate ("1Mbps"));
211  nodes.Get (0)->AddApplication (app);
212  app->SetStartTime (Seconds (1.));
213  app->SetStopTime (Seconds (20.));
214 
215  AsciiTraceHelper asciiTraceHelper;
216  Ptr<OutputStreamWrapper> stream = asciiTraceHelper.CreateFileStream ("sixth.cwnd");
217  ns3TcpSocket->TraceConnectWithoutContext ("CongestionWindow", MakeBoundCallback (&CwndChange, stream));
218 
219  PcapHelper pcapHelper;
220  Ptr<PcapFileWrapper> file = pcapHelper.CreateFile ("sixth.pcap", std::ios::out, PcapHelper::DLT_PPP);
221  devices.Get (1)->TraceConnectWithoutContext ("PhyRxDrop", MakeBoundCallback (&RxDrop, file));
222 
223  Simulator::Stop (Seconds (20));
224  Simulator::Run ();
225  Simulator::Destroy ();
226 
227  return 0;
228 }
229 
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
Definition: nstime.h:727
holds a vector of ns3::Application pointers.
uint32_t AddApplication(Ptr< Application > application)
Definition: node.cc:147
static void SendPacket(Ptr< Socket > socket, uint32_t pktSize, uint32_t pktCount, Time pktInterval)
tuple pointToPoint
Definition: first.py:28
keep track of time values and allow control of global simulation resolution
Definition: nstime.h:81
Ptr< Socket > m_socket
Definition: fifth.cc:78
Manage ASCII trace files for device models.
Definition: trace-helper.h:128
an Inet address class
tuple devices
Definition: first.py:32
Ptr< PcapFileWrapper > CreateFile(std::string filename, std::ios::openmode filemode, uint32_t dataLinkType, uint32_t snapLen=65535, int32_t tzCorrection=0)
Create and initialize a pcap file.
Definition: trace-helper.cc:49
NS_LOG_COMPONENT_DEFINE("GrantedTimeWindowMpiInterface")
holds a vector of std::pair of Ptr and interface index.
hold variables of type string
Definition: string.h:19
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
NetDeviceContainer Install(NodeContainer c)
Manage pcap files for device models.
Definition: trace-helper.h:38
void Write(Time t, Ptr< const Packet > p)
Write the next packet to file.
Callback< R > MakeBoundCallback(R(*fnPtr)(TX), ARG a1)
Build bound Callbacks which take varying numbers of arguments, and potentially returning a value...
Definition: callback.h:1463
static void RxDrop(Ptr< PcapFileWrapper > file, Ptr< const Packet > p)
Definition: sixth.cc:170
aggregate IP/TCP/UDP functionality to existing Nodes.
DataRate m_dataRate
Definition: fifth.cc:82
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes...
bool IsRunning(void) const
This method is syntactic sugar for the ns3::Simulator::isExpired method.
Definition: event-id.cc:59
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. ...
Build a set of PointToPointNetDevice objects.
Address m_peer
Definition: fifth.cc:79
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
a polymophic address class
Definition: address.h:86
Definition: fifth.cc:62
tuple nodes
Definition: first.py:25
Class for representing data rates.
Definition: data-rate.h:71
double GetSeconds(void) const
Definition: nstime.h:274
void Setup(Ptr< Socket > socket, Address address, uint32_t packetSize, uint32_t nPackets, DataRate dataRate)
Definition: fifth.cc:106
static void CwndChange(Ptr< OutputStreamWrapper > stream, uint32_t oldCwnd, uint32_t newCwnd)
Definition: sixth.cc:163
The base class for all ns3 applications.
Definition: application.h:61
tuple interfaces
Definition: first.py:40
holds a vector of ns3::NetDevice pointers
void SendPacket(void)
Definition: fifth.cc:142
uint32_t m_nPackets
Definition: fifth.cc:81
bool m_running
Definition: fifth.cc:84
uint32_t m_packetsSent
Definition: fifth.cc:85
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host.
virtual ~MyApp()
Definition: fifth.cc:100
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Definition: object-base.cc:269
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
EventId m_sendEvent
Definition: fifth.cc:83
keep track of a set of node pointers.
hold objects of type Ptr
Definition: pointer.h:33
uint64_t GetBitRate() const
Get the underlying bitrate.
Definition: data-rate.cc:235
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
#define NS_LOG_UNCOND(msg)
Definition: log.h:377
virtual void StopApplication(void)
Application specific shutdown code.
Definition: fifth.cc:126
virtual void StartApplication(void)
Application specific startup code.
Definition: fifth.cc:116
tuple stack
Definition: first.py:34
MyApp()
Definition: fifth.cc:88
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter...
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
an identifier for simulation events.
Definition: event-id.h:46
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
ApplicationContainer Install(NodeContainer c) const
Install an ns3::PacketSinkApplication on each node of the input container configured with all the att...
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
tuple address
Definition: first.py:37
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
virtual int Close(void)=0
Close a socket.
Hold a floating point type.
Definition: double.h:41
void SetAttribute(std::string name, const AttributeValue &value)
Definition: object-base.cc:161
void ScheduleTx(void)
Definition: fifth.cc:154
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
int main(int argc, char *argv[])
Definition: sixth.cc:177
uint32_t m_packetSize
Definition: fifth.cc:80