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
Time CalculateTxDuration(uint32_t size, WifiTxVector txVector, enum WifiPreamble preamble, double frequency, enum mpduType mpdutype, uint8_t incFlag)
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.
The MPDU is not part of an A-MPDU.
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...
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