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)
88 .AddConstructor<MinstrelWifiManager> ()
89 .AddAttribute (
"UpdateStatistics",
90 "The interval between updating statistics table ",
94 .AddAttribute (
"LookAroundRate",
95 "the percentage to try other rates",
98 MakeDoubleChecker<double> ())
99 .AddAttribute (
"EWMA",
103 MakeDoubleChecker<double> ())
104 .AddAttribute (
"SampleColumn",
105 "The number of columns used for sampling",
108 MakeDoubleChecker <double> ())
109 .AddAttribute (
"PacketLength",
110 "The packet length used for calculating mode TxTime",
113 MakeDoubleChecker <double> ())
133 for (uint32_t i = 0; i < nModes; i++)
157 if (mode == i->second)
382 double ackSnr,
WifiMode ackMode,
double dataSnr)
603 txTime = Seconds (1);
666 uint32_t max_prob = 0, index_max_prob = 0, max_tp = 0, index_max_tp = 0, index_max_tp2 = 0;
704 if (index_max_tp > station->
m_txrate)
709 NS_LOG_DEBUG (
"max tp=" << index_max_tp <<
"\nmax tp2=" << index_max_tp2 <<
"\nmax prob=" << index_max_prob);
750 for (uint32_t i = 0; i < numSampleRates; i++ )
758 newIndex = (i + uv) % numSampleRates;
777 for (uint32_t i = 0; i < numSampleRates; i++)
783 std::cout << std::endl;
794 std::cout <<
"index(" << i <<
") = " <<
m_minstrelTable[i].perfectTxTime <<
"\n";
uint32_t m_nsupported
modes supported
void CheckInit(MinstrelWifiRemoteStation *station)
check for initializations
void PrintTable(MinstrelWifiRemoteStation *station)
printing Minstrel Table
uint32_t GetNSupported(const WifiRemoteStation *station) const
keep track of time values and allow control of global simulation resolution
#define NS_LOG_FUNCTION(parameters)
void SetStream(int64_t stream)
Specifies the stream number for this RNG stream.
Implementation of Minstrel Rate Control AlgorithmPorting Minstrel from Madwifi and Linux Kernel http:...
virtual uint32_t GetNModes(void) const =0
virtual void DoReportFinalDataFailed(WifiRemoteStation *station)
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
#define NS_ASSERT(condition)
uint32_t m_sampleRate
current sample rate
uint32_t GetNextSample(MinstrelWifiRemoteStation *station)
getting the next sample from Sample Table
uint32_t m_txrate
current transmit rate
SampleRate m_sampleTable
sample table
virtual void SetupPhy(Ptr< WifiPhy > phy)
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
uint32_t GetNumberOfReceiveAntennas(const WifiRemoteStation *station) const
WifiMode GetSupported(const WifiRemoteStation *station, uint32_t i) const
uint32_t FindRate(MinstrelWifiRemoteStation *station)
find a rate to use from Minstrel Table
uint32_t m_pktLen
packet length used for calculate mode TxTime
uint32_t m_currentRate
current rate we are using
virtual void DoReportDataOk(WifiRemoteStation *station, double ackSnr, WifiMode ackMode, double dataSnr)
virtual void DoReportRxOk(WifiRemoteStation *station, double rxSnr, WifiMode txMode)
bool GetStbc(const WifiRemoteStation *station) const
NS_LOG_COMPONENT_DEFINE("MinstrelWifiManager")
bool m_isSampling
a flag to indicate we are currently sampling
int64_t GetMicroSeconds(void) const
int m_sampleCount
how many packets we have sample so far
hold objects of type ns3::Time
NS_OBJECT_ENSURE_REGISTERED(AntennaModel)
void PrintSampleTable(MinstrelWifiRemoteStation *station)
printing Sample Table
virtual void SetupPhy(Ptr< WifiPhy > phy)
double m_ewmaLevel
exponential weighted moving average
int64x64_t Min(const int64x64_t &a, const int64x64_t &b)
virtual WifiRemoteStation * DoCreateStation(void) const
virtual WifiTxVector DoGetDataTxVector(WifiRemoteStation *station, uint32_t size)
void AddCalcTxTime(WifiMode mode, Time t)
virtual void DoReportFinalRtsFailed(WifiRemoteStation *station)
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)
uint32_t m_maxTpRate2
second highest throughput rate
virtual WifiMode GetMode(uint32_t mode) const =0
bool GetShortGuardInterval(const WifiRemoteStation *station) const
uint32_t m_retry
total retries short + long
Ptr< UniformRandomVariable > m_uniformRandomVariable
Provides uniform random variables.
void SetMode(WifiMode mode)
void UpdateRetry(MinstrelWifiRemoteStation *station)
update the number of retries and reset accordingly
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)
initialize Sample Table
uint32_t m_maxProbRate
rate with highest prob of success
static Time CalculateTxDuration(uint32_t size, WifiTxVector txvector, enum WifiPreamble preamble)
uint32_t GetLongRetryCount(const WifiRemoteStation *station) const
virtual void DoReportRtsFailed(WifiRemoteStation *station)
uint32_t m_maxTpRate
the current throughput rate
#define NS_LOG_DEBUG(msg)
Time GetCalcTxTime(WifiMode mode) const
for estimating the TxTime of a packet with a given mode
virtual void DoReportDataFailed(WifiRemoteStation *station)
std::vector< struct RateInfo > MinstrelRate
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range. Both limits are inclusive.
uint32_t GetShortRetryCount(const WifiRemoteStation *station) const
uint32_t m_sampleCol
number of sample columns
uint32_t GetNumberOfTransmitAntennas(void)
virtual ~MinstrelWifiManager()
uint32_t m_shortRetry
short retries such as control packts
Hold an floating point type.
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)
a unique identifier for an interface.
MinstrelRate m_minstrelTable
minstrel table
void RateInit(MinstrelWifiRemoteStation *station)
initialize Minstrel Table
uint32_t m_err
retry errors
TypeId SetParent(TypeId tid)
std::vector< std::vector< uint32_t > > SampleRate
hold per-remote-station state.
Time m_nextStatsUpdate
10 times every second