A Discrete-Event Network Simulator
API
wave-helper.cc
Go to the documentation of this file.
1/*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License version 2 as
4 * published by the Free Software Foundation;
5 *
6 * This program is distributed in the hope that it will be useful,
7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 * GNU General Public License for more details.
10 *
11 * You should have received a copy of the GNU General Public License
12 * along with this program; if not, write to the Free Software
13 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
14 *
15 * Author: Junling Bu <linlinjavaer@gmail.com>
16 */
17
18#include "wave-helper.h"
19
20#include "wave-mac-helper.h"
21
22#include "ns3/abort.h"
23#include "ns3/config.h"
24#include "ns3/log.h"
25#include "ns3/minstrel-wifi-manager.h"
26#include "ns3/names.h"
27#include "ns3/pointer.h"
28#include "ns3/qos-txop.h"
29#include "ns3/radiotap-header.h"
30#include "ns3/string.h"
31#include "ns3/wave-net-device.h"
32
33NS_LOG_COMPONENT_DEFINE("WaveHelper");
34
35namespace ns3
36{
37
47static void
49 std::string context,
51 WifiMode mode [[maybe_unused]],
52 WifiPreamble preamble [[maybe_unused]],
53 uint8_t txLevel [[maybe_unused]])
54{
55 NS_LOG_FUNCTION(stream << context << p << mode << preamble << txLevel);
56 *stream->GetStream() << "t " << Simulator::Now().GetSeconds() << " " << context << " " << *p
57 << std::endl;
58}
59
68static void
71 WifiMode mode,
72 WifiPreamble preamble,
73 uint8_t txLevel)
74{
75 NS_LOG_FUNCTION(stream << p << mode << preamble << txLevel);
76 *stream->GetStream() << "t " << Simulator::Now().GetSeconds() << " " << *p << std::endl;
77}
78
88static void
90 std::string context,
92 double snr,
93 WifiMode mode,
94 enum WifiPreamble preamble)
95{
96 NS_LOG_FUNCTION(stream << context << p << snr << mode << preamble);
97 *stream->GetStream() << "r " << Simulator::Now().GetSeconds() << " " << context << " " << *p
98 << std::endl;
99}
100
109static void
112 double snr,
113 WifiMode mode,
114 enum WifiPreamble preamble)
115{
116 NS_LOG_FUNCTION(stream << p << snr << mode << preamble);
117 *stream->GetStream() << "r " << Simulator::Now().GetSeconds() << " " << *p << std::endl;
118}
119
120/****************************** YansWavePhyHelper ***********************************/
121YansWavePhyHelper
123{
124 YansWavePhyHelper helper;
125 helper.SetErrorRateModel("ns3::NistErrorRateModel");
126 return helper;
127}
128
129void
132 bool /* promiscuous */,
133 bool explicitFilename)
134{
135 //
136 // All of the Pcap enable functions vector through here including the ones
137 // that are wandering through all of devices on perhaps all of the nodes in
138 // the system. We can only deal with devices of type WaveNetDevice.
139 //
140 Ptr<WaveNetDevice> device = nd->GetObject<WaveNetDevice>();
141 if (!device)
142 {
143 NS_LOG_INFO("YansWavePhyHelper::EnablePcapInternal(): Device "
144 << &device << " not of type ns3::WaveNetDevice");
145 return;
146 }
147
148 std::vector<Ptr<WifiPhy>> phys = device->GetPhys();
149 NS_ABORT_MSG_IF(phys.size() == 0,
150 "EnablePcapInternal(): Phy layer in WaveNetDevice must be set");
151
152 PcapHelper pcapHelper;
153
154 std::string filename;
155 if (explicitFilename)
156 {
157 filename = prefix;
158 }
159 else
160 {
161 filename = pcapHelper.GetFilenameFromDevice(prefix, device);
162 }
163
165 pcapHelper.CreateFile(filename, std::ios::out, GetPcapDataLinkType());
166
167 std::vector<Ptr<WifiPhy>>::iterator i;
168 for (i = phys.begin(); i != phys.end(); ++i)
169 {
170 Ptr<WifiPhy> phy = (*i);
171 phy->TraceConnectWithoutContext(
172 "MonitorSnifferTx",
174 phy->TraceConnectWithoutContext(
175 "MonitorSnifferRx",
177 }
178}
179
180void
182 std::string prefix,
184 bool explicitFilename)
185{
186 //
187 // All of the ascii enable functions vector through here including the ones
188 // that are wandering through all of devices on perhaps all of the nodes in
189 // the system. We can only deal with devices of type WaveNetDevice.
190 //
191 Ptr<WaveNetDevice> device = nd->GetObject<WaveNetDevice>();
192 if (!device)
193 {
194 NS_LOG_INFO("EnableAsciiInternal(): Device " << device
195 << " not of type ns3::WaveNetDevice");
196 return;
197 }
198
199 //
200 // Our trace sinks are going to use packet printing, so we have to make sure
201 // that is turned on.
202 //
204
205 uint32_t nodeid = nd->GetNode()->GetId();
206 uint32_t deviceid = nd->GetIfIndex();
207 std::ostringstream oss;
208
209 //
210 // If we are not provided an OutputStreamWrapper, we are expected to create
211 // one using the usual trace filename conventions and write our traces
212 // without a context since there will be one file per context and therefore
213 // the context would be redundant.
214 //
215 if (!stream)
216 {
217 //
218 // Set up an output stream object to deal with private ofstream copy
219 // constructor and lifetime issues. Let the helper decide the actual
220 // name of the file given the prefix.
221 //
222 AsciiTraceHelper asciiTraceHelper;
223
224 std::string filename;
225 if (explicitFilename)
226 {
227 filename = prefix;
228 }
229 else
230 {
231 filename = asciiTraceHelper.GetFilenameFromDevice(prefix, device);
232 }
233
234 Ptr<OutputStreamWrapper> theStream = asciiTraceHelper.CreateFileStream(filename);
235 //
236 // We could go poking through the phy and the state looking for the
237 // correct trace source, but we can let Config deal with that with
238 // some search cost. Since this is presumably happening at topology
239 // creation time, it doesn't seem much of a price to pay.
240 //
241 oss.str("");
242 oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid
243 << "/$ns3::WaveNetDevice/PhyEntities/*/$ns3::WifiPhy/State/RxOk";
245 oss.str(),
247
248 oss.str("");
249 oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid
250 << "/$ns3::WaveNetDevice/PhyEntities/*/$ns3::WifiPhy/State/Tx";
252 oss.str(),
254
255 return;
256 }
257
258 //
259 // If we are provided an OutputStreamWrapper, we are expected to use it, and
260 // to provide a context. We are free to come up with our own context if we
261 // want, and use the AsciiTraceHelper Hook*WithContext functions, but for
262 // compatibility and simplicity, we just use Config::Connect and let it deal
263 // with coming up with a context.
264 //
265 oss.str("");
266 oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid
267 << "/$ns3::WaveNetDevice/PhyEntities/*/$ns3::WifiPhy/RxOk";
269
270 oss.str("");
271 oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid
272 << "/$ns3::WaveNetDevice/PhyEntities/*/$ns3::WifiPhy/State/Tx";
274}
275
276/********************************** WaveHelper ******************************************/
278{
279}
280
282{
283}
284
287{
288 WaveHelper helper;
289 // default 7 MAC entities and single PHY device.
291 helper.CreatePhys(1);
292 helper.SetChannelScheduler("ns3::DefaultChannelScheduler");
293 helper.SetRemoteStationManager("ns3::ConstantRateWifiManager",
294 "DataMode",
295 StringValue("OfdmRate6MbpsBW10MHz"),
296 "ControlMode",
297 StringValue("OfdmRate6MbpsBW10MHz"),
298 "NonUnicastMode",
299 StringValue("OfdmRate6MbpsBW10MHz"));
300 return helper;
301}
302
303void
304WaveHelper::CreateMacForChannel(std::vector<uint32_t> channelNumbers)
305{
306 if (channelNumbers.size() == 0)
307 {
308 NS_FATAL_ERROR("the WAVE MAC entities is at least one");
309 }
310 for (std::vector<uint32_t>::iterator i = channelNumbers.begin(); i != channelNumbers.end(); ++i)
311 {
313 {
314 NS_FATAL_ERROR("the channel number " << (*i) << " is not a valid WAVE channel number");
315 }
316 }
317 m_macsForChannelNumber = channelNumbers;
318}
319
320void
322{
323 if (phys == 0)
324 {
325 NS_FATAL_ERROR("the WAVE PHY entities is at least one");
326 }
328 {
329 NS_FATAL_ERROR("the number of assigned WAVE PHY entities is more than the number of valid "
330 "WAVE channels");
331 }
332 m_physNumber = phys;
333}
334
337 const WifiMacHelper& macHelper,
338 NodeContainer c) const
339{
340 try
341 {
342 const QosWaveMacHelper& qosMac [[maybe_unused]] =
343 dynamic_cast<const QosWaveMacHelper&>(macHelper);
344 }
345 catch (const std::bad_cast&)
346 {
347 NS_FATAL_ERROR("WifiMacHelper should be the class or subclass of QosWaveMacHelper");
348 }
349
351 for (NodeContainer::Iterator i = c.Begin(); i != c.End(); ++i)
352 {
353 Ptr<Node> node = *i;
354 Ptr<WaveNetDevice> device = CreateObject<WaveNetDevice>();
355
356 device->SetChannelManager(CreateObject<ChannelManager>());
357 device->SetChannelCoordinator(CreateObject<ChannelCoordinator>());
358 device->SetVsaManager(CreateObject<VsaManager>());
360
361 for (uint32_t j = 0; j != m_physNumber; ++j)
362 {
363 std::vector<Ptr<WifiPhy>> phys = phyHelper.Create(node, device);
364 NS_ABORT_IF(phys.size() != 1);
365 phys[0]->ConfigureStandard(WIFI_STANDARD_80211p);
366 phys[0]->SetOperatingChannel(
368 device->AddPhy(phys[0]);
369 }
370
371 for (std::vector<uint32_t>::const_iterator k = m_macsForChannelNumber.begin();
372 k != m_macsForChannelNumber.end();
373 ++k)
374 {
375 Ptr<WifiMac> wifiMac = macHelper.Create(device, WIFI_STANDARD_80211p);
376 Ptr<OcbWifiMac> ocbMac = DynamicCast<OcbWifiMac>(wifiMac);
379 ocbMac->EnableForWave(device);
380 device->AddMac(*k, ocbMac);
381 }
382
384
385 node->AddDevice(device);
386 devices.Add(device);
387 }
388 return devices;
389}
390
393{
394 return Install(phy, mac, NodeContainer(node));
395}
396
398WaveHelper::Install(const WifiPhyHelper& phy, const WifiMacHelper& mac, std::string nodeName) const
399{
400 Ptr<Node> node = Names::Find<Node>(nodeName);
401 return Install(phy, mac, NodeContainer(node));
402}
403
404void
406{
408
409 LogComponentEnable("WaveNetDevice", LOG_LEVEL_ALL);
410 LogComponentEnable("ChannelCoordinator", LOG_LEVEL_ALL);
411 LogComponentEnable("ChannelManager", LOG_LEVEL_ALL);
412 LogComponentEnable("ChannelScheduler", LOG_LEVEL_ALL);
413 LogComponentEnable("DefaultChannelScheduler", LOG_LEVEL_ALL);
414 LogComponentEnable("VsaManager", LOG_LEVEL_ALL);
415 LogComponentEnable("OcbWifiMac", LOG_LEVEL_ALL);
416 LogComponentEnable("VendorSpecificAction", LOG_LEVEL_ALL);
417 LogComponentEnable("WaveFrameExchangeManager", LOG_LEVEL_ALL);
418 LogComponentEnable("HigherLayerTxVectorTag", LOG_LEVEL_ALL);
419}
420
421int64_t
423{
424 int64_t currentStream = stream;
425 Ptr<NetDevice> netDevice;
426 for (NetDeviceContainer::Iterator i = c.Begin(); i != c.End(); ++i)
427 {
428 netDevice = (*i);
429 Ptr<WaveNetDevice> wave = DynamicCast<WaveNetDevice>(netDevice);
430 if (wave)
431 {
432 // Handle any random numbers in the PHY objects.
433 std::vector<Ptr<WifiPhy>> phys = wave->GetPhys();
434 for (std::vector<Ptr<WifiPhy>>::iterator j = phys.begin(); j != phys.end(); ++j)
435 {
436 currentStream += (*j)->AssignStreams(currentStream);
437 }
438
439 // Handle any random numbers in the MAC objects.
440 std::map<uint32_t, Ptr<OcbWifiMac>> macs = wave->GetMacs();
441 for (std::map<uint32_t, Ptr<OcbWifiMac>>::iterator k = macs.begin(); k != macs.end();
442 ++k)
443 {
444 // Handle any random numbers in the station managers.
445 Ptr<WifiRemoteStationManager> manager = k->second->GetWifiRemoteStationManager();
446 Ptr<MinstrelWifiManager> minstrel = DynamicCast<MinstrelWifiManager>(manager);
447 if (minstrel)
448 {
449 currentStream += minstrel->AssignStreams(currentStream);
450 }
451
452 PointerValue ptr;
453 k->second->GetAttribute("Txop", ptr);
454 Ptr<Txop> txop = ptr.Get<Txop>();
455 currentStream += txop->AssignStreams(currentStream);
456
457 k->second->GetAttribute("VO_Txop", ptr);
458 Ptr<QosTxop> vo_txop = ptr.Get<QosTxop>();
459 currentStream += vo_txop->AssignStreams(currentStream);
460
461 k->second->GetAttribute("VI_Txop", ptr);
462 Ptr<QosTxop> vi_txop = ptr.Get<QosTxop>();
463 currentStream += vi_txop->AssignStreams(currentStream);
464
465 k->second->GetAttribute("BE_Txop", ptr);
466 Ptr<QosTxop> be_txop = ptr.Get<QosTxop>();
467 currentStream += be_txop->AssignStreams(currentStream);
468
469 k->second->GetAttribute("BK_Txop", ptr);
470 Ptr<QosTxop> bk_txop = ptr.Get<QosTxop>();
471 currentStream += bk_txop->AssignStreams(currentStream);
472 }
473 }
474 }
475 return (currentStream - stream);
476}
477} // namespace ns3
Manage ASCII trace files for device models.
Definition: trace-helper.h:173
std::string GetFilenameFromDevice(std::string prefix, Ptr< NetDevice > device, bool useObjectNames=true)
Let the ascii trace helper figure out a reasonable filename to use for an ascii trace file associated...
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.
static std::vector< uint32_t > GetWaveChannels()
static uint32_t GetNumberOfWaveChannels()
static uint32_t GetCch()
static bool IsWaveChannel(uint32_t channelNumber)
This class will assign channel access for requests from higher layers.
static Mac48Address Allocate()
Allocate a new Mac48Address.
holds a vector of ns3::NetDevice pointers
std::vector< Ptr< NetDevice > >::const_iterator Iterator
NetDevice container iterator.
Iterator Begin() const
Get an iterator which refers to the first NetDevice in the container.
Iterator End() const
Get an iterator which indicates past-the-last NetDevice in the container.
keep track of a set of node pointers.
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
Iterator End() const
Get an iterator which indicates past-the-last Node in the container.
Iterator Begin() const
Get an iterator which refers to the first Node in the container.
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
Definition: node.cc:138
Ptr< Object > Create() const
Create an Object instance of the configured TypeId.
void EnableForWave(Ptr< WaveNetDevice > device)
std::ostream * GetStream()
Return a pointer to an ostream previously set in the wrapper.
static void EnablePrinting()
Enable printing packets metadata.
Definition: packet.cc:596
Manage pcap files for device models.
Definition: trace-helper.h:39
std::string GetFilenameFromDevice(std::string prefix, Ptr< NetDevice > device, bool useObjectNames=true)
Let the pcap helper figure out a reasonable filename to use for a pcap file associated with a device.
Definition: trace-helper.cc:79
Ptr< PcapFileWrapper > CreateFile(std::string filename, std::ios::openmode filemode, DataLinkType dataLinkType, uint32_t snapLen=std::numeric_limits< uint32_t >::max(), int32_t tzCorrection=0)
Create and initialize a pcap file.
Definition: trace-helper.cc:49
Hold objects of type Ptr<T>.
Definition: pointer.h:37
Ptr< T > Get() const
Definition: pointer.h:205
Handle packet fragmentation and retransmissions for QoS data frames as well as MSDU aggregation (A-MS...
Definition: qos-txop.h:73
Qos Wave Mac Helper class.
static Time Now()
Return the current simulation virtual time.
Definition: simulator.cc:199
Hold variables of type string.
Definition: string.h:42
double GetSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:402
Handle packet fragmentation and retransmissions for data and management frames.
Definition: txop.h:71
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
Definition: txop.cc:536
helps to create WaveNetDevice objects
Definition: wave-helper.h:116
int64_t AssignStreams(NetDeviceContainer c, int64_t stream)
Assign a fixed random variable stream number to the random variables used by the Phy and Mac aspects ...
Definition: wave-helper.cc:422
virtual ~WaveHelper()
Definition: wave-helper.cc:281
std::vector< uint32_t > m_macsForChannelNumber
MACs for channel number.
Definition: wave-helper.h:214
virtual NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer c) const
Definition: wave-helper.cc:336
static void EnableLogComponents()
Helper to enable all WaveNetDevice log components with one statement.
Definition: wave-helper.cc:405
uint32_t m_physNumber
Phy number.
Definition: wave-helper.h:215
void CreateMacForChannel(std::vector< uint32_t > channelNumbers)
Definition: wave-helper.cc:304
void SetChannelScheduler(std::string type, Ts &&... args)
Definition: wave-helper.h:231
void SetRemoteStationManager(std::string type, Ts &&... args)
Definition: wave-helper.h:224
ObjectFactory m_channelScheduler
channel scheduler
Definition: wave-helper.h:213
ObjectFactory m_stationManager
station manager
Definition: wave-helper.h:212
void CreatePhys(uint32_t phys)
Definition: wave-helper.cc:321
static WaveHelper Default()
Definition: wave-helper.cc:286
This class holds together multiple, ns3::WifiPhy, and ns3::OcbWifiMac (including ns3::WifiRemoteStati...
void AddPhy(Ptr< WifiPhy > phy)
void SetChannelCoordinator(Ptr< ChannelCoordinator > channelCoordinator)
void AddMac(uint32_t channelNumber, Ptr< OcbWifiMac > mac)
void SetAddress(Address address) override
Set the address of this interface.
void SetChannelScheduler(Ptr< ChannelScheduler > channelScheduler)
void SetVsaManager(Ptr< VsaManager > vsaManager)
const std::vector< Ptr< WifiPhy > > & GetPhys() const override
std::map< uint32_t, Ptr< OcbWifiMac > > GetMacs() const
void SetChannelManager(Ptr< ChannelManager > channelManager)
static void EnableLogComponents()
Helper to enable all WifiNetDevice log components with one statement.
Definition: wifi-helper.cc:870
create MAC layers for a ns3::WifiNetDevice.
virtual Ptr< WifiMac > Create(Ptr< WifiNetDevice > device, WifiStandard standard) const
void SetWifiRemoteStationManager(Ptr< WifiRemoteStationManager > stationManager)
Definition: wifi-mac.cc:847
represent a single transmission mode
Definition: wifi-mode.h:50
create PHY objects
Definition: wifi-helper.h:50
void SetErrorRateModel(std::string type, Args &&... args)
Helper function used to set the error rate model.
Definition: wifi-helper.h:536
PcapHelper::DataLinkType GetPcapDataLinkType() const
Get the data link type of PCAP traces to be used.
Definition: wifi-helper.cc:562
static void PcapSniffRxEvent(Ptr< PcapFileWrapper > file, Ptr< const Packet > packet, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu, SignalNoiseDbm signalNoise, uint16_t staId=SU_STA_ID)
Definition: wifi-helper.cc:218
static void PcapSniffTxEvent(Ptr< PcapFileWrapper > file, Ptr< const Packet > packet, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu, uint16_t staId=SU_STA_ID)
Definition: wifi-helper.cc:187
virtual std::vector< Ptr< WifiPhy > > Create(Ptr< Node > node, Ptr< WifiNetDevice > device) const =0
std::tuple< uint8_t, uint16_t, int, uint8_t > ChannelTuple
Tuple identifying an operating channel.
Definition: wifi-phy.h:869
hold a list of per-remote-station state.
To trace WaveNetDevice, we have to overwrite the trace functions of class YansWifiPhyHelper.
Definition: wave-helper.h:42
void EnablePcapInternal(std::string prefix, Ptr< NetDevice > nd, bool promiscuous, bool explicitFilename) override
Enable pcap output the indicated net device.
Definition: wave-helper.cc:130
void EnableAsciiInternal(Ptr< OutputStreamWrapper > stream, std::string prefix, Ptr< NetDevice > nd, bool explicitFilename) override
Enable ascii trace output on the indicated net device.
Definition: wave-helper.cc:181
static YansWavePhyHelper Default()
Create a phy helper in a default working state.
Definition: wave-helper.cc:122
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:975
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
Definition: config.cc:951
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:160
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition: abort.h:108
#define NS_ABORT_IF(cond)
Abnormal program termination if a condition is true.
Definition: abort.h:76
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:275
auto MakeBoundCallback(R(*fnPtr)(Args...), BArgs... bargs)
Make Callbacks with varying number of bound arguments.
Definition: callback.h:752
WifiPreamble
The type of preamble to be used by an IEEE 802.11 transmission.
@ WIFI_STANDARD_80211p
@ WIFI_PHY_BAND_5GHZ
The 5 GHz band.
Definition: wifi-phy-band.h:37
devices
Definition: first.py:35
Every class exported by the ns3 library is enclosed in the ns3 namespace.
static void AsciiPhyReceiveSinkWithContext(Ptr< OutputStreamWrapper > stream, std::string context, Ptr< const Packet > p, double snr, WifiMode mode, enum WifiPreamble preamble)
ASCII Phy receive sink with context.
Definition: wave-helper.cc:89
static void AsciiPhyReceiveSinkWithoutContext(Ptr< OutputStreamWrapper > stream, Ptr< const Packet > p, double snr, WifiMode mode, enum WifiPreamble preamble)
ASCII Phy receive sink without context.
Definition: wave-helper.cc:110
@ LOG_LEVEL_ALL
Print everything.
Definition: log.h:116
static void AsciiPhyTransmitSinkWithContext(Ptr< OutputStreamWrapper > stream, std::string context, Ptr< const Packet > p, WifiMode mode, WifiPreamble preamble, uint8_t txLevel)
ASCII Phy transmit sink with context.
Definition: wave-helper.cc:48
void LogComponentEnable(const char *name, enum LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:358
static void AsciiPhyTransmitSinkWithoutContext(Ptr< OutputStreamWrapper > stream, Ptr< const Packet > p, WifiMode mode, WifiPreamble preamble, uint8_t txLevel)
ASCII Phy transmit sink without context.
Definition: wave-helper.cc:69
mac
Definition: third.py:85
phy
Definition: third.py:82