src/devices/wifi/mac-stations.cc
changeset 2545 7a38029a2e5b
parent 2544 2e6e1a6e0d94
child 2546 3fc951966b1b
--- a/src/devices/wifi/mac-stations.cc	Mon Mar 03 04:03:39 2008 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,561 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2005,2006,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 <mathieu.lacage@sophia.inria.fr>
- */
-
-#include "mac-stations.h"
-#include "wifi-default-parameters.h"
-#include "wifi-mac-parameters.h"
-#include "ns3/assert.h"
-#include "ns3/log.h"
-#include "ns3/tag.h"
-
-NS_LOG_COMPONENT_DEFINE ("MacStations");
-
-namespace ns3 {
-
-/**
- * _all_ broadcast and multicast frames are transmitted
- * at the same constant default rate because since we don't
- * have any kind of feedback from their transmission,
- * we cannot adjust the rate, so, we pick one which ensures
- * that all frames reach destination.
- */
-class NonUnicastMacStation : public MacStation
-{
-public:
-  NonUnicastMacStation (MacStations *stations);
-  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 MacStations *GetStations (void) const;
-  virtual WifiMode DoGetDataMode (uint32_t size);
-  virtual WifiMode DoGetRtsMode (void);
-  MacStations *m_stations;
-};
-
-NonUnicastMacStation::NonUnicastMacStation (MacStations *stations)
-  : m_stations (stations)
-{
-  RecordDisassociated ();
-}
-void 
-NonUnicastMacStation::ReportRxOk (double rxSnr, WifiMode txMode)
-{
-  NS_ASSERT (false);
-}
-void 
-NonUnicastMacStation::ReportRtsFailed (void)
-{
-  NS_ASSERT (false);
-}
-void 
-NonUnicastMacStation::ReportDataFailed (void)
-{
-  NS_ASSERT (false);
-}
-void 
-NonUnicastMacStation::ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr)
-{
-  NS_ASSERT (false);
-}
-void 
-NonUnicastMacStation::ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr)
-{
-  NS_ASSERT (false);
-}
-void 
-NonUnicastMacStation::ReportFinalRtsFailed (void)
-{}
-void 
-NonUnicastMacStation::ReportFinalDataFailed (void)
-{}
-
-WifiMode 
-NonUnicastMacStation::DoGetDataMode (uint32_t size)
-{
-  WifiMode mode = m_stations->GetBasicMode (0);
-  NS_LOG_DEBUG ("non-unicast size="<<size<<", mode="<<mode);
-  return mode;
-}
-WifiMode 
-NonUnicastMacStation::DoGetRtsMode (void)
-{
-  NS_ASSERT (false);
-  // theoretically, no rts for broadcast/multicast packets.
-  return m_stations->GetBasicMode (0);
-}
-MacStations *
-NonUnicastMacStation::GetStations (void) const
-{
-  return m_stations;
-}
-
-
-} // namespace ns3
-
-namespace ns3 {
-
-MacStations::MacStations (WifiMode defaultTxMode)
-  : m_defaultTxMode (defaultTxMode),
-    m_nonUnicast (new NonUnicastMacStation (this)),
-    m_isLowLatency (WifiDefaultParameters::GetIsLowLatency ())
-{
-  Reset ();
-}
-
-MacStations::~MacStations ()
-{
-  for (Stations::const_iterator i = m_stations.begin (); i != m_stations.end (); i++) 
-    {
-      delete (*i).second;
-    }
-  m_stations.clear ();
-  delete m_nonUnicast;
-}
-
-MacStation *
-MacStations::Lookup (Mac48Address address)
-{
-  if (address.IsBroadcast () ||
-      address.IsMulticast ())
-    {
-      return m_nonUnicast;
-    }
-  for (Stations::const_iterator i = m_stations.begin (); i != m_stations.end (); i++) 
-    {
-      if ((*i).first == address)
-        {
-          return (*i).second;
-        }
-    }
-  MacStation *station = CreateStation ();
-  station->Reset ();
-  station->SetParameters (m_parameters);
-  m_stations.push_back (std::make_pair (address, station));
-  return station;
-}
-
-MacStation *
-MacStations::LookupNonUnicast (void)
-{
-  return m_nonUnicast;
-}
-
-WifiMode 
-MacStations::GetDefaultMode (void) const
-{
-  return m_defaultTxMode;
-}
-void
-MacStations::Reset (void)
-{
-  for (Stations::const_iterator i = m_stations.begin (); i != m_stations.end (); i++)
-    {
-      delete i->second;
-    }
-  m_stations.clear ();
-  m_basicModes.clear ();
-  m_basicModes.push_back (m_defaultTxMode);
-  NS_ASSERT (m_defaultTxMode.IsMandatory ());
-}
-void 
-MacStations::AddBasicMode (WifiMode mode)
-{
-  for (uint32_t i = 0; i < GetNBasicModes (); i++)
-    {
-      if (GetBasicMode (i) == mode)
-        {
-          return;
-        }
-    }
-  m_basicModes.push_back (mode);
-}
-uint32_t 
-MacStations::GetNBasicModes (void) const
-{
-  return m_basicModes.size ();
-}
-WifiMode 
-MacStations::GetBasicMode (uint32_t i) const
-{
-  NS_ASSERT (i < m_basicModes.size ());
-  return m_basicModes[i];
-}
-MacStations::BasicModesIterator 
-MacStations::BeginBasicModes (void) const
-{
-  return m_basicModes.begin ();
-}
-MacStations::BasicModesIterator 
-MacStations::EndBasicModes (void) const
-{
-  return m_basicModes.end ();
-}
-bool
-MacStations::IsLowLatency (void) const
-{
-  return m_isLowLatency;
-}
-void 
-MacStations::SetParameters (WifiMacParameters *parameters)
-{
-  m_parameters = parameters;
-}
-
-
-} // namespace ns3
-
-/***************************************************************
- *           Packet Mode Tagger
- ***************************************************************/ 
-
-namespace ns3 {
-
-class TxModeTag : public Tag
-{
-public:
-  TxModeTag ();
-  TxModeTag (WifiMode rtsMode, WifiMode dataMode);
-  WifiMode GetRtsMode (void) const;
-  WifiMode GetDataMode (void) const;
-
-  static uint32_t GetUid (void);
-  void Print (std::ostream &os) const;
-  void Serialize (ns3::Buffer::Iterator start) const;
-  uint32_t Deserialize (ns3::Buffer::Iterator start);
-  uint32_t GetSerializedSize (void) const;
-private:
-  WifiMode m_rtsMode;
-  WifiMode m_dataMode;
-};
-
-TxModeTag::TxModeTag ()
-{}
-TxModeTag::TxModeTag (WifiMode rtsMode, WifiMode dataMode)
-  : m_rtsMode (rtsMode),
-    m_dataMode (dataMode)
-{}
-WifiMode 
-TxModeTag::GetRtsMode (void) const
-{
-  return m_rtsMode;
-}
-WifiMode 
-TxModeTag::GetDataMode (void) const
-{
-  return m_dataMode;
-}
-
-uint32_t 
-TxModeTag::GetUid (void)
-{
-  static uint32_t uid = Tag::AllocateUid<TxModeTag> ("ns3.wifi.TxModeTag");
-  return uid;
-}
-void 
-TxModeTag::Print (std::ostream &os) const
-{
-  os << "rts="<<m_rtsMode<<" data="<<m_dataMode;
-}
-void 
-TxModeTag::Serialize (ns3::Buffer::Iterator start) const
-{}
-uint32_t 
-TxModeTag::Deserialize (ns3::Buffer::Iterator start)
-{
-  return 0;
-}
-uint32_t 
-TxModeTag::GetSerializedSize (void) const
-{
-  return 0;
-}
-
-} // namespace ns3
-
-
-/***************************************************************
- *           MacStation below.
- ***************************************************************/ 
-
-namespace ns3 {
-
-MacStation::MacStation ()
-  : m_state (BRAND_NEW)
-{}
-MacStation::~MacStation ()
-{}
-
-void 
-MacStation::SetParameters (WifiMacParameters *parameters)
-{
-  m_parameters = parameters;
-}
-
-bool
-MacStation::IsBrandNew (void) const
-{
-  return m_state == BRAND_NEW;
-}
-
-bool 
-MacStation::IsAssociated (void) const
-{
-  return m_state == GOT_ASSOC_TX_OK;
-}
-bool 
-MacStation::IsWaitAssocTxOk (void) const
-{
-  return m_state == WAIT_ASSOC_TX_OK;
-}
-void 
-MacStation::RecordWaitAssocTxOk (void)
-{
-  m_state = WAIT_ASSOC_TX_OK;
-}
-void 
-MacStation::RecordGotAssocTxOk (void)
-{
-  m_state = GOT_ASSOC_TX_OK;
-}
-void 
-MacStation::RecordGotAssocTxFailed (void)
-{
-  m_state = DISASSOC;
-}
-void 
-MacStation::RecordDisassociated (void)
-{
-  m_state = DISASSOC;
-}
-
-void 
-MacStation::Reset (void)
-{
-  m_modes.clear ();
-  AddSupportedMode (GetStations ()->GetDefaultMode ());
-}
-void 
-MacStation::AddSupportedMode (WifiMode mode)
-{
-  if (IsIn (mode))
-    {
-      return;
-    }
-  m_modes.push_back (mode);
-}
-
-bool
-MacStation::IsIn (WifiMode mode) const
-{
-  for (SupportedModes::const_iterator i = m_modes.begin (); i != m_modes.end (); i++)
-    {
-      if ((*i) == mode)
-        {
-          return true;
-        }
-    }
-  return false;
-}
-
-WifiMode
-MacStation::GetControlAnswerMode (WifiMode reqMode)
-{
-  /**
-   * see ieee 802.11e, section 9.6:
-   * 
-   * To allow the transmitting STA to calculate the contents of 
-   * the Duration/ID field, a STA responding to a received frame 
-   * shall transmit its Control Response frame (either CTS or ACK) 
-   * frames, other than the Block-Ack control frame, at the highest 
-   * rate in the BSSBasicRateSet parameter that is less than or equal 
-   * to the rate of the immediately previous frame in the frame 
-   * exchange sequence (as defined in 9.79.12) and that is of the
-   * same modulation type as the received frame. If no rate in the 
-   * basic rate set meets these conditions, then the control frame 
-   * sent in response to a received frame shall be transmitted at 
-   * the highest mandatory rate of the PHY that is less than or equal 
-   * to the rate of the received frame, and that is of the same 
-   * modulation type as the received frame. In addition, the Control 
-   * Response frame shall be sent using the same PHY options as the
-   * received frame, unless they conflict with the requirement to use 
-   * the BSSBasicRateSet parameter.
-   */
-  WifiMode mode = GetStations ()->GetDefaultMode ();
-  bool found = false;
-
-  // First, search the BSS Basic Rate set
-  for (MacStations::BasicModesIterator i = GetStations ()->BeginBasicModes (); 
-       i != GetStations ()->EndBasicModes (); i++)
-    {
-      if (i->GetPhyRate () > mode.GetPhyRate () &&
-          i->GetPhyRate () <= reqMode.GetPhyRate () &&
-          i->GetModulationType () == reqMode.GetModulationType ())
-        {
-          mode = *i;
-          found = true;
-        }
-    }
-  // no need to search Mandatory rate set because it is included
-  // within the Basic rate set.
-  return mode;
-}
-
-WifiMode 
-MacStation::GetCtsMode (WifiMode rtsMode)
-{
-  return GetControlAnswerMode (rtsMode);
-}
-WifiMode 
-MacStation::GetAckMode (WifiMode dataMode)
-{
-  return GetControlAnswerMode (dataMode);
-}
-
-uint32_t 
-MacStation::GetNSupportedModes (void) const
-{
-  return m_modes.size ();
-}
-WifiMode 
-MacStation::GetSupportedMode (uint32_t i) const
-{
-  NS_ASSERT (i < m_modes.size ());
-  return m_modes[i];
-}
-void 
-MacStation::PrepareForQueue (Ptr<const Packet> packet, uint32_t fullPacketSize)
-{
-  if (GetStations ()->IsLowLatency ())
-    {
-      return;
-    }
-  TxModeTag tag = TxModeTag (DoGetRtsMode (), DoGetDataMode (fullPacketSize));
-  packet->AddTag (tag);
-}
-WifiMode 
-MacStation::GetDataMode (Ptr<const Packet> packet, uint32_t fullPacketSize)
-{
-  if (GetStations ()->IsLowLatency ())
-    {
-      return DoGetDataMode (fullPacketSize);
-    }
-  TxModeTag tag;
-  bool found;
-  found = packet->PeekTag (tag);
-  NS_ASSERT (found);
-  return tag.GetDataMode ();
-}
-WifiMode 
-MacStation::GetRtsMode (Ptr<const Packet> packet)
-{
-  if (GetStations ()->IsLowLatency ())
-    {
-      return DoGetRtsMode ();
-    }
-  TxModeTag tag;
-  bool found;
-  found = packet->PeekTag (tag);
-  NS_ASSERT (found);
-  return tag.GetRtsMode ();
-}
-
-bool
-MacStation::NeedRts (Ptr<const Packet> packet)
-{
-  if (packet->GetSize () > m_parameters->GetRtsCtsThreshold ()) 
-    {
-      return true;
-    } 
-  else 
-    {
-      return false;
-    }
-}
-uint32_t 
-MacStation::GetMaxSsrc (Ptr<const Packet> packet)
-{
-  return m_parameters->GetMaxSsrc ();
-}
-
-uint32_t 
-MacStation::GetMaxSlrc (Ptr<const Packet> packet)
-{
-  return m_parameters->GetMaxSlrc ();
-}
-
-bool
-MacStation::NeedFragmentation (Ptr<const Packet> packet)
-{
-  if (packet->GetSize () > m_parameters->GetFragmentationThreshold ()) 
-    {
-      return true;
-    } 
-  else 
-    {
-      return false;
-    }
-}
-uint32_t
-MacStation::GetNFragments (Ptr<const Packet> packet)
-{
-  uint32_t nFragments = packet->GetSize () / m_parameters->GetFragmentationThreshold () + 1;
-  return nFragments;
-}
-
-uint32_t
-MacStation::GetFragmentSize (Ptr<const Packet> packet, uint32_t fragmentNumber)
-{
-  uint32_t nFragment = GetNFragments (packet);
-  if (fragmentNumber >= nFragment)
-    {
-      return 0;
-    }
-  if (fragmentNumber == nFragment - 1)
-    {
-      uint32_t lastFragmentSize = packet->GetSize () % m_parameters->GetFragmentationThreshold ();
-      return lastFragmentSize;
-    }
-  else
-    {
-      return m_parameters->GetFragmentationThreshold ();
-    }
-}
-
-bool
-MacStation::IsLastFragment (Ptr<const Packet> packet, uint32_t fragmentNumber) 
-{
-  if (fragmentNumber == (GetNFragments (packet) - 1)) 
-    {
-      return true;
-    } 
-  else 
-    {
-      return false;
-    }
-}
-
-} // namespace ns3
-