A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
wifi-simple-interference.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2009 The Boeing Company
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  */
19 
20 //
21 // This script configures three nodes on an 802.11b physical layer, with
22 // 802.11b NICs in adhoc mode. There is a transmitter, receiver, and
23 // interferer. The transmitter sends one packet to the receiver and
24 // the receiver receives it with a certain configurable RSS (by default,
25 // -80 dBm). The interferer does not do carrier sense and also sends
26 // the packet to interfere with the primary packet. The channel model
27 // is clear channel.
28 //
29 // Therefore, at the receiver, the reception looks like this:
30 //
31 // ------------------time---------------->
32 // t0
33 //
34 // |------------------------------------|
35 // | |
36 // | primary received frame (time t0) |
37 // | |
38 // |------------------------------------|
39 //
40 //
41 // t1
42 // |-----------------------------------|
43 // | |
44 // | interfering frame (time t1) |
45 // | |
46 // |-----------------------------------|
47 //
48 // The orientation is:
49 // n2 ---------> n0 <---------- n1
50 // interferer receiver transmitter
51 //
52 // The configurable parameters are:
53 // - Prss (primary rss) (-80 dBm default)
54 // - Irss (interfering rss) (-95 dBm default)
55 // - delta (microseconds, (t1-t0), may be negative, default 0)
56 // - PpacketSize (primary packet size) (bytes, default 1000)
57 // - IpacketSize (interferer packet size) (bytes, default 1000)
58 //
59 // For instance, for this configuration, the interfering frame arrives
60 // at -90 dBm with a time offset of 3.2 microseconds:
61 //
62 // ./waf --run "wifi-simple-interference --Irss=-90 --delta=3.2"
63 //
64 // Note that all ns-3 attributes (not just the ones exposed in the below
65 // script) can be changed at command line; see the documentation.
66 //
67 // This script can also be helpful to put the Wifi layer into verbose
68 // logging mode; this command will turn on all wifi logging:
69 //
70 // ./waf --run "wifi-simple-interference --verbose=1"
71 //
72 // When you are done, you will notice a pcap trace file in your directory.
73 // If you have tcpdump installed, you can try this:
74 //
75 // tcpdump -r wifi-simple-interference-0-0.pcap -nn -tt
76 // reading from file wifi-simple-interference-0-0.pcap, link-type IEEE802_11_RADIO (802.11 plus BSD radio information header)
77 // 10.008704 10008704us tsft 1.0 Mb/s 2437 MHz (0x00c0) -80dB signal -98dB noise IP 10.1.1.2.49153 > 10.1.1.255.80: UDP, length 1000
78 //
79 // Next, try this command and look at the tcpdump-- you should see two packets
80 // that are no longer interfering:
81 // ./waf --run "wifi-simple-interference --delta=30000"
82 
83 #include "ns3/core-module.h"
84 #include "ns3/network-module.h"
85 #include "ns3/mobility-module.h"
86 #include "ns3/config-store-module.h"
87 #include "ns3/wifi-module.h"
88 #include "ns3/internet-module.h"
89 
90 #include <iostream>
91 #include <fstream>
92 #include <vector>
93 #include <string>
94 
95 NS_LOG_COMPONENT_DEFINE ("WifiSimpleInterference");
96 
97 using namespace ns3;
98 
99 static inline std::string PrintReceivedPacket (Ptr<Socket> socket)
100 {
101  Address addr;
102  socket->GetSockName (addr);
104 
105  std::ostringstream oss;
106  oss << "Received one packet! Socket: " << iaddr.GetIpv4 () << " port: " << iaddr.GetPort ();
107 
108  return oss.str ();
109 }
110 
111 static void ReceivePacket (Ptr<Socket> socket)
112 {
114 }
115 
116 static void GenerateTraffic (Ptr<Socket> socket, uint32_t pktSize,
117  uint32_t pktCount, Time pktInterval )
118 {
119  if (pktCount > 0)
120  {
121  socket->Send (Create<Packet> (pktSize));
122  Simulator::Schedule (pktInterval, &GenerateTraffic,
123  socket, pktSize,pktCount-1, pktInterval);
124  }
125  else
126  {
127  socket->Close ();
128  }
129 }
130 
131 
132 int main (int argc, char *argv[])
133 {
134 // LogComponentEnable ("InterferenceHelper", LOG_LEVEL_ALL);
135 
136  std::string phyMode ("DsssRate1Mbps");
137  double Prss = -80; // -dBm
138  double Irss = -95; // -dBm
139  double delta = 0; // microseconds
140  uint32_t PpacketSize = 1000; // bytes
141  uint32_t IpacketSize = 1000; // bytes
142  bool verbose = false;
143 
144  // these are not command line arguments for this version
145  uint32_t numPackets = 1;
146  double interval = 1.0; // seconds
147  double startTime = 10.0; // seconds
148  double distanceToRx = 100.0; // meters
149 
150  double offset = 91; // This is a magic number used to set the
151  // transmit power, based on other configuration
152  CommandLine cmd;
153 
154  cmd.AddValue ("phyMode", "Wifi Phy mode", phyMode);
155  cmd.AddValue ("Prss", "Intended primary received signal strength (dBm)", Prss);
156  cmd.AddValue ("Irss", "Intended interfering received signal strength (dBm)", Irss);
157  cmd.AddValue ("delta", "time offset (microseconds) for interfering signal", delta);
158  cmd.AddValue ("PpacketSize", "size of application packet sent", PpacketSize);
159  cmd.AddValue ("IpacketSize", "size of interfering packet sent", IpacketSize);
160  cmd.AddValue ("verbose", "turn on all WifiNetDevice log components", verbose);
161 
162  cmd.Parse (argc, argv);
163  // Convert to time object
164  Time interPacketInterval = Seconds (interval);
165 
166  // disable fragmentation for frames below 2200 bytes
167  Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("2200"));
168  // turn off RTS/CTS for frames below 2200 bytes
169  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("2200"));
170  // Fix non-unicast data rate to be the same as that of unicast
171  Config::SetDefault ("ns3::WifiRemoteStationManager::NonUnicastMode",
172  StringValue (phyMode));
173 
174  NodeContainer c;
175  c.Create (3);
176 
177  // The below set of helpers will help us to put together the wifi NICs we want
178  WifiHelper wifi;
179  if (verbose)
180  {
181  wifi.EnableLogComponents (); // Turn on all Wifi logging
182  }
184 
186  // set it to zero; otherwise, gain will be added
187  wifiPhy.Set ("RxGain", DoubleValue (0) );
188  wifiPhy.Set ("CcaMode1Threshold", DoubleValue (0.0) );
189 
190  // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
192 
193  YansWifiChannelHelper wifiChannel;
194  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
195  wifiChannel.AddPropagationLoss ("ns3::LogDistancePropagationLossModel");
196  wifiPhy.SetChannel (wifiChannel.Create ());
197 
198  // Add a non-QoS upper mac, and disable rate control
200  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
201  "DataMode",StringValue (phyMode),
202  "ControlMode",StringValue (phyMode));
203  // Set it to adhoc mode
204  wifiMac.SetType ("ns3::AdhocWifiMac");
205  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c.Get (0));
206  // This will disable these sending devices from detecting a signal
207  // so that they do not backoff
208  wifiPhy.Set ("EnergyDetectionThreshold", DoubleValue (0.0) );
209  wifiPhy.Set ("TxGain", DoubleValue (offset + Prss) );
210  devices.Add (wifi.Install (wifiPhy, wifiMac, c.Get (1)));
211  wifiPhy.Set ("TxGain", DoubleValue (offset + Irss) );
212  devices.Add (wifi.Install (wifiPhy, wifiMac, c.Get (2)));
213 
214  // Note that with FixedRssLossModel, the positions below are not
215  // used for received signal strength.
216  MobilityHelper mobility;
217  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
218  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
219  positionAlloc->Add (Vector (distanceToRx, 0.0, 0.0));
220  positionAlloc->Add (Vector (-1*distanceToRx, 0.0, 0.0));
221  mobility.SetPositionAllocator (positionAlloc);
222  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
223  mobility.Install (c);
224 
225  InternetStackHelper internet;
226  internet.Install (c);
227 
228  Ipv4AddressHelper ipv4;
229  NS_LOG_INFO ("Assign IP Addresses.");
230  ipv4.SetBase ("10.1.1.0", "255.255.255.0");
231  Ipv4InterfaceContainer i = ipv4.Assign (devices);
232 
233  TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
234  Ptr<Socket> recvSink = Socket::CreateSocket (c.Get (0), tid);
235  InetSocketAddress local = InetSocketAddress (Ipv4Address ("10.1.1.1"), 80);
236  recvSink->Bind (local);
238 
239  Ptr<Socket> source = Socket::CreateSocket (c.Get (1), tid);
240  InetSocketAddress remote = InetSocketAddress (Ipv4Address ("255.255.255.255"), 80);
241  source->SetAllowBroadcast (true);
242  source->Connect (remote);
243 
244  // Interferer will send to a different port; we will not see a
245  // "Received packet" message
246  Ptr<Socket> interferer = Socket::CreateSocket (c.Get (2), tid);
247  InetSocketAddress interferingAddr = InetSocketAddress (Ipv4Address ("255.255.255.255"), 49000);
248  interferer->SetAllowBroadcast (true);
249  interferer->Connect (interferingAddr);
250 
251  // Tracing
252  wifiPhy.EnablePcap ("wifi-simple-interference", devices.Get (0));
253 
254  // Output what we are doing
255  NS_LOG_UNCOND ("Primary packet RSS=" << Prss << " dBm and interferer RSS=" << Irss << " dBm at time offset=" << delta << " ms");
256 
258  Seconds (startTime), &GenerateTraffic,
259  source, PpacketSize, numPackets, interPacketInterval);
260 
261  Simulator::ScheduleWithContext (interferer->GetNode ()->GetId (),
262  Seconds (startTime + delta/1000000.0), &GenerateTraffic,
263  interferer, IpacketSize, numPackets, interPacketInterval);
264 
265  Simulator::Run ();
267 
268  return 0;
269 }
270 
void AddPropagationLoss(std::string name, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
keep track of time values and allow control of global simulation resolution
Definition: nstime.h:81
an Inet address class
Ipv4Address GetIpv4(void) const
tuple devices
Definition: first.py:32
int main(int argc, char *argv[])
holds a vector of std::pair of Ptr and interface index.
Ptr< YansWifiChannel > Create(void) const
void SetRemoteStationManager(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Definition: wifi-helper.cc:73
hold variables of type string
Definition: string.h:19
virtual bool SetAllowBroadcast(bool allowBroadcast)=0
Configure whether broadcast datagram transmissions are allowed.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
Make it easy to create and manage PHY objects for the yans model.
virtual void SetType(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
static void Run(void)
Run the simulation until one of:
Definition: simulator.cc:157
virtual int GetSockName(Address &address) const =0
Get socket address.
void SetPcapDataLinkType(enum SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
aggregate IP/TCP/UDP functionality to existing Nodes.
#define NS_LOG_INFO(msg)
Definition: log.h:298
void Set(std::string name, const AttributeValue &v)
static YansWifiPhyHelper Default(void)
Create a phy helper in a default working state.
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached.
Definition: simulator.h:824
helps to create WifiNetDevice objects
Definition: wifi-helper.h:88
a 3d vector
Definition: vector.h:31
Include Radiotap link layer information.
virtual NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer c) const
Definition: wifi-helper.cc:102
a polymophic address class
Definition: address.h:86
void SetChannel(Ptr< YansWifiChannel > channel)
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
double startTime
holds a vector of ns3::NetDevice pointers
virtual void SetStandard(enum WifiPhyStandard standard)
Definition: wifi-helper.cc:96
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1238
static NqosWifiMacHelper Default(void)
Create a mac helper in a default working state.
void SetRecvCallback(Callback< void, Ptr< Socket > >)
Notify application when new data is available to be read.
Definition: socket.cc:128
static Ptr< Socket > CreateSocket(Ptr< Node > node, TypeId tid)
This method wraps the creation of sockets that is performed on a given node by a SocketFactory specif...
Definition: socket.cc:71
static void ScheduleWithContext(uint32_t context, Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event with the given context.
Definition: simulator.h:904
create non QoS-enabled MAC layers for a ns3::WifiNetDevice.
Parse command-line arguments.
Definition: command-line.h:152
static void Destroy(void)
Every event scheduled by the Simulator::insertAtDestroy method is invoked.
Definition: simulator.cc:121
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host.
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:667
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
static InetSocketAddress ConvertFrom(const Address &address)
keep track of a set of node pointers.
NS_LOG_COMPONENT_DEFINE("WifiSimpleInterference")
DSSS PHY (Clause 15) and HR/DSSS PHY (Clause 18)
void SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
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
manage and create wifi channel objects for the yans model.
Helper class used to assign positions and mobility models to nodes.
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:38
static void EnableLogComponents(void)
Helper to enable all WifiNetDevice log components with one statement.
Definition: wifi-helper.cc:142
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
uint32_t GetId(void) const
Definition: node.cc:104
static std::string PrintReceivedPacket(Ptr< Socket > socket)
virtual Ptr< Node > GetNode(void) const =0
Return the node this socket is associated with.
void AddValue(const std::string &name, const std::string &help, T &value)
Add a program argument, assigning to POD.
Definition: command-line.h:408
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
static void GenerateTraffic(Ptr< Socket > socket, uint32_t pktSize, uint32_t pktCount, Time pktInterval)
void Parse(int argc, char *argv[])
Parse the program arguments.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
uint16_t GetPort(void) const
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
static void ReceivePacket(Ptr< Socket > socket)
void SetPropagationDelay(std::string name, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
void EnablePcap(std::string prefix, Ptr< NetDevice > nd, bool promiscuous=false, bool explicitFilename=false)
Enable pcap output the indicated net device.
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
virtual int Close(void)=0
Close a socket.
Hold a floating point type.
Definition: double.h:41
a unique identifier for an interface.
Definition: type-id.h:49
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
bool verbose
static TypeId LookupByName(std::string name)
Definition: type-id.cc:536