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 
103  std::ostringstream oss;
104 
105  while (socket->Recv ())
106  {
107  socket->GetSockName (addr);
109 
110  oss << "Received one packet! Socket: " << iaddr.GetIpv4 () << " port: " << iaddr.GetPort ();
111  }
112 
113  return oss.str ();
114 }
115 
116 static void ReceivePacket (Ptr<Socket> socket)
117 {
119 }
120 
121 static void GenerateTraffic (Ptr<Socket> socket, uint32_t pktSize,
122  uint32_t pktCount, Time pktInterval )
123 {
124  if (pktCount > 0)
125  {
126  socket->Send (Create<Packet> (pktSize));
127  Simulator::Schedule (pktInterval, &GenerateTraffic,
128  socket, pktSize,pktCount-1, pktInterval);
129  }
130  else
131  {
132  socket->Close ();
133  }
134 }
135 
136 
137 int main (int argc, char *argv[])
138 {
139 // LogComponentEnable ("InterferenceHelper", LOG_LEVEL_ALL);
140 
141  std::string phyMode ("DsssRate1Mbps");
142  double Prss = -80; // -dBm
143  double Irss = -95; // -dBm
144  double delta = 0; // microseconds
145  uint32_t PpacketSize = 1000; // bytes
146  uint32_t IpacketSize = 1000; // bytes
147  bool verbose = false;
148 
149  // these are not command line arguments for this version
150  uint32_t numPackets = 1;
151  double interval = 1.0; // seconds
152  double startTime = 10.0; // seconds
153  double distanceToRx = 100.0; // meters
154 
155  double offset = 91; // This is a magic number used to set the
156  // transmit power, based on other configuration
157  CommandLine cmd;
158 
159  cmd.AddValue ("phyMode", "Wifi Phy mode", phyMode);
160  cmd.AddValue ("Prss", "Intended primary received signal strength (dBm)", Prss);
161  cmd.AddValue ("Irss", "Intended interfering received signal strength (dBm)", Irss);
162  cmd.AddValue ("delta", "time offset (microseconds) for interfering signal", delta);
163  cmd.AddValue ("PpacketSize", "size of application packet sent", PpacketSize);
164  cmd.AddValue ("IpacketSize", "size of interfering packet sent", IpacketSize);
165  cmd.AddValue ("verbose", "turn on all WifiNetDevice log components", verbose);
166 
167  cmd.Parse (argc, argv);
168  // Convert to time object
169  Time interPacketInterval = Seconds (interval);
170 
171  // disable fragmentation for frames below 2200 bytes
172  Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("2200"));
173  // turn off RTS/CTS for frames below 2200 bytes
174  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("2200"));
175  // Fix non-unicast data rate to be the same as that of unicast
176  Config::SetDefault ("ns3::WifiRemoteStationManager::NonUnicastMode",
177  StringValue (phyMode));
178 
179  NodeContainer c;
180  c.Create (3);
181 
182  // The below set of helpers will help us to put together the wifi NICs we want
183  WifiHelper wifi;
184  if (verbose)
185  {
186  wifi.EnableLogComponents (); // Turn on all Wifi logging
187  }
189 
191  // set it to zero; otherwise, gain will be added
192  wifiPhy.Set ("RxGain", DoubleValue (0) );
193  wifiPhy.Set ("CcaMode1Threshold", DoubleValue (0.0) );
194 
195  // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
197 
198  YansWifiChannelHelper wifiChannel;
199  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
200  wifiChannel.AddPropagationLoss ("ns3::LogDistancePropagationLossModel");
201  wifiPhy.SetChannel (wifiChannel.Create ());
202 
203  // Add a non-QoS upper mac, and disable rate control
205  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
206  "DataMode",StringValue (phyMode),
207  "ControlMode",StringValue (phyMode));
208  // Set it to adhoc mode
209  wifiMac.SetType ("ns3::AdhocWifiMac");
210  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c.Get (0));
211  // This will disable these sending devices from detecting a signal
212  // so that they do not backoff
213  wifiPhy.Set ("EnergyDetectionThreshold", DoubleValue (0.0) );
214  wifiPhy.Set ("TxGain", DoubleValue (offset + Prss) );
215  devices.Add (wifi.Install (wifiPhy, wifiMac, c.Get (1)));
216  wifiPhy.Set ("TxGain", DoubleValue (offset + Irss) );
217  devices.Add (wifi.Install (wifiPhy, wifiMac, c.Get (2)));
218 
219  // Note that with FixedRssLossModel, the positions below are not
220  // used for received signal strength.
221  MobilityHelper mobility;
222  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
223  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
224  positionAlloc->Add (Vector (distanceToRx, 0.0, 0.0));
225  positionAlloc->Add (Vector (-1*distanceToRx, 0.0, 0.0));
226  mobility.SetPositionAllocator (positionAlloc);
227  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
228  mobility.Install (c);
229 
230  InternetStackHelper internet;
231  internet.Install (c);
232 
233  Ipv4AddressHelper ipv4;
234  NS_LOG_INFO ("Assign IP Addresses.");
235  ipv4.SetBase ("10.1.1.0", "255.255.255.0");
236  Ipv4InterfaceContainer i = ipv4.Assign (devices);
237 
238  TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
239  Ptr<Socket> recvSink = Socket::CreateSocket (c.Get (0), tid);
240  InetSocketAddress local = InetSocketAddress (Ipv4Address ("10.1.1.1"), 80);
241  recvSink->Bind (local);
243 
244  Ptr<Socket> source = Socket::CreateSocket (c.Get (1), tid);
245  InetSocketAddress remote = InetSocketAddress (Ipv4Address ("255.255.255.255"), 80);
246  source->SetAllowBroadcast (true);
247  source->Connect (remote);
248 
249  // Interferer will send to a different port; we will not see a
250  // "Received packet" message
251  Ptr<Socket> interferer = Socket::CreateSocket (c.Get (2), tid);
252  InetSocketAddress interferingAddr = InetSocketAddress (Ipv4Address ("255.255.255.255"), 49000);
253  interferer->SetAllowBroadcast (true);
254  interferer->Connect (interferingAddr);
255 
256  // Tracing
257  wifiPhy.EnablePcap ("wifi-simple-interference", devices.Get (0));
258 
259  // Output what we are doing
260  NS_LOG_UNCOND ("Primary packet RSS=" << Prss << " dBm and interferer RSS=" << Irss << " dBm at time offset=" << delta << " ms");
261 
263  Seconds (startTime), &GenerateTraffic,
264  source, PpacketSize, numPackets, interPacketInterval);
265 
266  Simulator::ScheduleWithContext (interferer->GetNode ()->GetId (),
267  Seconds (startTime + delta/1000000.0), &GenerateTraffic,
268  interferer, IpacketSize, numPackets, interPacketInterval);
269 
270  Simulator::Run ();
272 
273  return 0;
274 }
275 
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())
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:95
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:18
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
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:170
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)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:223
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:825
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:1283
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:127
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:70
static void ScheduleWithContext(uint32_t context, Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event with the given context.
Definition: simulator.h:905
create non QoS-enabled MAC layers for a ns3::WifiNetDevice.
Parse command-line arguments.
Definition: command-line.h:196
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:677
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
static InetSocketAddress ConvertFrom(const Address &address)
Returns an InetSocketAddress which corresponds to the input Address.
keep track of a set of node pointers.
virtual Ptr< Packet > Recv(uint32_t maxSize, uint32_t flags)=0
Read data from the socket.
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)
Output the requested message unconditionaly.
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:106
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:471
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:845
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:535