the meat of the onoe rate control algorithm.
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Thu, 13 Dec 2007 09:26:20 +0100
changeset 2272 ae2bbdbfc161
parent 2271 85724b1cbb1a
child 2273 0bfe240ec168
the meat of the onoe rate control algorithm.
src/devices/wifi/onoe-mac-stations.cc
src/devices/wifi/onoe-mac-stations.h
--- a/src/devices/wifi/onoe-mac-stations.cc	Thu Dec 13 08:39:08 2007 +0100
+++ b/src/devices/wifi/onoe-mac-stations.cc	Thu Dec 13 09:26:20 2007 +0100
@@ -22,6 +22,9 @@
 #include "ns3/default-value.h"
 #include "ns3/time-default-value.h"
 #include "ns3/simulator.h"
+#include "ns3/log.h"
+
+NS_LOG_COMPONENT_DEFINE ("OnoeMacStation");
 
 namespace ns3 {
 
@@ -52,7 +55,13 @@
 
 OnoeMacStation::OnoeMacStation (OnoeMacStations *stations)
   : m_stations (stations),
-    m_nextModeUpdate (Simulator::Now () + stations->m_updatePeriod)
+    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)
 {}
 OnoeMacStation::~OnoeMacStation ()
 {}
@@ -105,6 +114,60 @@
     {
       return;
     }
+  /**
+   * 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) {
+    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;
+
 }
 
 OnoeMacStations *
@@ -116,8 +179,46 @@
 OnoeMacStation::DoGetDataMode (uint32_t size)
 {
   UpdateMode ();
-  // XXX
-  return GetSupportedMode (0);
+  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 
 OnoeMacStation::DoGetRtsMode (void)
--- a/src/devices/wifi/onoe-mac-stations.h	Thu Dec 13 08:39:08 2007 +0100
+++ b/src/devices/wifi/onoe-mac-stations.h	Thu Dec 13 09:26:20 2007 +0100
@@ -72,12 +72,14 @@
   void UpdateMode (void);
 
   OnoeMacStations *m_stations;
+  Time m_nextModeUpdate;
   uint32_t m_shortRetry;
   uint32_t m_longRetry;
-  Time m_nextModeUpdate;
   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