29#include "ns3/ampdu-subframe-header.h"
30#include "ns3/application-container.h"
31#include "ns3/boolean.h"
32#include "ns3/command-line.h"
33#include "ns3/config.h"
34#include "ns3/double.h"
35#include "ns3/gnuplot.h"
36#include "ns3/integer.h"
38#include "ns3/mobility-helper.h"
39#include "ns3/node-list.h"
40#include "ns3/packet-socket-client.h"
41#include "ns3/packet-socket-helper.h"
42#include "ns3/packet-socket-server.h"
43#include "ns3/propagation-delay-model.h"
44#include "ns3/propagation-loss-model.h"
45#include "ns3/queue-size.h"
46#include "ns3/rng-seed-manager.h"
48#include "ns3/string.h"
49#include "ns3/uinteger.h"
50#include "ns3/wifi-mac-header.h"
51#include "ns3/wifi-mac.h"
52#include "ns3/wifi-net-device.h"
53#include "ns3/yans-wifi-helper.h"
58#define PI 3.1415926535
74std::map<Mac48Address, uint64_t>
76std::map<Mac48Address, uint64_t>
78std::map<Mac48Address, uint64_t>
82std::map<Mac48Address, uint64_t>
87std::map<Mac48Address, uint64_t>
90std::map<Mac48Address, uint64_t>
93std::map<Mac48Address, uint64_t>
96std::map<Mac48Address, uint64_t>
100std::map<Mac48Address, Time>
103std::map<Mac48Address, Time>
119std::map<std::string ,
120 std::map<
unsigned int ,
double >>
307 {
"ErpOfdmRate12Mbps",
320 {
"ErpOfdmRate18Mbps",
333 {
"ErpOfdmRate24Mbps",
346 {
"ErpOfdmRate36Mbps",
359 {
"ErpOfdmRate48Mbps",
372 {
"ErpOfdmRate54Mbps",
1013std::map<std::string ,
1014 std::map<
unsigned int ,
double >>
1175 {
"ErpOfdmRate6Mbps",
1188 {
"ErpOfdmRate9Mbps",
1201 {
"ErpOfdmRate12Mbps",
1214 {
"ErpOfdmRate18Mbps",
1227 {
"ErpOfdmRate24Mbps",
1240 {
"ErpOfdmRate36Mbps",
1253 {
"ErpOfdmRate48Mbps",
1266 {
"ErpOfdmRate54Mbps",
1915 std::string sub = context.substr(10);
1916 uint32_t pos = sub.find(
"/Device");
1917 return std::stoi(sub.substr(0, pos));
1929 std::string sub = context.substr(10);
1930 uint32_t pos = sub.find(
"/Device");
1931 uint32_t nodeId = std::stoi(sub.substr(0, pos));
1932 Ptr<Node> n = NodeList::GetNode(nodeId);
1942 return Mac48Address::ConvertFrom(d->
GetAddress());
1957 uint64_t increment = 1)
1959 auto it = counter.find(addr);
1960 if (it != counter.end())
1962 it->second += increment;
1966 counter.insert(std::make_pair(addr, increment));
1984 uint16_t channelFreqMhz,
2056 <<
" val=" << newVal);
2060 << newVal << std::endl;
2090 <<
" psduDuration=" << psduDuration);
2104 <<
" size=" << p->
GetSize() <<
" reason=" << reason);
2160 NS_FATAL_ERROR(
"All devices should send with same power, so no packet switch during "
2161 "preamble detection should occur!");
2208 <<
" nMPDUs=" << +nMpdus <<
" snr=" << snr <<
" mode=" << mode
2209 <<
" preamble=" << preamble);
2214 NS_FATAL_ERROR(
"A-MPDU settings not properly applied: maximum configured MPDUs is "
2215 << +
maxMpdus <<
" but received an A-MPDU containing " << +nMpdus
2218 NS_LOG_WARN(
"Warning: less MPDUs aggregated in a received A-MPDU ("
2219 << +nMpdus <<
") than configured (" << +
maxMpdus <<
")");
2239 <<
" size=" << p->
GetSize() <<
" snr=" << snr);
2258 <<
" size=" << p->
GetSize() <<
" " << txPowerW);
2262 <<
" size=" << p->
GetSize() <<
" " << txPowerW << std::endl;
2329 <<
" " << p->
GetSize() <<
" " << addr << std::endl;
2425 uint16_t guardIntervalNs,
2427 double apTxPowerDbm,
2428 double staTxPowerDbm,
2446 uint16_t guardIntervalNs,
2448 double apTxPowerDbm,
2449 double staTxPowerDbm,
2452 RngSeedManager::SetSeed(10);
2453 RngSeedManager::SetRun(10);
2458 wifiNodes.
Create(networkSize + 1);
2462 wifiNodes.
Create(networkSize);
2466 phy.SetErrorRateModel(
"ns3::NistErrorRateModel");
2468 phy.SetPcapDataLinkType(WifiPhyHelper::DLT_IEEE802_11_RADIO);
2477 uint64_t beaconInterval = std::min<uint64_t>(
2478 (ceil((duration.
GetSeconds() * 1000000) / 1024) * 1024),
2480 mac.SetType(
"ns3::ApWifiMac",
2489 mac.SetType(
"ns3::StaWifiMac",
2496 for (
uint32_t i = 1; i < nNodes; ++i)
2503 mac.SetType(
"ns3::AdhocWifiMac");
2512 "/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported",
2514 Config::Set(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HeConfiguration/GuardInterval",
2518 for (
uint32_t i = 0; i < nNodes; ++i)
2522 wifi_dev->
GetMac()->SetAttribute(
"BE_MaxAmpduSize",
2524 wifi_dev->
GetMac()->SetAttribute(
"BK_MaxAmpduSize",
2526 wifi_dev->
GetMac()->SetAttribute(
"VO_MaxAmpduSize",
2528 wifi_dev->
GetMac()->SetAttribute(
"VI_MaxAmpduSize",
2534 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
2536 positionAlloc->Add(Vector(1.0, 1.0, 0.0));
2539 double angle = (
static_cast<double>(360) / (nNodes - 1));
2540 for (
uint32_t i = 0; i < (nNodes - 1); ++i)
2542 positionAlloc->Add(Vector(1.0 + (distance * cos((i * angle *
PI) / 180)),
2543 1.0 + (distance * sin((i * angle *
PI) / 180)),
2547 mobility.SetPositionAllocator(positionAlloc);
2551 packetSocket.
Install(wifiNodes);
2559 for (; i < nNodes; ++i)
2561 uint32_t j = infra ? 0 : (i + 1) % nNodes;
2568 client->SetRemote(socketAddr);
2572 client->SetAttribute(
"Interval",
TimeValue(pktInterval));
2578 server->SetLocal(socketAddr);
2584 "/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/MonitorSnifferRx",
2590 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::StaWifiMac/Assoc",
2592 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::StaWifiMac/DeAssoc",
2597 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::WifiMac/Txop/CwTrace",
2601 "/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::WifiMac/Txop/BackoffTrace",
2604 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyTxBegin",
2607 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyTxEnd",
2610 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyRxBegin",
2614 "/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyRxPayloadBegin",
2617 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyRxDrop",
2620 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyRxEnd",
2623 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/State/RxError",
2626 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/State/RxOk",
2629 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/MacTx",
2632 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/MacRx",
2635 Config::Connect(
"/NodeList/*/$ns3::Node/ApplicationList/*/$ns3::PacketSocketClient/Tx",
2639 Simulator::Stop(
Seconds(10) + duration);
2643 phy.EnablePcap(
"wifi_bianchi_pcap",
devices);
2647 Simulator::Destroy();
2673 auto it = counter.find(addr);
2674 if (it != counter.end())
2682main(
int argc,
char* argv[])
2688 double duration = 100;
2693 std::string workDir =
"./";
2694 std::string phyMode =
2696 std::string standard(
"11a");
2697 bool validate =
false;
2699 uint16_t plotBianchiModel =
2701 double maxRelativeError =
2704 double frequency = 5;
2705 uint16_t channelWidth = 20;
2706 uint16_t guardIntervalNs = 800;
2708 uint16_t pktInterval =
2711 double distance = 0.001;
2712 double apTxPower = 16;
2713 double staTxPower = 16;
2727 "ns3::WifiMacQueue::MaxSize",
2732 cmd.AddValue(
"verbose",
2733 "Logging level (0: no log - 1: simulation script logs - 2: all logs)",
2735 cmd.AddValue(
"tracing",
"Generate trace files",
tracing);
2736 cmd.AddValue(
"pktSize",
"The packet size in bytes",
pktSize);
2737 cmd.AddValue(
"trials",
"The maximal number of runs per network size", trials);
2738 cmd.AddValue(
"duration",
"Time duration for each trial in seconds", duration);
2739 cmd.AddValue(
"pcap",
"Enable/disable PCAP tracing", pcap);
2740 cmd.AddValue(
"infra",
"True to use infrastructure mode, false to use ring adhoc mode", infra);
2741 cmd.AddValue(
"workDir",
"The working directory used to store generated files", workDir);
2742 cmd.AddValue(
"phyMode",
"Set the constant PHY mode string used to transmit frames", phyMode);
2743 cmd.AddValue(
"standard",
"Set the standard (11a, 11b, 11g, 11n, 11ac, 11ax)", standard);
2744 cmd.AddValue(
"nMinStas",
"Minimum number of stations to start with", nMinStas);
2745 cmd.AddValue(
"nMaxStas",
"Maximum number of stations to start with", nMaxStas);
2746 cmd.AddValue(
"nStepSize",
"Number of stations to add at each step", nStepSize);
2747 cmd.AddValue(
"plotBianchiModel",
2748 "First bit corresponds to the DIFS model, second bit to the EIFS model",
2750 cmd.AddValue(
"validate",
2751 "Enable/disable validation of the ns-3 simulations against the Bianchi model",
2753 cmd.AddValue(
"maxRelativeError",
2754 "The maximum relative error tolerated between ns-3 results and the Bianchi model "
2755 "(used for regression, i.e. when the validate flag is set)",
2757 cmd.AddValue(
"frequency",
"Set the operating frequency band in GHz: 2.4, 5 or 6", frequency);
2758 cmd.AddValue(
"channelWidth",
2759 "Set the constant channel width in MHz (only for 11n/ac/ax)",
2761 cmd.AddValue(
"guardIntervalNs",
2762 "Set the the guard interval in nanoseconds (800 or 400 for 11n/ac, 800 or 1600 or "
2765 cmd.AddValue(
"maxMpdus",
2766 "Set the maximum number of MPDUs in A-MPDUs (0 to disable MPDU aggregation)",
2768 cmd.AddValue(
"distance",
"Set the distance in meters between the AP and the STAs", distance);
2769 cmd.AddValue(
"apTxPower",
2770 "Set the transmit power of the AP in dBm (if infrastructure only)",
2772 cmd.AddValue(
"staTxPower",
2773 "Set the transmit power of each STA in dBm (or all STAs if adhoc)",
2775 cmd.AddValue(
"pktInterval",
"Set the socket packet interval in microseconds", pktInterval);
2776 cmd.Parse(argc, argv);
2788 NS_FATAL_ERROR(
"Failed to open file wifi-bianchi-backoff-trace.out");
2793 NS_FATAL_ERROR(
"Failed to open file wifi-bianchi-phy-tx-trace.out");
2798 NS_FATAL_ERROR(
"Failed to open file wifi-bianchi-mac-tx-trace.out");
2803 NS_FATAL_ERROR(
"Failed to open file wifi-bianchi-mac-rx-trace.out");
2808 NS_FATAL_ERROR(
"Failed to open file wifi-bianchi-socket-send-trace.out");
2822 WifiHelper::EnableLogComponents();
2825 std::stringstream phyModeStr;
2826 phyModeStr << phyMode;
2827 if (phyMode.find(
"Mcs") != std::string::npos)
2829 phyModeStr <<
"_" << channelWidth <<
"MHz";
2832 std::stringstream ss;
2833 ss <<
"wifi-" << standard <<
"-p-" <<
pktSize << (infra ?
"-infrastructure" :
"-adhoc") <<
"-r-"
2834 << phyModeStr.str() <<
"-min-" << nMinStas <<
"-max-" << nMaxStas <<
"-step-" << nStepSize
2835 <<
"-throughput.plt";
2836 std::ofstream throughputPlot(ss.str());
2838 ss <<
"wifi-" << standard <<
"-p-" <<
pktSize << (infra ?
"-infrastructure" :
"-adhoc") <<
"-r-"
2839 << phyModeStr.str() <<
"-min-" << nMinStas <<
"-max-" << nMaxStas <<
"-step-" << nStepSize
2840 <<
"-throughput.eps";
2844 if (standard ==
"11a")
2850 else if (standard ==
"11b")
2856 else if (standard ==
"11g")
2862 else if (standard ==
"11n")
2864 if (frequency == 2.4)
2868 else if (frequency == 5)
2874 NS_FATAL_ERROR(
"Unsupported frequency band " << frequency <<
" GHz for standard "
2878 else if (standard ==
"11ac")
2883 else if (standard ==
"11ax")
2885 if (frequency == 2.4)
2889 else if (frequency == 5)
2893 else if (frequency == 6)
2899 NS_FATAL_ERROR(
"Unsupported frequency band " << frequency <<
" GHz for standard "
2908 std::string channelStr =
"{0, " + std::to_string(channelWidth) +
", BAND_" +
2909 (frequency == 2.4 ?
"2_4" : (frequency == 5 ?
"5" :
"6")) +
"GHZ, 0}";
2923 "ReferenceDistance",
2928 else if (frequency == 5)
2934 "ReferenceDistance",
2945 "ReferenceDistance",
2952 wifi.SetStandard(wifiStandard);
2953 wifi.SetRemoteStationManager(
"ns3::ConstantRateWifiManager",
2963 dataset.
SetStyle(Gnuplot2dDataset::LINES_POINTS);
2964 datasetBianchiEifs.
SetStyle(Gnuplot2dDataset::LINES_POINTS);
2965 datasetBianchiDifs.
SetStyle(Gnuplot2dDataset::LINES_POINTS);
2969 double averageThroughput;
2970 double throughputArray[trials];
2971 for (
uint32_t n = nMinStas; n <= nMaxStas; n += nStepSize)
2973 averageThroughput = 0;
2975 for (
uint32_t runIndex = 0; runIndex < trials; runIndex++)
2991 std::cout <<
"Trial " << runIndex + 1 <<
" of " << trials <<
"; " << phyModeStr.str()
2992 <<
" for " << n <<
" nodes " << std::endl;
2995 cwTraceFile <<
"# Trial " << runIndex + 1 <<
" of " << trials <<
"; "
2996 << phyModeStr.str() <<
" for " << n <<
" nodes" << std::endl;
2998 << phyModeStr.str() <<
" for " << n <<
" nodes" << std::endl;
2999 phyTxTraceFile <<
"# Trial " << runIndex + 1 <<
" of " << trials <<
"; "
3000 << phyModeStr.str() <<
" for " << n <<
" nodes" << std::endl;
3001 macTxTraceFile <<
"# Trial " << runIndex + 1 <<
" of " << trials <<
"; "
3002 << phyModeStr.str() <<
" for " << n <<
" nodes" << std::endl;
3003 macRxTraceFile <<
"# Trial " << runIndex + 1 <<
" of " << trials <<
"; "
3004 << phyModeStr.str() <<
" for " << n <<
" nodes" << std::endl;
3006 << phyModeStr.str() <<
" for " << n <<
" nodes" << std::endl;
3031 Time dataTransferDuration = last -
first;
3032 double nodeThroughput =
3033 (it->second * 8 /
static_cast<double>(dataTransferDuration.
GetMicroSeconds()));
3034 throughput += nodeThroughput;
3040 uint64_t nodeRxEventWhileDecodingPreamble =
3045 uint64_t nodeRxEvents = nodePhyHeaderFailures + nodePsduFailures + nodePsduSuccess +
3046 nodeRxEventWhileDecodingPreamble + nodeRxEventWhileRxing +
3047 nodeRxEventWhileTxing + nodeRxEventAbortedByTx;
3048 std::cout <<
"Node " << it->first <<
": TX packets " << nodeTxPackets
3049 <<
"; RX packets " << nodeRxPackets <<
"; PHY header failures "
3050 << nodePhyHeaderFailures <<
"; PSDU failures " << nodePsduFailures
3051 <<
"; PSDU success " << nodePsduSuccess
3052 <<
"; RX events while decoding preamble "
3053 << nodeRxEventWhileDecodingPreamble <<
"; RX events while RXing "
3054 << nodeRxEventWhileRxing <<
"; RX events while TXing "
3055 << nodeRxEventWhileTxing <<
"; RX events aborted by TX "
3056 << nodeRxEventAbortedByTx <<
"; total RX events " << nodeRxEvents
3057 <<
"; total events " << nodeTxPackets + nodeRxEvents <<
"; time first RX "
3058 <<
first <<
"; time last RX " << last <<
"; dataTransferDuration "
3059 << dataTransferDuration <<
"; throughput " << nodeThroughput <<
" Mbps"
3062 std::cout <<
"Total throughput: " << throughput <<
" Mbps" << std::endl;
3063 averageThroughput += throughput;
3064 throughputArray[runIndex] = throughput;
3066 averageThroughput = averageThroughput / trials;
3068 bool rateFound =
false;
3069 double relativeErrorDifs = 0;
3070 double relativeErrorEifs = 0;
3075 auto it = itDifs->second.find(n);
3076 if (it != itDifs->second.end())
3078 relativeErrorDifs = (std::abs(averageThroughput - it->second) / it->second);
3079 std::cout <<
"Relative error (DIFS): " << 100 * relativeErrorDifs <<
"%"
3084 NS_FATAL_ERROR(
"No Bianchi results (DIFS) calculated for that number of stations!");
3091 auto it = itEifs->second.find(n);
3092 if (it != itEifs->second.end())
3094 relativeErrorEifs = (std::abs(averageThroughput - it->second) / it->second);
3095 std::cout <<
"Relative error (EIFS): " << 100 * relativeErrorEifs <<
"%"
3100 NS_FATAL_ERROR(
"No Bianchi results (EIFS) calculated for that number of stations!");
3103 if (!rateFound && validate)
3107 double relativeError =
std::min(relativeErrorDifs, relativeErrorEifs);
3108 if (validate && (relativeError > maxRelativeError))
3114 for (
uint32_t i = 0; i < trials; ++i)
3116 stDev += pow(throughputArray[i] - averageThroughput, 2);
3118 stDev = sqrt(stDev / (trials - 1));
3119 dataset.
Add(n, averageThroughput, stDev);
3126 for (
uint32_t i = nMinStas; i <= nMaxStas; i += nStepSize)
3129 auto it = itDifs->second.find(i);
3130 if (it != itDifs->second.end())
3139 for (
uint32_t i = nMinStas; i <= nMaxStas; i += nStepSize)
3141 datasetBianchiDifs.
Add(i, 0.0);
3148 for (
uint32_t i = nMinStas; i <= nMaxStas; i += nStepSize)
3151 auto it = itEifs->second.find(i);
3152 if (it != itEifs->second.end())
3161 for (
uint32_t i = nMinStas; i <= nMaxStas; i += nStepSize)
3163 datasetBianchiEifs.
Add(i, 0.0);
3167 datasetBianchiEifs.
SetTitle(
"Bianchi (EIFS - lower bound)");
3168 datasetBianchiDifs.
SetTitle(
"Bianchi (DIFS - upper bound)");
3170 gnuplot.
SetTerminal(
"postscript eps color enh \"Times-BoldItalic\"");
3171 gnuplot.
SetLegend(
"Number of competing stations",
"Throughput (Mbps)");
3173 ss <<
"Frame size " <<
pktSize <<
" bytes";
3176 ss <<
"set xrange [" << nMinStas <<
":" << nMaxStas <<
"]\n"
3177 <<
"set xtics " << nStepSize <<
"\n"
3178 <<
"set grid xtics ytics\n"
3180 <<
"set style line 1 linewidth 5\n"
3181 <<
"set style line 2 linewidth 5\n"
3182 <<
"set style line 3 linewidth 5\n"
3183 <<
"set style line 4 linewidth 5\n"
3184 <<
"set style line 5 linewidth 5\n"
3185 <<
"set style line 6 linewidth 5\n"
3186 <<
"set style line 7 linewidth 5\n"
3187 <<
"set style line 8 linewidth 5\n"
3188 <<
"set style increment user";
3190 if (plotBianchiModel & 0x0001)
3192 datasetBianchiDifs.
SetTitle(
"Bianchi");
3195 if (plotBianchiModel & 0x0002)
3197 datasetBianchiEifs.
SetTitle(
"Bianchi");
3200 if (plotBianchiModel == 0x0003)
3202 datasetBianchiEifs.
SetTitle(
"Bianchi (EIFS - lower bound)");
3203 datasetBianchiDifs.
SetTitle(
"Bianchi (DIFS - upper bound)");
3206 throughputPlot.close();
WiFi adhoc experiment class.
Gnuplot2dDataset Run(const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy, const WifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel)
Run an experiment.
a polymophic address class
holds a vector of ns3::Application pointers.
AttributeValue implementation for Boolean.
Parse command-line arguments.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Class to represent a 2D points plot.
void SetErrorBars(enum ErrorBars errorBars)
void SetStyle(enum Style style)
void Add(double x, double y)
void SetTitle(const std::string &title)
Change line title.
a simple class to generate gnuplot-ready plotting commands from a set of datasets.
void AddDataset(const GnuplotDataset &dataset)
void SetLegend(const std::string &xLegend, const std::string &yLegend)
void SetTerminal(const std::string &terminal)
void GenerateOutput(std::ostream &os)
Writes gnuplot commands and data values to a single output stream.
void SetExtra(const std::string &extra)
void SetTitle(const std::string &title)
Hold a signed integer type.
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.
uint32_t GetN() const
Get the number of Ptr<Node> stored in this container.
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.
uint32_t GetNDevices() const
uint32_t AddApplication(Ptr< Application > application)
Associate an Application to this Node.
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
uint32_t GetSize() const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Ptr< Packet > Copy() const
performs a COW copy of the packet.
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
Create a new packet which contains a fragment of the original packet.
an address for a packet socket
void SetProtocol(uint16_t protocol)
Set the protocol.
void SetPhysicalAddress(const Address address)
Set the destination address.
void SetSingleDevice(uint32_t device)
Set the address to match only a specified NetDevice.
Give ns3::PacketSocket powers to ns3::Node.
void Install(Ptr< Node > node) const
Aggregate an instance of a ns3::PacketSocketFactory onto the provided node.
Class for representing queue sizes.
AttributeValue implementation for QueueSize.
The IEEE 802.11 SSID Information Element.
AttributeValue implementation for Ssid.
Hold variables of type string.
Simulation virtual time values and global simulation resolution.
double GetSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
int64_t GetMicroSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
AttributeValue implementation for Time.
Hold an unsigned integer type.
helps to create WifiNetDevice objects
create MAC layers for a ns3::WifiNetDevice.
represent a single transmission mode
Hold together all Wifi-related objects.
Ptr< WifiMac > GetMac() const
Address GetAddress() const override
void DisablePreambleDetectionModel()
Disable the preamble detection model on all links.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
bool IsAggregation() const
Checks whether the PSDU contains A-MPDU.
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 experiment(std::string queue_disc_type)
void SetDefault(std::string name, const AttributeValue &value)
void Connect(std::string path, const CallbackBase &cb)
void Set(std::string path, const AttributeValue &value)
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
@ PACKETS
Use number of packets for queue size.
Time Now()
create an ns3::Time instance which contains the current simulation time.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time Seconds(double value)
Construct a Time in the indicated unit.
WifiStandard
Identifies the IEEE 802.11 specifications that a Wifi device can be configured to use.
WifiPhyRxfailureReason
Enumeration of the possible reception failure reasons.
WifiPreamble
The type of preamble to be used by an IEEE 802.11 transmission.
@ PREAMBLE_DETECT_FAILURE
@ FRAME_CAPTURE_PACKET_SWITCH
@ RECEPTION_ABORTED_BY_TX
@ PREAMBLE_DETECTION_PACKET_SWITCH
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...
std::map< WifiSpectrumBand, double > RxPowerWattPerChannelBand
A map of the received power (Watts) for each band.
@ LOG_LEVEL_ALL
Print everything.
@ LOG_LEVEL_WARN
LOG_WARN and above.
void LogComponentEnable(const char *name, enum LogLevel level)
Enable the logging output associated with that log component.
SignalNoiseDbm structure.
std::map< Mac48Address, uint64_t > rxEventAbortedByTx
Map that stores the number of reception events aborted per STA because the PHY has started to transmi...
void BackoffTrace(std::string context, uint32_t newVal, uint8_t)
Backoff trace.
std::map< Mac48Address, uint64_t > rxEventWhileTxing
Map that stores the number of reception events per STA that occurred while PHY was already transmitti...
void PhyRxErrorTrace(std::string context, Ptr< const Packet > p, double snr)
PHY RX error trace.
std::map< Mac48Address, uint64_t > packetsReceived
Map that stores the total packets received per STA (and addressed to that STA)
std::ofstream backoffTraceFile
File that traces backoff over time.
void RestartCalc()
Reset the stats.
std::map< Mac48Address, uint64_t > bytesReceived
Map that stores the total bytes received per STA (and addressed to that STA)
std::map< Mac48Address, uint64_t > rxEventWhileDecodingPreamble
Map that stores the number of reception events per STA that occurred while PHY was already decoding a...
void AssociationLog(std::string context, Mac48Address address)
Association log trace.
void SocketSendTrace(std::string context, Ptr< const Packet > p, const Address &addr)
Socket send trace.
bool tracing
Flag to enable/disable generation of tracing files.
void CwTrace(std::string context, uint32_t cw, uint8_t)
Contention window trace.
uint32_t ContextToNodeId(std::string context)
Parse context strings of the form "/NodeList/x/DeviceList/x/..." to extract the NodeId integer.
std::map< Mac48Address, uint64_t > rxEventWhileRxing
Map that stores the number of reception events per STA that occurred while PHY was already receiving ...
void TracePacketReception(std::string context, Ptr< const Packet > p, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu, SignalNoiseDbm signalNoise, uint16_t staId)
Trace a packet reception.
void PhyRxDropTrace(std::string context, Ptr< const Packet > p, WifiPhyRxfailureReason reason)
PHY Drop trace.
void PhyTxTrace(std::string context, Ptr< const Packet > p, double txPowerW)
PHY TX trace.
std::map< Mac48Address, uint64_t > psduFailed
Map that stores the total number of unsuccessfully received PSDUS (for which the PHY header was succe...
#define PI
Avoid std::numbers::pi because it's C++20.
std::map< Mac48Address, uint64_t > packetsTransmitted
Map that stores the total packets transmitted per STA.
std::map< std::string, std::map< unsigned int, double > > bianchiResultsDifs
Table of the expected values for DIFS.
std::map< Mac48Address, Time > timeLastReceived
Map that stores the time at which the last packet was received per STA (and the packet is addressed t...
std::map< Mac48Address, Time > timeFirstTransmitted
Map that stores the time at which the first packet was transmitted per STA.
uint8_t maxMpdus
The maximum number of MPDUs in A-MPDUs (0 to disable MPDU aggregation)
void PhyRxDoneTrace(std::string context, Ptr< const Packet > p)
PHY RX end trace.
std::set< uint32_t > associated
Contains the IDs of the STAs that successfully associated to the access point (in infrastructure mode...
std::map< Mac48Address, uint64_t > phyHeaderFailed
Map that stores the total number of unsuccessfully received PHY headers per STA.
void MacTxTrace(std::string context, Ptr< const Packet > p)
MAC TX trace.
std::ofstream socketSendTraceFile
File that traces packets transmitted by the application over time.
uint64_t GetCount(const std::map< Mac48Address, uint64_t > &counter, Mac48Address addr)
Get the Counter associated with a MAC address.
std::ofstream macTxTraceFile
File that traces MAC transmissions over time.
void PhyRxTrace(std::string context, Ptr< const Packet > p, RxPowerWattPerChannelBand power)
PHY Rx trace.
std::ofstream phyTxTraceFile
File that traces PHY transmissions over time.
void IncrementCounter(std::map< Mac48Address, uint64_t > &counter, Mac48Address addr, uint64_t increment=1)
Incremement the counter for a given address.
std::map< Mac48Address, Time > timeFirstReceived
Map that stores the time at which the first packet was received per STA (and the packet is addressed ...
uint32_t pktSize
packet size used for the simulation (in bytes)
std::map< Mac48Address, uint64_t > psduSucceeded
Map that stores the total number of successfully received PSDUs per STA (including PSDUs not addresse...
std::map< Mac48Address, Time > timeLastTransmitted
Map that stores the time at which the last packet was transmitted per STA.
std::map< std::string, std::map< unsigned int, double > > bianchiResultsEifs
Table of the expected values for EIFS.
void MacRxTrace(std::string context, Ptr< const Packet > p)
MAC RX trace.
void PhyTxDoneTrace(std::string context, Ptr< const Packet > p)
PHY TX end trace.
void PhyRxPayloadTrace(std::string context, WifiTxVector txVector, Time psduDuration)
PHY Rx trace.
Mac48Address ContextToMac(std::string context)
Parse context strings of the form "/NodeList/x/DeviceList/x/..." and fetch the Mac address.
void PhyRxOkTrace(std::string context, Ptr< const Packet > p, double snr, WifiMode mode, WifiPreamble preamble)
PHY successful RX trace.
void DisassociationLog(std::string context, Mac48Address address)
Deassociation log trace.
std::ofstream cwTraceFile
File that traces CW over time.
std::ofstream macRxTraceFile
File that traces MAC receptions over time.