--- 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;