src/devices/wifi/wifi-net-device.cc
changeset 1964 041240a915f8
parent 1956 e51ef0422485
child 1969 a3803bfd94f9
--- a/src/devices/wifi/wifi-net-device.cc	Mon Oct 15 16:17:15 2007 +0200
+++ b/src/devices/wifi/wifi-net-device.cc	Mon Oct 15 16:47:53 2007 +0200
@@ -33,14 +33,37 @@
 #include "mac-high-nqsta.h"
 #include "mac-high-nqap.h"
 #include "dca-txop.h"
+#include "wifi-default-parameters.h"
+#include "arf-mac-stations.h"
+#include "aarf-mac-stations.h"
+#include "ideal-mac-stations.h"
+#include "cr-mac-stations.h"
 
 namespace ns3 {
 
+static WifiMode 
+GetWifiModeForPhyMode (WifiPhy *phy, enum WifiDefaultParameters::PhyModeParameter mode)
+{
+  uint32_t phyRate = (uint32_t)mode;
+  for (uint32_t i= 0; i < phy->GetNModes (); i++)
+    {
+      WifiMode mode = phy->GetMode (i);
+      if (mode.GetPhyRate () == phyRate)
+        {
+          return mode;
+        }
+    }
+  NS_ASSERT (false);
+  return WifiMode ();
+}
+
+
 WifiNetDevice::WifiNetDevice (Ptr<Node> node)
   : NetDevice (node, Mac48Address::Allocate ())
 {
   SetMtu (2300);
   EnableBroadcast (Mac48Address ("ff:ff:ff:ff:ff:ff"));
+  Construct ();
 }
 
 WifiNetDevice::~WifiNetDevice ()
@@ -53,9 +76,100 @@
   delete m_rxMiddle;
 }
 
+void
+WifiNetDevice::Construct (void)
+{
+  // the physical layer.
+  m_phy = new WifiPhy (this);
+
+  // the rate control algorithm
+  switch (WifiDefaultParameters::GetRateControlAlgorithm ()) {
+  case WifiDefaultParameters::ARF:
+    m_stations = new ArfMacStations (m_phy->GetMode (0));
+    break;
+  case WifiDefaultParameters::AARF:
+    m_stations = new AarfMacStations (m_phy->GetMode (0));
+    break;
+  case WifiDefaultParameters::CONSTANT_RATE: {
+    WifiMode dataRate = GetWifiModeForPhyMode (m_phy, WifiDefaultParameters::GetConstantDataRate ());
+    WifiMode ctlRate = GetWifiModeForPhyMode (m_phy, WifiDefaultParameters::GetConstantCtlRate ());
+    m_stations = new CrMacStations (dataRate, ctlRate);
+  } break;
+  case WifiDefaultParameters::IDEAL: {
+    double ber = WifiDefaultParameters::GetIdealRateControlBer ();
+    IdealMacStations *ideal = new IdealMacStations (m_phy->GetMode (0));
+    uint32_t nModes = m_phy->GetNModes ();
+    for (uint32_t i = 0; i < nModes; i++) 
+      {
+        WifiMode mode = m_phy->GetMode (i);
+        ideal->AddModeSnrThreshold (mode, m_phy->CalculateSnr (mode, ber));
+      }
+    m_stations = ideal;
+  } break;
+  default:
+    // NOTREACHED
+    NS_ASSERT (false);
+    break;
+  }
+
+  // MacParameters
+  MacParameters *parameters = new MacParameters ();
+  WifiMacHeader hdr;
+  hdr.SetType (WIFI_MAC_CTL_CTS);
+  Time ctsDelay = m_phy->CalculateTxDuration (hdr.GetSize (), m_phy->GetMode (0), WIFI_PREAMBLE_LONG);
+  hdr.SetType (WIFI_MAC_CTL_ACK);
+  Time ackDelay = m_phy->CalculateTxDuration (hdr.GetSize (), m_phy->GetMode (0), WIFI_PREAMBLE_LONG);
+  parameters->Initialize (ctsDelay, ackDelay);
+  m_parameters = parameters;
+
+  // the MacLow
+  MacLow *low = new MacLow ();
+  low->SetDevice (this);
+  low->SetPhy (m_phy);
+  low->SetStations (m_stations);
+  low->SetParameters (m_parameters);
+  m_phy->SetReceiveOkCallback (MakeCallback (&MacLow::ReceiveOk, low));
+  m_phy->SetReceiveErrorCallback (MakeCallback (&MacLow::ReceiveError, low));
+  m_low = low;
+
+  // the 'middle' rx
+  MacRxMiddle *rxMiddle = new MacRxMiddle ();
+  low->SetRxCallback (MakeCallback (&MacRxMiddle::Receive, rxMiddle));
+  m_rxMiddle = rxMiddle;
+
+  // the 'middle' tx
+  MacTxMiddle *txMiddle = new MacTxMiddle ();
+  m_txMiddle = txMiddle;
+
+}
+
+DcaTxop *
+WifiNetDevice::CreateDca (void) const
+{
+  DcaTxop *dca = new DcaTxop ();
+  dca->SetParameters (m_parameters);
+  dca->SetTxMiddle (m_txMiddle);
+  dca->SetLow (m_low);
+  dca->SetPhy (m_phy);
+  // 802.11a
+  Time difs = m_parameters->GetSifs () + 
+    m_parameters->GetSlotTime () + 
+    m_parameters->GetSlotTime ();
+  Time eifs = difs + m_parameters->GetSifs () + 
+    m_phy->CalculateTxDuration (2+2+6+4, m_phy->GetMode (0), WIFI_PREAMBLE_LONG);
+  dca->SetDifs (difs);
+  dca->SetEifs (eifs);
+  dca->SetCwBounds (15, 1023);
+  dca->SetMaxQueueSize (400);
+  dca->SetMaxQueueDelay (Seconds (10));
+  return dca;
+}
+
+
 void 
 WifiNetDevice::ConnectTo (Ptr<WifiChannel> channel)
 {
+  m_channel = channel;
   m_phy->SetChannel (channel);
   NotifyConnected ();
 }
@@ -92,6 +206,17 @@
   Mac48Address self = Mac48Address::ConvertFrom (GetAddress ());
   return self;
 }
+bool 
+WifiNetDevice::DoNeedsArp (void) const
+{
+  return true;
+}
+Ptr<Channel> 
+WifiNetDevice::DoGetChannel (void) const
+{
+  return m_channel;
+}
+
 
 /*****************************************************
  *            Adhoc code
@@ -99,7 +224,18 @@
 
 AdhocWifiNetDevice::AdhocWifiNetDevice (Ptr<Node> node)
   : WifiNetDevice (node)
-{}
+{
+  m_ssid = WifiDefaultParameters::GetSsid ();
+  m_dca = CreateDca ();
+
+  MacHighAdhoc *high = new MacHighAdhoc ();
+  high->SetDevice (this);
+  high->SetDcaTxop (m_dca);
+  high->SetForwardCallback (MakeCallback (&AdhocWifiNetDevice::DoForwardUp, 
+                                          static_cast<WifiNetDevice *> (this)));
+  m_rxMiddle->SetForwardCallback (MakeCallback (&MacHighAdhoc::Receive, high));
+  m_high = high;
+}
 AdhocWifiNetDevice::~AdhocWifiNetDevice ()
 {
   delete m_dca;
@@ -139,7 +275,30 @@
 
 NqstaWifiNetDevice::NqstaWifiNetDevice (Ptr<Node> node)
   : WifiNetDevice (node)
-{}
+{
+  m_ssid = WifiDefaultParameters::GetSsid ();
+  m_dca = CreateDca ();
+
+  SupportedRates rates;
+  for (uint32_t i = 0; i < m_phy->GetNModes (); i++) 
+    {
+      WifiMode mode = m_phy->GetMode (i);
+      rates.AddSupportedRate (mode.GetPhyRate ());
+    }
+  
+  MacHighNqsta *high = new MacHighNqsta ();
+  high->SetDevice (this);
+  high->SetDcaTxop (m_dca);
+  high->SetForwardCallback (MakeCallback (&NqstaWifiNetDevice::DoForwardUp, 
+                                          this));
+  high->SetAssociatedCallback (MakeCallback (&NqstaWifiNetDevice::Associated, 
+                                             this));
+  high->SetDisAssociatedCallback (MakeCallback (&NqstaWifiNetDevice::DisAssociated, 
+                                                this));
+  high->SetSupportedRates (rates);
+  m_rxMiddle->SetForwardCallback (MakeCallback (&MacHighNqsta::Receive, high));
+  m_high = high;
+}
 NqstaWifiNetDevice::~NqstaWifiNetDevice ()
 {
   delete m_dca;
@@ -193,7 +352,27 @@
 
 NqapWifiNetDevice::NqapWifiNetDevice (Ptr<Node> node)
   : WifiNetDevice (node)
-{}
+{
+  m_ssid = WifiDefaultParameters::GetSsid ();
+
+  m_dca = CreateDca ();
+
+  SupportedRates rates;
+  for (uint32_t i = 0; i < m_phy->GetNModes (); i++) 
+    {
+      rates.AddSupportedRate (m_phy->GetMode (i).GetPhyRate ());
+    }
+
+  MacHighNqap *high = new MacHighNqap ();
+  high->SetDevice (this);
+  high->SetDcaTxop (m_dca);
+  high->SetStations (m_stations);
+  high->SetForwardCallback (MakeCallback (&NqapWifiNetDevice::DoForwardUp, 
+                                          this));
+  high->SetSupportedRates (rates);
+  m_rxMiddle->SetForwardCallback (MakeCallback (&MacHighNqap::Receive, high));
+  m_high = high;
+}
 NqapWifiNetDevice::~NqapWifiNetDevice ()
 {
   delete m_dca;