Support for 5 and 10Mhz wifi channels
authorRamon Bauza <monbauza@gmail.com>
Mon, 13 Jul 2009 14:30:12 +0200
changeset 4680 a52c39181dd4
parent 4679 7555c9a0564b
child 4681 8558474b6149
child 4682 b9d9ae596f83
Support for 5 and 10Mhz wifi channels
src/devices/wifi/interference-helper.cc
src/devices/wifi/interference-helper.h
src/devices/wifi/wifi-mac.cc
src/devices/wifi/wifi-mac.h
src/devices/wifi/wifi-phy-standard.h
src/devices/wifi/wifi-phy.cc
src/devices/wifi/wifi-phy.h
src/devices/wifi/yans-error-rate-model.cc
src/devices/wifi/yans-wifi-phy.cc
src/devices/wifi/yans-wifi-phy.h
--- a/src/devices/wifi/interference-helper.cc	Mon Jul 13 09:57:32 2009 +0200
+++ b/src/devices/wifi/interference-helper.cc	Mon Jul 13 14:30:12 2009 +0200
@@ -241,6 +241,18 @@
       delay += m_plcpLongPreambleDelayUs;
       delay += lrint (ceil ((size * 8.0 + 48.0) / payloadMode.GetDataRate () / 4e-6) * 4);
       break;
+    case WIFI_PHY_STANDARD_80211_10Mhz: 
+      delay += m_plcpLongPreambleDelayUs;
+      // symbol duration is 8us
+      delay += 8;
+      delay += lrint (ceil ((size * 8.0 + 16.0 + 6.0) / payloadMode.GetDataRate () / 8e-6) * 8);
+      break;
+    case WIFI_PHY_STANDARD_80211_5Mhz: 
+      delay += m_plcpLongPreambleDelayUs;
+      // symbol duration is 16us
+      delay += 16;
+      delay += lrint (ceil ((size * 8.0 + 16.0 + 6.0) / payloadMode.GetDataRate () / 1.6e-5) * 16);
+      break;
     default:
      NS_ASSERT (false);
      break;
@@ -277,6 +289,34 @@
   m_maxPacketDuration = CalculateTxDuration (4095, WifiPhy::Get1mbb (), WIFI_PREAMBLE_LONG);
 }
 
+void
+InterferenceHelper::Configure80211_10MhzParameters (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_80211_standard = WIFI_PHY_STANDARD_80211_10Mhz;
+  m_plcpLongPreambleDelayUs = 32;
+  m_plcpShortPreambleDelayUs = 32;
+  m_longPlcpHeaderMode = WifiPhy::Get3mb10Mhz ();
+  m_shortPlcpHeaderMode = WifiPhy::Get3mb10Mhz ();
+  m_plcpHeaderLength = 4 + 1 + 12 + 1 + 6;
+  /* 4095 bytes at a 3Mb/s rate with a 1/2 coding rate. */
+  m_maxPacketDuration = CalculateTxDuration (4095, WifiPhy::Get3mb10Mhz (), WIFI_PREAMBLE_LONG);
+}
+
+void
+InterferenceHelper::Configure80211_5MhzParameters (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_80211_standard = WIFI_PHY_STANDARD_80211_5Mhz;
+  m_plcpLongPreambleDelayUs = 64;
+  m_plcpShortPreambleDelayUs = 64;
+  m_longPlcpHeaderMode = WifiPhy::Get1_5mb5Mhz ();
+  m_shortPlcpHeaderMode = WifiPhy::Get1_5mb5Mhz ();
+  m_plcpHeaderLength = 4 + 1 + 12 + 1 + 6;
+  /* 4095 bytes at a 1.5Mb/s rate with a 1/2 coding rate. */
+  m_maxPacketDuration = CalculateTxDuration (4095, WifiPhy::Get1_5mb5Mhz (), WIFI_PREAMBLE_LONG);
+}
+
 void 
 InterferenceHelper::AppendEvent (Ptr<InterferenceHelper::Event> event)
 {
--- a/src/devices/wifi/interference-helper.h	Mon Jul 13 09:57:32 2009 +0200
+++ b/src/devices/wifi/interference-helper.h	Mon Jul 13 14:30:12 2009 +0200
@@ -71,6 +71,8 @@
 
   void Configure80211aParameters (void);
   void Configure80211bParameters (void);
+  void Configure80211_10MhzParameters (void);
+  void Configure80211_5MhzParameters (void);
   void SetNoiseFigure (double value);
   void SetErrorRateModel (Ptr<ErrorRateModel> rate);
 
--- a/src/devices/wifi/wifi-mac.cc	Mon Jul 13 09:57:32 2009 +0200
+++ b/src/devices/wifi/wifi-mac.cc	Mon Jul 13 14:30:12 2009 +0200
@@ -117,6 +117,14 @@
 		   MakeSsidAccessor (&WifiMac::GetSsid,
 				     &WifiMac::SetSsid),
 		   MakeSsidChecker ())
+    .AddAttribute ("Standard", "The standard chosen configures some MAC-specific constants",
+                   EnumValue (WIFI_PHY_STANDARD_80211a),
+                   MakeEnumAccessor (&WifiMac::SetStandard),
+                   MakeEnumChecker (WIFI_PHY_STANDARD_80211a, "802.11a",
+                                    WIFI_PHY_STANDARD_80211b, "802.11b",
+                                    WIFI_PHY_STANDARD_80211_10Mhz,"802.11_10Mhz",
+                                    WIFI_PHY_STANDARD_80211_5Mhz,"802-11_5Mhz",
+                                    WIFI_PHY_STANDARD_holland, "holland"))
     .AddTraceSource ("MacTx", 
                      "A packet has been received from higher layers and is being processed in preparation for "
                      "queueing for transmission.",
@@ -200,4 +208,74 @@
   m_macRxDropTrace (packet);
 }
 
+void
+WifiMac::SetStandard (enum WifiPhyStandard standard)
+{
+  m_standard = standard;
+  switch (standard) {
+  case WIFI_PHY_STANDARD_80211a:
+    Configure80211a ();
+    break;
+  case WIFI_PHY_STANDARD_80211b:
+    Configure80211b ();
+    break;
+  case WIFI_PHY_STANDARD_80211_10Mhz: 
+    Configure80211_10Mhz ();
+    break;
+  case WIFI_PHY_STANDARD_80211_5Mhz:
+    Configure80211_5Mhz ();
+    break;
+  case WIFI_PHY_STANDARD_holland:
+    Configure80211a ();
+    break;
+  default:
+    NS_ASSERT (false);
+    break;
+  }
+}
+
+void
+WifiMac::Configure80211a (void)
+{
+  SetSifs(MicroSeconds(16));
+  SetSlot(MicroSeconds(9)); 
+  SetEifsNoDifs(MicroSeconds(16+44));
+  SetPifs(MicroSeconds(16+9));
+  SetCtsTimeout(MicroSeconds(16+44+9+GetDefaultMaxPropagationDelay().GetMicroSeconds ()*2));
+  SetAckTimeout(MicroSeconds(16+44+9+GetDefaultMaxPropagationDelay().GetMicroSeconds ()*2)); 
+}
+
+void
+WifiMac::Configure80211b (void)
+{
+  SetSifs(MicroSeconds(10));
+  SetSlot(MicroSeconds(20));
+  SetEifsNoDifs(MicroSeconds(10+304));
+  SetPifs(MicroSeconds(10+20));
+  SetCtsTimeout(MicroSeconds(10+304+20+GetDefaultMaxPropagationDelay().GetMicroSeconds ()*2));
+  SetAckTimeout(MicroSeconds(10+304+20+GetDefaultMaxPropagationDelay().GetMicroSeconds ()*2)); 
+}
+
+void
+WifiMac::Configure80211_10Mhz (void)
+{
+  SetSifs(MicroSeconds(32));
+  SetSlot(MicroSeconds(13)); 
+  SetEifsNoDifs(MicroSeconds(32+88));
+  SetPifs(MicroSeconds(32+13));
+  SetCtsTimeout(MicroSeconds(32+88+13+GetDefaultMaxPropagationDelay().GetMicroSeconds ()*2));
+  SetAckTimeout(MicroSeconds(32+88+13+GetDefaultMaxPropagationDelay().GetMicroSeconds ()*2)); 
+}
+
+void
+WifiMac::Configure80211_5Mhz (void)
+{
+  SetSifs(MicroSeconds(64));
+  SetSlot(MicroSeconds(21));
+  SetEifsNoDifs(MicroSeconds(64+176));
+  SetPifs(MicroSeconds(64+21));
+  SetCtsTimeout(MicroSeconds(64+176+21+GetDefaultMaxPropagationDelay().GetMicroSeconds ()*2));
+  SetAckTimeout(MicroSeconds(64+176+21+GetDefaultMaxPropagationDelay().GetMicroSeconds ()*2)); 
+}
+
 } // namespace ns3
--- a/src/devices/wifi/wifi-mac.h	Mon Jul 13 09:57:32 2009 +0200
+++ b/src/devices/wifi/wifi-mac.h	Mon Jul 13 14:30:12 2009 +0200
@@ -206,6 +206,10 @@
    * purposes.
    */
   void NotifyRxDrop (Ptr<const Packet> packet);
+  /**
+   * \param standard the wifi standard to be configured
+   */
+  void SetStandard (enum WifiPhyStandard standard);
 
 private:
   static Time GetDefaultMaxPropagationDelay (void);
@@ -217,6 +221,12 @@
 
   Time m_maxPropagationDelay;
   uint32_t m_maxMsduSize;
+  WifiPhyStandard m_standard;
+
+  void Configure80211a (void);
+  void Configure80211b (void);
+  void Configure80211_10Mhz (void);
+  void Configure80211_5Mhz ();
 
   /**
    * The trace source fired when packets come into the "top" of the device
--- a/src/devices/wifi/wifi-phy-standard.h	Mon Jul 13 09:57:32 2009 +0200
+++ b/src/devices/wifi/wifi-phy-standard.h	Mon Jul 13 14:30:12 2009 +0200
@@ -25,6 +25,8 @@
 enum WifiPhyStandard {
   WIFI_PHY_STANDARD_80211a,
   WIFI_PHY_STANDARD_80211b,
+  WIFI_PHY_STANDARD_80211_10Mhz,
+  WIFI_PHY_STANDARD_80211_5Mhz,
   WIFI_PHY_STANDARD_holland
 };
 
--- a/src/devices/wifi/wifi-phy.cc	Mon Jul 13 09:57:32 2009 +0200
+++ b/src/devices/wifi/wifi-phy.cc	Mon Jul 13 14:30:12 2009 +0200
@@ -244,6 +244,150 @@
   return mode;
 }
 
+WifiMode 
+WifiPhy::Get3mb10Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-3mbs-10Mhz",
+                                                      true,
+                                                      10000000, 3000000, 6000000);
+  return mode;
+}
+
+WifiMode 
+WifiPhy::Get4_5mb10Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-4.5mbs-10Mhz",
+                                                      false,
+                                                      10000000, 4500000, 6000000);
+  return mode;
+}
+
+WifiMode 
+WifiPhy::Get6mb10Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-6mbs-10Mhz",
+                                                      true,
+                                                      10000000, 6000000, 12000000);
+  return mode;
+}
+
+WifiMode 
+WifiPhy::Get9mb10Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-9mbs-10Mhz",
+                                                      false,
+                                                      10000000, 9000000, 12000000);
+  return mode;
+}
+
+WifiMode 
+WifiPhy::Get12mb10Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-12mbs-10Mhz",
+                                                      true,
+                                                      10000000, 12000000, 24000000);
+  return mode;
+}
+
+WifiMode 
+WifiPhy::Get18mb10Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-18mbs-10Mhz",
+                                                      false,
+                                                      10000000, 18000000, 24000000);
+  return mode;
+}
+
+WifiMode 
+WifiPhy::Get24mb10Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-24mbs-10Mhz",
+                                                      false,
+                                                      10000000, 24000000, 36000000);
+  return mode;
+}
+
+WifiMode 
+WifiPhy::Get27mb10Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-27mbs-10Mhz",
+                                                      false,
+                                                      10000000, 27000000, 36000000);
+  return mode;
+}
+
+WifiMode 
+WifiPhy::Get1_5mb5Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-1_5mbs-5Mhz",
+                                                      true,
+                                                      5000000, 1500000, 3000000);
+  return mode;
+}
+
+WifiMode 
+WifiPhy::Get2_25mb5Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-2.25mbs-5Mhz",
+                                                      false,
+                                                      5000000, 2250000, 3000000);
+  return mode;
+}
+
+WifiMode 
+WifiPhy::Get3mb5Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-3mbs-5Mhz",
+                                                      true,
+                                                      5000000, 3000000, 6000000);
+  return mode;
+}
+
+WifiMode 
+WifiPhy::Get4_5mb5Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-4.5mbs-5Mhz",
+                                                      false,
+                                                      5000000, 4500000, 6000000);
+  return mode;
+}
+
+WifiMode 
+WifiPhy::Get6mb5Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-6mbs-5Mhz",
+                                                      true,
+                                                      5000000, 6000000, 12000000);
+  return mode;
+}
+
+WifiMode 
+WifiPhy::Get9mb5Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-9mbs-5Mhz",
+                                                      false,
+                                                      10000000, 9000000, 12000000);
+  return mode;
+}
+
+WifiMode 
+WifiPhy::Get12mb5Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-12mbs-5Mhz",
+                                                      false,
+                                                      10000000, 12000000, 18000000);
+  return mode;
+}
+
+WifiMode 
+WifiPhy::Get13_5mb5Mhz (void)
+{
+  static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-13.5mbs-5Mhz",
+                                                      false,
+                                                      10000000, 13500000, 18000000);
+  return mode;
+}
+
 
 } // namespace ns3
 
@@ -265,6 +409,22 @@
     ns3::WifiPhy::Get2mbb ();
     ns3::WifiPhy::Get5_5mbb ();
     ns3::WifiPhy::Get11mbb ();
+    ns3::WifiPhy::Get3mb10Mhz ();
+    ns3::WifiPhy::Get4_5mb10Mhz ();
+    ns3::WifiPhy::Get6mb10Mhz ();
+    ns3::WifiPhy::Get9mb10Mhz ();
+    ns3::WifiPhy::Get12mb10Mhz ();
+    ns3::WifiPhy::Get18mb10Mhz ();
+    ns3::WifiPhy::Get24mb10Mhz ();
+    ns3::WifiPhy::Get27mb10Mhz ();
+    ns3::WifiPhy::Get1_5mb5Mhz ();
+    ns3::WifiPhy::Get2_25mb5Mhz ();
+    ns3::WifiPhy::Get3mb5Mhz ();
+    ns3::WifiPhy::Get4_5mb5Mhz ();
+    ns3::WifiPhy::Get6mb5Mhz ();
+    ns3::WifiPhy::Get9mb5Mhz ();
+    ns3::WifiPhy::Get12mb5Mhz ();
+    ns3::WifiPhy::Get13_5mb5Mhz ();
   }
 } g_constructor;
 }
--- a/src/devices/wifi/wifi-phy.h	Mon Jul 13 09:57:32 2009 +0200
+++ b/src/devices/wifi/wifi-phy.h	Mon Jul 13 14:30:12 2009 +0200
@@ -256,6 +256,22 @@
   static WifiMode Get2mbb (void);
   static WifiMode Get5_5mbb (void);
   static WifiMode Get11mbb (void);
+  static WifiMode Get3mb10Mhz (void);
+  static WifiMode Get4_5mb10Mhz (void);
+  static WifiMode Get6mb10Mhz (void);
+  static WifiMode Get9mb10Mhz (void);
+  static WifiMode Get12mb10Mhz (void);
+  static WifiMode Get18mb10Mhz (void);
+  static WifiMode Get24mb10Mhz (void);
+  static WifiMode Get27mb10Mhz (void);
+  static WifiMode Get1_5mb5Mhz (void);
+  static WifiMode Get2_25mb5Mhz (void);
+  static WifiMode Get3mb5Mhz (void);
+  static WifiMode Get4_5mb5Mhz (void);
+  static WifiMode Get6mb5Mhz (void);
+  static WifiMode Get9mb5Mhz (void);
+  static WifiMode Get12mb5Mhz (void);
+  static WifiMode Get13_5mb5Mhz (void);
 
 
   /**
--- a/src/devices/wifi/yans-error-rate-model.cc	Mon Jul 13 09:57:32 2009 +0200
+++ b/src/devices/wifi/yans-error-rate-model.cc	Mon Jul 13 14:30:12 2009 +0200
@@ -176,7 +176,7 @@
 double 
 YansErrorRateModel::GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const
 {
-  if (mode == WifiPhy::Get6mba ())
+  if (mode == WifiPhy::Get6mba () || mode == WifiPhy::Get3mb10Mhz () || mode == WifiPhy::Get1_5mb5Mhz ())
     {
       return GetFecBpskBer (snr, 
                             nbits,
@@ -186,7 +186,7 @@
                             11 // adFree
                             );      
     }
-  else if (mode == WifiPhy::Get9mba ())
+  else if (mode == WifiPhy::Get9mba () || mode == WifiPhy::Get4_5mb10Mhz () || mode == WifiPhy::Get2_25mb5Mhz ())
     {
       return GetFecBpskBer (snr, 
                             nbits,
@@ -196,7 +196,7 @@
                             8 // adFree
                             );
     }
-  else if (mode == WifiPhy::Get12mba ())
+  else if (mode == WifiPhy::Get12mba () || mode == WifiPhy::Get6mb10Mhz () || mode == WifiPhy::Get3mb5Mhz ())
     {
       return GetFecQamBer (snr, 
                            nbits,
@@ -208,7 +208,7 @@
                            0   // adFreePlusOne
                            );
     }
-  else if (mode == WifiPhy::Get18mba ())
+  else if (mode == WifiPhy::Get18mba () || mode == WifiPhy::Get9mb10Mhz () || mode == WifiPhy::Get4_5mb5Mhz ())
     {
       return GetFecQamBer (snr, 
                            nbits,
@@ -220,7 +220,7 @@
                            31 // adFreePlusOne
                            );
     }
-  else if (mode == WifiPhy::Get24mba ())
+  else if (mode == WifiPhy::Get24mba () || mode == WifiPhy::Get12mb10Mhz () || mode == WifiPhy::Get6mb5Mhz ())
     {
       return GetFecQamBer (snr, 
                            nbits,
@@ -232,7 +232,7 @@
                            0   // adFreePlusOne
                            );
     }
-  else if (mode == WifiPhy::Get36mba ())
+  else if (mode == WifiPhy::Get36mba () || mode == WifiPhy::Get18mb10Mhz () || mode == WifiPhy::Get9mb5Mhz ())
     {
       return GetFecQamBer (snr, 
                            nbits,
@@ -244,7 +244,7 @@
                            31  // adFreePlusOne
                            );
     }
-  else if (mode == WifiPhy::Get48mba ())
+  else if (mode == WifiPhy::Get48mba () || mode == WifiPhy::Get24mb10Mhz () || mode == WifiPhy::Get12mb5Mhz ())
     {
       return GetFecQamBer (snr, 
                            nbits,
@@ -256,7 +256,7 @@
                            16  // adFreePlusOne
                            );
     }
-  else if (mode == WifiPhy::Get54mba ())
+  else if (mode == WifiPhy::Get54mba () || mode == WifiPhy::Get27mb10Mhz () || mode == WifiPhy::Get13_5mb5Mhz ())
     {
       return GetFecQamBer (snr, 
                            nbits,
--- a/src/devices/wifi/yans-wifi-phy.cc	Mon Jul 13 09:57:32 2009 +0200
+++ b/src/devices/wifi/yans-wifi-phy.cc	Mon Jul 13 14:30:12 2009 +0200
@@ -111,6 +111,8 @@
                    MakeEnumAccessor (&YansWifiPhy::SetStandard),
                    MakeEnumChecker (WIFI_PHY_STANDARD_80211a, "802.11a",
                                     WIFI_PHY_STANDARD_80211b, "802.11b",
+                                    WIFI_PHY_STANDARD_80211_10Mhz,"802.11_10Mhz",
+                                    WIFI_PHY_STANDARD_80211_5Mhz,"802-11_5Mhz",
                                     WIFI_PHY_STANDARD_holland, "holland"))
     .AddAttribute ("State", "The state of the PHY layer",
                    PointerValue (),
@@ -156,6 +158,12 @@
   case WIFI_PHY_STANDARD_80211b:
     Configure80211b ();
     break;
+  case WIFI_PHY_STANDARD_80211_10Mhz: 
+    Configure80211_10Mhz ();
+    break;
+  case WIFI_PHY_STANDARD_80211_5Mhz:
+    Configure80211_5Mhz ();
+    break;
   case WIFI_PHY_STANDARD_holland:
     ConfigureHolland ();
     break;
@@ -461,6 +469,36 @@
 }
 
 void
+YansWifiPhy::Configure80211_10Mhz (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_interference.Configure80211_10MhzParameters ();
+  m_modes.push_back (WifiPhy::Get3mb10Mhz ());
+  m_modes.push_back (WifiPhy::Get4_5mb10Mhz ());
+  m_modes.push_back (WifiPhy::Get6mb10Mhz ());
+  m_modes.push_back (WifiPhy::Get9mb10Mhz ());
+  m_modes.push_back (WifiPhy::Get12mb10Mhz ());
+  m_modes.push_back (WifiPhy::Get18mb10Mhz ());
+  m_modes.push_back (WifiPhy::Get24mb10Mhz ());
+  m_modes.push_back (WifiPhy::Get27mb10Mhz  ());
+}
+
+void
+YansWifiPhy::Configure80211_5Mhz (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_interference.Configure80211_5MhzParameters ();
+  m_modes.push_back (WifiPhy::Get1_5mb5Mhz ());
+  m_modes.push_back (WifiPhy::Get2_25mb5Mhz ());
+  m_modes.push_back (WifiPhy::Get3mb5Mhz ());
+  m_modes.push_back (WifiPhy::Get4_5mb5Mhz ());
+  m_modes.push_back (WifiPhy::Get6mb5Mhz ());
+  m_modes.push_back (WifiPhy::Get9mb5Mhz ());
+  m_modes.push_back (WifiPhy::Get12mb5Mhz ());
+  m_modes.push_back (WifiPhy::Get13_5mb5Mhz  ());
+}
+
+void
 YansWifiPhy::ConfigureHolland (void)
 {
   NS_LOG_FUNCTION (this);
--- a/src/devices/wifi/yans-wifi-phy.h	Mon Jul 13 09:57:32 2009 +0200
+++ b/src/devices/wifi/yans-wifi-phy.h	Mon Jul 13 14:30:12 2009 +0200
@@ -125,6 +125,8 @@
   virtual void DoDispose (void);
   void Configure80211a (void);
   void Configure80211b (void);
+  void Configure80211_10Mhz (void);
+  void Configure80211_5Mhz ();
   void ConfigureHolland (void);
   double GetEdThresholdW (void) const;
   double DbmToW (double dbm) const;