/usr/include/ns3/minstrel-wifi-manager.h is in libns3-dev 3.13+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2009 Duy Nguyen
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Duy Nguyen <duy@soe.ucsc.edu>
*/
#ifndef MINSTREL_WIFI_MANAGER_H
#define MINSTREL_WIFI_MANAGER_H
#include "wifi-remote-station-manager.h"
#include "wifi-mode.h"
#include "ns3/nstime.h"
#include <vector>
namespace ns3 {
struct MinstrelWifiRemoteStation;
/**
* A struct to contain all information related to a data rate
*/
struct RateInfo
{
/**
* Perfect transmission time calculation, or frame calculation
* Given a bit rate and a packet length n bytes
*/
Time perfectTxTime;
uint32_t retryCount; ///< retry limit
uint32_t adjustedRetryCount; ///< adjust the retry limit for this rate
uint32_t numRateAttempt; ///< how many number of attempts so far
uint32_t numRateSuccess; ///< number of successful pkts
uint32_t prob; ///< (# pkts success )/(# total pkts)
/**
* EWMA calculation
* ewma_prob =[prob *(100 - ewma_level) + (ewma_prob_old * ewma_level)]/100
*/
uint32_t ewmaProb;
uint32_t prevNumRateAttempt; ///< from last rate
uint32_t prevNumRateSuccess; ///< from last rate
uint64_t successHist; ///< aggregate of all successes
uint64_t attemptHist; ///< aggregate of all attempts
uint32_t throughput; ///< throughput of a rate
};
/**
* Data structure for a Minstrel Rate table
* A vector of a struct RateInfo
*/
typedef std::vector<struct RateInfo> MinstrelRate;
/**
* Data structure for a Sample Rate table
* A vector of a vector uint32_t
*/
typedef std::vector<std::vector<uint32_t> > SampleRate;
/**
* \author Duy Nguyen
* \brief Implementation of Minstrel Rate Control Algorithm
* \ingroup wifi
*
* Porting Minstrel from Madwifi and Linux Kernel
* http://linuxwireless.org/en/developers/Documentation/mac80211/RateControl/minstrel
*/
class MinstrelWifiManager : public WifiRemoteStationManager
{
public:
static TypeId GetTypeId (void);
MinstrelWifiManager ();
virtual ~MinstrelWifiManager ();
virtual void SetupPhy (Ptr<WifiPhy> phy);
private:
// overriden from base class
virtual WifiRemoteStation * DoCreateStation (void) const;
virtual void DoReportRxOk (WifiRemoteStation *station,
double rxSnr, WifiMode txMode);
virtual void DoReportRtsFailed (WifiRemoteStation *station);
virtual void DoReportDataFailed (WifiRemoteStation *station);
virtual void DoReportRtsOk (WifiRemoteStation *station,
double ctsSnr, WifiMode ctsMode, double rtsSnr);
virtual void DoReportDataOk (WifiRemoteStation *station,
double ackSnr, WifiMode ackMode, double dataSnr);
virtual void DoReportFinalRtsFailed (WifiRemoteStation *station);
virtual void DoReportFinalDataFailed (WifiRemoteStation *station);
virtual WifiMode DoGetDataMode (WifiRemoteStation *station, uint32_t size);
virtual WifiMode DoGetRtsMode (WifiRemoteStation *station);
virtual bool IsLowLatency (void) const;
/// for estimating the TxTime of a packet with a given mode
Time GetCalcTxTime (WifiMode mode) const;
void AddCalcTxTime (WifiMode mode, Time t);
/// update the number of retries and reset accordingly
void UpdateRetry (MinstrelWifiRemoteStation *station);
/// getting the next sample from Sample Table
uint32_t GetNextSample (MinstrelWifiRemoteStation *station);
/// find a rate to use from Minstrel Table
uint32_t FindRate (MinstrelWifiRemoteStation *station);
/// updating the Minstrel Table every 1/10 seconds
void UpdateStats (MinstrelWifiRemoteStation *station);
/// initialize Minstrel Table
void RateInit (MinstrelWifiRemoteStation *station);
/// initialize Sample Table
void InitSampleTable (MinstrelWifiRemoteStation *station);
/// printing Sample Table
void PrintSampleTable (MinstrelWifiRemoteStation *station);
/// printing Minstrel Table
void PrintTable (MinstrelWifiRemoteStation *station);
void CheckInit (MinstrelWifiRemoteStation *station); ///< check for initializations
typedef std::vector<std::pair<Time,WifiMode> > TxTime;
MinstrelRate m_minstrelTable; ///< minstrel table
SampleRate m_sampleTable; ///< sample table
TxTime m_calcTxTime; ///< to hold all the calculated TxTime for all modes
Time m_updateStats; ///< how frequent do we calculate the stats(1/10 seconds)
double m_lookAroundRate; ///< the % to try other rates than our current rate
double m_ewmaLevel; ///< exponential weighted moving average
uint32_t m_segmentSize; ///< largest allowable segment size
uint32_t m_sampleCol; ///< number of sample columns
uint32_t m_pktLen; ///< packet length used for calculate mode TxTime
uint32_t m_nsupported; ///< modes supported
};
} // namespace ns3
#endif /* MINSTREL_WIFI_MANAGER_H */
|