# HG changeset patch # User Mathieu Lacage # Date 1204513419 -3600 # Node ID 2e6e1a6e0d9474ce55dfea3382680e478a439a42 # Parent 401bfe8c0176a6400eea0d929c3f3aaaf54cb7cb port last rate control algorithms diff -r 401bfe8c0176 -r 2e6e1a6e0d94 src/devices/wifi/amrr-wifi-manager.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/devices/wifi/amrr-wifi-manager.cc Mon Mar 03 04:03:39 2008 +0100 @@ -0,0 +1,290 @@ +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2003,2007 INRIA + * + * 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: Mathieu Lacage + */ + +#include "amrr-wifi-manager.h" +#include "ns3/simulator.h" +#include "ns3/log.h" +#include "ns3/uinteger.h" +#include "ns3/double.h" + +NS_LOG_COMPONENT_DEFINE ("AmrrWifiRemoteStation"); + +namespace ns3 { + +NS_OBJECT_ENSURE_REGISTERED (AmrrWifiManager); + +TypeId +AmrrWifiManager::GetTypeId (void) +{ + static TypeId tid = TypeId ("AmrrWifiManager") + .SetParent () + .AddConstructor () + .AddAttribute ("UpdatePeriod", + "The interval between decisions about rate control changes", + Seconds (1.0), + MakeTimeAccessor (&AmrrWifiManager::m_updatePeriod), + MakeTimeChecker ()) + .AddAttribute ("FailureRatio", + "Ratio of minimum erronous transmissions needed to switch to a lower rate", + Double (1.0/3.0), + MakeDoubleAccessor (&AmrrWifiManager::m_failureRatio), + MakeDoubleChecker (0.0, 1.0)) + .AddAttribute ("SuccessRatio", + "Ratio of maximum erronous transmissions needed to switch to a higher rate", + Double (1.0/10.0), + MakeDoubleAccessor (&AmrrWifiManager::m_successRatio), + MakeDoubleChecker (0.0, 1.0)) + .AddAttribute ("MaxSuccessThreshold", + "Maximum number of consecutive success periods needed to switch to a higher rate", + Uinteger (10), + MakeUintegerAccessor (&AmrrWifiManager::m_maxSuccessThreshold), + MakeUintegerChecker ()) + .AddAttribute ("MinSuccessThreshold", + "Minimum number of consecutive success periods needed to switch to a higher rate", + Uinteger (1), + MakeUintegerAccessor (&AmrrWifiManager::m_minSuccessThreshold), + MakeUintegerChecker ()) + ; + return tid; +} + +AmrrWifiManager::AmrrWifiManager () +{} +WifiRemoteStation * +AmrrWifiManager::CreateStation (void) +{ + return new AmrrWifiRemoteStation (this); +} + +AmrrWifiRemoteStation::AmrrWifiRemoteStation (Ptr stations) + : m_stations (stations), + m_nextModeUpdate (Simulator::Now () + stations->m_updatePeriod), + m_tx_ok (0), + m_tx_err (0), + m_tx_retr (0), + m_retry (0), + m_txrate (0), + m_successThreshold (m_stations->m_minSuccessThreshold), + m_success (0), + m_recovery (false) +{} +AmrrWifiRemoteStation::~AmrrWifiRemoteStation () +{} + +void +AmrrWifiRemoteStation::ReportRxOk (double rxSnr, WifiMode txMode) +{} +void +AmrrWifiRemoteStation::ReportRtsFailed (void) +{} +void +AmrrWifiRemoteStation::ReportDataFailed (void) +{ + m_retry++; + m_tx_retr++; +} +void +AmrrWifiRemoteStation::ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr) +{} +void +AmrrWifiRemoteStation::ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr) +{ + m_retry = 0; + m_tx_ok++; +} +void +AmrrWifiRemoteStation::ReportFinalRtsFailed (void) +{} +void +AmrrWifiRemoteStation::ReportFinalDataFailed (void) +{ + m_retry = 0; + m_tx_err++; +} +bool +AmrrWifiRemoteStation::IsMinRate (void) const +{ + return (m_txrate == 0); +} +bool +AmrrWifiRemoteStation::IsMaxRate (void) const +{ + NS_ASSERT (m_txrate + 1 <= GetNSupportedModes ()); + return (m_txrate + 1 == GetNSupportedModes ()); +} +bool +AmrrWifiRemoteStation::IsSuccess (void) const +{ + return (m_tx_retr + m_tx_err) < m_tx_ok * m_stations->m_successRatio; +} +bool +AmrrWifiRemoteStation::IsFailure (void) const +{ + return (m_tx_retr + m_tx_err) > m_tx_ok * m_stations->m_failureRatio; +} +bool +AmrrWifiRemoteStation::IsEnough (void) const +{ + return (m_tx_retr + m_tx_err + m_tx_ok) > 10; +} +void +AmrrWifiRemoteStation::ResetCnt (void) +{ + m_tx_ok = 0; + m_tx_err = 0; + m_tx_retr = 0; +} +void +AmrrWifiRemoteStation::IncreaseRate (void) +{ + m_txrate++; + NS_ASSERT (m_txrate < GetNSupportedModes ()); +} +void +AmrrWifiRemoteStation::DecreaseRate (void) +{ + m_txrate--; +} + +void +AmrrWifiRemoteStation::UpdateMode (void) +{ + if (Simulator::Now () < m_nextModeUpdate) + { + return; + } + m_nextModeUpdate = Simulator::Now () + m_stations->m_updatePeriod; + NS_LOG_DEBUG ("Update"); + + bool needChange = false; + + if (IsSuccess () && IsEnough ()) + { + m_success++; + NS_LOG_DEBUG ("++ success="< +AmrrWifiRemoteStation::GetManager (void) const +{ + return m_stations; +} +WifiMode +AmrrWifiRemoteStation::DoGetDataMode (uint32_t size) +{ + UpdateMode (); + NS_ASSERT (m_txrate < GetNSupportedModes ()); + uint32_t rateIndex; + if (m_retry < 1) + { + rateIndex = m_txrate; + } + else if (m_retry < 2) + { + if (m_txrate > 0) + { + rateIndex = m_txrate - 1; + } + else + { + rateIndex = m_txrate; + } + } + else if (m_retry < 3) + { + if (m_txrate > 1) + { + rateIndex = m_txrate - 2; + } + else + { + rateIndex = m_txrate; + } + } + else + { + if (m_txrate > 2) + { + rateIndex = m_txrate - 3; + } + else + { + rateIndex = m_txrate; + } + } + + return GetSupportedMode (rateIndex); +} +WifiMode +AmrrWifiRemoteStation::DoGetRtsMode (void) +{ + UpdateMode (); + // XXX: can we implement something smarter ? + return GetSupportedMode (0); +} + +} // namespace ns3 diff -r 401bfe8c0176 -r 2e6e1a6e0d94 src/devices/wifi/amrr-wifi-manager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/devices/wifi/amrr-wifi-manager.h Mon Mar 03 04:03:39 2008 +0100 @@ -0,0 +1,93 @@ +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2003,2007 INRIA + * + * 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: Mathieu Lacage + */ +#ifndef AMRR_WIFI_MANAGER_H +#define AMRR_WIFI_MANAGER_H + +#include "wifi-remote-station-manager.h" +#include "ns3/nstime.h" + +namespace ns3 { + +class AmrrWifiManager : public WifiRemoteStationManager +{ +public: + static TypeId GetTypeId (void); + + AmrrWifiManager (); + +private: + friend class AmrrWifiRemoteStation; + virtual WifiRemoteStation *CreateStation (void); + + Time m_updatePeriod; + double m_failureRatio; + double m_successRatio; + uint32_t m_maxSuccessThreshold; + uint32_t m_minSuccessThreshold; +}; + +/** + */ +class AmrrWifiRemoteStation : public WifiRemoteStation +{ +public: + AmrrWifiRemoteStation (Ptr stations); + + virtual ~AmrrWifiRemoteStation (); + + virtual void ReportRxOk (double rxSnr, WifiMode txMode); + virtual void ReportRtsFailed (void); + virtual void ReportDataFailed (void); + virtual void ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr); + virtual void ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr); + virtual void ReportFinalRtsFailed (void); + virtual void ReportFinalDataFailed (void); + +private: + virtual Ptr GetManager (void) const; + virtual WifiMode DoGetDataMode (uint32_t size); + virtual WifiMode DoGetRtsMode (void); + + void UpdateRetry (void); + void UpdateMode (void); + void ResetCnt (void); + void IncreaseRate (void); + void DecreaseRate (void); + bool IsMinRate (void) const; + bool IsMaxRate (void) const; + bool IsSuccess (void) const; + bool IsFailure (void) const; + bool IsEnough (void) const; + + Ptr m_stations; + Time m_nextModeUpdate; + uint32_t m_tx_ok; + uint32_t m_tx_err; + uint32_t m_tx_retr; + uint32_t m_retry; + uint32_t m_txrate; + uint32_t m_successThreshold; + uint32_t m_success; + bool m_recovery; +}; + +} // namespace ns3 + +#endif /* AMRR_WIFI_MANAGER_H */ diff -r 401bfe8c0176 -r 2e6e1a6e0d94 src/devices/wifi/onoe-mac-stations.cc --- a/src/devices/wifi/onoe-mac-stations.cc Mon Mar 03 02:07:40 2008 +0100 +++ b/src/devices/wifi/onoe-mac-stations.cc Mon Mar 03 04:03:39 2008 +0100 @@ -18,13 +18,11 @@ * Author: Mathieu Lacage */ -#include "onoe-mac-stations.h" -#include "ns3/default-value.h" -#include "ns3/time-default-value.h" +#include "onoe-wifi-manager.h" #include "ns3/simulator.h" #include "ns3/log.h" -NS_LOG_COMPONENT_DEFINE ("OnoeMacStation"); +NS_LOG_COMPONENT_DEFINE ("OnoeWifiRemoteStation"); namespace ns3 { @@ -41,19 +39,19 @@ "Raise threshold", 10); -OnoeMacStations::OnoeMacStations (WifiMode defaultTxMode) +OnoeWifiManager::OnoeWifiManager (WifiMode defaultTxMode) : MacStations (defaultTxMode), m_updatePeriod (g_updatePeriod.GetValue ()), m_addCreditThreshold (g_addCreditThreshold.GetValue ()), m_raiseThreshold (g_raiseThreshold.GetValue ()) {} MacStation * -OnoeMacStations::CreateStation (void) +OnoeWifiManager::CreateStation (void) { - return new OnoeMacStation (this); + return new OnoeWifiRemoteStation (this); } -OnoeMacStation::OnoeMacStation (OnoeMacStations *stations) +OnoeWifiRemoteStation::OnoeWifiRemoteStation (OnoeWifiManager *stations) : m_stations (stations), m_nextModeUpdate (Simulator::Now () + stations->m_updatePeriod), m_shortRetry (0), @@ -64,52 +62,52 @@ m_tx_upper (0), m_txrate (0) {} -OnoeMacStation::~OnoeMacStation () +OnoeWifiRemoteStation::~OnoeWifiRemoteStation () {} void -OnoeMacStation::ReportRxOk (double rxSnr, WifiMode txMode) +OnoeWifiRemoteStation::ReportRxOk (double rxSnr, WifiMode txMode) {} void -OnoeMacStation::ReportRtsFailed (void) +OnoeWifiRemoteStation::ReportRtsFailed (void) { m_shortRetry++; } void -OnoeMacStation::ReportDataFailed (void) +OnoeWifiRemoteStation::ReportDataFailed (void) { m_longRetry++; } void -OnoeMacStation::ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr) +OnoeWifiRemoteStation::ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr) {} void -OnoeMacStation::ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr) +OnoeWifiRemoteStation::ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr) { UpdateRetry (); m_tx_ok++; } void -OnoeMacStation::ReportFinalRtsFailed (void) +OnoeWifiRemoteStation::ReportFinalRtsFailed (void) { UpdateRetry (); m_tx_err++; } void -OnoeMacStation::ReportFinalDataFailed (void) +OnoeWifiRemoteStation::ReportFinalDataFailed (void) { UpdateRetry (); m_tx_err++; } void -OnoeMacStation::UpdateRetry (void) +OnoeWifiRemoteStation::UpdateRetry (void) { m_tx_retr += m_shortRetry + m_longRetry; m_shortRetry = 0; m_longRetry = 0; } void -OnoeMacStation::UpdateMode (void) +OnoeWifiRemoteStation::UpdateMode (void) { if (Simulator::Now () < m_nextModeUpdate) { @@ -173,13 +171,13 @@ } -OnoeMacStations * -OnoeMacStation::GetStations (void) const +OnoeWifiManager * +OnoeWifiRemoteStation::GetStations (void) const { return m_stations; } WifiMode -OnoeMacStation::DoGetDataMode (uint32_t size) +OnoeWifiRemoteStation::DoGetDataMode (uint32_t size) { UpdateMode (); NS_ASSERT (m_txrate < GetNSupportedModes ()); @@ -224,7 +222,7 @@ return GetSupportedMode (rateIndex); } WifiMode -OnoeMacStation::DoGetRtsMode (void) +OnoeWifiRemoteStation::DoGetRtsMode (void) { UpdateMode (); // XXX: can we implement something smarter ? diff -r 401bfe8c0176 -r 2e6e1a6e0d94 src/devices/wifi/onoe-mac-stations.h --- a/src/devices/wifi/onoe-mac-stations.h Mon Mar 03 02:07:40 2008 +0100 +++ b/src/devices/wifi/onoe-mac-stations.h Mon Mar 03 04:03:39 2008 +0100 @@ -20,19 +20,19 @@ #ifndef ONOE_MAC_STATIONS_H #define ONOE_MAC_STATIONS_H -#include "mac-stations.h" +#include "wifi-remote-station-manager.h" #include "ns3/nstime.h" namespace ns3 { -class OnoeMacStations : public MacStations +class OnoeWifiManager : public WifiRemoteStationManager { public: - OnoeMacStations (WifiMode defaultTxMode); + OnoeWifiManager (); private: - friend class OnoeMacStation; - virtual MacStation *CreateStation (void); + friend class OnoeWifiRemoteStation; + virtual WifiRemoteStation *CreateStation (void); Time m_updatePeriod; uint32_t m_addCreditThreshold; @@ -48,12 +48,12 @@ * any publication or reference about this algorithm beyond the madwifi * source code. */ -class OnoeMacStation : public MacStation +class OnoeWifiRemoteStation : public WifiRemoteStation { public: - OnoeMacStation (OnoeMacStations *stations); + OnoeWifiRemoteStation (OnoeWifiManager *stations); - virtual ~OnoeMacStation (); + virtual ~OnoeWifiRemoteStation (); virtual void ReportRxOk (double rxSnr, WifiMode txMode); virtual void ReportRtsFailed (void); @@ -64,14 +64,14 @@ virtual void ReportFinalDataFailed (void); private: - virtual OnoeMacStations *GetStations (void) const; + virtual OnoeWifiManager *GetStations (void) const; virtual WifiMode DoGetDataMode (uint32_t size); virtual WifiMode DoGetRtsMode (void); void UpdateRetry (void); void UpdateMode (void); - OnoeMacStations *m_stations; + OnoeWifiManager *m_stations; Time m_nextModeUpdate; uint32_t m_shortRetry; uint32_t m_longRetry; diff -r 401bfe8c0176 -r 2e6e1a6e0d94 src/devices/wifi/onoe-wifi-manager.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/devices/wifi/onoe-wifi-manager.cc Mon Mar 03 04:03:39 2008 +0100 @@ -0,0 +1,239 @@ +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2003,2007 INRIA + * + * 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: Mathieu Lacage + */ + +#include "onoe-wifi-manager.h" +#include "ns3/simulator.h" +#include "ns3/log.h" +#include "ns3/uinteger.h" + +NS_LOG_COMPONENT_DEFINE ("OnoeWifiRemoteStation"); + +namespace ns3 { + +TypeId +OnoeWifiManager::GetTypeId (void) +{ + static TypeId tid = TypeId ("OnoeWifiManager") + .SetParent () + .AddConstructor () + .AddAttribute ("UpdatePeriod", + "The interval between decisions about rate control changes", + Seconds (1.0), + MakeTimeAccessor (&OnoeWifiManager::m_updatePeriod), + MakeTimeChecker ()) + .AddAttribute ("RaiseThreshold", "XXX", + Uinteger (10), + MakeUintegerAccessor (&OnoeWifiManager::m_raiseThreshold), + MakeUintegerChecker ()) + .AddAttribute ("AddCreditThreshold", "Add credit threshold", + Uinteger (10), + MakeUintegerAccessor (&OnoeWifiManager::m_addCreditThreshold), + MakeUintegerChecker ()) + ; + return tid; +} + +OnoeWifiManager::OnoeWifiManager () +{} +WifiRemoteStation * +OnoeWifiManager::CreateStation (void) +{ + return new OnoeWifiRemoteStation (this); +} + +OnoeWifiRemoteStation::OnoeWifiRemoteStation (Ptr stations) + : m_stations (stations), + m_nextModeUpdate (Simulator::Now () + stations->m_updatePeriod), + m_shortRetry (0), + m_longRetry (0), + m_tx_ok (0), + m_tx_err (0), + m_tx_retr (0), + m_tx_upper (0), + m_txrate (0) +{} +OnoeWifiRemoteStation::~OnoeWifiRemoteStation () +{} + +void +OnoeWifiRemoteStation::ReportRxOk (double rxSnr, WifiMode txMode) +{} +void +OnoeWifiRemoteStation::ReportRtsFailed (void) +{ + m_shortRetry++; +} +void +OnoeWifiRemoteStation::ReportDataFailed (void) +{ + m_longRetry++; +} +void +OnoeWifiRemoteStation::ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr) +{} +void +OnoeWifiRemoteStation::ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr) +{ + UpdateRetry (); + m_tx_ok++; +} +void +OnoeWifiRemoteStation::ReportFinalRtsFailed (void) +{ + UpdateRetry (); + m_tx_err++; +} +void +OnoeWifiRemoteStation::ReportFinalDataFailed (void) +{ + UpdateRetry (); + m_tx_err++; +} +void +OnoeWifiRemoteStation::UpdateRetry (void) +{ + m_tx_retr += m_shortRetry + m_longRetry; + m_shortRetry = 0; + m_longRetry = 0; +} +void +OnoeWifiRemoteStation::UpdateMode (void) +{ + if (Simulator::Now () < m_nextModeUpdate) + { + return; + } + m_nextModeUpdate = Simulator::Now () + m_stations->m_updatePeriod; + /** + * The following 20 lines of code were copied from the Onoe + * rate control kernel module used in the madwifi driver. + */ + + int dir = 0, enough; + uint32_t nrate; + enough = (m_tx_ok + m_tx_err >= 10); + + /* no packet reached -> down */ + if (m_tx_err > 0 && m_tx_ok == 0) + dir = -1; + + /* all packets needs retry in average -> down */ + if (enough && m_tx_ok < m_tx_retr) + dir = -1; + + /* no error and less than rate_raise% of packets need retry -> up */ + if (enough && m_tx_err == 0 && + m_tx_retr < (m_tx_ok * m_stations->m_addCreditThreshold) / 100) + dir = 1; + + NS_LOG_DEBUG (this << " ok " << m_tx_ok << " err " << m_tx_err << " retr " << m_tx_retr << + " upper " << m_tx_upper << " dir " << dir); + + nrate = m_txrate; + switch (dir) { + case 0: + if (enough && m_tx_upper > 0) + m_tx_upper--; + break; + case -1: + if (nrate > 0) { + nrate--; + } + m_tx_upper = 0; + break; + case 1: + /* raise rate if we hit rate_raise_threshold */ + if (++m_tx_upper < m_stations->m_raiseThreshold) + break; + m_tx_upper = 0; + if (nrate + 1 < GetNSupportedModes ()) { + nrate++; + } + break; + } + + if (nrate != m_txrate) { + NS_ASSERT (nrate < GetNSupportedModes ()); + m_txrate = nrate; + m_tx_ok = m_tx_err = m_tx_retr = m_tx_upper = 0; + } else if (enough) + m_tx_ok = m_tx_err = m_tx_retr = 0; + +} + +Ptr +OnoeWifiRemoteStation::GetManager (void) const +{ + return m_stations; +} +WifiMode +OnoeWifiRemoteStation::DoGetDataMode (uint32_t size) +{ + UpdateMode (); + NS_ASSERT (m_txrate < GetNSupportedModes ()); + uint32_t rateIndex; + if (m_longRetry < 4) + { + rateIndex = m_txrate; + } + else if (m_longRetry < 6) + { + if (m_txrate > 0) + { + rateIndex = m_txrate - 1; + } + else + { + rateIndex = m_txrate; + } + } + else if (m_longRetry < 8) + { + if (m_txrate > 1) + { + rateIndex = m_txrate - 2; + } + else + { + rateIndex = m_txrate; + } + } + else + { + if (m_txrate > 2) + { + rateIndex = m_txrate - 3; + } + else + { + rateIndex = m_txrate; + } + } + return GetSupportedMode (rateIndex); +} +WifiMode +OnoeWifiRemoteStation::DoGetRtsMode (void) +{ + UpdateMode (); + // XXX: can we implement something smarter ? + return GetSupportedMode (0); +} + +} // namespace ns3 diff -r 401bfe8c0176 -r 2e6e1a6e0d94 src/devices/wifi/onoe-wifi-manager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/devices/wifi/onoe-wifi-manager.h Mon Mar 03 04:03:39 2008 +0100 @@ -0,0 +1,89 @@ +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2003,2007 INRIA + * + * 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: Mathieu Lacage + */ +#ifndef ONOE_WIFI_MANAGER_H +#define ONOE_WIFI_MANAGER_H + +#include "wifi-remote-station-manager.h" +#include "ns3/nstime.h" + +namespace ns3 { + +class OnoeWifiManager : public WifiRemoteStationManager +{ +public: + static TypeId GetTypeId (void); + + OnoeWifiManager (); + +private: + friend class OnoeWifiRemoteStation; + virtual WifiRemoteStation *CreateStation (void); + + Time m_updatePeriod; + uint32_t m_addCreditThreshold; + uint32_t m_raiseThreshold; +}; + +/** + * \brief an implementation of rate control algorithm developed + * by Atsushi Onoe + * + * This algorithm is well known because it has been used as the default + * rate control algorithm for the madwifi driver. I am not aware of + * any publication or reference about this algorithm beyond the madwifi + * source code. + */ +class OnoeWifiRemoteStation : public WifiRemoteStation +{ +public: + OnoeWifiRemoteStation (Ptr stations); + + virtual ~OnoeWifiRemoteStation (); + + virtual void ReportRxOk (double rxSnr, WifiMode txMode); + virtual void ReportRtsFailed (void); + virtual void ReportDataFailed (void); + virtual void ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr); + virtual void ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr); + virtual void ReportFinalRtsFailed (void); + virtual void ReportFinalDataFailed (void); + +private: + virtual Ptr GetManager (void) const; + virtual WifiMode DoGetDataMode (uint32_t size); + virtual WifiMode DoGetRtsMode (void); + + void UpdateRetry (void); + void UpdateMode (void); + + Ptr m_stations; + Time m_nextModeUpdate; + uint32_t m_shortRetry; + uint32_t m_longRetry; + uint32_t m_tx_ok; + uint32_t m_tx_err; + uint32_t m_tx_retr; + uint32_t m_tx_upper; + uint32_t m_txrate; +}; + +} // namespace ns3 + +#endif /* ONOE_WIFI_MANAGER_H */ diff -r 401bfe8c0176 -r 2e6e1a6e0d94 src/devices/wifi/rraa-wifi-manager.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/devices/wifi/rraa-wifi-manager.cc Mon Mar 03 04:03:39 2008 +0100 @@ -0,0 +1,407 @@ +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2004,2005,2006 INRIA + * + * 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: Federico Maguolo + */ + +#include "rraa-wifi-manager.h" +#include "ns3/assert.h" +#include "ns3/log.h" +#include "ns3/boolean.h" +#include "ns3/double.h" +#include "ns3/uinteger.h" +#include "ns3/simulator.h" + +NS_LOG_COMPONENT_DEFINE ("RraaWifiManager"); + +namespace ns3 { + +RraaWifiRemoteStation::RraaWifiRemoteStation (Ptr stations) + : m_stations (stations) +{ + m_initialized = false; + m_rtsWnd = 0; + m_rtsCounter = 0; + m_rtsOn = false; + m_lastFrameFail = false; +} + +RraaWifiRemoteStation::~RraaWifiRemoteStation () +{} + +void +RraaWifiRemoteStation::ResetCountersBasic (void) +{ + if (!m_initialized) { + m_rate = GetMaxRate (); + m_initialized = true; + } + m_failed = 0; + m_counter = GetThresholds (m_rate).ewnd; + m_lastReset = Simulator::Now (); +} + +Ptr +RraaWifiRemoteStation::GetManager (void) const +{ + return m_stations; +} + +uint32_t +RraaWifiRemoteStation::GetMaxRate (void) +{ + return GetNSupportedModes () - 1; +} +uint32_t +RraaWifiRemoteStation::GetMinRate (void) +{ + return 0; +} + +ThresholdsItem +RraaWifiRemoteStation::GetThresholds (uint32_t rate) +{ + WifiMode mode = GetSupportedMode (rate); + return m_stations->GetThresholds (mode); +} + + +void +RraaWifiRemoteStation::ReportRtsFailed (void) +{} + +void +RraaWifiRemoteStation::ReportDataFailed (void) +{ + m_lastFrameFail = true; + CheckTimeout (); + m_counter--; + m_failed++; + RunBasicAlgorithm (); +} +void +RraaWifiRemoteStation::ReportRxOk (double rxSnr, WifiMode txMode) +{} +void +RraaWifiRemoteStation::ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr) +{ + NS_LOG_DEBUG ("self="< packet) +{ + if (m_stations->OnlyBasic ()) + return WifiRemoteStation::NeedRts (packet); + ARts (); + return m_rtsOn; +} + +void +RraaWifiRemoteStation::CheckTimeout (void) +{ + Time d = Simulator::Now () - m_lastReset; + if (m_counter == 0 || d > m_stations->GetTimeout ()) { + ResetCountersBasic (); + } +} + +void +RraaWifiRemoteStation::RunBasicAlgorithm (void) +{ + ThresholdsItem thresholds = GetThresholds (m_rate); + double ploss = (double) m_failed / (double) thresholds.ewnd; + if (m_counter == 0 || ploss > thresholds.pmtl) { + if (m_rate > GetMinRate () && ploss > thresholds.pmtl) { + m_rate--; + } + else if (m_rate < GetMaxRate () && ploss < thresholds.pori) { + m_rate++; + } + ResetCountersBasic (); + } +} + +void +RraaWifiRemoteStation::ARts (void) +{ + if (!m_rtsOn && m_lastFrameFail) { + m_rtsWnd++; + m_rtsCounter = m_rtsWnd; + } + else if ((m_rtsOn && m_lastFrameFail) || + (!m_rtsOn && !m_lastFrameFail)) { + m_rtsWnd = m_rtsWnd / 2; + m_rtsCounter = m_rtsWnd; + } + if (m_rtsCounter > 0) { + m_rtsOn = true; + m_rtsCounter--; + } + else { + m_rtsOn = false; + } +} + + +TypeId +RraaWifiManager::GetTypeId (void) +{ + static TypeId tid = TypeId ("RraaWifiManager") + .SetParent () + .AddConstructor () + .AddAttribute ("Basic", + "If true the RRAA-BASIC algorithm will be used, otherwise the RRAA wil be used", + Boolean (false), + MakeBooleanAccessor (&RraaWifiManager::m_basic), + MakeBooleanChecker ()) + .AddAttribute ("Timeout", + "Timeout for the RRAA BASIC loss estimaton block (s)", + Seconds (0.05), + MakeTimeAccessor (&RraaWifiManager::m_timeout), + MakeTimeChecker ()) + .AddAttribute ("ewndFor54mbps", + "ewnd parameter for 54 Mbs data mode", + Uinteger (40), + MakeUintegerAccessor (&RraaWifiManager::m_ewndfor54), + MakeUintegerChecker ()) + .AddAttribute ("ewndFor48mbps", + "ewnd parameter for 48 Mbs data mode", + Uinteger (40), + MakeUintegerAccessor (&RraaWifiManager::m_ewndfor48), + MakeUintegerChecker ()) + .AddAttribute ("ewndFor36mbps", + "ewnd parameter for 36 Mbs data mode", + Uinteger (40), + MakeUintegerAccessor (&RraaWifiManager::m_ewndfor36), + MakeUintegerChecker ()) + .AddAttribute ("ewndFor24mbps", + "ewnd parameter for 24 Mbs data mode", + Uinteger (40), + MakeUintegerAccessor (&RraaWifiManager::m_ewndfor24), + MakeUintegerChecker ()) + .AddAttribute ("ewndFor18mbps", + "ewnd parameter for 18 Mbs data mode", + Uinteger (20), + MakeUintegerAccessor (&RraaWifiManager::m_ewndfor18), + MakeUintegerChecker ()) + .AddAttribute ("ewndFor12mbps", + "ewnd parameter for 12 Mbs data mode", + Uinteger (20), + MakeUintegerAccessor (&RraaWifiManager::m_ewndfor12), + MakeUintegerChecker ()) + .AddAttribute ("ewndFor9mbps", + "ewnd parameter for 9 Mbs data mode", + Uinteger (10), + MakeUintegerAccessor (&RraaWifiManager::m_ewndfor9), + MakeUintegerChecker ()) + .AddAttribute ("ewndFor6mbps", + "ewnd parameter for 6 Mbs data mode", + Uinteger (6), + MakeUintegerAccessor (&RraaWifiManager::m_ewndfor6), + MakeUintegerChecker ()) + .AddAttribute ("poriFor48mbps", + "Pori parameter for 48 Mbs data mode", + Double (0.047), + MakeDoubleAccessor (&RraaWifiManager::m_porifor48), + MakeDoubleChecker ()) + .AddAttribute ("poriFor36mbps", + "Pori parameter for 36 Mbs data mode", + Double (0.115), + MakeDoubleAccessor (&RraaWifiManager::m_porifor36), + MakeDoubleChecker ()) + .AddAttribute ("poriFor24mbps", + "Pori parameter for 24 Mbs data mode", + Double (0.1681), + MakeDoubleAccessor (&RraaWifiManager::m_porifor24), + MakeDoubleChecker ()) + .AddAttribute ("poriFor18mbps", + "Pori parameter for 18 Mbs data mode", + Double (0.1325), + MakeDoubleAccessor (&RraaWifiManager::m_porifor18), + MakeDoubleChecker ()) + .AddAttribute ("poriFor12mbps", + "Pori parameter for 12 Mbs data mode", + Double (0.1861), + MakeDoubleAccessor (&RraaWifiManager::m_porifor12), + MakeDoubleChecker ()) + .AddAttribute ("poriFor9mbps", + "Pori parameter for 9 Mbs data mode", + Double (0.1434), + MakeDoubleAccessor (&RraaWifiManager::m_porifor9), + MakeDoubleChecker ()) + .AddAttribute ("poriFor6mbps", + "Pori parameter for 6 Mbs data mode", + Double (0.5), + MakeDoubleAccessor (&RraaWifiManager::m_porifor6), + MakeDoubleChecker ()) + .AddAttribute ("pmtlFor54mbps", + "Pmtl parameter for 54 Mbs data mode", + Double (0.094), + MakeDoubleAccessor (&RraaWifiManager::m_pmtlfor54), + MakeDoubleChecker ()) + .AddAttribute ("pmtlFor48mbps", + "Pmtl parameter for 48 Mbs data mode", + Double (0.23), + MakeDoubleAccessor (&RraaWifiManager::m_pmtlfor48), + MakeDoubleChecker ()) + .AddAttribute ("pmtlFor36mbps", + "Pmtl parameter for 36 Mbs data mode", + Double (0.3363), + MakeDoubleAccessor (&RraaWifiManager::m_pmtlfor36), + MakeDoubleChecker ()) + .AddAttribute ("pmtlFor24mbps", + "Pmtl parameter for 24 Mbs data mode", + Double (0.265), + MakeDoubleAccessor (&RraaWifiManager::m_pmtlfor24), + MakeDoubleChecker ()) + .AddAttribute ("pmtlFor18mbps", + "Pmtl parameter for 18 Mbs data mode", + Double (0.3722), + MakeDoubleAccessor (&RraaWifiManager::m_pmtlfor18), + MakeDoubleChecker ()) + .AddAttribute ("pmtlFor12mbps", + "Pmtl parameter for 12 Mbs data mode", + Double(0.2868), + MakeDoubleAccessor (&RraaWifiManager::m_pmtlfor12), + MakeDoubleChecker ()) + .AddAttribute ("pmtlFor9mbps", + "Pmtl parameter for 9 Mbs data mode", + Double (0.3932), + MakeDoubleAccessor (&RraaWifiManager::m_pmtlfor9), + MakeDoubleChecker ()) + ; + return tid; +} + + +RraaWifiManager::RraaWifiManager () +{} +RraaWifiManager::~RraaWifiManager () +{} + +WifiRemoteStation * +RraaWifiManager::CreateStation (void) +{ + return new RraaWifiRemoteStation (this); +} + +bool +RraaWifiManager::OnlyBasic (void) +{ + return m_basic; +} + +Time +RraaWifiManager::GetTimeout (void) const +{ + return m_timeout; +} + +ThresholdsItem +RraaWifiManager::GetThresholds (WifiMode mode) const +{ + switch (mode.GetDataRate () / 1000000) { + case 54: { + ThresholdsItem mode54 = {54000000, + 0.0, + m_pmtlfor54, + m_ewndfor54}; + return mode54; + } break; + case 48: { + ThresholdsItem mode48 = {48000000, + m_porifor48, + m_pmtlfor48, + m_ewndfor48}; + return mode48; + } break; + case 36: { + ThresholdsItem mode36 = {36000000, + m_porifor36, + m_pmtlfor36, + m_ewndfor36}; + return mode36; + } break; + case 24: { + ThresholdsItem mode24 = {24000000, + m_porifor24, + m_pmtlfor24, + m_ewndfor24}; + return mode24; + } break; + case 18: { + ThresholdsItem mode18 = {18000000, + m_porifor18, + m_pmtlfor18, + m_ewndfor18}; + return mode18; + } break; + case 12: { + ThresholdsItem mode12 = {12000000, + m_porifor12, + m_pmtlfor12, + m_ewndfor12}; + return mode12; + } break; + case 9: { + ThresholdsItem mode9 = {9000000, + m_porifor9, + m_pmtlfor9, + m_ewndfor9}; + return mode9; + } break; + case 6: { + ThresholdsItem mode6 = {6000000, + m_porifor6, + 1.0, + m_ewndfor6}; + return mode6; + } break; + } + NS_ASSERT("Thresholds for an unknown mode are asked"); + return ThresholdsItem (); +} + +} // namespace ns3 diff -r 401bfe8c0176 -r 2e6e1a6e0d94 src/devices/wifi/rraa-wifi-manager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/devices/wifi/rraa-wifi-manager.h Mon Mar 03 04:03:39 2008 +0100 @@ -0,0 +1,127 @@ +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2005,2006 INRIA + * + * 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: Federico Maguolo + */ +#ifndef RRAA_WIFI_MANAGER_H +#define RRAA_WIFI_MANAGER_H + +#include "ns3/nstime.h" +#include "wifi-remote-station-manager.h" + +namespace ns3 { + +struct ThresholdsItem { + uint32_t datarate; + double pori; + double pmtl; + uint32_t ewnd; +}; + +typedef std::vector Thresholds; + +/** + * \brief Robust Rate Adaptation Algorithm + * + * This is an implementation of RRAA as described in + * "Robust rate adaptation for 802.11 wireless networks" + * by "Starsky H. Y. Wong", "Hao Yang", "Songwu Lu", and, + * "Vaduvur Bharghavan" published in Mobicom 06. + */ +class RraaWifiManager : public WifiRemoteStationManager +{ +public: + static TypeId GetTypeId (void); + + RraaWifiManager (); + virtual ~RraaWifiManager (); + bool OnlyBasic (void); + Time GetTimeout (void) const; + ThresholdsItem GetThresholds (WifiMode mode) const; +private: + virtual class WifiRemoteStation *CreateStation (void); + bool m_basic; + Time m_timeout; + uint32_t m_ewndfor54; + uint32_t m_ewndfor48; + uint32_t m_ewndfor36; + uint32_t m_ewndfor24; + uint32_t m_ewndfor18; + uint32_t m_ewndfor12; + uint32_t m_ewndfor9; + uint32_t m_ewndfor6; + double m_porifor48; + double m_porifor36; + double m_porifor24; + double m_porifor18; + double m_porifor12; + double m_porifor9; + double m_porifor6; + double m_pmtlfor54; + double m_pmtlfor48; + double m_pmtlfor36; + double m_pmtlfor24; + double m_pmtlfor18; + double m_pmtlfor12; + double m_pmtlfor9; +}; + + +class RraaWifiRemoteStation : public WifiRemoteStation +{ +public: + RraaWifiRemoteStation (Ptr stations); + virtual ~RraaWifiRemoteStation (); + + virtual void ReportRxOk (double rxSnr, WifiMode txMode); + virtual void ReportRtsFailed (void); + virtual void ReportDataFailed (void); + virtual void ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr); + virtual void ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr); + virtual void ReportFinalRtsFailed (void); + virtual void ReportFinalDataFailed (void); + virtual bool NeedRts (Ptr packet); + +private: + virtual Ptr GetManager (void) const; + virtual WifiMode DoGetDataMode (uint32_t size); + virtual WifiMode DoGetRtsMode (void); + uint32_t GetMaxRate (void); + uint32_t GetMinRate (void); + ThresholdsItem GetThresholds (uint32_t rate); + void CheckTimeout (void); + void RunBasicAlgorithm (void); + void ARts (void); + void ResetCountersBasic (void); + + uint32_t m_counter; + uint32_t m_failed; + uint32_t m_rtsWnd; + uint32_t m_rtsCounter; + Time m_lastReset; + bool m_rtsOn; + bool m_lastFrameFail; + bool m_initialized; + + uint32_t m_rate; + + Ptr m_stations; +}; + +} // namespace ns3 + +#endif /* RRAA_WIFI_MANAGER_H */ diff -r 401bfe8c0176 -r 2e6e1a6e0d94 src/devices/wifi/wscript --- a/src/devices/wifi/wscript Mon Mar 03 02:07:40 2008 +0100 +++ b/src/devices/wifi/wscript Mon Mar 03 04:03:39 2008 +0100 @@ -32,6 +32,9 @@ 'arf-wifi-manager.cc', 'aarf-wifi-manager.cc', 'ideal-wifi-manager.cc', + 'amrr-wifi-manager.cc', + 'onoe-wifi-manager.cc', + 'rraa-wifi-manager.cc', 'constant-rate-wifi-manager.cc', 'wifi-helper.cc', ] @@ -51,6 +54,9 @@ 'aarf-wifi-manager.h', 'constant-rate-wifi-manager.h', 'ideal-wifi-manager.h', + 'amrr-wifi-manager.h', + 'onoe-wifi-manager.h', + 'rraa-wifi-manager.h', 'wifi-mac.h', 'adhoc-wifi-mac.h', 'nqsta-wifi-mac.h',