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 | |
int64_t | AssignStreams (int64_t stream) |
virtual void | SetupPhy (Ptr< WifiPhy > phy) |
Public Member Functions inherited from ns3::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) |
Public Member Functions inherited from ns3::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 | Initialize (void) |
Public Member Functions inherited from ns3::SimpleRefCount< Object, ObjectBase, ObjectDeleter > | |
SimpleRefCount (const SimpleRefCount &o) | |
uint32_t | GetReferenceCount (void) const |
SimpleRefCount & | operator= (const SimpleRefCount &o) |
void | Ref (void) const |
void | Unref (void) const |
Public Member Functions inherited from ns3::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) |
Static Public Member Functions inherited from ns3::WifiRemoteStationManager | |
static TypeId | GetTypeId (void) |
Static Public Member Functions inherited from ns3::Object | |
static TypeId | GetTypeId (void) |
Static Public Member Functions inherited from ns3::SimpleRefCount< Object, ObjectBase, ObjectDeleter > | |
static void | Cleanup (void) |
Static Public Member Functions inherited from ns3::ObjectBase | |
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 More... | |
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 More... | |
void | InitSampleTable (MinstrelWifiRemoteStation *station) |
initialize Sample Table More... | |
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 More... | |
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 | |
Protected Member Functions inherited from ns3::WifiRemoteStationManager | |
virtual void | DoDispose (void) |
uint32_t | GetNSupported (const WifiRemoteStation *station) const |
WifiMode | GetSupported (const WifiRemoteStation *station, uint32_t i) const |
Protected Member Functions inherited from ns3::Object | |
Object (const Object &o) | |
virtual void | DoInitialize (void) |
virtual void | NotifyNewAggregate (void) |
Protected Member Functions inherited from ns3::ObjectBase | |
void | ConstructSelf (const AttributeConstructionList &attributes) |
virtual void | NotifyConstructionCompleted (void) |
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.
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().
|
privatevirtual |
Implements ns3::WifiRemoteStationManager.
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_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::Simulator::Now().
|
privatevirtual |
station | the station with which we need to communicate |
size | size of the packet or fragment we want to send |
Note: This method is called before sending a unicast packet or a fragment of a unicast packet to decide which transmission mode to use.
start the rate at half way
Implements ns3::WifiRemoteStationManager.
Definition at line 439 of file minstrel-wifi-manager.cc.
References CheckInit(), ns3::MinstrelWifiRemoteStation::m_initialized, m_nsupported, ns3::MinstrelWifiRemoteStation::m_txrate, and UpdateStats().
|
privatevirtual |
station | the station with which we need to communicate |
Note: This method is called before sending an rts to a station to decide which transmission mode to use for the rts.
Implements ns3::WifiRemoteStationManager.
Definition at line 455 of file minstrel-wifi-manager.cc.
References 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
Implements ns3::WifiRemoteStationManager.
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.
|
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.
|
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, m_nsupported, m_sampleCol, and m_sampleTable.
Referenced by FindRate().
|
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, m_nsupported, m_sampleCol, m_sampleTable, m_uniformRandomVariable, and NS_LOG_DEBUG.
Referenced by CheckInit().
|
privatevirtual |
Note: In this context, low vs high latency is defined in IEEE 802.11 Rate Adaptation: A Practical Approach, by M. Lacage, M.H. Manshaei, and T. Turletti.
Implements ns3::WifiRemoteStationManager.
Definition at line 464 of file minstrel-wifi-manager.cc.
|
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::Simulator::Now(), NS_LOG_DEBUG, RateInit(), and ns3::Seconds().
Referenced by DoGetDataMode().