From 85a341d645b57b7cd88a26ed2ea0a314704240ea Mon Sep 17 00:00:00 2001 From: Jordan Augé Date: Fri, 24 Feb 2017 14:58:01 +0100 Subject: Initial commit: vICN MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I7ce66c4e84a6a1921c63442f858b49e083adc7a7 Signed-off-by: Jordan Augé --- .../wifi/model/minstrel-ht-wifi-manager.h | 202 +++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 emu-radio/ns3-patch/wifi/model/minstrel-ht-wifi-manager.h (limited to 'emu-radio/ns3-patch/wifi/model/minstrel-ht-wifi-manager.h') diff --git a/emu-radio/ns3-patch/wifi/model/minstrel-ht-wifi-manager.h b/emu-radio/ns3-patch/wifi/model/minstrel-ht-wifi-manager.h new file mode 100644 index 00000000..6ea064fa --- /dev/null +++ b/emu-radio/ns3-patch/wifi/model/minstrel-ht-wifi-manager.h @@ -0,0 +1,202 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2015 Ghada Badawy + * + * 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: Ghada Badawy + * + * modified by zeng + * NOTE: currently the spatial stream used are hard coded to 1*1, because only 1 spatial + * stream is supported for 802.11n + */ + + + +#ifndef MINSTREL_HT_WIFI_MANAGER_H +#define MINSTREL_HT_WIFI_MANAGER_H + +#include "wifi-remote-station-manager.h" +#include "wifi-mode.h" +#include "ns3/nstime.h" +#include +#include +#include + + +namespace ns3 { + +struct MinstrelHtWifiRemoteStation; + +/** + * A struct to contain all information related to a data rate + */ +struct HtRateInfo +{ + /** + * 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 HtMinstrelRate; + +struct GroupInfo +{ + /** + * MCS rates are divided into groups based on the number of streams and flags that they use + */ + uint8_t m_col; ///< sample table column + uint8_t m_index; /// McsGroup; + +/** + * Data structure for a Sample Rate table + * A vector of a vector uint32_t + */ +typedef std::vector > HtSampleRate; + + +/** + * \author Ghada Badawy + * \brief Implementation of Minstrel HT Rate Control Algorithm + * \ingroup wifi + * + * http://lwn.net/Articles/376765/ + */ +class MinstrelHtWifiManager : public WifiRemoteStationManager +{ + +public: + static TypeId GetTypeId (void); + MinstrelHtWifiManager (); + virtual ~MinstrelHtWifiManager (); + + virtual void SetupPhy (Ptr phy); + + typedef void (*RateChangeTracedCallback)(const uint64_t rate, const Mac48Address remoteAddress); + +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 WifiTxVector DoGetDataTxVector (WifiRemoteStation *station, uint32_t size); + virtual WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station); + + virtual bool DoNeedDataRetransmission (WifiRemoteStation *st, Ptr packet, bool normally); + + + 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 (MinstrelHtWifiRemoteStation *station); + + /// getting the next sample from Sample Table + uint32_t GetNextSample (MinstrelHtWifiRemoteStation *station); + + /// find a rate to use from Minstrel Table + uint32_t FindRate (MinstrelHtWifiRemoteStation *station); + + /// updating the Minstrel Table every 1/10 seconds + void UpdateStats (MinstrelHtWifiRemoteStation *station); + + /// initialize Minstrel Table + void RateInit (MinstrelHtWifiRemoteStation *station); + + /// initialize Sample Table + void InitSampleTable (MinstrelHtWifiRemoteStation *station); + + /// printing Sample Table + void PrintSampleTable (MinstrelHtWifiRemoteStation *station); + + /// printing Minstrel Table + void PrintTable (MinstrelHtWifiRemoteStation *station); + + void CheckInit (MinstrelHtWifiRemoteStation *station); ///< check for initializations + + uint32_t GetRateId(uint32_t rate); + + uint32_t GetGroupId(uint32_t rate, WifiRemoteStation *st, uint8_t txstreams); + uint32_t GetTxRate(uint32_t groupid, uint32_t index); + uint8_t GetStreams (uint32_t groupId, MinstrelHtWifiRemoteStation *station); + + typedef std::vector > TxTime; + + + 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 + uint8_t m_nGroups;/// m_rateChange; +}; + +} // namespace ns3 + +#endif /* MINSTREL_HT_WIFI_MANAGER_H */ + -- cgit 1.2.3-korg