A Discrete-Event Network Simulator
API
wifi-power-adaptation-distance.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2014 Universidad de la República - Uruguay
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 * Author: Matias Richart <mrichart@fing.edu.uy>
19 */
20
88#include "ns3/gnuplot.h"
89#include "ns3/command-line.h"
90#include "ns3/config.h"
91#include "ns3/uinteger.h"
92#include "ns3/double.h"
93#include "ns3/log.h"
94#include "ns3/yans-wifi-helper.h"
95#include "ns3/ssid.h"
96#include "ns3/mobility-helper.h"
97#include "ns3/internet-stack-helper.h"
98#include "ns3/ipv4-address-helper.h"
99#include "ns3/packet-sink-helper.h"
100#include "ns3/on-off-helper.h"
101#include "ns3/yans-wifi-channel.h"
102#include "ns3/wifi-net-device.h"
103#include "ns3/wifi-mac.h"
104#include "ns3/wifi-mac-header.h"
105#include "ns3/mobility-model.h"
106
107using namespace ns3;
108using namespace std;
109
110NS_LOG_COMPONENT_DEFINE ("PowerAdaptationDistance");
111
113static const uint32_t packetSize = 1420;
114
119{
120public:
128
136 void PhyCallback (std::string path, Ptr<const Packet> packet, double powerW);
144 void RxCallback (std::string path, Ptr<const Packet> packet, const Address &from);
153 void PowerCallback (std::string path, double oldPower, double newPower, Mac48Address dest);
162 void RateCallback (std::string path, DataRate oldRate, DataRate newRate, Mac48Address dest);
169 void SetPosition (Ptr<Node> node, Vector position);
176 void AdvancePosition (Ptr<Node> node, int stepsSize, int stepsTime);
183 Vector GetPosition (Ptr<Node> node);
184
197
198
199private:
201 typedef std::vector<std::pair<Time, DataRate> > TxTime;
215
216 std::map<Mac48Address, double> m_currentPower;
217 std::map<Mac48Address, DataRate> m_currentRate;
220 double m_totalTime;
224};
225
227{
228 Ptr<NetDevice> device = aps.Get (0);
229 Ptr<WifiNetDevice> wifiDevice = DynamicCast<WifiNetDevice> (device);
230 Ptr<WifiPhy> phy = wifiDevice->GetPhy ();
231 SetupPhy (phy);
232 DataRate dataRate = DataRate (phy->GetDefaultMode ().GetDataRate (phy->GetChannelWidth ()));
233 double power = phy->GetTxPowerEnd ();
234 for (uint32_t j = 0; j < stas.GetN (); j++)
235 {
236 Ptr<NetDevice> staDevice = stas.Get (j);
237 Ptr<WifiNetDevice> wifiStaDevice = DynamicCast<WifiNetDevice> (staDevice);
238 Mac48Address addr = wifiStaDevice->GetMac ()->GetAddress ();
239 m_currentPower[addr] = power;
240 m_currentRate[addr] = dataRate;
241 }
242 m_currentRate[Mac48Address ("ff:ff:ff:ff:ff:ff")] = dataRate;
243 m_totalEnergy = 0;
244 m_totalTime = 0;
245 m_bytesTotal = 0;
246 m_output.SetTitle ("Throughput Mbits/s");
247 m_output_power.SetTitle ("Average Transmit Power");
248}
249
250void
252{
253 for (const auto & mode : phy->GetModeList ())
254 {
255 WifiTxVector txVector;
256 txVector.SetMode (mode);
258 txVector.SetChannelWidth (phy->GetChannelWidth ());
259 DataRate dataRate = DataRate (mode.GetDataRate (phy->GetChannelWidth ()));
260 Time time = phy->CalculateTxDuration (packetSize, txVector, phy->GetPhyBand ());
261 NS_LOG_DEBUG (mode.GetUniqueName () << " " << time.GetSeconds () << " " << dataRate);
262 m_timeTable.push_back (std::make_pair (time, dataRate));
263 }
264}
265
266Time
268{
269 for (TxTime::const_iterator i = m_timeTable.begin (); i != m_timeTable.end (); i++)
270 {
271 if (rate == i->second)
272 {
273 return i->first;
274 }
275 }
276 NS_ASSERT (false);
277 return Seconds (0);
278}
279
280void
281NodeStatistics::PhyCallback (std::string path, Ptr<const Packet> packet, double powerW)
282{
283 WifiMacHeader head;
284 packet->PeekHeader (head);
285 Mac48Address dest = head.GetAddr1 ();
286
287 if (head.GetType () == WIFI_MAC_DATA)
288 {
289 m_totalEnergy += pow (10.0, m_currentPower[dest] / 10.0) * GetCalcTxTime (m_currentRate[dest]).GetSeconds ();
291 }
292}
293
294void
295NodeStatistics::PowerCallback (std::string path, double oldPower, double newPower, Mac48Address dest)
296{
297 m_currentPower[dest] = newPower;
298}
299
300void
301NodeStatistics::RateCallback (std::string path, DataRate oldRate, DataRate newRate, Mac48Address dest)
302{
303 m_currentRate[dest] = newRate;
304}
305
306void
307NodeStatistics::RxCallback (std::string path, Ptr<const Packet> packet, const Address &from)
308{
309 m_bytesTotal += packet->GetSize ();
310}
311
312void
314{
316 mobility->SetPosition (position);
317}
318
319Vector
321{
323 return mobility->GetPosition ();
324}
325
326void
327NodeStatistics::AdvancePosition (Ptr<Node> node, int stepsSize, int stepsTime)
328{
329 Vector pos = GetPosition (node);
330 double mbs = ((m_bytesTotal * 8.0) / (1000000 * stepsTime));
331 m_bytesTotal = 0;
332 double atp = m_totalEnergy / stepsTime;
333 m_totalEnergy = 0;
334 m_totalTime = 0;
335 m_output_power.Add (pos.x, atp);
336 m_output.Add (pos.x, mbs);
337 pos.x += stepsSize;
338 SetPosition (node, pos);
339 NS_LOG_INFO ("At time " << Simulator::Now ().GetSeconds () << " sec; setting new position to " << pos);
340 Simulator::Schedule (Seconds (stepsTime), &NodeStatistics::AdvancePosition, this, node, stepsSize, stepsTime);
341}
342
345{
346 return m_output;
347}
348
351{
352 return m_output_power;
353}
354
355void PowerCallback (std::string path, double oldPower, double newPower, Mac48Address dest)
356{
357 NS_LOG_INFO ((Simulator::Now ()).GetSeconds () << " " << dest << " Old power=" << oldPower << " New power=" << newPower);
358}
359
360void RateCallback (std::string path, DataRate oldRate, DataRate newRate, Mac48Address dest)
361{
362 NS_LOG_INFO ((Simulator::Now ()).GetSeconds () << " " << dest << " Old rate=" << oldRate << " New rate=" << newRate);
363}
364
365int main (int argc, char *argv[])
366{
367 double maxPower = 17;
368 double minPower = 0;
369 uint32_t powerLevels = 18;
370
371 uint32_t rtsThreshold = 2346;
372 std::string manager = "ns3::ParfWifiManager";
373 std::string outputFileName = "parf";
374 int ap1_x = 0;
375 int ap1_y = 0;
376 int sta1_x = 5;
377 int sta1_y = 0;
378 uint32_t steps = 200;
379 uint32_t stepsSize = 1;
380 uint32_t stepsTime = 1;
381
382 CommandLine cmd (__FILE__);
383 cmd.AddValue ("manager", "PRC Manager", manager);
384 cmd.AddValue ("rtsThreshold", "RTS threshold", rtsThreshold);
385 cmd.AddValue ("outputFileName", "Output filename", outputFileName);
386 cmd.AddValue ("steps", "How many different distances to try", steps);
387 cmd.AddValue ("stepsTime", "Time on each step", stepsTime);
388 cmd.AddValue ("stepsSize", "Distance between steps", stepsSize);
389 cmd.AddValue ("maxPower", "Maximum available transmission level (dbm).", maxPower);
390 cmd.AddValue ("minPower", "Minimum available transmission level (dbm).", minPower);
391 cmd.AddValue ("powerLevels", "Number of transmission power levels available between "
392 "TxPowerStart and TxPowerEnd included.", powerLevels);
393 cmd.AddValue ("AP1_x", "Position of AP1 in x coordinate", ap1_x);
394 cmd.AddValue ("AP1_y", "Position of AP1 in y coordinate", ap1_y);
395 cmd.AddValue ("STA1_x", "Position of STA1 in x coordinate", sta1_x);
396 cmd.AddValue ("STA1_y", "Position of STA1 in y coordinate", sta1_y);
397 cmd.Parse (argc, argv);
398
399 if (steps == 0)
400 {
401 std::cout << "Exiting without running simulation; steps value of 0" << std::endl;
402 }
403
404 uint32_t simuTime = (steps + 1) * stepsTime;
405
406 //Define the APs
407 NodeContainer wifiApNodes;
408 wifiApNodes.Create (1);
409
410 //Define the STAs
412 wifiStaNodes.Create (1);
413
415 wifi.SetStandard (WIFI_STANDARD_80211a);
416 WifiMacHelper wifiMac;
417 YansWifiPhyHelper wifiPhy;
418 YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
419
420 wifiPhy.SetChannel (wifiChannel.Create ());
421
422 NetDeviceContainer wifiApDevices;
423 NetDeviceContainer wifiStaDevices;
424 NetDeviceContainer wifiDevices;
425
426 //Configure the STA node
427 wifi.SetRemoteStationManager ("ns3::MinstrelWifiManager", "RtsCtsThreshold", UintegerValue (rtsThreshold));
428 wifiPhy.Set ("TxPowerStart", DoubleValue (maxPower));
429 wifiPhy.Set ("TxPowerEnd", DoubleValue (maxPower));
430
431 Ssid ssid = Ssid ("AP");
432 wifiMac.SetType ("ns3::StaWifiMac",
433 "Ssid", SsidValue (ssid));
434 wifiStaDevices.Add (wifi.Install (wifiPhy, wifiMac, wifiStaNodes.Get (0)));
435
436 //Configure the AP node
437 wifi.SetRemoteStationManager (manager, "DefaultTxPowerLevel", UintegerValue (powerLevels - 1), "RtsCtsThreshold", UintegerValue (rtsThreshold));
438 wifiPhy.Set ("TxPowerStart", DoubleValue (minPower));
439 wifiPhy.Set ("TxPowerEnd", DoubleValue (maxPower));
440 wifiPhy.Set ("TxPowerLevels", UintegerValue (powerLevels));
441
442 ssid = Ssid ("AP");
443 wifiMac.SetType ("ns3::ApWifiMac",
444 "Ssid", SsidValue (ssid));
445 wifiApDevices.Add (wifi.Install (wifiPhy, wifiMac, wifiApNodes.Get (0)));
446
447 wifiDevices.Add (wifiStaDevices);
448 wifiDevices.Add (wifiApDevices);
449
450 //Configure the mobility.
452 Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
453 //Initial position of AP and STA
454 positionAlloc->Add (Vector (ap1_x, ap1_y, 0.0));
455 NS_LOG_INFO ("Setting initial AP position to " << Vector (ap1_x, ap1_y, 0.0));
456 positionAlloc->Add (Vector (sta1_x, sta1_y, 0.0));
457 NS_LOG_INFO ("Setting initial STA position to " << Vector (sta1_x, sta1_y, 0.0));
458 mobility.SetPositionAllocator (positionAlloc);
459 mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
460 mobility.Install (wifiApNodes.Get (0));
461 mobility.Install (wifiStaNodes.Get (0));
462
463 //Statistics counter
464 NodeStatistics statistics = NodeStatistics (wifiApDevices, wifiStaDevices);
465
466 //Move the STA by stepsSize meters every stepsTime seconds
467 Simulator::Schedule (Seconds (0.5 + stepsTime), &NodeStatistics::AdvancePosition, &statistics, wifiStaNodes.Get (0), stepsSize, stepsTime);
468
469 //Configure the IP stack
471 stack.Install (wifiApNodes);
472 stack.Install (wifiStaNodes);
474 address.SetBase ("10.1.1.0", "255.255.255.0");
475 Ipv4InterfaceContainer i = address.Assign (wifiDevices);
476 Ipv4Address sinkAddress = i.GetAddress (0);
477 uint16_t port = 9;
478
479 //Configure the CBR generator
480 PacketSinkHelper sink ("ns3::UdpSocketFactory", InetSocketAddress (sinkAddress, port));
481 ApplicationContainer apps_sink = sink.Install (wifiStaNodes.Get (0));
482
483 OnOffHelper onoff ("ns3::UdpSocketFactory", InetSocketAddress (sinkAddress, port));
484 onoff.SetConstantRate (DataRate ("54Mb/s"), packetSize);
485 onoff.SetAttribute ("StartTime", TimeValue (Seconds (0.5)));
486 onoff.SetAttribute ("StopTime", TimeValue (Seconds (simuTime)));
487 ApplicationContainer apps_source = onoff.Install (wifiApNodes.Get (0));
488
489 apps_sink.Start (Seconds (0.5));
490 apps_sink.Stop (Seconds (simuTime));
491
492 //------------------------------------------------------------
493 //-- Setup stats and data collection
494 //--------------------------------------------
495
496 //Register packet receptions to calculate throughput
497 Config::Connect ("/NodeList/1/ApplicationList/*/$ns3::PacketSink/Rx",
499
500 //Register power and rate changes to calculate the Average Transmit Power
501 Config::Connect ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/RemoteStationManager/$" + manager + "/PowerChange",
503 Config::Connect ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/RemoteStationManager/$" + manager + "/RateChange",
505
506 Config::Connect ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyTxBegin",
508
509 //Callbacks to print every change of power and rate
510 Config::Connect ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/RemoteStationManager/$" + manager + "/PowerChange",
512 Config::Connect ("/NodeList/0/DeviceList/*/$ns3::WifiNetDevice/RemoteStationManager/$" + manager + "/RateChange",
514
515 Simulator::Stop (Seconds (simuTime));
516 Simulator::Run ();
517
518 std::ofstream outfile (("throughput-" + outputFileName + ".plt").c_str ());
519 Gnuplot gnuplot = Gnuplot (("throughput-" + outputFileName + ".eps").c_str (), "Throughput");
520 gnuplot.SetTerminal ("post eps color enhanced");
521 gnuplot.SetLegend ("Time (seconds)", "Throughput (Mb/s)");
522 gnuplot.SetTitle ("Throughput (AP to STA) vs time");
523 gnuplot.AddDataset (statistics.GetDatafile ());
524 gnuplot.GenerateOutput (outfile);
525
526 if (manager.compare ("ns3::ParfWifiManager") == 0
527 || manager.compare ("ns3::AparfWifiManager") == 0
528 || manager.compare ("ns3::RrpaaWifiManager") == 0)
529 {
530 std::ofstream outfile2 (("power-" + outputFileName + ".plt").c_str ());
531 gnuplot = Gnuplot (("power-" + outputFileName + ".eps").c_str (), "Average Transmit Power");
532 gnuplot.SetTerminal ("post eps color enhanced");
533 gnuplot.SetLegend ("Time (seconds)", "Power (mW)");
534 gnuplot.SetTitle ("Average transmit power (AP to STA) vs time");
535 gnuplot.AddDataset (statistics.GetPowerDatafile ());
536 gnuplot.GenerateOutput (outfile2);
537 }
538
539 Simulator::Destroy ();
540
541 return 0;
542}
Class to collect node statistics.
void SetPosition(Ptr< Node > node, Vector position)
Set the Position of a node.
Gnuplot2dDataset m_output_power
Power output data.
Gnuplot2dDataset GetPowerDatafile()
Get the Power output data.
TxTime m_timeTable
Time, DataRate table.
void RateCallback(std::string path, DataRate oldRate, DataRate newRate, Mac48Address dest)
Callback called by WifiNetDevice/RemoteStationManager/x/RateChange.
Gnuplot2dDataset GetDatafile()
Get the Throughput output data.
void RxCallback(std::string path, Ptr< const Packet > packet, const Address &from)
Callback called by PacketSink/Rx.
NodeStatistics(NetDeviceContainer aps, NetDeviceContainer stas)
Constructor.
Time GetCalcTxTime(DataRate rate)
Get the time at which a given datarate has been recorded.
void PowerCallback(std::string path, double oldPower, double newPower, Mac48Address dest)
Callback called by WifiNetDevice/RemoteStationManager/x/PowerChange.
double m_totalTime
Time spent on a given state.
uint32_t m_bytesTotal
Number of received bytes on a given state.
void SetupPhy(Ptr< WifiPhy > phy)
Setup the WifiPhy object.
std::vector< std::pair< Time, DataRate > > TxTime
Time, DataRate pair vector.
Vector GetPosition(Ptr< Node > node)
Get the Position of a node.
std::map< Mac48Address, double > m_currentPower
Current Tx power for each sender.
double m_totalEnergy
Energy used on a given state.
Gnuplot2dDataset m_output
Throughput output data.
std::map< Mac48Address, DataRate > m_currentRate
Current Tx rate for each sender.
void AdvancePosition(Ptr< Node > node, int stepsSize, int stepsTime)
Move a node.
void PhyCallback(std::string path, Ptr< const Packet > packet, double powerW)
Callback called by WifiNetDevice/Phy/PhyTxBegin.
a polymophic address class
Definition: address.h:91
holds a vector of ns3::Application pointers.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
Parse command-line arguments.
Definition: command-line.h:229
Class for representing data rates.
Definition: data-rate.h:89
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:41
Class to represent a 2D points plot.
Definition: gnuplot.h:118
void Add(double x, double y)
Definition: gnuplot.cc:361
void SetTitle(const std::string &title)
Change line title.
Definition: gnuplot.cc:141
a simple class to generate gnuplot-ready plotting commands from a set of datasets.
Definition: gnuplot.h:372
void AddDataset(const GnuplotDataset &dataset)
Definition: gnuplot.cc:758
void SetLegend(const std::string &xLegend, const std::string &yLegend)
Definition: gnuplot.cc:738
void SetTerminal(const std::string &terminal)
Definition: gnuplot.cc:726
void GenerateOutput(std::ostream &os)
Writes gnuplot commands and data values to a single output stream.
Definition: gnuplot.cc:764
void SetTitle(const std::string &title)
Definition: gnuplot.cc:732
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
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.
Definition: ipv4-address.h:41
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
an EUI-48 address
Definition: mac48-address.h:44
Helper class used to assign positions and mobility models to nodes.
Keep track of the current position and velocity of an object.
holds a vector of ns3::NetDevice pointers
uint32_t GetN(void) const
Get the number of Ptr<NetDevice> stored in this container.
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
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(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:43
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Definition: packet.cc:290
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:856
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
The IEEE 802.11 SSID Information Element.
Definition: ssid.h:36
AttributeValue implementation for Ssid.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:379
AttributeValue implementation for Time.
Definition: nstime.h:1308
Hold an unsigned integer type.
Definition: uinteger.h:44
Vector3D Vector
Vector alias typedef for compatibility with mobility models.
Definition: vector.h:324
helps to create WifiNetDevice objects
Definition: wifi-helper.h:323
Implements the IEEE 802.11 MAC header.
Mac48Address GetAddr1(void) const
Return the address in the Address 1 field.
WifiMacType GetType(void) const
Return the type (enum WifiMacType)
create MAC layers for a ns3::WifiNetDevice.
void SetType(std::string type, Args &&... args)
Ptr< WifiMac > GetMac(void) const
Ptr< WifiPhy > GetPhy(void) const
void Set(std::string name, const AttributeValue &v)
Definition: wifi-helper.cc:141
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
void SetChannelWidth(uint16_t channelWidth)
Sets the selected channelWidth (in MHz)
void SetMode(WifiMode mode)
Sets the selected payload transmission mode.
void SetPreambleType(WifiPreamble preamble)
Sets the preamble type.
manage and create wifi channel objects for the YANS model.
Ptr< YansWifiChannel > Create(void) const
Make it easy to create and manage PHY objects for the YANS model.
void SetChannel(Ptr< YansWifiChannel > channel)
uint16_t port
Definition: dsdv-manet.cc:45
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:920
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
void(* DataRate)(DataRate oldValue, DataRate newValue)
TracedValue callback signature for DataRate.
Definition: data-rate.h:329
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
@ WIFI_STANDARD_80211a
@ WIFI_PREAMBLE_LONG
address
Definition: first.py:44
stack
Definition: first.py:41
Every class exported by the ns3 library is enclosed in the ns3 namespace.
@ WIFI_MAC_DATA
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1648
cmd
Definition: second.py:35
STL namespace.
ssid
Definition: third.py:97
wifi
Definition: third.py:99
mobility
Definition: third.py:107
wifiStaNodes
Definition: third.py:88
phy
Definition: third.py:93
void RateCallback(std::string path, DataRate oldRate, DataRate newRate, Mac48Address dest)
static const uint32_t packetSize
Pcket size generated at the AP.
void PowerCallback(std::string path, double oldPower, double newPower, Mac48Address dest)
Ptr< PacketSink > sink
Definition: wifi-tcp.cc:56