33 #include "ns3/packet.h"    34 #include "ns3/random-variable-stream.h"    35 #include "ns3/simulator.h"    41 #define Min(a,b) ((a < b) ? a : b)    54     .SetGroupName (
"Wifi")
    56     .AddAttribute (
"UpdateStatistics",
    57                    "The interval between updating statistics table ",
    61     .AddAttribute (
"LookAroundRate",
    62                    "the percentage to try other rates",
    65                    MakeUintegerChecker<uint8_t> ())
    66     .AddAttribute (
"EWMA",
    70                    MakeUintegerChecker<uint8_t> ())
    71     .AddAttribute (
"SampleColumn",
    72                    "The number of columns used for sampling",
    75                    MakeUintegerChecker <uint8_t> ())
    76     .AddAttribute (
"PacketLength",
    77                    "The packet length used for calculating mode TxTime",
    80                    MakeUintegerChecker <uint32_t> ())
    81     .AddAttribute (
"PrintStats",
    82                    "Print statistics table",
    86     .AddAttribute (
"PrintSamples",
    87                    "Print samples table",
    91     .AddTraceSource (
"Rate",
    92                      "Traced value for rate changes (b/s)",
    94                      "ns3::TracedValueCallback::Uint64")
   116   uint8_t nModes = 
phy->GetNModes ();
   117   for (uint8_t i = 0; i < nModes; i++)
   141       NS_FATAL_ERROR (
"WifiRemoteStationManager selected does not support HT rates");
   145       NS_FATAL_ERROR (
"WifiRemoteStationManager selected does not support VHT rates");
   149       NS_FATAL_ERROR (
"WifiRemoteStationManager selected does not support HE rates");
   219       std::ostringstream tmp;
   221       station->
m_statsFile.open (tmp.str ().c_str (), std::ios::out);
   256           NS_LOG_DEBUG (
" More retries left for the maximum throughput rate.");
   264           NS_LOG_DEBUG (
" More retries left for the second maximum throughput rate.");
   273           NS_LOG_DEBUG (
" More retries left for the maximum probability rate.");
   294           NS_LOG_DEBUG (
"Look around rate is slower than the maximum throughput rate.");
   298               NS_LOG_DEBUG (
" More retries left for the maximum throughput rate.");
   306               NS_LOG_DEBUG (
" More retries left for the sampling rate.");
   315               NS_LOG_DEBUG (
" More retries left for the maximum probability rate.");
   331           NS_LOG_DEBUG (
"Look around rate is faster than the maximum throughput rate.");
   335               NS_LOG_DEBUG (
" More retries left for the sampling rate.");
   343               NS_LOG_DEBUG (
" More retries left for the maximum throughput rate.");
   352               NS_LOG_DEBUG (
" More retries left for the maximum probability rate.");
   373   if (channelWidth > 20 && channelWidth != 22)
   388   return WifiTxVector (mode, 
GetDefaultTxPowerLevel (), 
GetPreambleForTransmission (mode.
GetModulationClass (), 
GetShortPreambleEnabled (), 
UseGreenfieldForDestination (
GetAddress (station))), 800, 1, 1, 0, channelWidth, 
GetAggregation (station), 
false);
   397   if (channelWidth > 20 && channelWidth != 22)
   412   rtsTxVector = 
WifiTxVector (mode, 
GetDefaultTxPowerLevel (), 
GetPreambleForTransmission (mode.
GetModulationClass (), 
GetShortPreambleEnabled (), 
UseGreenfieldForDestination (
GetAddress (station))), 800, 1, 1, 0, channelWidth, 
GetAggregation (station), 
false);
   456       uint8_t ratesSupported = station->
m_nModes;
   457       if (delta > ratesSupported * 2)
   561   for (uint8_t i = 0; i < station->
m_nModes; i++)
   651   uint8_t index_max_tp = 0, index_max_tp2 = 0;
   654   NS_LOG_DEBUG (
"Finding the maximum throughput, second maximum throughput, and highest probability");
   656   for (uint8_t i = 0; i < station->
m_nModes; i++)
   662       if (max_tp < station->m_minstrelTable[i].throughput)
   671   for (uint8_t i = 0; i < station->
m_nModes; i++)
   673       if ((i != index_max_tp) && (max_tp < station->m_minstrelTable[i].throughput))
   680   uint32_t max_prob = 0;
   681   uint8_t index_max_prob = 0;
   682   for (uint8_t i = 0; i < station->
m_nModes; i++)
   700   if (index_max_tp > station->
m_txrate)
   706                 ")\tsecond max throughput=" << +index_max_tp2 << 
"(" << 
GetSupported (station, index_max_tp2) <<
   707                 ")\tmax prob=" << +index_max_prob << 
"(" << 
GetSupported (station, index_max_prob) << 
")");
   765                                      double ackSnr, 
WifiMode ackMode, 
double dataSnr)
   930   for (uint8_t i = 0; i < station->
m_nModes; i++)
   952       for (uint32_t retries = 2; retries < 11; retries++)
   956           NS_LOG_DEBUG (
"   totalTxTimeWithGivenRetries = " << totalTxTimeWithGivenRetries);
   972   NS_LOG_FUNCTION (
this << dataTransmissionTime << shortRetries << longRetries);
   976   Time tt = dataTransmissionTime + 
GetMac ()->GetAckTimeout ();
   978   uint32_t cwMax = 1023;
   980   for (uint32_t retry = 0; retry < longRetries; retry++)
   983       tt += dataTransmissionTime + 
GetMac ()->GetAckTimeout ();
   986       tt += (cw / 2.0) * 
GetMac ()->GetSlot ();
   989       cw = 
std::min (cwMax, (cw + 1) * 2);
  1002   uint8_t numSampleRates = station->
m_nModes;
  1007       for (uint8_t i = 0; i < numSampleRates; i++ )
  1015           newIndex = (i + uv) % numSampleRates;
  1020               newIndex = (newIndex + 1) % station->
m_nModes;
  1030   uint8_t numSampleRates = station->
m_nModes;
  1031   std::stringstream table;
  1032   for (uint8_t i = 0; i < numSampleRates; i++)
  1046   station->
m_statsFile << 
"best   _______________rate________________    ________statistics________    ________last_______    ______sum-of________\n" <<
  1047     "rate  [      name       idx airtime max_tp]  [avg(tp) avg(prob) sd(prob)]  [prob.|retry|suc|att]  [#success | #attempts]\n";
  1053   for (uint8_t i = 0; i < station->
m_nModes; i++)
  1065       if (i == maxTpRate2)
  1073       if (i == maxProbRate)
  1085         std::setw (2) << i << 
"  " <<
  1087         std::setw (8) << 
"    -----    " <<
  1088         std::setw (8) << tmpTh << 
"    " <<
  1089         std::setw (3) << rate.
ewmaProb / 180 <<
  1090         std::setw (3) << 
"       ---      " <<
  1091         std::setw (3) << rate.
prob / 180 << 
"     " <<
 void CheckInit(MinstrelWifiRemoteStation *station)
check for initializations 
void PrintTable(MinstrelWifiRemoteStation *station)
printing Minstrel Table 
uint16_t m_maxProbRate
rate with highest prob of success 
WifiTxVector DoGetDataTxVector(WifiRemoteStation *station)
void SetupMac(const Ptr< WifiMac > mac)
Set up MAC associated with this device since it is the object that knows the full set of timing param...
Simulation virtual time values and global simulation resolution. 
Ptr< WifiMac > GetMac(void) const
Return the WifiMac. 
bool GetVhtSupported(void) const
Return whether the device has VHT capability support enabled. 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
void SetStream(int64_t stream)
Specifies the stream number for the RngStream. 
uint8_t GetNSupported(const WifiRemoteStation *station) const
Return the number of modes supported by the given station. 
bool m_printStats
whether statistics table should be printed. 
  AttributeValue implementation for Boolean. 
uint8_t m_lookAroundRate
the % to try other rates than our current rate 
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
uint8_t m_index
vector index 
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system. 
Time perfectTxTime
Perfect transmission time calculation, or frame calculation Given a bit rate and a packet length n by...
Implementation of Minstrel Rate Control AlgorithmMinstrel is a rate control algorithm implemented in ...
uint16_t m_maxTpRate
the current throughput rate 
uint16_t m_txrate
current transmit rate 
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
 Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
uint16_t m_maxTpRate2
second highest throughput rate 
void DoReportFinalDataFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class. 
hold per-remote-station state for Minstrel Wifi manager. 
Time m_updateStats
how frequent do we calculate the stats (1/10 seconds) 
void UpdateStats(MinstrelWifiRemoteStation *station)
updating the Minstrel Table every 1/10 seconds 
bool GetHeSupported(void) const
Return whether the device has HE capability support enabled. 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit. 
uint16_t m_sampleRate
current sample rate 
Mac48Address m_address
Mac48Address of the remote station. 
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate. 
MinstrelRate m_minstrelTable
minstrel table 
std::ofstream m_statsFile
stats file 
WifiPreamble GetPreambleForTransmission(WifiModulationClass modulation, bool useShortPreamble, bool useGreenfield)
Return the preamble to be used for the transmission. 
WifiMode GetSupported(const WifiRemoteStation *station, uint8_t i) const
Return whether mode associated with the specified station at the specified index. ...
bool m_sampleDeferred
a flag to indicate sample rate is on the second stage 
std::vector< std::vector< uint8_t > > SampleRate
Data structure for a Sample Rate table A vector of a vector uint8_t. 
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
std::vector< RateInfo > MinstrelRate
Data structure for a Minstrel Rate table A vector of a struct RateInfo. 
TracedValue< uint64_t > m_currentRate
Trace rate changes. 
uint8_t m_nModes
number of modes supported 
uint32_t m_pktLen
packet length used for calculate mode TxTime 
WifiRemoteStationState * m_state
Remote station state. 
uint32_t adjustedRetryCount
adjust the retry limit for this rate 
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source. 
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range. 
void DoReportDataOk(WifiRemoteStation *station, double ackSnr, WifiMode ackMode, double dataSnr)
This method is a pure virtual method that must be implemented by the sub-class. 
void DoReportRxOk(WifiRemoteStation *station, double rxSnr, WifiMode txMode)
This method is a pure virtual method that must be implemented by the sub-class. 
bool GetShortPreambleEnabled(void) const
Return whether the device uses short PLCP preambles. 
A struct to contain all information related to a data rate. 
virtual uint32_t GetInteger(void)=0
Get the next random value as an integer drawn from the distribution. 
void SetupPhy(const Ptr< WifiPhy > phy)
Set up PHY associated with this device since it is the object that knows the full set of transmit rat...
bool m_isSampling
a flag to indicate we are currently sampling 
int m_numSamplesDeferred
number samles deferred 
  AttributeValue implementation for Time. 
SampleRate m_sampleTable
sample table 
uint8_t m_col
To keep track of the current position in the our random sample table going row by row from 1st column...
uint32_t prevNumRateSuccess
Number of successful frames transmitted with previous rate. 
Hold an unsigned integer type. 
bool IsLowLatency(void) const
uint16_t GetNextSample(MinstrelWifiRemoteStation *station)
getting the next sample from Sample Table 
void PrintSampleTable(MinstrelWifiRemoteStation *station)
printing Sample Table 
bool GetHtSupported(void) const
Return whether the device has HT capability support enabled. 
uint32_t prevNumRateAttempt
Number of transmission attempts with previous rate. 
uint64_t attemptHist
Aggregate of all transmission attempts. 
uint64_t successHist
Aggregate of all transmission successes. 
void AddCalcTxTime(WifiMode mode, Time t)
Add transmission time for the given mode to an internal list. 
virtual void SetupPhy(const Ptr< WifiPhy > phy)
Set up PHY associated with this device since it is the object that knows the full set of transmit rat...
void DoReportFinalRtsFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class. 
hold a list of per-remote-station state. 
WifiModulationClass GetModulationClass() const
WifiTxVector DoGetRtsTxVector(WifiRemoteStation *station)
uint32_t m_longRetry
long retries such as data packets 
uint16_t FindRate(MinstrelWifiRemoteStation *station)
find a rate to use from Minstrel Table 
bool m_initialized
for initializing tables 
uint32_t ewmaProb
EWMA calculation ewma_prob =[prob *(100 - ewma_level) + (ewma_prob_old * ewma_level)]/100. 
int64_t GetMicroSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit. 
TxTime m_calcTxTime
to hold all the calculated TxTime for all modes 
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
void UpdateRate(MinstrelWifiRemoteStation *station)
updating the rate 
void SetPreambleType(WifiPreamble preamble)
Sets the preamble type. 
WifiTxVector GetDataTxVector(MinstrelWifiRemoteStation *station)
Get data transmit vector. 
Ptr< const AttributeChecker > MakeBooleanChecker(void)
  
bool UseGreenfieldForDestination(Mac48Address dest) const
bool DoNeedRetransmission(WifiRemoteStation *st, Ptr< const Packet > packet, bool normally)
Mac48Address GetAddress(const WifiRemoteStation *station) const
Return the address of the station. 
WifiMode GetNonErpSupported(const WifiRemoteStation *station, uint8_t i) const
Return whether non-ERP mode associated with the specified station at the specified index...
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
 Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
uint32_t throughput
throughput of a rate 
static Time Now(void)
Return the current simulation virtual time. 
uint32_t m_retry
total retries short + long 
int m_totalPacketsCount
total number of packets as of now 
bool GetAggregation(const WifiRemoteStation *station) const
Return whether the given station supports A-MPDU. 
Ptr< UniformRandomVariable > m_uniformRandomVariable
Provides uniform random variables. 
void SetMode(WifiMode mode)
Sets the selected payload transmission mode. 
void UpdateRetry(MinstrelWifiRemoteStation *station)
update the number of retries and reset accordingly 
int m_samplePacketsCount
how many packets we have sample so far 
static TypeId GetTypeId(void)
Get the type ID. 
void InitSampleTable(MinstrelWifiRemoteStation *station)
initialize Sample Table 
virtual void SetupMac(const Ptr< WifiMac > mac)
Set up MAC associated with this device since it is the object that knows the full set of timing param...
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message. 
void DoReportRtsFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class. 
WifiTxVector GetRtsTxVector(MinstrelWifiRemoteStation *station)
Get RTS transmit vector. 
bool GetUseNonErpProtection(void) const
Return whether the device supports protection of non-ERP stations. 
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG. 
Time Seconds(double value)
Construct a Time in the indicated unit. 
uint32_t CountRetries(MinstrelWifiRemoteStation *station)
Count retries. 
uint8_t GetDefaultTxPowerLevel(void) const
void DoReportDataFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class. 
void DoInitialize(void)
Initialize() implementation. 
bool m_printSamples
whether samples table should be printed. 
virtual ~MinstrelWifiManager()
uint32_t m_shortRetry
short retries such as control packts 
WifiRemoteStation * DoCreateStation(void) const
uint8_t m_sampleCol
number of sample columns 
Time GetCalcTxTime(WifiMode mode) const
for estimating the TxTime of a packet with a given mode 
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
 Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
void DoReportRtsOk(WifiRemoteStation *station, double ctsSnr, WifiMode ctsMode, double rtsSnr)
This method is a pure virtual method that must be implemented by the sub-class. 
a unique identifier for an interface. 
uint8_t m_ewmaLevel
exponential weighted moving average 
Time CalculateTimeUnicastPacket(Time dataTransmissionTime, uint32_t shortRetries, uint32_t longRetries)
Estimate the time to transmit the given packet with the given number of retries. 
void RateInit(MinstrelWifiRemoteStation *station)
initialize Minstrel Table 
TypeId SetParent(TypeId tid)
Set the parent TypeId. 
hold per-remote-station state. 
uint64_t GetDataRate(uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
uint32_t prob
(# pkts success )/(# total pkts) 
uint16_t GetChannelWidth(const WifiRemoteStation *station) const
Return the channel width supported by the station. 
void UpdatePacketCounters(MinstrelWifiRemoteStation *station)
Update packet counters. 
Time m_nextStatsUpdate
10 times every second