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-infra.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 two nodes on an 802.11b physical layer, with
22
// 802.11b NICs in infrastructure mode, and by default, the station sends
23
// one packet of 1000 (application) bytes to the access point. The
24
// physical layer is configured
25
// to receive at a fixed RSS (regardless of the distance and transmit
26
// power); therefore, changing position of the nodes has no effect.
27
//
28
// There are a number of command-line options available to control
29
// the default behavior. The list of available command-line options
30
// can be listed with the following command:
31
// ./waf --run "wifi-simple-infra --help"
32
//
33
// For instance, for this configuration, the physical layer will
34
// stop successfully receiving packets when rss drops below -97 dBm.
35
// To see this effect, try running:
36
//
37
// ./waf --run "wifi-simple-infra --rss=-97 --numPackets=20"
38
// ./waf --run "wifi-simple-infra --rss=-98 --numPackets=20"
39
// ./waf --run "wifi-simple-infra --rss=-99 --numPackets=20"
40
//
41
// Note that all ns-3 attributes (not just the ones exposed in the below
42
// script) can be changed at command line; see the documentation.
43
//
44
// This script can also be helpful to put the Wifi layer into verbose
45
// logging mode; this command will turn on all wifi logging:
46
//
47
// ./waf --run "wifi-simple-infra --verbose=1"
48
//
49
// When you are done, you will notice two pcap trace files in your directory.
50
// If you have tcpdump installed, you can try this:
51
//
52
// tcpdump -r wifi-simple-infra-0-0.pcap -nn -tt
53
//
54
55
#include "ns3/core-module.h"
56
#include "ns3/network-module.h"
57
#include "ns3/mobility-module.h"
58
#include "ns3/config-store-module.h"
59
#include "ns3/wifi-module.h"
60
#include "ns3/internet-module.h"
61
62
#include <iostream>
63
#include <fstream>
64
#include <vector>
65
#include <string>
66
67
NS_LOG_COMPONENT_DEFINE
(
"WifiSimpleInfra"
);
68
69
using namespace
ns3;
70
71
void
ReceivePacket
(
Ptr<Socket>
socket)
72
{
73
NS_LOG_UNCOND
(
"Received one packet!"
);
74
}
75
76
static
void
GenerateTraffic
(
Ptr<Socket>
socket, uint32_t pktSize,
77
uint32_t pktCount,
Time
pktInterval )
78
{
79
if
(pktCount > 0)
80
{
81
socket->
Send
(Create<Packet> (pktSize));
82
Simulator::Schedule
(pktInterval, &
GenerateTraffic
,
83
socket, pktSize,pktCount-1, pktInterval);
84
}
85
else
86
{
87
socket->
Close
();
88
}
89
}
90
91
92
int
main
(
int
argc,
char
*argv[])
93
{
94
std::string phyMode (
"DsssRate1Mbps"
);
95
double
rss = -80;
// -dBm
96
uint32_t packetSize = 1000;
// bytes
97
uint32_t numPackets = 1;
98
double
interval = 1.0;
// seconds
99
bool
verbose
=
false
;
100
101
CommandLine
cmd;
102
103
cmd.
AddValue
(
"phyMode"
,
"Wifi Phy mode"
, phyMode);
104
cmd.
AddValue
(
"rss"
,
"received signal strength"
, rss);
105
cmd.
AddValue
(
"packetSize"
,
"size of application packet sent"
, packetSize);
106
cmd.
AddValue
(
"numPackets"
,
"number of packets generated"
, numPackets);
107
cmd.
AddValue
(
"interval"
,
"interval (seconds) between packets"
, interval);
108
cmd.
AddValue
(
"verbose"
,
"turn on all WifiNetDevice log components"
, verbose);
109
110
cmd.
Parse
(argc, argv);
111
// Convert to time object
112
Time
interPacketInterval = Seconds (interval);
113
114
// disable fragmentation for frames below 2200 bytes
115
Config::SetDefault
(
"ns3::WifiRemoteStationManager::FragmentationThreshold"
,
StringValue
(
"2200"
));
116
// turn off RTS/CTS for frames below 2200 bytes
117
Config::SetDefault
(
"ns3::WifiRemoteStationManager::RtsCtsThreshold"
,
StringValue
(
"2200"
));
118
// Fix non-unicast data rate to be the same as that of unicast
119
Config::SetDefault
(
"ns3::WifiRemoteStationManager::NonUnicastMode"
,
120
StringValue
(phyMode));
121
122
NodeContainer
c;
123
c.
Create
(2);
124
125
// The below set of helpers will help us to put together the wifi NICs we want
126
WifiHelper
wifi;
127
if
(verbose)
128
{
129
wifi.
EnableLogComponents
();
// Turn on all Wifi logging
130
}
131
wifi.
SetStandard
(
WIFI_PHY_STANDARD_80211b
);
132
133
YansWifiPhyHelper
wifiPhy =
YansWifiPhyHelper::Default
();
134
// This is one parameter that matters when using FixedRssLossModel
135
// set it to zero; otherwise, gain will be added
136
wifiPhy.
Set
(
"RxGain"
,
DoubleValue
(0) );
137
// ns-3 supports RadioTap and Prism tracing extensions for 802.11b
138
wifiPhy.
SetPcapDataLinkType
(
YansWifiPhyHelper::DLT_IEEE802_11_RADIO
);
139
140
YansWifiChannelHelper
wifiChannel;
141
wifiChannel.
SetPropagationDelay
(
"ns3::ConstantSpeedPropagationDelayModel"
);
142
// The below FixedRssLossModel will cause the rss to be fixed regardless
143
// of the distance between the two stations, and the transmit power
144
wifiChannel.
AddPropagationLoss
(
"ns3::FixedRssLossModel"
,
"Rss"
,
DoubleValue
(rss));
145
wifiPhy.
SetChannel
(wifiChannel.
Create
());
146
147
// Add a non-QoS upper mac, and disable rate control
148
NqosWifiMacHelper
wifiMac =
NqosWifiMacHelper::Default
();
149
wifi.
SetRemoteStationManager
(
"ns3::ConstantRateWifiManager"
,
150
"DataMode"
,
StringValue
(phyMode),
151
"ControlMode"
,
StringValue
(phyMode));
152
153
// Setup the rest of the upper mac
154
Ssid
ssid =
Ssid
(
"wifi-default"
);
155
// setup sta.
156
wifiMac.
SetType
(
"ns3::StaWifiMac"
,
157
"Ssid"
,
SsidValue
(ssid),
158
"ActiveProbing"
,
BooleanValue
(
false
));
159
NetDeviceContainer
staDevice = wifi.
Install
(wifiPhy, wifiMac, c.
Get
(0));
160
NetDeviceContainer
devices
= staDevice;
161
// setup ap.
162
wifiMac.
SetType
(
"ns3::ApWifiMac"
,
163
"Ssid"
,
SsidValue
(ssid));
164
NetDeviceContainer
apDevice = wifi.
Install
(wifiPhy, wifiMac, c.
Get
(1));
165
devices.
Add
(apDevice);
166
167
// Note that with FixedRssLossModel, the positions below are not
168
// used for received signal strength.
169
MobilityHelper
mobility;
170
Ptr<ListPositionAllocator>
positionAlloc = CreateObject<ListPositionAllocator> ();
171
positionAlloc->
Add
(
Vector
(0.0, 0.0, 0.0));
172
positionAlloc->
Add
(
Vector
(5.0, 0.0, 0.0));
173
mobility.
SetPositionAllocator
(positionAlloc);
174
mobility.
SetMobilityModel
(
"ns3::ConstantPositionMobilityModel"
);
175
mobility.
Install
(c);
176
177
InternetStackHelper
internet;
178
internet.
Install
(c);
179
180
Ipv4AddressHelper
ipv4;
181
NS_LOG_INFO
(
"Assign IP Addresses."
);
182
ipv4.
SetBase
(
"10.1.1.0"
,
"255.255.255.0"
);
183
Ipv4InterfaceContainer
i = ipv4.
Assign
(devices);
184
185
TypeId
tid =
TypeId::LookupByName
(
"ns3::UdpSocketFactory"
);
186
Ptr<Socket>
recvSink =
Socket::CreateSocket
(c.
Get
(0), tid);
187
InetSocketAddress
local =
InetSocketAddress
(
Ipv4Address::GetAny
(), 80);
188
recvSink->
Bind
(local);
189
recvSink->
SetRecvCallback
(
MakeCallback
(&
ReceivePacket
));
190
191
Ptr<Socket>
source =
Socket::CreateSocket
(c.
Get
(1), tid);
192
InetSocketAddress
remote =
InetSocketAddress
(
Ipv4Address
(
"255.255.255.255"
), 80);
193
source->
SetAllowBroadcast
(
true
);
194
source->
Connect
(remote);
195
196
// Tracing
197
wifiPhy.
EnablePcap
(
"wifi-simple-infra"
, devices);
198
199
// Output what we are doing
200
NS_LOG_UNCOND
(
"Testing "
<< numPackets <<
" packets sent with receiver rss "
<< rss );
201
202
Simulator::ScheduleWithContext
(source->
GetNode
()->
GetId
(),
203
Seconds (1.0), &
GenerateTraffic
,
204
source, packetSize, numPackets, interPacketInterval);
205
206
Simulator::Stop
(Seconds (30.0));
207
Simulator::Run
();
208
Simulator::Destroy
();
209
210
return
0;
211
}
212
examples
wireless
wifi-simple-infra.cc
Generated on Fri Aug 30 2013 01:42:44 for ns-3 by
1.8.1.2