A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
olsr-hna.cc
Go to the documentation of this file.
1/*
2 *
3 * SPDX-License-Identifier: GPL-2.0-only
4 *
5 * Authors: Lalith Suresh <suresh.lalith@gmail.com>
6 *
7 */
8
9//
10// This script, adapted from examples/wireless/wifi-simple-adhoc illustrates
11// the use of OLSR HNA.
12//
13// Network Topology:
14//
15// |------ OLSR ------| |---- non-OLSR ----|
16// A )))) (((( B ------------------- C
17// 10.1.1.1 10.1.1.2 172.16.1.2 172.16.1.1
18//
19// Node A needs to send a UDP packet to node C. This can be done only after
20// A receives an HNA message from B, in which B announces 172.16.1.0/24
21// as an associated network.
22//
23// If no HNA message is generated by B, a will not be able to form a route to C.
24// This can be verified as follows:
25//
26// ./ns3 run olsr-hna
27//
28// There are two ways to make a node to generate HNA messages.
29//
30// One way is to use olsr::RoutingProtocol::SetRoutingTableAssociation ()
31// to use which you may run:
32//
33// ./ns3 run "olsr-hna --assocMethod=SetRoutingTable"
34//
35// The other way is to use olsr::RoutingProtocol::AddHostNetworkAssociation ()
36// to use which you may run:
37//
38// ./ns3 run "olsr-hna --assocMethod=AddHostNetwork"
39//
40
41#include "ns3/core-module.h"
42#include "ns3/csma-module.h"
43#include "ns3/internet-module.h"
44#include "ns3/mobility-module.h"
45#include "ns3/network-module.h"
46#include "ns3/olsr-helper.h"
47#include "ns3/olsr-routing-protocol.h"
48#include "ns3/yans-wifi-helper.h"
49
50#include <fstream>
51#include <iostream>
52#include <string>
53#include <vector>
54
55using namespace ns3;
56
58
59void
61{
62 NS_LOG_UNCOND("Received one packet!");
63}
64
65static void
67{
68 if (pktCount > 0)
69 {
70 socket->Send(Create<Packet>(pktSize));
71 Simulator::Schedule(pktInterval,
73 socket,
74 pktSize,
75 pktCount - 1,
76 pktInterval);
77 }
78 else
79 {
80 socket->Close();
81 }
82}
83
84int
85main(int argc, char* argv[])
86{
87 std::string phyMode("DsssRate1Mbps");
88 double rss = -80; // -dBm
89 uint32_t packetSize = 1000; // bytes
90 uint32_t numPackets = 1;
91 double interval = 1.0; // seconds
92 bool verbose = false;
93 std::string assocMethod("SetRoutingTable");
94 bool reverse = false;
95
96 CommandLine cmd(__FILE__);
97
98 cmd.AddValue("phyMode", "Wifi Phy mode", phyMode);
99 cmd.AddValue("rss", "received signal strength", rss);
100 cmd.AddValue("packetSize", "size of application packet sent", packetSize);
101 cmd.AddValue("numPackets", "number of packets generated", numPackets);
102 cmd.AddValue("interval", "interval (seconds) between packets", interval);
103 cmd.AddValue("verbose", "turn on all WifiNetDevice log components", verbose);
104 cmd.AddValue("assocMethod",
105 "How to add the host to the HNA table (SetRoutingTable, "
106 "AddHostNetwork)",
107 assocMethod);
108 cmd.AddValue("reverse", "Send packets from CSMA to WiFi if set to true", reverse);
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",
116 StringValue("2200"));
117 // turn off RTS/CTS for frames below 2200 bytes
118 Config::SetDefault("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue("2200"));
119 // Fix non-unicast data rate to be the same as that of unicast
120 Config::SetDefault("ns3::WifiRemoteStationManager::NonUnicastMode", StringValue(phyMode));
121
122 NodeContainer olsrNodes;
123 olsrNodes.Create(2);
124
126 csmaNodes.Create(1);
127
128 // The below set of helpers will help us to put together the wifi NICs we want
130 if (verbose)
131 {
132 WifiHelper::EnableLogComponents(); // Turn on all Wifi logging
133 }
134 wifi.SetStandard(WIFI_STANDARD_80211b);
135
136 YansWifiPhyHelper wifiPhy;
137 // This is one parameter that matters when using FixedRssLossModel
138 // set it to zero; otherwise, gain will be added
139 wifiPhy.Set("RxGain", DoubleValue(0));
140 // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
142
143 YansWifiChannelHelper wifiChannel;
144 wifiChannel.SetPropagationDelay("ns3::ConstantSpeedPropagationDelayModel");
145 // The below FixedRssLossModel will cause the rss to be fixed regardless
146 // of the distance between the two stations, and the transmit power
147 wifiChannel.AddPropagationLoss("ns3::FixedRssLossModel", "Rss", DoubleValue(rss));
148 wifiPhy.SetChannel(wifiChannel.Create());
149
150 // Add a mac and disable rate control
151 WifiMacHelper wifiMac;
152 wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
153 "DataMode",
154 StringValue(phyMode),
155 "ControlMode",
156 StringValue(phyMode));
157 // Set it to adhoc mode
158 wifiMac.SetType("ns3::AdhocWifiMac");
159 NetDeviceContainer devices = wifi.Install(wifiPhy, wifiMac, olsrNodes);
160
162 csma.SetChannelAttribute("DataRate", DataRateValue(DataRate(5000000)));
163 csma.SetChannelAttribute("Delay", TimeValue(MilliSeconds(2)));
165 csma.Install(NodeContainer(csmaNodes.Get(0), olsrNodes.Get(1)));
166
167 // Note that with FixedRssLossModel, the positions below are not
168 // used for received signal strength.
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(olsrNodes);
176
178
179 // Specify Node B's csma device as a non-OLSR device.
180 olsr.ExcludeInterface(olsrNodes.Get(1), 2);
181
182 Ipv4StaticRoutingHelper staticRouting;
183
185 list.Add(staticRouting, 0);
186 list.Add(olsr, 10);
187
188 InternetStackHelper internet_olsr;
189 internet_olsr.SetRoutingHelper(list); // has effect on the next Install ()
190 internet_olsr.Install(olsrNodes);
191
192 InternetStackHelper internet_csma;
193 internet_csma.Install(csmaNodes);
194
196 NS_LOG_INFO("Assign IP Addresses.");
197 ipv4.SetBase("10.1.1.0", "255.255.255.0");
198 ipv4.Assign(devices);
199
200 ipv4.SetBase("172.16.1.0", "255.255.255.0");
201 ipv4.Assign(csmaDevices);
202
203 TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory");
204 Ptr<Socket> recvSink;
205 if (!reverse)
206 {
207 recvSink = Socket::CreateSocket(csmaNodes.Get(0), tid);
208 }
209 else
210 {
211 recvSink = Socket::CreateSocket(olsrNodes.Get(0), tid);
212 }
214 recvSink->Bind(local);
215 recvSink->SetRecvCallback(MakeCallback(&ReceivePacket));
216
217 Ptr<Socket> source;
218 if (!reverse)
219 {
220 source = Socket::CreateSocket(olsrNodes.Get(0), tid);
221 InetSocketAddress remote = InetSocketAddress(Ipv4Address("172.16.1.1"), 80);
222 source->Connect(remote);
223 }
224 else
225 {
226 source = Socket::CreateSocket(csmaNodes.Get(0), tid);
227 InetSocketAddress remote = InetSocketAddress(Ipv4Address("10.1.1.1"), 80);
228 source->Connect(remote);
229 }
230
231 // Obtain olsr::RoutingProtocol instance of gateway node
232 // (namely, node B) and add the required association
234 olsrNodes.Get(1)->GetObject<Ipv4>()->GetRoutingProtocol());
235
236 if (assocMethod == "SetRoutingTable")
237 {
238 // Create a special Ipv4StaticRouting instance for RoutingTableAssociation
239 // Even the Ipv4StaticRouting instance added to list may be used
241
242 // Add the required routes into the Ipv4StaticRouting Protocol instance
243 // and have the node generate HNA messages for all these routes
244 // which are associated with non-OLSR interfaces specified above.
245 hnaEntries->AddNetworkRouteTo(Ipv4Address("172.16.1.0"),
246 Ipv4Mask("255.255.255.0"),
247 uint32_t(2),
248 uint32_t(1));
249 olsrrp_Gw->SetRoutingTableAssociation(hnaEntries);
250 }
251 else if (assocMethod == "AddHostNetwork")
252 {
253 // Specify the required associations directly.
254 olsrrp_Gw->AddHostNetworkAssociation(Ipv4Address("172.16.1.0"), Ipv4Mask("255.255.255.0"));
255 }
256 else
257 {
258 std::cout << "invalid HnaMethod option (" << assocMethod << ")" << std::endl;
259 exit(0);
260 }
261
262 // Add a default route to the CSMA node (to enable replies)
263 Ptr<Ipv4StaticRouting> staticRoutingProt;
265 csmaNodes.Get(0)->GetObject<Ipv4>()->GetRoutingProtocol());
266 staticRoutingProt->AddNetworkRouteTo("10.1.1.0", "255.255.255.0", "172.16.1.2", 1);
267
268 // Tracing
269 wifiPhy.EnablePcap("olsr-hna-wifi", devices);
270 csma.EnablePcap("olsr-hna-csma", csmaDevices, false);
271 AsciiTraceHelper ascii;
272 wifiPhy.EnableAsciiAll(ascii.CreateFileStream("olsr-hna-wifi.tr"));
273 csma.EnableAsciiAll(ascii.CreateFileStream("olsr-hna-csma.tr"));
274
275 Simulator::ScheduleWithContext(source->GetNode()->GetId(),
276 Seconds(15.0),
278 source,
280 numPackets,
281 interPacketInterval);
282
283 Ptr<OutputStreamWrapper> routingStream =
284 Create<OutputStreamWrapper>("olsr-hna.routes", std::ios::out);
286
290
291 return 0;
292}
void EnableAsciiAll(std::string prefix)
Enable ascii trace output on each device (which is of the appropriate type) in the set of all nodes c...
Manage ASCII trace files for device models.
Ptr< OutputStreamWrapper > CreateFileStream(std::string filename, std::ios::openmode filemode=std::ios::out)
Create and initialize an output stream object we'll use to write the traced bits.
Parse command-line arguments.
build a set of CsmaNetDevice objects
Definition csma-helper.h:37
Class for representing data rates.
Definition data-rate.h:78
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition double.h:31
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
void SetRoutingHelper(const Ipv4RoutingHelper &routing)
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
Ipv4 addresses are stored in host order in this class.
static Ipv4Address GetAny()
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition ipv4.h:69
virtual Ptr< Ipv4RoutingProtocol > GetRoutingProtocol() const =0
Get the routing protocol to be used by this Ipv4 stack.
Helper class that adds ns3::Ipv4ListRouting objects.
void Add(const Ipv4RoutingHelper &routing, int16_t priority)
a class to represent an Ipv4 address mask
static void PrintRoutingTableAllAt(Time printTime, Ptr< OutputStreamWrapper > stream, Time::Unit unit=Time::S)
prints the routing tables of all nodes at a particular time.
static Ptr< T > GetRouting(Ptr< Ipv4RoutingProtocol > protocol)
Request a specified routing protocol <T> from Ipv4RoutingProtocol protocol.
Helper class that adds ns3::Ipv4StaticRouting objects.
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition object.h:511
Helper class that adds OLSR routing to nodes.
Definition olsr-helper.h:31
void EnablePcap(std::string prefix, Ptr< NetDevice > nd, bool promiscuous=false, bool explicitFilename=false)
Enable pcap output the indicated net device.
Smart pointer class similar to boost::intrusive_ptr.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition simulator.h:560
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition simulator.cc:131
static void ScheduleWithContext(uint32_t context, const Time &delay, FUNC f, Ts &&... args)
Schedule an event with the given context.
Definition simulator.h:577
static void Run()
Run the simulation.
Definition simulator.cc:167
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition simulator.cc:175
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:61
Hold variables of type string.
Definition string.h:45
Simulation virtual time values and global simulation resolution.
Definition nstime.h:94
a unique identifier for an interface.
Definition type-id.h:48
static TypeId LookupByName(std::string name)
Get a TypeId by name.
Definition type-id.cc:872
helps to create WifiNetDevice objects
static void EnableLogComponents(LogLevel logLevel=LOG_LEVEL_ALL)
Helper to enable all WifiNetDevice log components with one statement.
create MAC layers for a ns3::WifiNetDevice.
void SetType(std::string type, Args &&... args)
void SetPcapDataLinkType(SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
void Set(std::string name, const AttributeValue &v)
@ DLT_IEEE802_11_RADIO
Include Radiotap link layer information.
manage and create wifi channel objects for the YANS model.
void SetPropagationDelay(std::string name, Ts &&... args)
void AddPropagationLoss(std::string name, Ts &&... args)
Ptr< YansWifiChannel > Create() const
Make it easy to create and manage PHY objects for the YANS model.
void SetChannel(Ptr< YansWifiChannel > channel)
void SetDefault(std::string name, const AttributeValue &value)
Definition config.cc:883
#define NS_LOG_UNCOND(msg)
Output the requested message unconditionally.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:191
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition log.h:264
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Definition object.h:619
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Definition ptr.h:436
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1308
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition nstime.h:1320
@ WIFI_STANDARD_80211b
devices
Definition first.py:31
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition callback.h:684
Definition olsr.py:1
csmaNodes
Definition second.py:42
csmaDevices
Definition second.py:56
wifi
Definition third.py:84
mobility
Definition third.py:92
void ReceivePacket(Ptr< Socket > socket)
Definition olsr-hna.cc:60
static void GenerateTraffic(Ptr< Socket > socket, uint32_t pktSize, uint32_t pktCount, Time pktInterval)
Definition olsr-hna.cc:66
#define list
bool verbose
uint32_t pktSize
packet size used for the simulation (in bytes)
static const uint32_t packetSize
Packet size generated at the AP.