src/devices/wifi/dcf-manager.cc
changeset 2524 db72c0e7743e
parent 2508 18b690d1e74b
child 3905 99c9346b5d71
--- a/src/devices/wifi/dcf-manager.cc	Sat Mar 01 20:41:08 2008 +0100
+++ b/src/devices/wifi/dcf-manager.cc	Sat Mar 01 21:21:53 2008 +0100
@@ -6,7 +6,9 @@
 #include <math.h>
 
 #include "dcf-manager.h"
-#include "wifi-mac-parameters.h"
+#include "wifi-phy.h"
+#include "wifi-mac.h"
+#include "mac-low.h"
 
 NS_LOG_COMPONENT_DEFINE ("DcfManager");
 
@@ -22,6 +24,9 @@
 DcfState::DcfState ()
   : m_backoffSlots (0),
     m_backoffStart (Seconds (0.0)),
+    m_cwMin (0),
+    m_cwMax (0),
+    m_cw (0),
     m_accessRequested (false)
 {}
 
@@ -33,14 +38,33 @@
 {
   m_aifsn = aifsn;
 }
-
 void 
-DcfState::SetCwBounds (uint32_t minCw, uint32_t maxCw)
+DcfState::SetCwMin (uint32_t minCw)
 {
   m_cwMin = minCw;
+  ResetCw ();
+}
+void 
+DcfState::SetCwMax (uint32_t maxCw)
+{
   m_cwMax = maxCw;
   ResetCw ();
 }
+uint32_t 
+DcfState::GetAifsn (void) const
+{
+  return m_aifsn;
+}
+uint32_t
+DcfState::GetCwMin (void) const
+{
+  return m_cwMin;
+}
+uint32_t 
+DcfState::GetCwMax (void) const
+{
+  return m_cwMax;
+}
 
 void 
 DcfState::ResetCw (void)
@@ -72,11 +96,6 @@
   m_backoffStart = Simulator::Now ();
 }
 
-uint32_t 
-DcfState::GetAifsn (void) const
-{
-  return m_aifsn;
-}
 uint32_t
 DcfState::GetCw (void) const
 {
@@ -121,6 +140,53 @@
 }
 
 
+/***************************************************************
+ *         Listener for Nav events. Forwards to DcfManager
+ ***************************************************************/
+
+class LowNavListener : public ns3::MacLowNavListener {
+public:
+  LowNavListener (ns3::DcfManager *dcf)
+    : m_dcf (dcf) {}
+  virtual ~LowNavListener () {}
+  virtual void NavStart (Time duration) {
+    m_dcf->NotifyNavStartNow (duration);
+  }
+  virtual void NavReset (Time duration) {
+    m_dcf->NotifyNavResetNow (duration);
+  }
+private:
+  ns3::DcfManager *m_dcf;
+};
+
+/***************************************************************
+ *         Listener for PHY events. Forwards to DcfManager
+ ***************************************************************/
+
+class PhyListener : public ns3::WifiPhyListener {
+public:
+  PhyListener (ns3::DcfManager *dcf)
+    : m_dcf (dcf) {}
+  virtual ~PhyListener () {}
+  virtual void NotifyRxStart (Time duration) {
+    m_dcf->NotifyRxStartNow (duration);
+  }
+  virtual void NotifyRxEndOk (void) {
+    m_dcf->NotifyRxEndOkNow ();
+  }
+  virtual void NotifyRxEndError (void) {
+    m_dcf->NotifyRxEndErrorNow ();
+  }
+  virtual void NotifyTxStart (Time duration) {
+    m_dcf->NotifyTxStartNow (duration);
+  }
+  virtual void NotifyCcaBusyStart (Time duration) {
+    m_dcf->NotifyCcaBusyStartNow (duration);
+  }
+private:
+  ns3::DcfManager *m_dcf;
+};
+
 /****************************************************************
  *      Implement the DCF manager of all DCF state holders
  ****************************************************************/
@@ -138,11 +204,34 @@
     m_lastBusyDuration (MicroSeconds (0)),
     m_rxing (false),
     m_slotTime (Seconds (0.0)),
-    m_sifs (Seconds (0.0))
+    m_sifs (Seconds (0.0)),
+    m_phyListener (0),
+    m_lowListener (0)
 {}
 
+DcfManager::~DcfManager ()
+{
+  delete m_phyListener;
+  delete m_lowListener;
+  m_phyListener = 0;
+  m_lowListener = 0;
+}
+
 void 
-DcfManager::SetSlotTime (Time slotTime)
+DcfManager::SetupPhyListener (Ptr<WifiPhy> phy)
+{
+  m_phyListener = new PhyListener (this);
+  phy->RegisterListener (m_phyListener);
+}
+void 
+DcfManager::SetupLowListener (Ptr<MacLow> low)
+{
+  m_lowListener = new LowNavListener (this);
+  low->RegisterNavListener (m_lowListener);
+}
+
+void 
+DcfManager::SetSlot (Time slotTime)
 {
   m_slotTime = slotTime;
 }
@@ -151,11 +240,10 @@
 {
   m_sifs = sifs;
 }
-
 void 
-DcfManager::SetAckTxDuration (Time ackTxDuration)
+DcfManager::SetEifsNoDifs (Time eifsNoDifs)
 {
-  m_ackTxTime = ackTxDuration;
+  m_eifsNoDifs = eifsNoDifs;
 }
 
 void 
@@ -302,12 +390,15 @@
   Time rxAccessStart;
   if (m_lastRxEnd >= m_lastRxStart) 
     {
-      rxAccessStart = m_lastRxEnd + m_sifs;
+      rxAccessStart = m_lastRxEnd;
       if (!m_lastRxReceivedOk)
         {
-          /* to handle EIFS */
-          rxAccessStart += m_ackTxTime;
-        } 
+          rxAccessStart += m_eifsNoDifs;
+        }
+      else
+        {
+          rxAccessStart += m_sifs;
+        }
     } 
   else 
     {