38 #include "ns3/simulator.h"
40 #include "ns3/double.h"
41 #include "ns3/boolean.h"
46 #define Min(a,b) ((a < b) ? a : b)
47 #define Max(a,b) ((a > b) ? a : b)
84 std::vector<HtRateInfo> ().swap (
m_groupsTable[j].m_ratesTable);
96 static TypeId tid =
TypeId (
"ns3::MinstrelHtWifiManager")
98 .AddConstructor<MinstrelHtWifiManager> ()
99 .SetGroupName (
"Wifi")
100 .AddAttribute (
"UpdateStatistics",
101 "The interval between updating statistics table ",
105 .AddAttribute (
"LookAroundRate",
106 "The percentage to try other rates (for legacy Minstrel)",
109 MakeDoubleChecker<double> (0, 100))
110 .AddAttribute (
"EWMA",
114 MakeDoubleChecker<double> (0, 100))
115 .AddAttribute (
"SampleColumn",
116 "The number of columns used for sampling",
119 MakeUintegerChecker <uint32_t> ())
120 .AddAttribute (
"PacketLength",
121 "The packet length used for calculating mode TxTime",
124 MakeUintegerChecker <uint32_t> ())
125 .AddAttribute (
"UseVhtOnly",
126 "Use only VHT MCSs (and not HT) when VHT is available",
130 .AddAttribute (
"PrintStats",
131 "Control the printing of the statistics table",
135 .AddTraceSource (
"RateChange",
136 "The transmission rate has changed",
138 "ns3::MinstrelHtWifiManager::RateChangeTracedCallback")
173 int64_t numStreamsAssigned = 0;
175 numStreamsAssigned++;
177 return numStreamsAssigned;
226 for (uint8_t chWidth = 20; chWidth <=
MAX_HT_WIDTH; chWidth *= 2)
252 WifiMode mode = htMcsList[deviceIndex];
256 NS_LOG_DEBUG (
"Initialized group " << groupId <<
": (" << (uint16_t)streams <<
"," << (uint16_t)sgi <<
"," << (uint16_t)chWidth <<
")");
265 for (uint16_t chWidth = 20; chWidth <=
MAX_VHT_WIDTH; chWidth *= 2)
298 NS_LOG_DEBUG (
"Initialized group " << groupId <<
": (" << (uint16_t)streams <<
"," << (uint16_t)sgi <<
"," << (uint16_t)chWidth <<
")");
318 NS_LOG_FUNCTION (
this << phy << (uint16_t)streams << (uint16_t)chWidth << mode);
321 txvector.
SetNss (streams);
330 NS_LOG_FUNCTION (
this << phy << (uint16_t)streams << (uint16_t)sgi << (uint16_t)chWidth << mode);
333 txvector.
SetNss (streams);
346 NS_LOG_FUNCTION (
this << phy << (uint16_t)streams << (uint16_t)sgi << (uint16_t)chWidth << mode);
349 txvector.
SetNss (streams);
364 for (TxTime::const_iterator i =
m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.begin (); i !=
m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.end (); i++)
366 if (mode == i->second)
380 m_minstrelGroups[groupId].ratesFirstMpduTxTimeTable.push_back (std::make_pair (t, mode));
390 if (mode == i->second)
404 m_minstrelGroups[groupId].ratesTxTimeTable.push_back (std::make_pair (t, mode));
498 std::ostringstream tmp;
500 station->
m_statsFile.open (tmp.str ().c_str (), std::ios::out);
580 station->
m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt++;
588 double ackSnr,
WifiMode ackMode,
double dataSnr)
620 station->
m_groupsTable[groupId].m_ratesTable[rateId].numRateSuccess++;
621 station->
m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt++;
693 NS_LOG_FUNCTION (
this << st << (uint16_t)nSuccessfulMpdus << (uint16_t)nFailedMpdus << rxSnr << dataSnr);
704 NS_ASSERT_MSG (
false,
"A-MPDU Tx Status called but no HT or VHT supported.");
708 (uint16_t)nSuccessfulMpdus <<
" FailedMpdus= " << (uint16_t)nFailedMpdus);
711 station->
m_ampduLen += nSuccessfulMpdus + nFailedMpdus;
717 station->
m_groupsTable[groupId].m_ratesTable[rateId].numRateSuccess += nSuccessfulMpdus;
718 station->
m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt += nSuccessfulMpdus + nFailedMpdus;
799 station->
m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].retryCount))
807 station->
m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].retryCount +
808 station->
m_groupsTable[maxProbGroupId].m_ratesTable[maxProbRateId].retryCount))
815 NS_ASSERT_MSG (
false,
"Max retries reached and m_longRetry not cleared properly. longRetry= " << station->
m_longRetry);
832 station->
m_groupsTable[maxProbGroupId].m_ratesTable[maxProbRateId].retryCount)
839 NS_ASSERT_MSG (
false,
"Max retries reached and m_longRetry not cleared properly. longRetry= " << station->
m_longRetry);
857 NS_LOG_FUNCTION (
this << station << (uint16_t)nSuccessfulMpdus << (uint16_t)nFailedMpdus);
915 uint32_t mcsIndex = station->
m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex;
924 NS_ASSERT_MSG (
false,
"Inconsistent group selected. Group: (" << (uint16_t)group.
streams <<
"," << (uint16_t)group.
sgi <<
"," << (uint16_t)group.
chWidth <<
")" <<
974 uint32_t mcsIndex = station->
m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex;
981 bool rateFound =
false;
983 for (uint32_t i = 0; i < nBasicRates; i++)
986 if (rate <= lastDataRate)
996 uint32_t nSupportRates = phy->
GetNModes ();
997 for (uint32_t i = 0; i < nSupportRates; i++)
1000 if (rate <= lastDataRate)
1028 uint32_t maxRetries;
1041 NS_LOG_DEBUG (
"No re-transmission allowed. Retries: " << station->
m_longRetry <<
" Max retries: " << maxRetries);
1063 return station->
m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].retryCount +
1064 station->
m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].retryCount +
1065 station->
m_groupsTable[maxProbGroupId].m_ratesTable[maxProbRateId].retryCount;
1069 return 1 + station->
m_groupsTable[maxTpGroupId].m_ratesTable[maxTp2RateId].retryCount +
1070 station->
m_groupsTable[maxProbGroupId].m_ratesTable[maxProbRateId].retryCount;
1088 uint32_t index = station->
m_groupsTable[sampleGroup].m_index;
1093 uint32_t rateIndex =
GetIndex (sampleGroup, sampleIndex);
1153 uint32_t sampleGroupId =
GetGroupId (sampleIdx);
1154 uint32_t sampleRateId =
GetRateId (sampleIdx);
1157 if (station->
m_groupsTable[sampleGroupId].m_supported && station->
m_groupsTable[sampleGroupId].m_ratesTable[sampleRateId].supported)
1169 " SampleRate= " << sampleIdx <<
" SampleProb= " << sampleRateInfo.
ewmaProb);
1190 Time maxTp2Duration = station->
m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].perfectTxTime;
1191 Time maxProbDuration = station->
m_groupsTable[maxProbGroupId].m_ratesTable[maxProbRateId].perfectTxTime;
1193 NS_LOG_DEBUG (
"Use sample rate? SampleDuration= " << sampleDuration <<
" maxTp2Duration= " << maxTp2Duration <<
1194 " maxProbDuration= " << maxProbDuration <<
" sampleStreams= " << (uint16_t)sampleStreams <<
1195 " maxTpStreams= " << (uint16_t)maxTpStreams);
1196 if (sampleDuration < maxTp2Duration || (sampleStreams < maxTpStreams && sampleDuration < maxProbDuration))
1204 NS_LOG_DEBUG (
"FindRate " <<
"sampleRate=" << sampleIdx);
1219 NS_LOG_DEBUG (
"FindRate " <<
"sampleRate=" << sampleIdx);
1280 station->
m_groupsTable[j].m_ratesTable[i].retryUpdated =
false;
1283 "\t attempt=" << station->
m_groupsTable[j].m_ratesTable[i].numRateAttempt <<
1284 "\t success=" << station->
m_groupsTable[j].m_ratesTable[i].numRateSuccess);
1287 if (station->
m_groupsTable[j].m_ratesTable[i].numRateAttempt > 0)
1289 station->
m_groupsTable[j].m_ratesTable[i].numSamplesSkipped = 0;
1294 tempProb = (100 * station->
m_groupsTable[j].m_ratesTable[i].numRateSuccess) / station->
m_groupsTable[j].m_ratesTable[i].numRateAttempt;
1301 station->
m_groupsTable[j].m_ratesTable[i].ewmaProb = tempProb;
1306 tempProb, station->
m_groupsTable[j].m_ratesTable[i].ewmaProb,
1310 station->
m_groupsTable[j].m_ratesTable[i].ewmaProb = tempProb;
1320 station->
m_groupsTable[j].m_ratesTable[i].numSamplesSkipped++;
1326 station->
m_groupsTable[j].m_ratesTable[i].numRateSuccess = 0;
1327 station->
m_groupsTable[j].m_ratesTable[i].numRateAttempt = 0;
1329 if (station->
m_groupsTable[j].m_ratesTable[i].throughput != 0)
1373 Time txTime = station->
m_groupsTable[groupId].m_ratesTable[rateId].perfectTxTime;
1390 uint32_t tmpGroupId, tmpRateId;
1391 double tmpTh, tmpProb;
1392 uint32_t groupId, rateId;
1395 uint32_t maxGPGroupId, maxGPRateId;
1405 tmpProb = station->
m_groupsTable[tmpGroupId].m_ratesTable[tmpRateId].ewmaProb;
1406 tmpTh = station->
m_groupsTable[tmpGroupId].m_ratesTable[tmpRateId].throughput;
1410 currentTh = station->
m_groupsTable[groupId].m_ratesTable[rateId].throughput;
1411 if (currentTh > tmpTh)
1418 maxGPTh = station->
m_groupsTable[maxGPGroupId].m_ratesTable[maxGPRateId].throughput;
1420 if (currentTh > maxGPTh)
1449 uint32_t groupId, rateId;
1451 uint32_t maxTpGroupId, maxTpRateId;
1452 uint32_t maxTp2GroupId, maxTp2RateId;
1453 double maxTpTh, maxTpProb;
1454 double maxTp2Th, maxTp2Prob;
1458 prob = station->
m_groupsTable[groupId].m_ratesTable[rateId].ewmaProb;
1459 th = station->
m_groupsTable[groupId].m_ratesTable[rateId].throughput;
1463 maxTpProb = station->
m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].ewmaProb;
1464 maxTpTh = station->
m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].throughput;
1468 maxTp2Prob = station->
m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].ewmaProb;
1469 maxTp2Th = station->
m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].throughput;
1471 if (th > maxTpTh || (th == maxTpTh && prob > maxTpProb))
1476 else if (th > maxTp2Th || (th == maxTp2Th && prob > maxTp2Prob))
1487 maxTpTh = station->
m_groupsTable[maxTpGroupId].m_ratesTable[maxTpRateId].throughput;
1491 maxTp2Prob = group->
m_ratesTable[maxTp2RateId].ewmaProb;
1492 maxTp2Th = station->
m_groupsTable[maxTp2GroupId].m_ratesTable[maxTp2RateId].throughput;
1494 if (th > maxTpTh || (th == maxTpTh && prob > maxTpProb))
1499 else if (th > maxTp2Th || (th == maxTp2Th && prob > maxTp2Prob))
1517 for (uint32_t groupId = 0; groupId <
m_numGroups; groupId++)
1538 station->
m_groupsTable[groupId].m_ratesTable[i].supported =
false;
1542 for (uint32_t i = 0; i < station->
m_nModes; i++)
1562 station->
m_groupsTable[groupId].m_ratesTable[rateId].supported =
true;
1563 station->
m_groupsTable[groupId].m_ratesTable[rateId].mcsIndex = i;
1564 station->
m_groupsTable[groupId].m_ratesTable[rateId].numRateAttempt = 0;
1565 station->
m_groupsTable[groupId].m_ratesTable[rateId].numRateSuccess = 0;
1566 station->
m_groupsTable[groupId].m_ratesTable[rateId].prob = 0;
1567 station->
m_groupsTable[groupId].m_ratesTable[rateId].ewmaProb = 0;
1568 station->
m_groupsTable[groupId].m_ratesTable[rateId].prevNumRateAttempt = 0;
1569 station->
m_groupsTable[groupId].m_ratesTable[rateId].prevNumRateSuccess = 0;
1570 station->
m_groupsTable[groupId].m_ratesTable[rateId].numSamplesSkipped = 0;
1571 station->
m_groupsTable[groupId].m_ratesTable[rateId].successHist = 0;
1572 station->
m_groupsTable[groupId].m_ratesTable[rateId].attemptHist = 0;
1573 station->
m_groupsTable[groupId].m_ratesTable[rateId].throughput = 0;
1575 station->
m_groupsTable[groupId].m_ratesTable[rateId].retryCount = 0;
1576 station->
m_groupsTable[groupId].m_ratesTable[rateId].adjustedRetryCount = 0;
1594 if (!station->
m_groupsTable[groupId].m_ratesTable[rateId].retryUpdated)
1607 uint32_t cwMax = 1023;
1608 Time cwTime, txTime, dataTxTime;
1610 Time ackTime =
GetMac ()->GetBasicBlockAckTimeout ();
1612 if (station->
m_groupsTable[groupId].m_ratesTable[rateId].ewmaProb < 1)
1614 station->
m_groupsTable[groupId].m_ratesTable[rateId].retryCount = 1;
1618 station->
m_groupsTable[groupId].m_ratesTable[rateId].retryCount = 2;
1619 station->
m_groupsTable[groupId].m_ratesTable[rateId].retryUpdated =
true;
1625 cwTime = (cw / 2) * slotTime;
1626 cw =
Min ((cw + 1) * 2, cwMax);
1627 cwTime += (cw / 2) * slotTime;
1628 cw =
Min ((cw + 1) * 2, cwMax);
1631 txTime = cwTime + 2 * (dataTxTime + ackTime);
1637 cwTime = (cw / 2) * slotTime;
1638 cw =
Min ((cw + 1) * 2, cwMax);
1641 txTime += cwTime + ackTime + dataTxTime;
1644 && (++station->
m_groupsTable[groupId].m_ratesTable[rateId].retryCount < 7));
1651 double diff, incr, tmp;
1654 diff = currentProb - ewmaProb;
1655 incr = (100 - weight) * diff / 100;
1656 tmp = oldEwmsd * oldEwmsd;
1657 tmp = weight * (tmp + diff * incr) / 100;
1676 for (uint32_t i = 0; i < numSampleRates; i++ )
1683 newIndex = (i + uv) % numSampleRates;
1701 station->
m_statsFile <<
" best ____________rate__________ ________statistics________ ________last_______ ______sum-of________\n" <<
1702 " mode guard # rate [name idx airtime max_tp] [avg(tp) avg(prob) sd(prob)] [prob.|retry|suc|att] [#success | #attempts]\n";
1730 for (uint32_t i = 0; i < numRates; i++)
1736 of <<
"HT" << group.
chWidth <<
" " << giMode <<
"GI " << (int)group.
streams <<
" ";
1740 of <<
"VHT" << group.
chWidth <<
" " << giMode <<
"GI " << (int)group.
streams <<
" ";
1747 uint32_t idx =
GetIndex (groupId, i);
1748 if (idx == maxTpRate)
1756 if (idx == maxTpRate2)
1764 if (idx == maxProbRate)
1775 of << std::setw (4) <<
" MCS" << (group.
streams - 1) * 8 + i;
1779 of << std::setw (7) <<
" MCS" << i <<
"/" << (int) group.
streams;
1782 of <<
" " << std::setw (3) << idx <<
" ";
1789 std::setw (7) << station->
m_groupsTable[groupId].m_ratesTable[i].throughput / 100 <<
" " <<
1790 std::setw (7) << station->
m_groupsTable[groupId].m_ratesTable[i].ewmaProb <<
" " <<
1791 std::setw (7) << station->
m_groupsTable[groupId].m_ratesTable[i].ewmsdProb <<
" " <<
1792 std::setw (7) << station->
m_groupsTable[groupId].m_ratesTable[i].prob <<
" " <<
1793 std::setw (2) << station->
m_groupsTable[groupId].m_ratesTable[i].retryCount <<
" " <<
1794 std::setw (3) << station->
m_groupsTable[groupId].m_ratesTable[i].prevNumRateSuccess <<
" " <<
1795 std::setw (3) << station->
m_groupsTable[groupId].m_ratesTable[i].prevNumRateAttempt <<
" " <<
1796 std::setw (9) << station->
m_groupsTable[groupId].m_ratesTable[i].successHist <<
" " <<
1797 std::setw (9) << station->
m_groupsTable[groupId].m_ratesTable[i].attemptHist <<
"\n";
1831 NS_LOG_FUNCTION (
this << (uint16_t)txstreams << (uint16_t)sgi << (uint16_t)chWidth);
1839 NS_LOG_FUNCTION (
this << (uint16_t)txstreams << (uint16_t)sgi << (uint16_t)chWidth);
1849 uint32_t groupId = 0;
1850 uint32_t rateId = 0;
1851 while (groupId < m_numGroups && !station->m_groupsTable[groupId].m_supported)
1855 while (rateId < m_numRates && !station->m_groupsTable[groupId].m_ratesTable[rateId].supported)
1868 uint32_t rateId = 0;
1869 while (rateId < m_numRates && !station->m_groupsTable[groupId].m_ratesTable[rateId].supported)
1883 for (uint32_t i = 0; i < phy->
GetNMcs (); i++)
1888 vhtMcsList.push_back (mode);
1899 for (uint32_t i = 0; i < phy->
GetNMcs (); i++)
1904 htMcsList.push_back (mode);
1916 NS_FATAL_ERROR (
"WifiRemoteStationManager selected does not support HE rates");
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.
bool GetVhtSupported(Mac48Address address) const
Return whether the station supports VHT or not.
Simulation virtual time values and global simulation resolution.
void DoReportAmpduTxStatus(WifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr)
Typically called per A-MPDU, either when a Block ACK was successfully received or when a BlockAckTime...
A struct to contain information of a group.
#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 the RngStream.
AttributeValue implementation for Boolean.
double CalculateThroughput(MinstrelHtWifiRemoteStation *station, uint32_t groupId, uint32_t rateId, double ewmaProb)
Return the average throughput of the MCS defined by groupId and rateId.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
static const uint8_t MAX_SUPPORTED_STREAMS
Constants for maximum values.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
WifiModeList GetHtDeviceMcsList(void) const
Returns a list of only the HT MCS supported by the device.
void PrintTable(MinstrelHtWifiRemoteStation *station)
Printing Minstrel Table.
void SetupMac(const Ptr< WifiMac > mac)
Set up MAC associated with this device since it is the object that knows the full set of timing param...
void UpdatePacketCounters(MinstrelHtWifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus)
Update the number of sample count variables.
uint32_t GetLowestIndex(MinstrelHtWifiRemoteStation *station)
Returns the lowest global index of the rates supported by the station.
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
uint32_t m_maxProbRate
The highest success probability rate of this group.
double CalculateEwmsd(double oldEwmsd, double currentProb, double ewmaProb, uint32_t weight)
Perform EWMSD (Exponentially Weighted Moving Standard Deviation) calculation.
MinstrelHtWifiRemoteStation structure.
WifiTxVector DoGetDataTxVector(WifiRemoteStation *station)
hold per-remote-station state for Minstrel Wifi manager.
uint32_t m_ampduPacketCount
Number of A-MPDUs transmitted.
uint32_t GetIndex(uint32_t groupId, uint32_t rateId)
Returns the global index corresponding to the groupId and rateId.
static const uint8_t MAX_VHT_STREAM_GROUPS
Maximal number of groups per stream in VHT (4 possible channel widths and 2 possible SGI configuratio...
#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 m_maxTpRate
The max throughput rate of this group.
void SetStbc(bool stbc)
Sets if STBC is being used.
void DoReportFinalRtsFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class.
Mac48Address m_address
Mac48Address of the remote station.
void StatsDump(MinstrelHtWifiRemoteStation *station, uint32_t index, std::ofstream &of)
Print group statistics.
HtMinstrelRate m_ratesTable
Information about rates of this group.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
uint8_t sgi
short guard interval (0 or 1)
uint32_t m_txrate
current transmit rate
uint32_t GetHtGroupId(uint8_t txstreams, uint8_t sgi, uint8_t chWidth)
Returns the groupId of a HT MCS with the given number of streams, if using sgi and the channel width ...
uint8_t GetNMcs(void) const
The WifiPhy::GetNMcs() method is used (e.g., by a WifiRemoteStationManager) to determine the set of t...
void DoReportRxOk(WifiRemoteStation *station, double rxSnr, WifiMode txMode)
This method is a pure virtual method that must be implemented by the sub-class.
WifiMode GetMcsSupported(const WifiRemoteStation *station, uint32_t i) const
Return the WifiMode supported by the specified station at the specified index.
bool DoNeedDataRetransmission(WifiRemoteStation *st, Ptr< const Packet > packet, bool normally)
MinstrelRate m_minstrelTable
minstrel table
uint32_t m_frameLength
Frame length used for calculate modes TxTime.
MinstrelMcsGroups m_minstrelGroups
Global array for groups information.
bool m_isHt
If the station is HT capable.
bool m_sampleDeferred
a flag to indicate sample rate is on the second stage
uint32_t m_maxTpRate2
The second max throughput rate of this group.
uint16_t GetFrequency(void) const
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.
bool GetStbc(void) const
Return whether STBC is supported.
WifiRemoteStationState * m_state
Remote station state.
bool m_printStats
If statistics table should be printed.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
Ptr< WifiPhy > GetPhy(void) const
Return the WifiPhy.
Time CalculateTxDuration(uint32_t size, WifiTxVector txVector, uint16_t frequency)
bool GetStbc(const WifiRemoteStation *station) const
Return whether the given station supports space-time block coding (STBC).
uint32_t m_col
To keep track of the current position in the our random sample table going row by row from 1st column...
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
int64x64_t Min(const int64x64_t &a, const int64x64_t &b)
Minimum.
void AddFirstMpduTxTime(uint32_t groupId, WifiMode mode, Time t)
Save a TxTime to the vector of groups.
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
WifiTxVector DoGetRtsTxVector(WifiRemoteStation *station)
int64_t GetMicroSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
uint8_t GetNumberOfAntennas(void)
AttributeValue implementation for Time.
double m_ewmaLevel
Exponential weighted moving average level (or coefficient).
void CalculateRetransmits(MinstrelHtWifiRemoteStation *station, uint32_t index)
Calculate the number of retransmissions to set for the index rate.
SampleRate m_sampleTable
sample table
void SetGuardInterval(uint16_t guardInterval)
Sets the guard interval duration (in nanoseconds)
Hold an unsigned integer type.
static const uint8_t MAX_VHT_GROUP_RATES
Number of rates (or MCS) per VHT group.
Time GetMpduTxTime(uint32_t groupId, WifiMode mode) const
Obtain the TXtime saved in the group information.
static const uint8_t MAX_HT_WIDTH
Maximal channel width.
bool IsValidMcs(Ptr< WifiPhy > phy, uint8_t streams, uint8_t chWidth, WifiMode mode)
Check the validity of a combination of number of streams, chWidth and mode.
virtual ~MinstrelHtWifiManager()
WifiPreamble GetPreambleForTransmission(WifiMode mode, Mac48Address dest)
Return the preamble to be used for the transmission.
uint64_t GetDataRate(uint8_t channelWidth, uint16_t guardInterval, uint8_t nss) const
WifiMode GetBasicMode(uint32_t i) const
Return a basic mode from the set of basic modes.
uint8_t GetChannelWidth(const WifiRemoteStation *station) const
Return the channel width supported by the station.
int64x64_t Max(const int64x64_t &a, const int64x64_t &b)
Maximum.
static const uint8_t MAX_HT_STREAM_GROUPS
Maximal number of groups per stream in HT (2 possible channel widths and 2 possible SGI configuration...
void DoDisposeStation(WifiRemoteStation *station)
Dispose station function.
uint8_t GetMcsValue(void) const
uint32_t GetRateId(uint32_t index)
For managing rates from different groups, a global index for all rates in all groups is used...
uint32_t m_sampleWait
How many transmission attempts to wait until a new sample.
uint8_t GetNumberOfSupportedStreams(const WifiRemoteStation *station) const
Return the number of supported streams the station has.
Mac48Address GetAddress(const WifiRemoteStation *station) const
Return the address of the station.
uint32_t GetNModes(void) const
The WifiPhy::GetNModes() and WifiPhy::GetMode() methods are used (e.g., by a WifiRemoteStationManager...
virtual void SetupPhy(const Ptr< WifiPhy > phy)
Set up PHY associated with this device since it is the object that knows the full set of transmit rat...
Ptr< UniformRandomVariable > m_uniformRandomVariable
Provides uniform random variables.
hold a list of per-remote-station state.
bool m_useVhtOnly
If only VHT MCS should be used, instead of HT and VHT.
std::vector< struct GroupInfo > McsGroupData
Data structure for a table of groups.
uint32_t m_longRetry
long retries such as data packets
static TypeId GetTypeId(void)
Get the type ID.
static const uint8_t MAX_VHT_WIDTH
Maximal channel width.
uint32_t GetNess(const WifiRemoteStation *station) const
void SetNss(uint8_t nss)
Sets the number of Nss refer to IEEE 802.11n Table 20-28 for explanation and range.
bool m_initialized
for initializing tables
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
WifiRemoteStation * DoCreateStation(void) const
Time CalculateFirstMpduTxDuration(Ptr< WifiPhy > phy, uint8_t streams, uint8_t sgi, uint8_t chWidth, WifiMode mode)
Estimates the TxTime of a frame with a given mode and group (stream, guard interval and channel width...
WifiMode GetMcs(uint8_t mcs) const
The WifiPhy::GetMcs() method is used (e.g., by a WifiRemoteStationManager) to determine the set of tr...
double ewmaProb
Exponential weighted moving average of probability.
Time perfectTxTime
Perfect transmission time calculation, or frame calculation.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
uint8_t m_numRates
Number of rates per group Minstrel should consider.
uint32_t m_maxTpRate2
second highest throughput rate
void SetBestStationThRates(MinstrelHtWifiRemoteStation *station, uint32_t index)
Set index rate as maxTpRate or maxTp2Rate if is better than current values.
void InitSampleTable(MinstrelHtWifiRemoteStation *station)
Initialize Sample Table.
static bool IsValidTxVector(WifiTxVector txVector)
The standard disallows certain combinations of WifiMode, number of spatial streams, and channel widths.
void SetPreambleType(WifiPreamble preamble)
Sets the preamble type.
void DisposeStation()
Dispose station function.
Ptr< const AttributeChecker > MakeBooleanChecker(void)
void DoReportRtsFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class.
void UpdateRetry(MinstrelHtWifiRemoteStation *station)
Update the number of retries and reset accordingly.
uint32_t m_nSampleCol
Number of sample columns.
uint32_t m_sampleCount
Max number of samples per update interval.
void DoReportFinalDataFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class.
uint8_t m_numGroups
Number of groups Minstrel should consider.
void SetHeSupported(bool enable)
Enable or disable HE capability support.
Time m_updateStats
How frequent do we calculate the stats (1/10 seconds).
bool HasVhtSupported(void) const
Return whether the device has VHT capability support enabled.
static const uint8_t MAX_HT_GROUP_RATES
Number of rates (or MCS) per HT group.
void DoReportDataFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class.
void UpdateStats(MinstrelHtWifiRemoteStation *station)
Updating the Minstrel Table every 1/10 seconds.
McsGroupData m_groupsTable
Table of groups with stats.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
std::vector< WifiMode > WifiModeList
In various parts of the code, folk are interested in maintaining a list of transmission modes...
bool GetShortGuardInterval(const WifiRemoteStation *station) const
Return whether the given station supports HT/VHT short guard interval.
uint32_t GetVhtGroupId(uint8_t txstreams, uint8_t sgi, uint8_t chWidth)
Returns the groupId of a VHT MCS with the given number of streams, if using sgi and the channel width...
WifiModeList GetVhtDeviceMcsList(void) const
Returns a list of only the VHT MCS supported by the device.
static Time Now(void)
Return the current simulation virtual time.
double m_ampduLen
Number of MPDUs in an A-MPDU.
std::vector< HtRateInfo > HtMinstrelRate
Data structure for a Minstrel Rate table.
std::ofstream m_statsFile
File where statistics table is written.
void RateInit(MinstrelHtWifiRemoteStation *station)
Initialize Minstrel Table.
int m_totalPacketsCount
total number of packets as of now
uint64_t GetNonHtReferenceRate(void) const
Implementation of Minstrel HT Rate Control AlgorithmMinstrel-HT is a rate adaptation mechanism for th...
uint32_t FindRate(MinstrelHtWifiRemoteStation *station)
Find a rate to use from Minstrel Table.
void SetupPhy(const Ptr< WifiPhy > phy)
Set up PHY associated with this device since it is the object that knows the full set of transmit rat...
bool HasHtSupported(void) const
Return whether the device has HT capability support enabled.
void SetMode(WifiMode mode)
Sets the selected payload transmission mode.
Data structure to contain the information that defines a group.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
void DoInitialize(void)
Initialize() implementation.
Time CalculateMpduTxDuration(Ptr< WifiPhy > phy, uint8_t streams, uint8_t sgi, uint8_t chWidth, WifiMode mode)
Estimates the TxTime of a frame with a given mode and group (stream, guard interval and channel width...
int m_samplePacketsCount
how many packets we have sample so far
uint8_t GetDefaultTxPowerLevel(void) const
double m_lookAroundRate
The % to try other rates than our current rate.
virtual void SetupMac(const Ptr< WifiMac > mac)
Set up MAC associated with this device since it is the object that knows the full set of timing param...
uint32_t m_maxProbRate
rate with highest prob of success
uint32_t GetNBasicModes(void) const
Return the number of basic modes we support.
uint32_t GetLongRetryCount(const WifiRemoteStation *station) const
Return the long retry limit of the given station.
std::vector< McsGroup > MinstrelMcsGroups
Data structure for a table of group definitions.
uint32_t GetNMcsSupported(const WifiRemoteStation *station) const
Return the number of MCS supported by the given station.
uint32_t m_nModes
number of modes supported
void AddMpduTxTime(uint32_t groupId, WifiMode mode, Time t)
Save a TxTime to the vector of groups.
A struct to contain all statistics information related to a data rate.
void SetNextSample(MinstrelHtWifiRemoteStation *station)
Set the next sample from Sample Table.
uint32_t m_maxTpRate
the current throughput rate
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
uint32_t m_numSamplesSlow
Number of times a slow rate was sampled.
Time Seconds(double value)
Construct a Time in the indicated unit.
Ptr< MinstrelWifiManager > m_legacyManager
Pointer to an instance of MinstrelWifiManager.
uint32_t numSamplesSkipped
Number of times this rate statistics were not updated because no attempts have been made...
uint32_t GetGroupId(uint32_t index)
Return the groupId from the global index.
void SetBestProbabilityRate(MinstrelHtWifiRemoteStation *station, uint32_t index)
Set index rate as maxProbRate if it is better than current value.
uint32_t m_sampleTries
Number of sample tries after waiting sampleWait.
uint8_t chWidth
channel width (MHz)
void SetNess(uint8_t ness)
Sets the Ness number refer to IEEE 802.11n Table 20-6 for explanation.
bool IsLowLatency(void) const
Time GetFirstMpduTxTime(uint32_t groupId, WifiMode mode) const
Obtain the TXtime saved in the group information.
void SetChannelWidth(uint8_t channelWidth)
Sets the selected channelWidth (in MHz)
uint32_t GetShortRetryCount(const WifiRemoteStation *station) const
Return the short retry limit of the given station.
uint32_t CountRetries(MinstrelHtWifiRemoteStation *station)
Count retries.
TracedCallback< uint64_t, Mac48Address > m_rateChange
The trace source fired when the transmission rate change.
WifiModulationClass GetModulationClass() const
WifiMode GetMode(void) const
void UpdateRate(MinstrelHtWifiRemoteStation *station)
Update rate.
uint32_t GetNextSample(MinstrelHtWifiRemoteStation *station)
Getting the next sample from Sample Table.
The MPDU is part of an A-MPDU, but is not the last aggregate.
double m_avgAmpduLen
Average number of MPDUs in an A-MPDU.
uint32_t m_shortRetry
short retries such as control packts
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.
This class can be used to hold variables of floating point type such as 'double' or 'float'...
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
a unique identifier for an interface.
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.
void CheckInit(MinstrelHtWifiRemoteStation *station)
Check for initializations.
uint32_t m_sampleGroup
The group that the sample rate belongs to.
hold per-remote-station state.
bool GetHtSupported(const WifiRemoteStation *station) const
Return whether the given station is HT capable.
Ptr< WifiMac > GetMac(void) const
Return the WifiMac.
WifiMode GetMode(uint32_t mode) const
The WifiPhy::GetNModes() and WifiPhy::GetMode() methods are used (e.g., by a WifiRemoteStationManager...
Time m_nextStatsUpdate
10 times every second