Implementation of Minstrel Rate Control AlgorithmPorting Minstrel from Madwifi and Linux Kernel http://linuxwireless.org/en/developers/Documentation/mac80211/RateControl/minstrel. More...
#include <minstrel-wifi-manager.h>
Public Member Functions | |
MinstrelWifiManager () | |
virtual | ~MinstrelWifiManager () |
int64_t | AssignStreams (int64_t stream) |
virtual void | SetupPhy (Ptr< WifiPhy > phy) |
![]() | |
WifiRemoteStationManager () | |
virtual | ~WifiRemoteStationManager () |
void | AddBasicMode (WifiMode mode) |
void | AddSupportedMode (Mac48Address address, WifiMode mode) |
WifiMode | GetAckMode (Mac48Address address, WifiMode dataMode) |
WifiMode | GetBasicMode (uint32_t i) const |
WifiMode | GetCtsMode (Mac48Address address, WifiMode rtsMode) |
WifiMode | GetDataMode (Mac48Address address, const WifiMacHeader *header, Ptr< const Packet > packet, uint32_t fullPacketSize) |
WifiMode | GetDefaultMode (void) const |
uint32_t | GetFragmentationThreshold (void) const |
uint32_t | GetFragmentOffset (Mac48Address address, const WifiMacHeader *header, Ptr< const Packet > packet, uint32_t fragmentNumber) |
uint32_t | GetFragmentSize (Mac48Address address, const WifiMacHeader *header, Ptr< const Packet > packet, uint32_t fragmentNumber) |
WifiRemoteStationInfo | GetInfo (Mac48Address address) |
uint32_t | GetMaxSlrc (void) const |
uint32_t | GetMaxSsrc (void) const |
uint32_t | GetNBasicModes (void) const |
WifiMode | GetNonUnicastMode (void) const |
uint32_t | GetRtsCtsThreshold (void) const |
WifiMode | GetRtsMode (Mac48Address address, const WifiMacHeader *header, Ptr< const Packet > packet) |
bool | IsAssociated (Mac48Address address) const |
bool | IsBrandNew (Mac48Address address) const |
bool | IsLastFragment (Mac48Address address, const WifiMacHeader *header, Ptr< const Packet > packet, uint32_t fragmentNumber) |
bool | IsWaitAssocTxOk (Mac48Address address) const |
bool | NeedDataRetransmission (Mac48Address address, const WifiMacHeader *header, Ptr< const Packet > packet) |
bool | NeedFragmentation (Mac48Address address, const WifiMacHeader *header, Ptr< const Packet > packet) |
bool | NeedRts (Mac48Address address, const WifiMacHeader *header, Ptr< const Packet > packet) |
bool | NeedRtsRetransmission (Mac48Address address, const WifiMacHeader *header, Ptr< const Packet > packet) |
void | PrepareForQueue (Mac48Address address, const WifiMacHeader *header, Ptr< const Packet > packet, uint32_t fullPacketSize) |
void | RecordDisassociated (Mac48Address address) |
void | RecordGotAssocTxFailed (Mac48Address address) |
void | RecordGotAssocTxOk (Mac48Address address) |
void | RecordWaitAssocTxOk (Mac48Address address) |
void | ReportDataFailed (Mac48Address address, const WifiMacHeader *header) |
void | ReportDataOk (Mac48Address address, const WifiMacHeader *header, double ackSnr, WifiMode ackMode, double dataSnr) |
void | ReportFinalDataFailed (Mac48Address address, const WifiMacHeader *header) |
void | ReportFinalRtsFailed (Mac48Address address, const WifiMacHeader *header) |
void | ReportRtsFailed (Mac48Address address, const WifiMacHeader *header) |
void | ReportRtsOk (Mac48Address address, const WifiMacHeader *header, double ctsSnr, WifiMode ctsMode, double rtsSnr) |
void | ReportRxOk (Mac48Address address, const WifiMacHeader *header, double rxSnr, WifiMode txMode) |
void | Reset (void) |
void | Reset (Mac48Address address) |
void | SetFragmentationThreshold (uint32_t threshold) |
void | SetMaxSlrc (uint32_t maxSlrc) |
void | SetMaxSsrc (uint32_t maxSsrc) |
void | SetRtsCtsThreshold (uint32_t threshold) |
![]() | |
Object () | |
virtual | ~Object () |
void | AggregateObject (Ptr< Object > other) |
void | Dispose (void) |
AggregateIterator | GetAggregateIterator (void) const |
virtual TypeId | GetInstanceTypeId (void) const |
template<typename T > | |
Ptr< T > | GetObject (void) const |
template<typename T > | |
Ptr< T > | GetObject (TypeId tid) const |
void | Start (void) |
![]() | |
SimpleRefCount () | |
SimpleRefCount (const SimpleRefCount &o) | |
uint32_t | GetReferenceCount (void) const |
SimpleRefCount & | operator= (const SimpleRefCount &o) |
void | Ref (void) const |
void | Unref (void) const |
![]() | |
virtual | ~ObjectBase () |
void | GetAttribute (std::string name, AttributeValue &value) const |
bool | GetAttributeFailSafe (std::string name, AttributeValue &attribute) const |
void | SetAttribute (std::string name, const AttributeValue &value) |
bool | SetAttributeFailSafe (std::string name, const AttributeValue &value) |
bool | TraceConnect (std::string name, std::string context, const CallbackBase &cb) |
bool | TraceConnectWithoutContext (std::string name, const CallbackBase &cb) |
bool | TraceDisconnect (std::string name, std::string context, const CallbackBase &cb) |
bool | TraceDisconnectWithoutContext (std::string name, const CallbackBase &cb) |
Static Public Member Functions | |
static TypeId | GetTypeId (void) |
Private Types | |
typedef std::vector< std::pair < Time, WifiMode > > | TxTime |
Private Member Functions | |
void | AddCalcTxTime (WifiMode mode, Time t) |
void | CheckInit (MinstrelWifiRemoteStation *station) |
check for initializations | |
virtual WifiRemoteStation * | DoCreateStation (void) const |
virtual WifiMode | DoGetDataMode (WifiRemoteStation *station, uint32_t size) |
virtual WifiMode | DoGetRtsMode (WifiRemoteStation *station) |
virtual void | DoReportDataFailed (WifiRemoteStation *station) |
virtual void | DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode, double dataSnr) |
virtual void | DoReportFinalDataFailed (WifiRemoteStation *station) |
virtual void | DoReportFinalRtsFailed (WifiRemoteStation *station) |
virtual void | DoReportRtsFailed (WifiRemoteStation *station) |
virtual void | DoReportRtsOk (WifiRemoteStation *station, double ctsSnr, WifiMode ctsMode, double rtsSnr) |
virtual void | DoReportRxOk (WifiRemoteStation *station, double rxSnr, WifiMode txMode) |
uint32_t | FindRate (MinstrelWifiRemoteStation *station) |
find a rate to use from Minstrel Table | |
Time | GetCalcTxTime (WifiMode mode) const |
for estimating the TxTime of a packet with a given mode | |
uint32_t | GetNextSample (MinstrelWifiRemoteStation *station) |
getting the next sample from Sample Table | |
void | InitSampleTable (MinstrelWifiRemoteStation *station) |
initialize Sample Table | |
virtual bool | IsLowLatency (void) const |
void | PrintSampleTable (MinstrelWifiRemoteStation *station) |
printing Sample Table | |
void | PrintTable (MinstrelWifiRemoteStation *station) |
printing Minstrel Table | |
void | RateInit (MinstrelWifiRemoteStation *station) |
initialize Minstrel Table | |
void | UpdateRetry (MinstrelWifiRemoteStation *station) |
update the number of retries and reset accordingly | |
void | UpdateStats (MinstrelWifiRemoteStation *station) |
updating the Minstrel Table every 1/10 seconds |
Private Attributes | |
TxTime | m_calcTxTime |
to hold all the calculated TxTime for all modes | |
double | m_ewmaLevel |
exponential weighted moving average | |
double | m_lookAroundRate |
the % to try other rates than our current rate | |
MinstrelRate | m_minstrelTable |
minstrel table | |
uint32_t | m_nsupported |
modes supported | |
uint32_t | m_pktLen |
packet length used for calculate mode TxTime | |
uint32_t | m_sampleCol |
number of sample columns | |
SampleRate | m_sampleTable |
sample table | |
uint32_t | m_segmentSize |
largest allowable segment size | |
Ptr< UniformRandomVariable > | m_uniformRandomVariable |
Provides uniform random variables. | |
Time | m_updateStats |
how frequent do we calculate the stats(1/10 seconds) |
Additional Inherited Members | |
![]() | |
virtual void | DoDispose (void) |
uint32_t | GetNSupported (const WifiRemoteStation *station) const |
WifiMode | GetSupported (const WifiRemoteStation *station, uint32_t i) const |
Implementation of Minstrel Rate Control Algorithm
Porting Minstrel from Madwifi and Linux Kernel http://linuxwireless.org/en/developers/Documentation/mac80211/RateControl/minstrel.
ns3::MinstrelWifiManager is accessible through the following paths with Config::Set and Config::Connect:
No TraceSources are defined for this type.
Definition at line 87 of file minstrel-wifi-manager.h.
|
private |
Definition at line 155 of file minstrel-wifi-manager.h.
ns3::MinstrelWifiManager::MinstrelWifiManager | ( | ) |
Definition at line 121 of file minstrel-wifi-manager.cc.
References m_nsupported, and m_uniformRandomVariable.
|
virtual |
Definition at line 128 of file minstrel-wifi-manager.cc.
Definition at line 168 of file minstrel-wifi-manager.cc.
References m_calcTxTime.
Referenced by SetupPhy().
int64_t ns3::MinstrelWifiManager::AssignStreams | ( | int64_t | stream | ) |
Assign a fixed random variable stream number to the random variables used by this model. Return the number of streams (possibly zero) that have been assigned.
stream | first stream index to use |
Definition at line 145 of file minstrel-wifi-manager.cc.
References m_uniformRandomVariable, NS_LOG_FUNCTION, and ns3::RandomVariableStream::SetStream().
|
private |
check for initializations
Definition at line 201 of file minstrel-wifi-manager.cc.
References ns3::WifiRemoteStationManager::GetNSupported(), InitSampleTable(), ns3::MinstrelWifiRemoteStation::m_initialized, m_minstrelTable, m_nsupported, m_sampleCol, m_sampleTable, and RateInit().
Referenced by DoGetDataMode(), DoReportDataFailed(), and DoReportDataOk().
|
privatevirtual |
Definition at line 174 of file minstrel-wifi-manager.cc.
References ns3::MinstrelWifiRemoteStation::m_col, ns3::MinstrelWifiRemoteStation::m_currentRate, ns3::MinstrelWifiRemoteStation::m_err, ns3::MinstrelWifiRemoteStation::m_index, ns3::MinstrelWifiRemoteStation::m_initialized, ns3::MinstrelWifiRemoteStation::m_isSampling, ns3::MinstrelWifiRemoteStation::m_longRetry, ns3::MinstrelWifiRemoteStation::m_maxProbRate, ns3::MinstrelWifiRemoteStation::m_maxTpRate, ns3::MinstrelWifiRemoteStation::m_maxTpRate2, ns3::MinstrelWifiRemoteStation::m_nextStatsUpdate, ns3::MinstrelWifiRemoteStation::m_packetCount, ns3::MinstrelWifiRemoteStation::m_retry, ns3::MinstrelWifiRemoteStation::m_sampleCount, ns3::MinstrelWifiRemoteStation::m_sampleRate, ns3::MinstrelWifiRemoteStation::m_sampleRateSlower, ns3::MinstrelWifiRemoteStation::m_shortRetry, ns3::MinstrelWifiRemoteStation::m_txrate, m_updateStats, and ns3::Now().
|
privatevirtual |
start the rate at half way
Definition at line 439 of file minstrel-wifi-manager.cc.
References CheckInit(), ns3::WifiRemoteStationManager::GetSupported(), ns3::MinstrelWifiRemoteStation::m_initialized, m_nsupported, ns3::MinstrelWifiRemoteStation::m_txrate, and UpdateStats().
|
privatevirtual |
Definition at line 455 of file minstrel-wifi-manager.cc.
References ns3::WifiRemoteStationManager::GetSupported(), ns3::MinstrelWifiRemoteStation::m_txrate, and NS_LOG_DEBUG.
|
privatevirtual |
Retry Chain table is implemented here
Try | LOOKAROUND RATE | NORMAL RATE
1 | Best throughput | Random rate | Best throughput 2 | Random rate | Best throughput | Next best throughput 3 | Best probability | Best probability | Best probability 4 | Lowest Baserate | Lowest baserate | Lowest baserate
Note: For clarity, multiple blocks of if's and else's are used After a failing 7 times, DoReportFinalDataFailed will be called
for normal rate, we're not currently sampling random rates
use best throughput rate
< there's still a few retries left
use second best throughput rate
use best probability rate
use lowest base rate
for look-around rate, we're currently sampling random rates
current sampling rate is slower than the current best rate
use best throughput rate
< there are a few retries left
use random rate
use max probability rate
use lowest base rate
current sampling rate is better than current best rate
use random rate
< keep using it
use the best rate
use the best probability rate
use the lowest base rate
Definition at line 248 of file minstrel-wifi-manager.cc.
References CheckInit(), ns3::MinstrelWifiRemoteStation::m_initialized, ns3::MinstrelWifiRemoteStation::m_isSampling, ns3::MinstrelWifiRemoteStation::m_longRetry, ns3::MinstrelWifiRemoteStation::m_maxProbRate, ns3::MinstrelWifiRemoteStation::m_maxTpRate, ns3::MinstrelWifiRemoteStation::m_maxTpRate2, m_minstrelTable, ns3::MinstrelWifiRemoteStation::m_sampleRate, ns3::MinstrelWifiRemoteStation::m_sampleRateSlower, ns3::MinstrelWifiRemoteStation::m_txrate, and NS_LOG_DEBUG.
|
privatevirtual |
Definition at line 382 of file minstrel-wifi-manager.cc.
References CheckInit(), FindRate(), ns3::MinstrelWifiRemoteStation::m_initialized, ns3::MinstrelWifiRemoteStation::m_isSampling, m_minstrelTable, m_nsupported, ns3::MinstrelWifiRemoteStation::m_packetCount, ns3::MinstrelWifiRemoteStation::m_retry, ns3::MinstrelWifiRemoteStation::m_sampleRateSlower, ns3::MinstrelWifiRemoteStation::m_txrate, and UpdateRetry().
|
privatevirtual |
Definition at line 411 of file minstrel-wifi-manager.cc.
References FindRate(), ns3::MinstrelWifiRemoteStation::m_err, ns3::MinstrelWifiRemoteStation::m_isSampling, m_minstrelTable, m_nsupported, ns3::MinstrelWifiRemoteStation::m_retry, ns3::MinstrelWifiRemoteStation::m_sampleRateSlower, ns3::MinstrelWifiRemoteStation::m_txrate, NS_LOG_DEBUG, and UpdateRetry().
|
privatevirtual |
Definition at line 240 of file minstrel-wifi-manager.cc.
References ns3::MinstrelWifiRemoteStation::m_err, and UpdateRetry().
|
privatevirtual |
Definition at line 225 of file minstrel-wifi-manager.cc.
References ns3::MinstrelWifiRemoteStation::m_shortRetry, ns3::MinstrelWifiRemoteStation::m_txrate, and NS_LOG_DEBUG.
|
privatevirtual |
Definition at line 234 of file minstrel-wifi-manager.cc.
References NS_LOG_DEBUG.
|
privatevirtual |
Definition at line 218 of file minstrel-wifi-manager.cc.
References NS_LOG_DEBUG.
|
private |
find a rate to use from Minstrel Table
for determining when to try a sample rate
if we are below the target of look around rate percentage, look around note: do it randomly by flipping a coin instead sampling all at once until it reaches the look around rate
now go through the table and find an index rate
This if condition is used to make sure that we don't need to use the sample rate it is the same as our current rate
start sample count
set flag that we are currently sampling
bookeeping for resetting stuff
error check
set the rate that we're currently sampling
is this rate slower than the current best rate
using the best rate instead
continue using the best rate
Definition at line 489 of file minstrel-wifi-manager.cc.
References ns3::UniformRandomVariable::GetInteger(), GetNextSample(), ns3::MinstrelWifiRemoteStation::m_isSampling, m_lookAroundRate, ns3::MinstrelWifiRemoteStation::m_maxTpRate, ns3::MinstrelWifiRemoteStation::m_maxTpRate2, m_minstrelTable, m_nsupported, ns3::MinstrelWifiRemoteStation::m_packetCount, ns3::MinstrelWifiRemoteStation::m_sampleCount, ns3::MinstrelWifiRemoteStation::m_sampleRate, ns3::MinstrelWifiRemoteStation::m_sampleRateSlower, ns3::MinstrelWifiRemoteStation::m_txrate, m_uniformRandomVariable, and NS_LOG_DEBUG.
Referenced by DoReportDataOk(), and DoReportFinalDataFailed().
for estimating the TxTime of a packet with a given mode
Definition at line 153 of file minstrel-wifi-manager.cc.
References m_calcTxTime, NS_ASSERT, and ns3::Seconds().
Referenced by RateInit().
|
private |
getting the next sample from Sample Table
bookeeping for m_index and m_col variables
Definition at line 469 of file minstrel-wifi-manager.cc.
References ns3::MinstrelWifiRemoteStation::m_col, ns3::MinstrelWifiRemoteStation::m_index, m_nsupported, m_sampleCol, and m_sampleTable.
Referenced by FindRate().
|
static |
Reimplemented from ns3::WifiRemoteStationManager.
Definition at line 82 of file minstrel-wifi-manager.cc.
References m_ewmaLevel, m_lookAroundRate, m_pktLen, m_sampleCol, m_segmentSize, m_updateStats, ns3::Seconds(), and ns3::TypeId::SetParent().
|
private |
initialize Sample Table
for off-seting to make rates fall between 0 and numrates
The next two lines basically tries to generate a random number between 0 and the number of available rates
this loop is used for filling in other uninitilized places
Definition at line 739 of file minstrel-wifi-manager.cc.
References ns3::UniformRandomVariable::GetInteger(), ns3::MinstrelWifiRemoteStation::m_col, ns3::MinstrelWifiRemoteStation::m_index, m_nsupported, m_sampleCol, m_sampleTable, m_uniformRandomVariable, and NS_LOG_DEBUG.
Referenced by CheckInit().
|
privatevirtual |
Definition at line 464 of file minstrel-wifi-manager.cc.
|
private |
printing Sample Table
Definition at line 773 of file minstrel-wifi-manager.cc.
References m_nsupported, m_sampleCol, m_sampleTable, and NS_LOG_DEBUG.
|
private |
printing Minstrel Table
Definition at line 789 of file minstrel-wifi-manager.cc.
References m_minstrelTable, m_nsupported, and NS_LOG_DEBUG.
|
private |
initialize Minstrel Table
Definition at line 717 of file minstrel-wifi-manager.cc.
References GetCalcTxTime(), ns3::WifiRemoteStationManager::GetSupported(), m_minstrelTable, m_nsupported, and NS_LOG_DEBUG.
Referenced by CheckInit(), and UpdateStats().
Reimplemented from ns3::WifiRemoteStationManager.
Definition at line 133 of file minstrel-wifi-manager.cc.
References AddCalcTxTime(), ns3::WifiPhy::CalculateTxDuration(), ns3::WifiPhy::GetMode(), ns3::WifiPhy::GetNModes(), m_pktLen, and ns3::WIFI_PREAMBLE_LONG.
|
private |
update the number of retries and reset accordingly
Definition at line 431 of file minstrel-wifi-manager.cc.
References ns3::MinstrelWifiRemoteStation::m_longRetry, ns3::MinstrelWifiRemoteStation::m_retry, and ns3::MinstrelWifiRemoteStation::m_shortRetry.
Referenced by DoReportDataOk(), DoReportFinalDataFailed(), and DoReportFinalRtsFailed().
|
private |
updating the Minstrel Table every 1/10 seconds
calculate the perfect tx time for this rate
just for initialization
if we've attempted something
calculate the probability of success assume probability scales from 0 to 18000
bookeeping
ewma probability (cast for gcc 3.4 compatibility)
calculating throughput
bookeeping
Sample less often below 10% and above 95% of success
retry count denotes the number of retries permitted for each rate
if it's 0 allow one retry limit
go find max throughput, second maximum throughput, high probability succ
find the second highest max
reset it
Definition at line 577 of file minstrel-wifi-manager.cc.
References ns3::Time::GetMicroSeconds(), ns3::MinstrelWifiRemoteStation::m_currentRate, m_ewmaLevel, ns3::MinstrelWifiRemoteStation::m_initialized, ns3::MinstrelWifiRemoteStation::m_maxProbRate, ns3::MinstrelWifiRemoteStation::m_maxTpRate, ns3::MinstrelWifiRemoteStation::m_maxTpRate2, m_minstrelTable, ns3::MinstrelWifiRemoteStation::m_nextStatsUpdate, m_nsupported, ns3::MinstrelWifiRemoteStation::m_txrate, m_updateStats, ns3::Now(), ns3::Simulator::Now(), NS_LOG_DEBUG, RateInit(), and ns3::Seconds().
Referenced by DoGetDataMode().
|
private |
to hold all the calculated TxTime for all modes
Definition at line 160 of file minstrel-wifi-manager.h.
Referenced by AddCalcTxTime(), and GetCalcTxTime().
|
private |
exponential weighted moving average
Definition at line 163 of file minstrel-wifi-manager.h.
Referenced by GetTypeId(), and UpdateStats().
|
private |
the % to try other rates than our current rate
Definition at line 162 of file minstrel-wifi-manager.h.
Referenced by FindRate(), and GetTypeId().
|
private |
minstrel table
Definition at line 156 of file minstrel-wifi-manager.h.
Referenced by CheckInit(), DoReportDataFailed(), DoReportDataOk(), DoReportFinalDataFailed(), FindRate(), PrintTable(), RateInit(), and UpdateStats().
|
private |
modes supported
Definition at line 167 of file minstrel-wifi-manager.h.
Referenced by CheckInit(), DoGetDataMode(), DoReportDataOk(), DoReportFinalDataFailed(), FindRate(), GetNextSample(), InitSampleTable(), MinstrelWifiManager(), PrintSampleTable(), PrintTable(), RateInit(), and UpdateStats().
|
private |
packet length used for calculate mode TxTime
Definition at line 166 of file minstrel-wifi-manager.h.
Referenced by GetTypeId(), and SetupPhy().
|
private |
number of sample columns
Definition at line 165 of file minstrel-wifi-manager.h.
Referenced by CheckInit(), GetNextSample(), GetTypeId(), InitSampleTable(), and PrintSampleTable().
|
private |
sample table
Definition at line 157 of file minstrel-wifi-manager.h.
Referenced by CheckInit(), GetNextSample(), InitSampleTable(), and PrintSampleTable().
|
private |
largest allowable segment size
Definition at line 164 of file minstrel-wifi-manager.h.
Referenced by GetTypeId().
|
private |
Provides uniform random variables.
Definition at line 170 of file minstrel-wifi-manager.h.
Referenced by AssignStreams(), FindRate(), InitSampleTable(), and MinstrelWifiManager().
|
private |
how frequent do we calculate the stats(1/10 seconds)
Definition at line 161 of file minstrel-wifi-manager.h.
Referenced by DoCreateStation(), GetTypeId(), and UpdateStats().