33 #include "ns3/simulator.h" 
   35 #include "ns3/uinteger.h" 
   36 #include "ns3/double.h" 
   37 #include "ns3/wifi-mac.h" 
   38 #include "ns3/assert.h" 
   41 #define Min(a,b) ((a < b) ? a : b) 
   89     .SetGroupName (
"Wifi")
 
   91     .AddAttribute (
"UpdateStatistics",
 
   92                    "The interval between updating statistics table ",
 
   96     .AddAttribute (
"LookAroundRate",
 
   97                    "the percentage to try other rates",
 
  100                    MakeDoubleChecker<double> ())
 
  101     .AddAttribute (
"EWMA",
 
  105                    MakeDoubleChecker<double> ())
 
  106     .AddAttribute (
"SampleColumn",
 
  107                    "The number of columns used for sampling",
 
  110                    MakeDoubleChecker <double> ())
 
  111     .AddAttribute (
"PacketLength",
 
  112                    "The packet length used for calculating mode TxTime",
 
  115                    MakeDoubleChecker <double> ())
 
  136   for (uint32_t i = 0; i < nModes; i++)
 
  160       if (mode == i->second)
 
  291           NS_LOG_DEBUG (
" More retries left for the maximum throughput rate.");
 
  299           NS_LOG_DEBUG (
" More retries left for the second maximum throughput rate.");
 
  308           NS_LOG_DEBUG (
" More retries left for the maximum probability rate.");
 
  329           NS_LOG_DEBUG (
"Look around rate is slower than the maximum throughput rate.");
 
  333               NS_LOG_DEBUG (
" More retries left for the maximum throughput rate.");
 
  341               NS_LOG_DEBUG (
" More retries left for the sampling rate.");
 
  350               NS_LOG_DEBUG (
" More retries left for the maximum probability rate.");
 
  366           NS_LOG_DEBUG (
"Look around rate is faster than the maximum throughput rate.");
 
  370               NS_LOG_DEBUG (
" More retries left for the sampling rate.");
 
  378               NS_LOG_DEBUG (
" More retries left for the maximum throughput rate.");
 
  387               NS_LOG_DEBUG (
" More retries left for the maximum probability rate.");
 
  405                                      double ackSnr, 
WifiMode ackMode, 
double dataSnr)
 
  478   if (channelWidth > 20 && channelWidth != 22)
 
  500   if (channelWidth > 20 && channelWidth != 22)
 
  757   uint32_t max_prob = 0, index_max_prob = 0, max_tp = 0, index_max_tp = 0, index_max_tp2 = 0;
 
  760   NS_LOG_DEBUG (
"Finding the maximum throughput, second maximum throughput, and highest probability");
 
  768       if (max_tp < station->m_minstrelTable[i].throughput)
 
  774       if (max_prob < station->m_minstrelTable[i].ewmaProb)
 
  786       if ((i != index_max_tp) && (max_tp < station->m_minstrelTable[i].throughput))
 
  797   if (index_max_tp > station->
m_txrate)
 
  803                 ")\tsecond max throughput=" << index_max_tp2 << 
"(" << 
GetSupported (station, index_max_tp2) <<
 
  804                 ")\tmax prob=" << index_max_prob << 
"(" << 
GetSupported (station, index_max_prob) << 
")");
 
  829       for (uint32_t retries = 2; retries < 11; retries++)
 
  833           NS_LOG_DEBUG (
"   totalTxTimeWithGivenRetries = " << totalTxTimeWithGivenRetries);
 
  847   NS_LOG_FUNCTION (
this << dataTransmissionTime << shortRetries << longRetries);
 
  851   Time tt = dataTransmissionTime + 
GetMac ()->GetAckTimeout ();
 
  853   uint32_t cwMax = 1023;
 
  855   for (uint32_t retry = 0; retry < longRetries; retry++)
 
  858       tt += dataTransmissionTime + 
GetMac ()->GetAckTimeout ();
 
  864       cw = std::min (cwMax, (cw + 1) * 2);
 
  883       for (uint32_t i = 0; i < numSampleRates; i++ )
 
  890           newIndex = (i + uv) % numSampleRates;
 
  908   std::stringstream table;
 
  909   for (uint32_t i = 0; i < numSampleRates; i++)
 
uint32_t m_nsupported
modes supported 
 
void CheckInit(MinstrelWifiRemoteStation *station)
check for initializations 
 
void PrintTable(MinstrelWifiRemoteStation *station)
 
uint32_t GetNSupported(const WifiRemoteStation *station) const 
Return the number of modes supported by the given station. 
 
virtual uint32_t GetFrequency(void) const =0
 
Simulation virtual time values and global simulation resolution. 
 
#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 this RNG stream. 
 
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
 
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system. 
 
Implementation of Minstrel Rate Control AlgorithmPorting Minstrel from Madwifi and Linux Kernel http:...
 
virtual uint32_t GetNModes(void) const =0
The WifiPhy::GetNModes() and WifiPhy::GetMode() methods are used (e.g., by a WifiRemoteStationManager...
 
virtual 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)
 
#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. 
 
uint32_t m_sampleRate
current sample rate 
 
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit. 
 
uint32_t GetNextSample(MinstrelWifiRemoteStation *station)
 
virtual bool DoNeedDataRetransmission(WifiRemoteStation *st, Ptr< const Packet > packet, bool normally)
 
uint32_t m_txrate
current transmit rate 
 
MinstrelRate m_minstrelTable
minstrel table 
 
virtual void SetupPhy(Ptr< WifiPhy > phy)
Set up PHY associated with this device since it is the object that knows the full set of transmit rat...
 
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
 
bool GetAggregation(const WifiRemoteStation *station) const 
Return whether the given station supports A-MPDU. 
 
WifiMode GetSupported(const WifiRemoteStation *station, uint32_t i) const 
Return whether mode associated with the specified station at the specified index. ...
 
uint32_t FindRate(MinstrelWifiRemoteStation *station)
 
uint32_t m_pktLen
packet length used for calculate mode TxTime 
 
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range. 
 
virtual 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. 
 
virtual void DoReportRxOk(WifiRemoteStation *station, double rxSnr, WifiMode txMode)
This method is a pure virtual method that must be implemented by the sub-class. 
 
uint32_t m_col
To keep track of the current position in the our random sample table going row by row from 1st column...
 
virtual uint32_t GetInteger(void)=0
Get the next random value as an integer drawn from the distribution. 
 
bool m_isSampling
a flag to indicate we are currently sampling 
 
int64_t GetMicroSeconds(void) const 
Get an approximation of the time stored in this instance in the indicated unit. 
 
int m_sampleCount
how many packets we have sample so far 
 
AttributeValue implementation for Time. 
 
SampleRate m_sampleTable
sample table 
 
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit. 
 
void PrintSampleTable(MinstrelWifiRemoteStation *station)
 
virtual void SetupPhy(Ptr< WifiPhy > phy)
Set up PHY associated with this device since it is the object that knows the full set of transmit rat...
 
double m_ewmaLevel
exponential weighted moving average 
 
virtual WifiRemoteStation * DoCreateStation(void) const 
 
virtual WifiTxVector DoGetDataTxVector(WifiRemoteStation *station, uint32_t size)
 
void AddCalcTxTime(WifiMode mode, Time t)
Add transmission time for the given mode to an internal list. 
 
virtual 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. 
 
virtual WifiTxVector DoGetRtsTxVector(WifiRemoteStation *station)
 
uint32_t m_longRetry
long retries such as data packets 
 
bool m_initialized
for initializing tables 
 
TxTime m_calcTxTime
to hold all the calculated TxTime for all modes 
 
virtual bool IsLowLatency(void) const 
 
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. 
 
uint32_t m_maxTpRate2
second highest throughput rate 
 
virtual WifiMode GetMode(uint32_t mode) const =0
The WifiPhy::GetNModes() and WifiPhy::GetMode() methods are used (e.g., by a WifiRemoteStationManager...
 
Time CalculateTxDuration(uint32_t size, WifiTxVector txVector, enum WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag)
 
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
 
static Time Now(void)
Return the current simulation virtual time. 
 
uint32_t m_retry
total retries short + long 
 
Ptr< UniformRandomVariable > m_uniformRandomVariable
 
void SetMode(WifiMode mode)
Sets the selected payload transmission mode. 
 
void UpdateRetry(MinstrelWifiRemoteStation *station)
 
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
 
double m_lookAroundRate
the % to try other rates than our current rate 
 
static TypeId GetTypeId(void)
 
uint8_t GetDefaultTxPowerLevel(void) const 
 
void InitSampleTable(MinstrelWifiRemoteStation *station)
 
uint32_t m_maxProbRate
rate with highest prob of success 
 
uint32_t GetLongRetryCount(const WifiRemoteStation *station) const 
Return the long retry limit of the given station. 
 
virtual void DoReportRtsFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class. 
 
uint32_t m_maxTpRate
the current throughput rate 
 
#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. 
 
Time GetCalcTxTime(WifiMode mode) const 
 
virtual void DoReportDataFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class. 
 
std::vector< struct RateInfo > MinstrelRate
Data structure for a Minstrel Rate table A vector of a struct RateInfo. 
 
uint32_t GetChannelWidth(const WifiRemoteStation *station) const 
Return the channel width supported by the station. 
 
uint32_t GetShortRetryCount(const WifiRemoteStation *station) const 
Return the short retry limit of the given station. 
 
uint32_t m_sampleCol
number of sample columns 
 
virtual ~MinstrelWifiManager()
 
uint32_t m_shortRetry
short retries such as control packts 
 
This class can be used to hold variables of floating point type such as 'double' or 'float'...
 
bool m_sampleRateSlower
a flag to indicate sample rate is slower 
 
int m_packetCount
total number of packets as of now 
 
virtual 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. 
 
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)
 
uint32_t m_err
retry errors 
 
TypeId SetParent(TypeId tid)
Set the parent TypeId. 
 
std::vector< std::vector< uint32_t > > SampleRate
Data structure for a Sample Rate table A vector of a vector uint32_t. 
 
hold per-remote-station state. 
 
Ptr< WifiMac > GetMac(void) const 
Return the WifiMac. 
 
Time m_nextStatsUpdate
10 times every second