35 #include "ns3/core-module.h"
36 #include "ns3/network-module.h"
37 #include "ns3/wifi-module.h"
38 #include "ns3/stats-module.h"
39 #include "ns3/mobility-module.h"
40 #include "ns3/propagation-module.h"
79 StandardInfo (std::string name,
enum WifiPhyStandard standard, uint32_t width,
bool sgi,
double snrLow,
double snrHigh,
double xMin,
double xMax,
double yMax)
81 m_standard (standard),
110 actualDataset.
Add (snr, currentRate);
117 int main (
int argc,
char *argv[])
119 std::vector <StandardInfo> standards;
121 uint32_t rtsThreshold = 65535;
122 uint32_t BE_MaxAmpduSize = 65535;
132 bool shortGuardInterval =
false;
133 uint32_t channelWidth = 20;
134 std::string standard (
"802.11b");
136 std::string outfileName (
"minstrel-ht-");
139 cmd.
AddValue (
"rtsThreshold",
"RTS threshold", rtsThreshold);
140 cmd.
AddValue (
"BE_MaxAmpduSize",
"BE Max A-MPDU size", BE_MaxAmpduSize);
141 cmd.
AddValue (
"stepSize",
"Power between steps (dBm)", stepSize);
142 cmd.
AddValue (
"stepTime",
"Time on each step (seconds)", stepTime);
143 cmd.
AddValue (
"broadcast",
"Send broadcast instead of unicast", broadcast);
144 cmd.
AddValue (
"channelWidth",
"Set channel width (valid only for 802.11n or ac)", channelWidth);
145 cmd.
AddValue (
"shortGuard",
"Set short guard interval (802.11n/ac)", shortGuardInterval);
146 cmd.
AddValue (
"nss",
"Set nss (valid only for 802.11n or ac)", nss);
147 cmd.
AddValue (
"standard",
"Set standard (02.11a, 802.11b, 802.11g, 802.11n-5GHz, 802.11n-2.4GHz, 802.11ac, 802.11-holland, 802.11-10MHz, 802.11-5MHz)", standard);
148 cmd.
Parse (argc, argv);
150 if (standard ==
"802.11b")
152 NS_ABORT_MSG_IF (channelWidth != 20 && channelWidth != 22,
"Invalid channel width for standard " << standard);
155 else if (standard ==
"802.11a" || standard ==
"802.11g")
157 NS_ABORT_MSG_IF (channelWidth != 20,
"Invalid channel width for standard " << standard);
160 else if (standard ==
"802.11n-5GHz" || standard ==
"802.11n-2.4GHz")
162 NS_ABORT_MSG_IF (channelWidth != 20 && channelWidth != 40,
"Invalid channel width for standard " << standard);
163 NS_ABORT_MSG_IF (nss == 0 || nss > 4,
"Invalid nss " << nss <<
" for standard " << standard);
165 else if (standard ==
"802.11ac")
167 NS_ABORT_MSG_IF (channelWidth != 20 && channelWidth != 40 && channelWidth != 80 && channelWidth != 160,
"Invalid channel width for standard " << standard);
168 NS_ABORT_MSG_IF (nss == 0 || nss > 4,
"Invalid nss " << nss <<
" for standard " << standard);
171 outfileName.append (standard);
172 if (standard ==
"802.11n-5GHz" || standard ==
"802.11n-2.4GHz" || standard ==
"802.11ac")
174 std::ostringstream oss;
176 if (shortGuardInterval)
184 oss <<
"-" << channelWidth <<
"MHz-" << gi <<
"-" <<nss <<
"SS";
185 outfileName += oss.str ();
187 std::string tmp = outfileName +
".plt";
188 std::ofstream outfile (tmp.c_str ());
189 tmp = outfileName +
".eps";
205 for (std::vector<StandardInfo>::size_type i = 0; i != standards.size (); i++)
207 if (standard == standards[i].m_name)
209 selectedStandard = standards[i];
213 std::cout <<
"Testing " << selectedStandard.
m_name <<
"..." << std::endl;
215 steps = std::abs ((
int) (selectedStandard.
m_snrHigh - selectedStandard.
m_snrLow ) / stepSize) + 1;
216 Ptr<Node> clientNode = CreateObject<Node> ();
217 Ptr<Node> serverNode = CreateObject<Node> ();
220 wifi.SetStandard (selectedStandard.
m_standard);
235 wifi.SetRemoteStationManager (
"ns3::MinstrelHtWifiManager",
"RtsCtsThreshold",
UintegerValue (rtsThreshold),
"PrintStats",
BooleanValue (
true));
242 wifiMac.
SetType (
"ns3::AdhocWifiMac",
244 serverDevice = wifi.Install (wifiPhy, wifiMac, serverNode);
245 clientDevice = wifi.Install (wifiPhy, wifiMac, clientNode);
253 positionAlloc->
Add (Vector (ap1_x, ap1_y, 0.0));
254 NS_LOG_INFO (
"Setting initial AP position to " << Vector (ap1_x, ap1_y, 0.0));
255 positionAlloc->
Add (Vector (sta1_x, sta1_y, 0.0));
256 NS_LOG_INFO (
"Setting initial STA position to " << Vector (sta1_x, sta1_y, 0.0));
275 wifiPhyPtrClient->SetNumberOfTransmitAntennas (nss);
276 wifiPhyPtrClient->SetNumberOfReceiveAntennas (nss);
278 NS_LOG_DEBUG (
"Channel width " << wifiPhyPtrClient->GetChannelWidth () <<
" noiseDbm " <<
noiseDbm);
287 wifiPhyPtrServer->SetNumberOfTransmitAntennas (nss);
288 wifiPhyPtrServer->SetNumberOfReceiveAntennas (nss);
291 rssLossModel->
SetRss (rssCurrent);
292 NS_LOG_INFO (
"Setting initial Rss to " << rssCurrent);
297 packetSocketHelper.
Install (serverNode);
298 packetSocketHelper.
Install (clientNode);
326 serverNode->AddApplication (server);
335 std::ostringstream xMinStr, xMaxStr, yMaxStr;
336 std::string xRangeStr (
"set xrange [");
337 xMinStr << selectedStandard.
m_xMin;
338 xRangeStr.append (xMinStr.str ());
339 xRangeStr.append (
":");
340 xMaxStr << selectedStandard.
m_xMax;
341 xRangeStr.append (xMaxStr.str ());
342 xRangeStr.append (
"]");
343 std::string yRangeStr (
"set yrange [0:");
344 yMaxStr << selectedStandard.
m_yMax;
345 yRangeStr.append (yMaxStr.str ());
346 yRangeStr.append (
"]");
348 std::ostringstream widthStrStr;
349 std::ostringstream nssStrStr;
350 std::string title (
"Wi-Fi Minstrel ht rate control: ");
351 title.append (standard);
352 title.append (
" channel width: ");
353 widthStrStr << selectedStandard.
m_width;
354 title.append (widthStrStr.str ());
355 title.append (
" MHz nss: ");
357 title.append (nssStrStr.str ());
358 if (shortGuardInterval ==
true)
360 title.append (
" shortGuard: true");
363 gnuplot.
SetTerminal (
"postscript eps color enh \"Times-BoldItalic\"");
364 gnuplot.
SetLegend (
"SNR (dB)",
"Rate (Mb/s)");
ERP-OFDM PHY (Clause 19, Section 19.5)
uint32_t AddApplication(Ptr< Application > application)
Associate an Application to this Node.
void PacketRx(Ptr< const Packet > pkt, const Address &addr)
void AppendExtra(const std::string &extra)
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
OFDM PHY for the 5 GHz band (Clause 17 with 5 MHz channel bandwidth)
AttributeValue implementation for Boolean.
void SetLocal(PacketSocketAddress addr)
set the local address and protocol to be used
HT OFDM PHY for the 5 GHz band (clause 20)
Class to represent a 2D points plot.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
Make it easy to create and manage PHY objects for the yans model.
void SetPropagationLossModel(Ptr< PropagationLossModel > loss)
an address for a packet socket
void SetPropagationDelayModel(Ptr< PropagationDelayModel > delay)
static void Run(void)
Run the simulation.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
OFDM PHY for the 5 GHz band (Clause 17 with 10 MHz channel bandwidth)
void AddDataset(const GnuplotDataset &dataset)
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
void Set(std::string name, const AttributeValue &v)
HT OFDM PHY for the 2.4 GHz band (clause 20)
static YansWifiPhyHelper Default(void)
Create a phy helper in a default working state.
helps to create WifiNetDevice objects
StandardInfo(std::string name, enum WifiPhyStandard standard, uint32_t width, bool sgi, double snrLow, double snrHigh, double xMin, double xMax, double yMax)
Give ns3::PacketSocket powers to ns3::Node.
void SetSingleDevice(uint32_t device)
Set the address to match only a specified NetDevice.
a polymophic address class
void SetChannel(Ptr< YansWifiChannel > channel)
WifiPhyStandard
Identifies the PHY specification that a Wifi device is configured to use.
Ptr< WifiPhy > GetPhy(void) const
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
a simple class to generate gnuplot-ready plotting commands from a set of datasets.
AttributeValue implementation for Time.
void SetTitle(const std::string &title)
Hold an unsigned integer type.
holds a vector of ns3::NetDevice pointers
Hold together all Wifi-related objects.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
void GenerateOutput(std::ostream &os)
Writes gnuplot commands and data values to a single output stream.
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
void Add(double x, double y)
Parse command-line arguments.
void SetLegend(const std::string &xLegend, const std::string &yLegend)
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
This is intended to be the configuration used in this paper: Gavin Holland, Nitin Vaidya and Paramvir...
enum WifiPhyStandard m_standard
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
OFDM PHY for the 5 GHz band (Clause 17)
void SetPhysicalAddress(const Address address)
Set the destination address.
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(Ptr< Node > node) const
Aggregate an instance of a ns3::PacketSocketFactory onto the provided node.
create MAC layers for a ns3::WifiNetDevice.
static Time Now(void)
Return the current simulation virtual time.
void SetExtra(const std::string &extra)
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(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue(), std::string n10="", const AttributeValue &v10=EmptyAttributeValue())
Helper class used to assign positions and mobility models to nodes.
#define NS_ABORT_IF(cond)
Abnormal program termination if a condition is true.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
void SetRemote(PacketSocketAddress addr)
set the remote address and protocol to be used
void AddValue(const std::string &name, const std::string &help, T &value)
Add a program argument, assigning to POD.
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Time Seconds(double value)
Construct a Time in the indicated unit.
void ChangeSignalAndReportRate(Ptr< FixedRssLossModel > rssModel, struct Step step, double rss, Gnuplot2dDataset &rateDataset, Gnuplot2dDataset &actualDataset)
void SetProtocol(uint16_t protocol)
Set the protocol.
void Add(Vector v)
Add a position to the list of positions.
const double NOISE_DBM_Hz
void Parse(int argc, char *argv[])
Parse the program arguments.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
static const uint32_t packetSize
virtual void SetChannelWidth(uint32_t channelwidth)=0
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
void SetTerminal(const std::string &terminal)
This class can be used to hold variables of floating point type such as 'double' or 'float'...
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
void SetStartTime(Time start)
Specify application start time.
void RateChange(uint64_t newVal, Mac48Address dest)