A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Portuguese
Docs ▼
Wiki
Manual
Models
Develop ▼
API
Bugs
API
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
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);
103
InetSocketAddress
iaddr =
InetSocketAddress::ConvertFrom
(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
{
113
NS_LOG_UNCOND
(
PrintReceivedPacket
(socket));
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
}
183
wifi.
SetStandard
(
WIFI_PHY_STANDARD_80211b
);
184
185
YansWifiPhyHelper
wifiPhy =
YansWifiPhyHelper::Default
();
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
191
wifiPhy.
SetPcapDataLinkType
(
YansWifiPhyHelper::DLT_IEEE802_11_RADIO
);
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
199
NqosWifiMacHelper
wifiMac =
NqosWifiMacHelper::Default
();
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);
237
recvSink->
SetRecvCallback
(
MakeCallback
(&
ReceivePacket
));
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
257
Simulator::ScheduleWithContext
(source->
GetNode
()->
GetId
(),
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
();
266
Simulator::Destroy
();
267
268
return
0;
269
}
270
examples
wireless
wifi-simple-interference.cc
Generated on Fri Aug 30 2013 01:42:44 for ns-3 by
1.8.1.2