A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
wifi-simple-adhoc.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 adhoc mode, and by default, sends one packet of 1000
23 // (application) bytes to the other node. The physical layer is configured
24 // to receive at a fixed RSS (regardless of the distance and transmit
25 // power); therefore, changing position of the nodes has no effect.
26 //
27 // There are a number of command-line options available to control
28 // the default behavior. The list of available command-line options
29 // can be listed with the following command:
30 // ./waf --run "wifi-simple-adhoc --help"
31 //
32 // For instance, for this configuration, the physical layer will
33 // stop successfully receiving packets when rss drops below -97 dBm.
34 // To see this effect, try running:
35 //
36 // ./waf --run "wifi-simple-adhoc --rss=-97 --numPackets=20"
37 // ./waf --run "wifi-simple-adhoc --rss=-98 --numPackets=20"
38 // ./waf --run "wifi-simple-adhoc --rss=-99 --numPackets=20"
39 //
40 // Note that all ns-3 attributes (not just the ones exposed in the below
41 // script) can be changed at command line; see the documentation.
42 //
43 // This script can also be helpful to put the Wifi layer into verbose
44 // logging mode; this command will turn on all wifi logging:
45 //
46 // ./waf --run "wifi-simple-adhoc --verbose=1"
47 //
48 // When you are done, you will notice two pcap trace files in your directory.
49 // If you have tcpdump installed, you can try this:
50 //
51 // tcpdump -r wifi-simple-adhoc-0-0.pcap -nn -tt
52 //
53 
54 #include "ns3/core-module.h"
55 #include "ns3/network-module.h"
56 #include "ns3/mobility-module.h"
57 #include "ns3/config-store-module.h"
58 #include "ns3/wifi-module.h"
59 #include "ns3/internet-module.h"
60 
61 #include <iostream>
62 #include <fstream>
63 #include <vector>
64 #include <string>
65 
66 NS_LOG_COMPONENT_DEFINE ("WifiSimpleAdhoc");
67 
68 using namespace ns3;
69 
71 {
72  NS_LOG_UNCOND ("Received one packet!");
73 }
74 
75 static void GenerateTraffic (Ptr<Socket> socket, uint32_t pktSize,
76  uint32_t pktCount, Time pktInterval )
77 {
78  if (pktCount > 0)
79  {
80  socket->Send (Create<Packet> (pktSize));
81  Simulator::Schedule (pktInterval, &GenerateTraffic,
82  socket, pktSize,pktCount-1, pktInterval);
83  }
84  else
85  {
86  socket->Close ();
87  }
88 }
89 
90 
91 int main (int argc, char *argv[])
92 {
93  std::string phyMode ("DsssRate1Mbps");
94  double rss = -80; // -dBm
95  uint32_t packetSize = 1000; // bytes
96  uint32_t numPackets = 1;
97  double interval = 1.0; // seconds
98  bool verbose = false;
99 
100  CommandLine cmd;
101 
102  cmd.AddValue ("phyMode", "Wifi Phy mode", phyMode);
103  cmd.AddValue ("rss", "received signal strength", rss);
104  cmd.AddValue ("packetSize", "size of application packet sent", packetSize);
105  cmd.AddValue ("numPackets", "number of packets generated", numPackets);
106  cmd.AddValue ("interval", "interval (seconds) between packets", interval);
107  cmd.AddValue ("verbose", "turn on all WifiNetDevice log components", verbose);
108 
109  cmd.Parse (argc, argv);
110  // Convert to time object
111  Time interPacketInterval = Seconds (interval);
112 
113  // disable fragmentation for frames below 2200 bytes
114  Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("2200"));
115  // turn off RTS/CTS for frames below 2200 bytes
116  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("2200"));
117  // Fix non-unicast data rate to be the same as that of unicast
118  Config::SetDefault ("ns3::WifiRemoteStationManager::NonUnicastMode",
119  StringValue (phyMode));
120 
121  NodeContainer c;
122  c.Create (2);
123 
124  // The below set of helpers will help us to put together the wifi NICs we want
125  WifiHelper wifi;
126  if (verbose)
127  {
128  wifi.EnableLogComponents (); // Turn on all Wifi logging
129  }
131 
133  // This is one parameter that matters when using FixedRssLossModel
134  // set it to zero; otherwise, gain will be added
135  wifiPhy.Set ("RxGain", DoubleValue (0) );
136  // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
138 
139  YansWifiChannelHelper wifiChannel;
140  wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
141  // The below FixedRssLossModel will cause the rss to be fixed regardless
142  // of the distance between the two stations, and the transmit power
143  wifiChannel.AddPropagationLoss ("ns3::FixedRssLossModel","Rss",DoubleValue (rss));
144  wifiPhy.SetChannel (wifiChannel.Create ());
145 
146  // Add a non-QoS upper mac, and disable rate control
148  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
149  "DataMode",StringValue (phyMode),
150  "ControlMode",StringValue (phyMode));
151  // Set it to adhoc mode
152  wifiMac.SetType ("ns3::AdhocWifiMac");
153  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c);
154 
155  // Note that with FixedRssLossModel, the positions below are not
156  // used for received signal strength.
157  MobilityHelper mobility;
158  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
159  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
160  positionAlloc->Add (Vector (5.0, 0.0, 0.0));
161  mobility.SetPositionAllocator (positionAlloc);
162  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
163  mobility.Install (c);
164 
165  InternetStackHelper internet;
166  internet.Install (c);
167 
168  Ipv4AddressHelper ipv4;
169  NS_LOG_INFO ("Assign IP Addresses.");
170  ipv4.SetBase ("10.1.1.0", "255.255.255.0");
171  Ipv4InterfaceContainer i = ipv4.Assign (devices);
172 
173  TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
174  Ptr<Socket> recvSink = Socket::CreateSocket (c.Get (0), tid);
176  recvSink->Bind (local);
178 
179  Ptr<Socket> source = Socket::CreateSocket (c.Get (1), tid);
180  InetSocketAddress remote = InetSocketAddress (Ipv4Address ("255.255.255.255"), 80);
181  source->SetAllowBroadcast (true);
182  source->Connect (remote);
183 
184  // Tracing
185  wifiPhy.EnablePcap ("wifi-simple-adhoc", devices);
186 
187  // Output what we are doing
188  NS_LOG_UNCOND ("Testing " << numPackets << " packets sent with receiver rss " << rss );
189 
191  Seconds (1.0), &GenerateTraffic,
192  source, packetSize, numPackets, interPacketInterval);
193 
194  Simulator::Run ();
196 
197  return 0;
198 }
199 
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
static Ipv4Address GetAny(void)
tuple devices
Definition: first.py:32
holds a vector of std::pair of Ptr&lt;Ipv4&gt; 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.
Make it easy to create and manage PHY objects for the yans model.
static void GenerateTraffic(Ptr< Socket > socket, uint32_t pktSize, uint32_t pktCount, Time pktInterval)
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())
void ReceivePacket(Ptr< Socket > socket)
static void Run(void)
Run the simulation until one of:
Definition: simulator.cc:157
#define NS_LOG_COMPONENT_DEFINE(name)
Definition: log.h:171
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 &quot;time&quot; 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
void SetChannel(Ptr< YansWifiChannel > channel)
void Install(Ptr< Node > node) const
&quot;Layout&quot; a single node according to the current position allocator type.
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.
keep track of a set of node pointers.
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...
int main(int argc, char *argv[])
uint32_t GetId(void) const
Definition: node.cc:104
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&lt;Node&gt; stored in this container at a given index.
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.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
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