src/devices/wifi/mac-stations.cc
changeset 1930 ec22299cf6bb
parent 1913 4e4ea4809c3d
child 1975 32e6677b99fb
--- a/src/devices/wifi/mac-stations.cc	Tue Oct 09 12:42:45 2007 +0200
+++ b/src/devices/wifi/mac-stations.cc	Tue Oct 09 16:02:21 2007 +0200
@@ -33,7 +33,7 @@
 class NonUnicastMacStation : public MacStation
 {
 public:
-  NonUnicastMacStation (WifiMode defaultTxMode);
+  NonUnicastMacStation (MacStations *stations);
   virtual void ReportRxOk (double rxSnr, WifiMode txMode);
   virtual void ReportRtsFailed (void);
   virtual void ReportDataFailed (void);
@@ -41,10 +41,13 @@
   virtual void ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr);
   virtual WifiMode GetDataMode (uint32_t size);
   virtual WifiMode GetRtsMode (void);
+private:
+  virtual MacStations *GetStations (void) const;
+  MacStations *m_stations;
 };
 
-NonUnicastMacStation::NonUnicastMacStation (WifiMode defaultTxMode)
-  : MacStation (defaultTxMode)
+NonUnicastMacStation::NonUnicastMacStation (MacStations *stations)
+  : m_stations (stations)
 {}
 void 
 NonUnicastMacStation::ReportRxOk (double rxSnr, WifiMode txMode)
@@ -74,12 +77,17 @@
 WifiMode 
 NonUnicastMacStation::GetDataMode (uint32_t size)
 {
-  return GetMode (0);
+  return m_stations->GetBasicMode (0);
 }
 WifiMode 
 NonUnicastMacStation::GetRtsMode (void)
 {
-  return GetMode (0);
+  return m_stations->GetBasicMode (0);
+}
+MacStations *
+NonUnicastMacStation::GetStations (void) const
+{
+  return m_stations;
 }
 
 
@@ -88,13 +96,16 @@
 namespace ns3 {
 
 MacStations::MacStations (WifiMode defaultTxMode)
-  : m_nonUnicast (new NonUnicastMacStation (defaultTxMode)),
-    m_defaultTxMode (defaultTxMode)
-{}
+  : m_defaultTxMode (defaultTxMode),
+    m_nonUnicast (new NonUnicastMacStation (this))
+{
+  m_basicModes.push_back (m_defaultTxMode);
+  NS_ASSERT (m_defaultTxMode.IsMandatory ());
+}
 
 MacStations::~MacStations ()
 {
-  for (StationsI i = m_stations.begin (); i != m_stations.end (); i++) 
+  for (Stations::const_iterator i = m_stations.begin (); i != m_stations.end (); i++) 
     {
       delete (*i).second;
     }
@@ -110,14 +121,14 @@
     {
       return m_nonUnicast;
     }
-  for (StationsI i = m_stations.begin (); i != m_stations.end (); i++) 
+  for (Stations::const_iterator i = m_stations.begin (); i != m_stations.end (); i++) 
     {
       if ((*i).first == address)
         {
           return (*i).second;
         }
     }
-  MacStation *station = CreateStation (m_defaultTxMode);
+  MacStation *station = CreateStation ();
   m_stations.push_back (std::make_pair (address, station));
   return station;
 }
@@ -128,6 +139,34 @@
   return m_nonUnicast;
 }
 
+WifiMode 
+MacStations::GetDefaultMode (void) const
+{
+  return m_defaultTxMode;
+}
+uint32_t 
+MacStations::GetNBasicModes (void) const
+{
+  return m_basicModes.size ();
+}
+WifiMode 
+MacStations::GetBasicMode (uint32_t i) const
+{
+  NS_ASSERT (i > 0);
+  return m_basicModes[i-1];
+}
+MacStations::BasicModesIterator 
+MacStations::BeginBasicModes (void) const
+{
+  return m_basicModes.begin ();
+}
+MacStations::BasicModesIterator 
+MacStations::EndBasicModes (void) const
+{
+  return m_basicModes.end ();
+}
+
+
 } // namespace ns3
 
 /***************************************************************
@@ -136,17 +175,9 @@
 
 namespace ns3 {
 
-MacStation::WifiRate::WifiRate (WifiMode _mode, bool _isBasic)
-  : mode (_mode), isBasic (_isBasic)
+MacStation::MacStation ()
+  : m_state (DISASSOC)
 {}
-
-MacStation::MacStation (WifiMode txMode)
-  : m_state (DISASSOC),
-    m_defaultTxMode (txMode)
-{
-  NS_ASSERT (m_defaultTxMode.IsMandatory ());
-  ResetModes ();
-}
 MacStation::~MacStation ()
 {}
 
@@ -182,36 +213,27 @@
 }
 
 void 
-MacStation::ResetModes (void)
+MacStation::Reset (void)
 {
-  m_rates.clear ();
-  AddBasicMode (m_defaultTxMode);
+  m_modes.clear ();
+  AddSupportedMode (GetStations ()->GetDefaultMode ());
 }
 void 
-MacStation::AddBasicMode (WifiMode mode)
+MacStation::AddSupportedMode (WifiMode mode)
 {
   if (IsIn (mode))
     {
       return;
     }
-  m_rates.push_back (WifiRate (mode, true));
-}
-void 
-MacStation::AddExtendedMode (WifiMode mode)
-{
-  if (IsIn (mode))
-    {
-      return;
-    }
-  m_rates.push_back (WifiRate (mode, false));
+  m_modes.push_back (mode);
 }
 
 bool
 MacStation::IsIn (WifiMode mode) const
 {
-  for (WifiRates::const_iterator i = m_rates.begin (); i != m_rates.end (); i++)
+  for (SupportedModes::const_iterator i = m_modes.begin (); i != m_modes.end (); i++)
     {
-      if (i->mode == mode)
+      if ((*i) == mode)
         {
           return true;
         }
@@ -242,36 +264,23 @@
    * received frame, unless they conflict with the requirement to use 
    * the BSSBasicRateSet parameter.
    */
-  WifiMode mode = m_defaultTxMode;
+  WifiMode mode = GetStations ()->GetDefaultMode ();
   bool found = false;
 
   // First, search the BSS Basic Rate set
-  for (WifiRates::const_iterator i = m_rates.begin (); i != m_rates.end (); i++)
+  for (MacStations::BasicModesIterator i = GetStations ()->BeginBasicModes (); 
+       i != GetStations ()->EndBasicModes (); i++)
     {
-      if (i->mode.GetPhyRate () > mode.GetPhyRate () &&
-          i->mode.GetPhyRate () <= reqMode.GetPhyRate () &&
-          i->mode.GetModulationType () == reqMode.GetModulationType () &&
-          i->isBasic)
+      if (i->GetPhyRate () > mode.GetPhyRate () &&
+          i->GetPhyRate () <= reqMode.GetPhyRate () &&
+          i->GetModulationType () == reqMode.GetModulationType ())
         {
-          mode = i->mode;
+          mode = *i;
           found = true;
         }
     }
-  if (found)
-    {
-      return mode;
-    }
-  // Then, search the mandatory rates.
-  for (WifiRates::const_iterator i = m_rates.begin (); i != m_rates.end (); i++)
-    {
-      if (i->mode.GetPhyRate () > mode.GetPhyRate () &&
-          i->mode.GetPhyRate () <= reqMode.GetPhyRate () &&
-          i->mode.GetModulationType () == reqMode.GetModulationType () &&
-          i->mode.IsMandatory ())
-        {
-          mode = i->mode;
-        }
-    }
+  // no need to search Mandatory rate set because it is included
+  // within the Basic rate set.
   return mode;
 }
 
@@ -287,15 +296,15 @@
 }
 
 uint32_t 
-MacStation::GetNModes (void) const
+MacStation::GetNSupportedModes (void) const
 {
-  return m_rates.size ();
+  return m_modes.size ();
 }
 WifiMode 
-MacStation::GetMode (uint32_t i) const
+MacStation::GetSupportedMode (uint32_t i) const
 {
   NS_ASSERT (i > 0);
-  return m_rates[i-1].mode;
+  return m_modes[i-1];
 }