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"
59#define PI 3.1415926535
75std::map<Mac48Address, uint64_t>
77std::map<Mac48Address, uint64_t>
79std::map<Mac48Address, uint64_t>
83std::map<Mac48Address, uint64_t>
88std::map<Mac48Address, uint64_t>
91std::map<Mac48Address, uint64_t>
94std::map<Mac48Address, uint64_t>
97std::map<Mac48Address, uint64_t>
101std::map<Mac48Address, Time>
104std::map<Mac48Address, Time>
120std::map<std::string ,
121 std::map<
unsigned int ,
double >>
308 {
"ErpOfdmRate12Mbps",
321 {
"ErpOfdmRate18Mbps",
334 {
"ErpOfdmRate24Mbps",
347 {
"ErpOfdmRate36Mbps",
360 {
"ErpOfdmRate48Mbps",
373 {
"ErpOfdmRate54Mbps",
1014std::map<std::string ,
1015 std::map<
unsigned int ,
double >>
1176 {
"ErpOfdmRate6Mbps",
1189 {
"ErpOfdmRate9Mbps",
1202 {
"ErpOfdmRate12Mbps",
1215 {
"ErpOfdmRate18Mbps",
1228 {
"ErpOfdmRate24Mbps",
1241 {
"ErpOfdmRate36Mbps",
1254 {
"ErpOfdmRate48Mbps",
1267 {
"ErpOfdmRate54Mbps",
1916 std::string sub = context.substr(10);
1917 uint32_t pos = sub.find(
"/Device");
1918 return std::stoi(sub.substr(0, pos));
1930 std::string sub = context.substr(10);
1931 uint32_t pos = sub.find(
"/Device");
1932 uint32_t nodeId = std::stoi(sub.substr(0, pos));
1935 for (
uint32_t i = 0; i < n->GetNDevices(); i++)
1958 uint64_t increment = 1)
1960 auto it = counter.find(addr);
1961 if (it != counter.end())
1963 it->second += increment;
1967 counter.insert(std::make_pair(addr, increment));
1985 uint16_t channelFreqMhz,
1996 packet->RemoveHeader(subHdr);
1998 packet = packet->CreateFragment(0,
static_cast<uint32_t>(extractedLength));
2001 packet->PeekHeader(hdr);
2008 if (packet->GetSize() >=
pktSize)
2057 <<
" val=" << newVal);
2061 << newVal << std::endl;
2076 <<
" size=" << p->GetSize());
2091 <<
" psduDuration=" << psduDuration);
2105 <<
" size=" << p->GetSize() <<
" reason=" << reason);
2161 NS_FATAL_ERROR(
"All devices should send with same power, so no packet switch during "
2162 "preamble detection should occur!");
2189 <<
" size=" << p->GetSize());
2208 uint8_t nMpdus = (p->GetSize() /
pktSize);
2211 <<
" nMPDUs=" << +nMpdus <<
" snr=" << snr <<
" mode=" << mode
2212 <<
" preamble=" << preamble);
2217 NS_FATAL_ERROR(
"A-MPDU settings not properly applied: maximum configured MPDUs is "
2218 << +
maxMpdus <<
" but received an A-MPDU containing " << +nMpdus
2221 NS_LOG_WARN(
"Warning: less MPDUs aggregated in a received A-MPDU ("
2222 << +nMpdus <<
") than configured (" << +
maxMpdus <<
")");
2242 <<
" size=" << p->GetSize() <<
" snr=" << snr);
2261 <<
" size=" << p->GetSize() <<
" " << txPowerW);
2265 <<
" size=" << p->GetSize() <<
" " << txPowerW << std::endl;
2284 <<
" " << p->GetSize());
2299 << p->GetSize() << std::endl;
2315 << p->GetSize() << std::endl;
2332 <<
" " << p->GetSize() <<
" " << addr << std::endl;
2428 uint16_t guardIntervalNs,
2430 double apTxPowerDbm,
2431 double staTxPowerDbm,
2449 uint16_t guardIntervalNs,
2451 double apTxPowerDbm,
2452 double staTxPowerDbm,
2461 wifiNodes.
Create(networkSize + 1);
2465 wifiNodes.
Create(networkSize);
2469 phy.SetErrorRateModel(
"ns3::NistErrorRateModel");
2470 phy.SetChannel(wifiChannel.
Create());
2480 uint64_t beaconInterval = std::min<uint64_t>(
2481 (ceil((duration.
GetSeconds() * 1000000) / 1024) * 1024),
2483 mac.SetType(
"ns3::ApWifiMac",
2488 phy.Set(
"TxPowerStart",
DoubleValue(apTxPowerDbm));
2490 devices = wifi.Install(phy, mac, wifiNodes.
Get(0));
2492 mac.SetType(
"ns3::StaWifiMac",
2497 phy.Set(
"TxPowerStart",
DoubleValue(staTxPowerDbm));
2498 phy.Set(
"TxPowerEnd",
DoubleValue(staTxPowerDbm));
2499 for (
uint32_t i = 1; i < nNodes; ++i)
2501 devices.Add(wifi.Install(phy, mac, wifiNodes.
Get(i)));
2506 mac.SetType(
"ns3::AdhocWifiMac");
2507 phy.Set(
"TxPowerStart",
DoubleValue(staTxPowerDbm));
2508 phy.Set(
"TxPowerEnd",
DoubleValue(staTxPowerDbm));
2509 devices = wifi.Install(phy, mac, wifiNodes);
2512 wifi.AssignStreams(devices, trialNumber);
2515 "/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported",
2517 Config::Set(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HeConfiguration/GuardInterval",
2521 for (
uint32_t i = 0; i < nNodes; ++i)
2525 wifi_dev->GetMac()->SetAttribute(
"BE_MaxAmpduSize",
2527 wifi_dev->GetMac()->SetAttribute(
"BK_MaxAmpduSize",
2529 wifi_dev->GetMac()->SetAttribute(
"VO_MaxAmpduSize",
2531 wifi_dev->GetMac()->SetAttribute(
"VI_MaxAmpduSize",
2537 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
2539 positionAlloc->Add(Vector(1.0, 1.0, 0.0));
2542 double angle = (
static_cast<double>(360) / (nNodes - 1));
2543 for (
uint32_t i = 0; i < (nNodes - 1); ++i)
2545 positionAlloc->Add(Vector(1.0 + (distance * cos((i * angle *
PI) / 180)),
2546 1.0 + (distance * sin((i * angle *
PI) / 180)),
2550 mobility.SetPositionAllocator(positionAlloc);
2551 mobility.Install(wifiNodes);
2554 packetSocket.
Install(wifiNodes);
2558 startTime->SetAttribute(
"Stream",
IntegerValue(trialNumber));
2562 for (; i < nNodes; ++i)
2564 uint32_t j = infra ? 0 : (i + 1) % nNodes;
2571 client->SetRemote(socketAddr);
2575 client->SetAttribute(
"Interval",
TimeValue(pktInterval));
2576 double start = startTime->GetValue();
2577 NS_LOG_DEBUG(
"Client " << i <<
" starting at " << start);
2578 client->SetStartTime(
Seconds(start));
2581 server->SetLocal(socketAddr);
2587 "/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/MonitorSnifferRx",
2593 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::StaWifiMac/Assoc",
2595 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::StaWifiMac/DeAssoc",
2600 StaticCast<WifiNetDevice>(wifiNodes.
Get(0)->
GetDevice(0))->GetMac()->GetQosSupported()
2604 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::WifiMac/" + txop +
2608 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/$ns3::WifiMac/" + txop +
2612 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyTxBegin",
2615 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyTxEnd",
2618 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyRxBegin",
2622 "/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyRxPayloadBegin",
2625 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyRxDrop",
2628 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyRxEnd",
2631 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/State/RxError",
2634 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/State/RxOk",
2637 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/MacTx",
2640 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/MacRx",
2643 Config::Connect(
"/NodeList/*/$ns3::Node/ApplicationList/*/$ns3::PacketSocketClient/Tx",
2651 phy.EnablePcap(
"wifi_bianchi_pcap", devices);
2681 auto it = counter.find(addr);
2682 if (it != counter.end())
2690main(
int argc,
char* argv[])
2696 double duration = 100;
2701 std::string workDir =
"./";
2702 std::string phyMode =
2704 std::string standard(
"11a");
2705 bool validate =
false;
2707 uint16_t plotBianchiModel =
2709 double maxRelativeError =
2712 double frequency = 5;
2713 uint16_t channelWidth = 20;
2714 uint16_t guardIntervalNs = 800;
2716 uint16_t pktInterval =
2719 double distance = 0.001;
2720 double apTxPower = 16;
2721 double staTxPower = 16;
2735 "ns3::WifiMacQueue::MaxSize",
2740 cmd.AddValue(
"verbose",
2741 "Logging level (0: no log - 1: simulation script logs - 2: all logs)",
2743 cmd.AddValue(
"tracing",
"Generate trace files",
tracing);
2744 cmd.AddValue(
"pktSize",
"The packet size in bytes",
pktSize);
2745 cmd.AddValue(
"trials",
"The maximal number of runs per network size", trials);
2746 cmd.AddValue(
"duration",
"Time duration for each trial in seconds", duration);
2747 cmd.AddValue(
"pcap",
"Enable/disable PCAP tracing", pcap);
2748 cmd.AddValue(
"infra",
"True to use infrastructure mode, false to use ring adhoc mode", infra);
2749 cmd.AddValue(
"workDir",
"The working directory used to store generated files", workDir);
2750 cmd.AddValue(
"phyMode",
"Set the constant PHY mode string used to transmit frames", phyMode);
2751 cmd.AddValue(
"standard",
"Set the standard (11a, 11b, 11g, 11n, 11ac, 11ax)", standard);
2752 cmd.AddValue(
"nMinStas",
"Minimum number of stations to start with", nMinStas);
2753 cmd.AddValue(
"nMaxStas",
"Maximum number of stations to start with", nMaxStas);
2754 cmd.AddValue(
"nStepSize",
"Number of stations to add at each step", nStepSize);
2755 cmd.AddValue(
"plotBianchiModel",
2756 "First bit corresponds to the DIFS model, second bit to the EIFS model",
2758 cmd.AddValue(
"validate",
2759 "Enable/disable validation of the ns-3 simulations against the Bianchi model",
2761 cmd.AddValue(
"maxRelativeError",
2762 "The maximum relative error tolerated between ns-3 results and the Bianchi model "
2763 "(used for regression, i.e. when the validate flag is set)",
2765 cmd.AddValue(
"frequency",
"Set the operating frequency band in GHz: 2.4, 5 or 6", frequency);
2766 cmd.AddValue(
"channelWidth",
2767 "Set the constant channel width in MHz (only for 11n/ac/ax)",
2769 cmd.AddValue(
"guardIntervalNs",
2770 "Set the the guard interval in nanoseconds (800 or 400 for 11n/ac, 800 or 1600 or "
2773 cmd.AddValue(
"maxMpdus",
2774 "Set the maximum number of MPDUs in A-MPDUs (0 to disable MPDU aggregation)",
2776 cmd.AddValue(
"distance",
"Set the distance in meters between the AP and the STAs", distance);
2777 cmd.AddValue(
"apTxPower",
2778 "Set the transmit power of the AP in dBm (if infrastructure only)",
2780 cmd.AddValue(
"staTxPower",
2781 "Set the transmit power of each STA in dBm (or all STAs if adhoc)",
2783 cmd.AddValue(
"pktInterval",
"Set the socket packet interval in microseconds", pktInterval);
2784 cmd.Parse(argc, argv);
2796 NS_FATAL_ERROR(
"Failed to open file wifi-bianchi-backoff-trace.out");
2801 NS_FATAL_ERROR(
"Failed to open file wifi-bianchi-phy-tx-trace.out");
2806 NS_FATAL_ERROR(
"Failed to open file wifi-bianchi-mac-tx-trace.out");
2811 NS_FATAL_ERROR(
"Failed to open file wifi-bianchi-mac-rx-trace.out");
2816 NS_FATAL_ERROR(
"Failed to open file wifi-bianchi-socket-send-trace.out");
2833 std::stringstream phyModeStr;
2834 phyModeStr << phyMode;
2835 if (phyMode.find(
"Mcs") != std::string::npos)
2837 phyModeStr <<
"_" << channelWidth <<
"MHz";
2840 std::stringstream ss;
2841 ss <<
"wifi-" << standard <<
"-p-" <<
pktSize << (infra ?
"-infrastructure" :
"-adhoc") <<
"-r-"
2842 << phyModeStr.str() <<
"-min-" << nMinStas <<
"-max-" << nMaxStas <<
"-step-" << nStepSize
2843 <<
"-throughput.plt";
2844 std::ofstream throughputPlot(ss.str());
2846 ss <<
"wifi-" << standard <<
"-p-" <<
pktSize << (infra ?
"-infrastructure" :
"-adhoc") <<
"-r-"
2847 << phyModeStr.str() <<
"-min-" << nMinStas <<
"-max-" << nMaxStas <<
"-step-" << nStepSize
2848 <<
"-throughput.eps";
2852 if (standard ==
"11a")
2858 else if (standard ==
"11b")
2864 else if (standard ==
"11g")
2870 else if (standard ==
"11n")
2872 if (frequency == 2.4 || frequency == 5)
2878 NS_FATAL_ERROR(
"Unsupported frequency band " << frequency <<
" GHz for standard "
2882 else if (standard ==
"11ac")
2887 else if (standard ==
"11ax")
2889 if (frequency == 2.4 || frequency == 5 || frequency == 6)
2895 NS_FATAL_ERROR(
"Unsupported frequency band " << frequency <<
" GHz for standard "
2904 std::string channelStr =
"{0, " + std::to_string(channelWidth) +
", BAND_" +
2905 (frequency == 2.4 ?
"2_4" : (frequency == 5 ?
"5" :
"6")) +
"GHZ, 0}";
2919 "ReferenceDistance",
2924 else if (frequency == 5)
2930 "ReferenceDistance",
2941 "ReferenceDistance",
2948 wifi.SetStandard(wifiStandard);
2949 wifi.SetRemoteStationManager(
"ns3::ConstantRateWifiManager",
2965 double averageThroughput;
2966 std::vector<double> throughputArray(trials);
2967 for (
uint32_t n = nMinStas; n <= nMaxStas; n += nStepSize)
2969 averageThroughput = 0;
2971 for (
uint32_t runIndex = 0; runIndex < trials; runIndex++)
2987 std::cout <<
"Trial " << runIndex + 1 <<
" of " << trials <<
"; " << phyModeStr.str()
2988 <<
" for " << n <<
" nodes " << std::endl;
2991 cwTraceFile <<
"# Trial " << runIndex + 1 <<
" of " << trials <<
"; "
2992 << phyModeStr.str() <<
" for " << n <<
" nodes" << std::endl;
2994 << phyModeStr.str() <<
" for " << n <<
" nodes" << std::endl;
2995 phyTxTraceFile <<
"# Trial " << runIndex + 1 <<
" of " << trials <<
"; "
2996 << phyModeStr.str() <<
" for " << n <<
" nodes" << std::endl;
2997 macTxTraceFile <<
"# Trial " << runIndex + 1 <<
" of " << trials <<
"; "
2998 << phyModeStr.str() <<
" for " << n <<
" nodes" << std::endl;
2999 macRxTraceFile <<
"# Trial " << runIndex + 1 <<
" of " << trials <<
"; "
3000 << phyModeStr.str() <<
" for " << n <<
" nodes" << std::endl;
3002 << phyModeStr.str() <<
" for " << n <<
" nodes" << std::endl;
3027 Time dataTransferDuration = last -
first;
3028 double nodeThroughput =
3029 (it->second * 8 /
static_cast<double>(dataTransferDuration.
GetMicroSeconds()));
3036 uint64_t nodeRxEventWhileDecodingPreamble =
3041 uint64_t nodeRxEvents = nodePhyHeaderFailures + nodePsduFailures + nodePsduSuccess +
3042 nodeRxEventWhileDecodingPreamble + nodeRxEventWhileRxing +
3043 nodeRxEventWhileTxing + nodeRxEventAbortedByTx;
3044 std::cout <<
"Node " << it->first <<
": TX packets " << nodeTxPackets
3045 <<
"; RX packets " << nodeRxPackets <<
"; PHY header failures "
3046 << nodePhyHeaderFailures <<
"; PSDU failures " << nodePsduFailures
3047 <<
"; PSDU success " << nodePsduSuccess
3048 <<
"; RX events while decoding preamble "
3049 << nodeRxEventWhileDecodingPreamble <<
"; RX events while RXing "
3050 << nodeRxEventWhileRxing <<
"; RX events while TXing "
3051 << nodeRxEventWhileTxing <<
"; RX events aborted by TX "
3052 << nodeRxEventAbortedByTx <<
"; total RX events " << nodeRxEvents
3053 <<
"; total events " << nodeTxPackets + nodeRxEvents <<
"; time first RX "
3054 <<
first <<
"; time last RX " << last <<
"; dataTransferDuration "
3055 << dataTransferDuration <<
"; throughput " << nodeThroughput <<
" Mbps"
3058 std::cout <<
"Total throughput: " <<
throughput <<
" Mbps" << std::endl;
3062 averageThroughput = averageThroughput / trials;
3064 bool rateFound =
false;
3065 double relativeErrorDifs = 0;
3066 double relativeErrorEifs = 0;
3071 auto it = itDifs->second.find(n);
3072 if (it != itDifs->second.end())
3074 relativeErrorDifs = (std::abs(averageThroughput - it->second) / it->second);
3075 std::cout <<
"Relative error (DIFS): " << 100 * relativeErrorDifs <<
"%"
3080 NS_FATAL_ERROR(
"No Bianchi results (DIFS) calculated for that number of stations!");
3087 auto it = itEifs->second.find(n);
3088 if (it != itEifs->second.end())
3090 relativeErrorEifs = (std::abs(averageThroughput - it->second) / it->second);
3091 std::cout <<
"Relative error (EIFS): " << 100 * relativeErrorEifs <<
"%"
3096 NS_FATAL_ERROR(
"No Bianchi results (EIFS) calculated for that number of stations!");
3099 if (!rateFound && validate)
3103 double relativeError = std::min(relativeErrorDifs, relativeErrorEifs);
3104 if (validate && (relativeError > maxRelativeError))
3110 for (
uint32_t i = 0; i < trials; ++i)
3112 stDev += pow(throughputArray[i] - averageThroughput, 2);
3114 stDev = sqrt(stDev / (trials - 1));
3115 dataset.
Add(n, averageThroughput, stDev);
3122 for (
uint32_t i = nMinStas; i <= nMaxStas; i += nStepSize)
3125 auto it = itDifs->second.find(i);
3126 if (it != itDifs->second.end())
3130 datasetBianchiDifs.
Add(i, value);
3135 for (
uint32_t i = nMinStas; i <= nMaxStas; i += nStepSize)
3137 datasetBianchiDifs.
Add(i, 0.0);
3144 for (
uint32_t i = nMinStas; i <= nMaxStas; i += nStepSize)
3147 auto it = itEifs->second.find(i);
3148 if (it != itEifs->second.end())
3152 datasetBianchiEifs.
Add(i, value);
3157 for (
uint32_t i = nMinStas; i <= nMaxStas; i += nStepSize)
3159 datasetBianchiEifs.
Add(i, 0.0);
3163 datasetBianchiEifs.
SetTitle(
"Bianchi (EIFS - lower bound)");
3164 datasetBianchiDifs.
SetTitle(
"Bianchi (DIFS - upper bound)");
3166 gnuplot.
SetTerminal(
"postscript eps color enh \"Times-BoldItalic\"");
3167 gnuplot.
SetLegend(
"Number of competing stations",
"Throughput (Mbps)");
3169 ss <<
"Frame size " <<
pktSize <<
" bytes";
3172 ss <<
"set xrange [" << nMinStas <<
":" << nMaxStas <<
"]\n"
3173 <<
"set xtics " << nStepSize <<
"\n"
3174 <<
"set grid xtics ytics\n"
3176 <<
"set style line 1 linewidth 5\n"
3177 <<
"set style line 2 linewidth 5\n"
3178 <<
"set style line 3 linewidth 5\n"
3179 <<
"set style line 4 linewidth 5\n"
3180 <<
"set style line 5 linewidth 5\n"
3181 <<
"set style line 6 linewidth 5\n"
3182 <<
"set style line 7 linewidth 5\n"
3183 <<
"set style line 8 linewidth 5\n"
3184 <<
"set style increment user";
3186 if (plotBianchiModel & 0x0001)
3188 datasetBianchiDifs.
SetTitle(
"Bianchi");
3191 if (plotBianchiModel & 0x0002)
3193 datasetBianchiEifs.
SetTitle(
"Bianchi");
3196 if (plotBianchiModel == 0x0003)
3198 datasetBianchiEifs.
SetTitle(
"Bianchi (EIFS - lower bound)");
3199 datasetBianchiDifs.
SetTitle(
"Bianchi (DIFS - upper bound)");
3202 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(ErrorBars errorBars)
void SetStyle(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.
static Mac48Address ConvertFrom(const Address &address)
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 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.
static Ptr< Node > GetNode(uint32_t n)
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.
Smart pointer class similar to boost::intrusive_ptr.
Class for representing queue sizes.
AttributeValue implementation for QueueSize.
static void SetRun(uint64_t run)
Set the run number of simulation.
static void SetSeed(uint32_t seed)
Set the seed.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
static Time Now()
Return the current simulation virtual time.
static void Run()
Run the simulation.
static void Stop()
Tell the Simulator the calling event should be the last one executed.
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
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.
represent a single transmission mode
Hold together all Wifi-related objects.
void DisablePreambleDetectionModel()
Disable the preamble detection model on all links.
@ DLT_IEEE802_11_RADIO
Include Radiotap link layer information.
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.
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
@ SIGNAL_DETECTION_ABORTED_BY_TX
@ RECEPTION_ABORTED_BY_TX
@ PREAMBLE_DETECTION_PACKET_SWITCH
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void LogComponentEnable(const std::string &name, LogLevel level)
Enable the logging output associated with that log component.
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< WifiSpectrumBandInfo, double > RxPowerWattPerChannelBand
A map of the received power (Watts) for each band.
@ LOG_LEVEL_ALL
Print everything.
@ LOG_LEVEL_WARN
LOG_WARN and above.
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 unsuccessfuly received PSDUS (for which the PHY header was succes...
#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 unsuccessfuly 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.