Bug 871: Rework construction of Wi-Fi rates

This patch attempts to lay some groundwork for enhancements to the Wi-Fi module
by bringing the representation of transmit rates more in line with the
standard.

The key part of the patch is the introduction of a type that corresponds to the
notion of Modulation Class described in IEEE 802.11-2007, Section 9.6.1, Table
9-2.

It also adds coding rate information to the WifiModes and centralises their
construction into a single WifiModeFactory method. The rates are also renamed
with reference to their Modulation Class.

WifiModes no longer have a WifiStandard, but the latter type still exists and is
used to imply the set of WifiModes that a MAC/PHY pair will support.
This commit is contained in:
Dean Armstrong
2010-06-16 10:55:13 +01:00
parent b77c2830c5
commit ebb9193ef9
34 changed files with 987 additions and 919 deletions

View File

@@ -69,6 +69,28 @@ to be recomputed upon any interface or address notification event from IPv4.
<h2>Changes to existing API:</h2>
<ul>
<li><b>Changes to construction and naming of Wi-Fi transmit rates:</b>
A reorganisation of the construction of Wi-Fi transmit rates has been
undertaken with the aim of simplifying the task of supporting further
IEEE 802.11 PHYs. This work has been completed under the auspices of
Bug 871.
From the viewpoint of simulation scripts not part of the ns-3
distribution, the key change is that WifiMode names of the form
wifi<em>x</em>-<em>n</em>mbs are now invalid. Names now take the
form <em>Cccc</em>Rate<em>n</em>Mbps[BW<em>b</em>MHz],
where <em>n</em> is the root bitrate in megabits-per-second as before
(with only significant figures included, and an underscore replacing
any decimal point), and <em>Cccc</em> is a representation of the
Modulation Class as defined in Table 9-2 of IEEE
Std. 802.11-2007. Currently-supported options for <em>Cccc</em>
are <em>Ofdm</em> and <em>Dsss</em>. For modulation classes where
optional reduced-bandwidth transmission is possible, this is captured
in the final part of the form above, with <em>b</em> specifying the
nominal signal bandwidth in megahertz.
</ul>
<h2>Changed behavior:</h2>
<ul>
<li><b>Queue trace behavior during Enqueue changed:</b> The behavior of the

View File

@@ -26,6 +26,17 @@ http://www.nsnam.org/wiki/index.php/Installation
New user-visible features
-------------------------
- A reorganisation of the construction of Wi-Fi transmit rates has
been undertaken with the aim of simplifying the task of
supporting further IEEE 802.11 PHYs. This work has been completed
under the auspices of Bug 871. A consequence of this work is that
WifiModes have a new (hopefully future-proof) naming, and
simulations which specify rates by name will need updating. The
list of new rate names is given in the error message produced
when an attempt is made to use any invalid rate name (including
those that were previously valid).
- A new OFDM error rate model for WiFi (NistErrorRateModel); this model
has been validated in clear-channel testbed tests. For 802.11b, it
uses the same underlying model as the YansErrorRateModel, but it differs
@@ -50,6 +61,7 @@ many cases referencing the Bugzilla bug number
- bug 900: RawTextConfigLoad::Default does not load configurations
- bug 858 - support MSG_PEEK in IPv4/IPv6 raw socket
- bug 932 - Support IP_HDRINCL option for Ipv4RawSocket
- bug 871 - naming for WifiPhyStandard
Known issues
------------

View File

@@ -174,7 +174,7 @@ AodvExample::CreateDevices ()
YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
wifiPhy.SetChannel (wifiChannel.Create ());
WifiHelper wifi = WifiHelper::Default ();
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("wifia-6mbs"), "RtsCtsThreshold", UintegerValue (0));
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate6Mbps"), "RtsCtsThreshold", UintegerValue (0));
devices = wifi.Install (wifiPhy, wifiMac, nodes);
if (pcap)

View File

@@ -92,7 +92,7 @@ static void GenerateTraffic (Ptr<Socket> socket, uint32_t pktSize,
int main (int argc, char *argv[])
{
std::string phyMode ("wifib-1mbs");
std::string phyMode ("DsssRate1Mbps");
double rss = -80; // -dBm
uint32_t packetSize = 1000; // bytes
uint32_t numPackets = 1;

View File

@@ -106,7 +106,7 @@ main (int argc, char *argv[])
//
WifiHelper wifi = WifiHelper::Default ();
wifi.SetStandard (WIFI_PHY_STANDARD_80211a);
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("wifia-54mbs"));
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate54Mbps"));
//
// No reason for pesky access points, so we'll use an ad-hoc network.

View File

@@ -41,7 +41,7 @@ def main(argv):
#
wifi = ns3.WifiHelper.Default()
wifi.SetStandard (ns3.WIFI_PHY_STANDARD_80211a);
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", ns3.StringValue ("wifia-54mbs"));
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", ns3.StringValue ("OfdmRate54Mbps"));
#
# No reason for pesky access points, so we'll use an ad-hoc network.

View File

@@ -146,7 +146,7 @@ main (int argc, char *argv[])
NqosWifiMacHelper mac = NqosWifiMacHelper::Default ();
mac.SetType ("ns3::AdhocWifiMac");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-54mbs"));
"DataMode", StringValue ("OfdmRate54Mbps"));
YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
wifiPhy.SetChannel (wifiChannel.Create ());

View File

@@ -117,7 +117,7 @@ def main(argv):
mac = ns3.NqosWifiMacHelper.Default()
mac.SetType("ns3::AdhocWifiMac")
wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
"DataMode", ns3.StringValue("wifia-54mbs"))
"DataMode", ns3.StringValue("OfdmRate54Mbps"))
wifiPhy = ns3.YansWifiPhyHelper.Default()
wifiChannel = ns3.YansWifiChannelHelper.Default()
wifiPhy.SetChannel(wifiChannel.Create())

View File

@@ -185,56 +185,56 @@ int main (int argc, char *argv[])
NS_LOG_DEBUG ("54");
experiment = Experiment ("54mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-54mbs"));
"DataMode", StringValue ("OfdmRate54Mbps"));
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("48");
experiment = Experiment ("48mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-48mbs"));
"DataMode", StringValue ("OfdmRate48Mbps"));
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("36");
experiment = Experiment ("36mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-36mbs"));
"DataMode", StringValue ("OfdmRate36Mbps"));
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("24");
experiment = Experiment ("24mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-24mbs"));
"DataMode", StringValue ("OfdmRate24Mbps"));
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("18");
experiment = Experiment ("18mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-18mbs"));
"DataMode", StringValue ("OfdmRate18Mbps"));
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("12");
experiment = Experiment ("12mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-12mbs"));
"DataMode", StringValue ("OfdmRate12Mbps"));
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("9");
experiment = Experiment ("9mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-9mbs"));
"DataMode", StringValue ("OfdmRate9Mbps"));
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("6");
experiment = Experiment ("6mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-6mbs"));
"DataMode", StringValue ("OfdmRate6Mbps"));
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);

View File

@@ -167,10 +167,10 @@ int main (int argc, char *argv[])
std::ofstream outfile ("clear-channel.plt");
std::vector <std::string> modes;
modes.push_back ("wifib-1mbs");
modes.push_back ("wifib-2mbs");
modes.push_back ("wifib-5.5mbs");
modes.push_back ("wifib-11mbs");
modes.push_back ("DsssRate1Mbps");
modes.push_back ("DsssRate2Mbps");
modes.push_back ("DsssRate5_5Mbps");
modes.push_back ("DsssRate11Mbps");
// disable fragmentation
Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("2200"));
Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("2200"));

View File

@@ -69,8 +69,8 @@ void experiment (bool enableCtsRts)
// 5. Install wireless devices
WifiHelper wifi;
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode",StringValue ("wifib-2mbs"),
"ControlMode",StringValue ("wifib-1mbs"));
"DataMode",StringValue ("DsssRate2Mbps"),
"ControlMode",StringValue ("DsssRate1Mbps"));
YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
wifiPhy.SetChannel (wifiChannel);
NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();

View File

@@ -109,7 +109,7 @@ static void GenerateTraffic (Ptr<Socket> socket, uint32_t pktSize,
int main (int argc, char *argv[])
{
std::string phyMode ("wifib-1mbs");
std::string phyMode ("DsssRate1Mbps");
double distance = 500; // m
uint32_t packetSize = 1000; // bytes
uint32_t numPackets = 1;

View File

@@ -91,7 +91,7 @@ static void GenerateTraffic (Ptr<Socket> socket, uint32_t pktSize,
int main (int argc, char *argv[])
{
std::string phyMode ("wifib-1mbs");
std::string phyMode ("DsssRate1Mbps");
double rss = -80; // -dBm
uint32_t packetSize = 1000; // bytes
uint32_t numPackets = 1;

View File

@@ -92,7 +92,7 @@ static void GenerateTraffic (Ptr<Socket> socket, uint32_t pktSize,
int main (int argc, char *argv[])
{
std::string phyMode ("wifib-1mbs");
std::string phyMode ("DsssRate1Mbps");
double rss = -80; // -dBm
uint32_t packetSize = 1000; // bytes
uint32_t numPackets = 1;

View File

@@ -125,7 +125,7 @@ int main (int argc, char *argv[])
{
// LogComponentEnable ("InterferenceHelper", LOG_LEVEL_ALL);
std::string phyMode ("wifib-1mbs");
std::string phyMode ("DsssRate1Mbps");
double Prss = -80; // -dBm
double Irss = -95; // -dBm
double delta = 0; // microseconds

View File

@@ -34,11 +34,11 @@ ConstantRateWifiManager::GetTypeId (void)
.SetParent<WifiRemoteStationManager> ()
.AddConstructor<ConstantRateWifiManager> ()
.AddAttribute ("DataMode", "The transmission mode to use for every data packet transmission",
StringValue ("wifia-6mbs"),
StringValue ("OfdmRate6Mbps"),
MakeWifiModeAccessor (&ConstantRateWifiManager::m_dataMode),
MakeWifiModeChecker ())
.AddAttribute ("ControlMode", "The transmission mode to use for every control packet transmission.",
StringValue ("wifia-6mbs"),
StringValue ("OfdmRate6Mbps"),
MakeWifiModeAccessor (&ConstantRateWifiManager::m_ctlMode),
MakeWifiModeChecker ())
;

View File

@@ -115,63 +115,63 @@ InterferenceHelperTxDurationTest::DoRun (void)
bool retval = true;
// IEEE Std 802.11-2007 Table 18-2 "Example of LENGTH calculations for CCK"
retval = retval
&& CheckPayloadDuration (1023, WifiPhy::Get11mbb (), 744)
&& CheckPayloadDuration (1024, WifiPhy::Get11mbb (), 745)
&& CheckPayloadDuration (1025, WifiPhy::Get11mbb (), 746)
&& CheckPayloadDuration (1026, WifiPhy::Get11mbb (), 747);
retval = retval
&& CheckPayloadDuration (1023, WifiPhy::GetDsssRate11Mbps (), 744)
&& CheckPayloadDuration (1024, WifiPhy::GetDsssRate11Mbps (), 745)
&& CheckPayloadDuration (1025, WifiPhy::GetDsssRate11Mbps (), 746)
&& CheckPayloadDuration (1026, WifiPhy::GetDsssRate11Mbps (), 747);
// Similar, but we add PLCP preamble and header durations
// and we test different rates.
// The payload durations for modes other than 11mbb have been
// calculated by hand according to IEEE Std 802.11-2007 18.2.3.5
retval = retval
&& CheckTxDuration (1023, WifiPhy::Get11mbb (), WIFI_PREAMBLE_SHORT, 744 + 96)
&& CheckTxDuration (1024, WifiPhy::Get11mbb (), WIFI_PREAMBLE_SHORT, 745 + 96)
&& CheckTxDuration (1025, WifiPhy::Get11mbb (), WIFI_PREAMBLE_SHORT, 746 + 96)
&& CheckTxDuration (1026, WifiPhy::Get11mbb (), WIFI_PREAMBLE_SHORT, 747 + 96)
&& CheckTxDuration (1023, WifiPhy::Get11mbb (), WIFI_PREAMBLE_LONG, 744 + 192)
&& CheckTxDuration (1024, WifiPhy::Get11mbb (), WIFI_PREAMBLE_LONG, 745 + 192)
&& CheckTxDuration (1025, WifiPhy::Get11mbb (), WIFI_PREAMBLE_LONG, 746 + 192)
&& CheckTxDuration (1026, WifiPhy::Get11mbb (), WIFI_PREAMBLE_LONG, 747 + 192)
&& CheckTxDuration (1023, WifiPhy::Get5_5mbb (), WIFI_PREAMBLE_SHORT, 1488 + 96)
&& CheckTxDuration (1024, WifiPhy::Get5_5mbb (), WIFI_PREAMBLE_SHORT, 1490 + 96)
&& CheckTxDuration (1025, WifiPhy::Get5_5mbb (), WIFI_PREAMBLE_SHORT, 1491 + 96)
&& CheckTxDuration (1026, WifiPhy::Get5_5mbb (), WIFI_PREAMBLE_SHORT, 1493 + 96)
&& CheckTxDuration (1023, WifiPhy::Get5_5mbb (), WIFI_PREAMBLE_LONG, 1488 + 192)
&& CheckTxDuration (1024, WifiPhy::Get5_5mbb (), WIFI_PREAMBLE_LONG, 1490 + 192)
&& CheckTxDuration (1025, WifiPhy::Get5_5mbb (), WIFI_PREAMBLE_LONG, 1491 + 192)
&& CheckTxDuration (1026, WifiPhy::Get5_5mbb (), WIFI_PREAMBLE_LONG, 1493 + 192)
&& CheckTxDuration (1023, WifiPhy::Get2mbb (), WIFI_PREAMBLE_SHORT, 4092 + 96)
&& CheckTxDuration (1024, WifiPhy::Get2mbb (), WIFI_PREAMBLE_SHORT, 4096 + 96)
&& CheckTxDuration (1025, WifiPhy::Get2mbb (), WIFI_PREAMBLE_SHORT, 4100 + 96)
&& CheckTxDuration (1026, WifiPhy::Get2mbb (), WIFI_PREAMBLE_SHORT, 4104 + 96)
&& CheckTxDuration (1023, WifiPhy::Get2mbb (), WIFI_PREAMBLE_LONG, 4092 + 192)
&& CheckTxDuration (1024, WifiPhy::Get2mbb (), WIFI_PREAMBLE_LONG, 4096 + 192)
&& CheckTxDuration (1025, WifiPhy::Get2mbb (), WIFI_PREAMBLE_LONG, 4100 + 192)
&& CheckTxDuration (1026, WifiPhy::Get2mbb (), WIFI_PREAMBLE_LONG, 4104 + 192)
&& CheckTxDuration (1023, WifiPhy::Get1mbb (), WIFI_PREAMBLE_SHORT, 8184 + 96)
&& CheckTxDuration (1024, WifiPhy::Get1mbb (), WIFI_PREAMBLE_SHORT, 8192 + 96)
&& CheckTxDuration (1025, WifiPhy::Get1mbb (), WIFI_PREAMBLE_SHORT, 8200 + 96)
&& CheckTxDuration (1026, WifiPhy::Get1mbb (), WIFI_PREAMBLE_SHORT, 8208 + 96)
&& CheckTxDuration (1023, WifiPhy::Get1mbb (), WIFI_PREAMBLE_LONG, 8184 + 192)
&& CheckTxDuration (1024, WifiPhy::Get1mbb (), WIFI_PREAMBLE_LONG, 8192 + 192)
&& CheckTxDuration (1025, WifiPhy::Get1mbb (), WIFI_PREAMBLE_LONG, 8200 + 192)
&& CheckTxDuration (1026, WifiPhy::Get1mbb (), WIFI_PREAMBLE_LONG, 8208 + 192);
retval = retval
&& CheckTxDuration (1023, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_SHORT, 744 + 96)
&& CheckTxDuration (1024, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_SHORT, 745 + 96)
&& CheckTxDuration (1025, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_SHORT, 746 + 96)
&& CheckTxDuration (1026, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_SHORT, 747 + 96)
&& CheckTxDuration (1023, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 744 + 192)
&& CheckTxDuration (1024, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 745 + 192)
&& CheckTxDuration (1025, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 746 + 192)
&& CheckTxDuration (1026, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 747 + 192)
&& CheckTxDuration (1023, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_SHORT, 1488 + 96)
&& CheckTxDuration (1024, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_SHORT, 1490 + 96)
&& CheckTxDuration (1025, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_SHORT, 1491 + 96)
&& CheckTxDuration (1026, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_SHORT, 1493 + 96)
&& CheckTxDuration (1023, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_LONG, 1488 + 192)
&& CheckTxDuration (1024, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_LONG, 1490 + 192)
&& CheckTxDuration (1025, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_LONG, 1491 + 192)
&& CheckTxDuration (1026, WifiPhy::GetDsssRate5_5Mbps (), WIFI_PREAMBLE_LONG, 1493 + 192)
&& CheckTxDuration (1023, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_SHORT, 4092 + 96)
&& CheckTxDuration (1024, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_SHORT, 4096 + 96)
&& CheckTxDuration (1025, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_SHORT, 4100 + 96)
&& CheckTxDuration (1026, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_SHORT, 4104 + 96)
&& CheckTxDuration (1023, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_LONG, 4092 + 192)
&& CheckTxDuration (1024, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_LONG, 4096 + 192)
&& CheckTxDuration (1025, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_LONG, 4100 + 192)
&& CheckTxDuration (1026, WifiPhy::GetDsssRate2Mbps (), WIFI_PREAMBLE_LONG, 4104 + 192)
&& CheckTxDuration (1023, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_SHORT, 8184 + 96)
&& CheckTxDuration (1024, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_SHORT, 8192 + 96)
&& CheckTxDuration (1025, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_SHORT, 8200 + 96)
&& CheckTxDuration (1026, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_SHORT, 8208 + 96)
&& CheckTxDuration (1023, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_LONG, 8184 + 192)
&& CheckTxDuration (1024, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_LONG, 8192 + 192)
&& CheckTxDuration (1025, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_LONG, 8200 + 192)
&& CheckTxDuration (1026, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_LONG, 8208 + 192);
// values from http://mailman.isi.edu/pipermail/ns-developers/2009-July/006226.html
retval = retval && CheckTxDuration (14, WifiPhy::Get1mbb (), WIFI_PREAMBLE_LONG, 304);
retval = retval && CheckTxDuration (14, WifiPhy::GetDsssRate1Mbps (), WIFI_PREAMBLE_LONG, 304);
// values from
// http://www.oreillynet.com/pub/a/wireless/2003/08/08/wireless_throughput.html
retval = retval
&& CheckTxDuration (1536, WifiPhy::Get11mbb (), WIFI_PREAMBLE_LONG, 1310)
&& CheckTxDuration (76, WifiPhy::Get11mbb (), WIFI_PREAMBLE_LONG, 248)
&& CheckTxDuration (14, WifiPhy::Get11mbb (), WIFI_PREAMBLE_LONG, 203)
&& CheckTxDuration (1536, WifiPhy::Get54mba (), WIFI_PREAMBLE_LONG, 248)
&& CheckTxDuration (76, WifiPhy::Get54mba (), WIFI_PREAMBLE_LONG, 32)
&& CheckTxDuration (14, WifiPhy::Get54mba (), WIFI_PREAMBLE_LONG, 24);
&& CheckTxDuration (1536, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 1310)
&& CheckTxDuration (76, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 248)
&& CheckTxDuration (14, WifiPhy::GetDsssRate11Mbps (), WIFI_PREAMBLE_LONG, 203)
&& CheckTxDuration (1536, WifiPhy::GetOfdmRate54Mbps (), WIFI_PREAMBLE_LONG, 248)
&& CheckTxDuration (76, WifiPhy::GetOfdmRate54Mbps (), WIFI_PREAMBLE_LONG, 32)
&& CheckTxDuration (14, WifiPhy::GetOfdmRate54Mbps (), WIFI_PREAMBLE_LONG, 24);
return (!retval);
}

View File

@@ -229,65 +229,70 @@ InterferenceHelper::GetEnergyDuration (double energyW)
WifiMode
InterferenceHelper::GetPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble)
{
switch (payloadMode.GetStandard ())
{
case WIFI_PHY_STANDARD_holland:
case WIFI_PHY_STANDARD_80211a:
// IEEE Std 802.11-2007, 17.3.2
// actually this is only the first part of the PlcpHeader,
// because the last 16 bits of the PlcpHeader are using the
// same mode of the payload
return WifiPhy::Get6mba ();
case WIFI_PHY_STANDARD_80211b:
if (preamble == WIFI_PREAMBLE_LONG)
{
// IEEE Std 802.11-2007, sections 15.2.3 and 18.2.2.1
return WifiPhy::Get1mbb ();
}
else // WIFI_PREAMBLE_SHORT
{
// IEEE Std 802.11-2007, section 18.2.2.2
return WifiPhy::Get2mbb ();
}
case WIFI_PHY_STANDARD_80211_10Mhz:
return WifiPhy::Get3mb10Mhz ();
case WIFI_PHY_STANDARD_80211_5Mhz:
return WifiPhy::Get1_5mb5Mhz ();
default:
NS_FATAL_ERROR("unknown standard");
return WifiMode ();
}
switch (payloadMode.GetModulationClass ())
{
case WIFI_MOD_CLASS_OFDM:
{
switch (payloadMode.GetBandwidth ()) {
case 5000000:
return WifiPhy::GetOfdmRate1_5MbpsBW5MHz ();
case 10000000:
return WifiPhy::GetOfdmRate3MbpsBW10MHz ();
default:
// IEEE Std 802.11-2007, 17.3.2
// actually this is only the first part of the PlcpHeader,
// because the last 16 bits of the PlcpHeader are using the
// same mode of the payload
return WifiPhy::GetOfdmRate6Mbps ();
}
}
case WIFI_MOD_CLASS_DSSS:
if (preamble == WIFI_PREAMBLE_LONG)
{
// IEEE Std 802.11-2007, sections 15.2.3 and 18.2.2.1
return WifiPhy::GetDsssRate1Mbps ();
}
else // WIFI_PREAMBLE_SHORT
{
// IEEE Std 802.11-2007, section 18.2.2.2
return WifiPhy::GetDsssRate2Mbps ();
}
default:
NS_FATAL_ERROR("unsupported modulation class");
return WifiMode ();
}
}
uint32_t
InterferenceHelper::GetPlcpHeaderDurationMicroSeconds (WifiMode payloadMode, WifiPreamble preamble)
{
switch (payloadMode.GetStandard ())
switch (payloadMode.GetModulationClass ())
{
case WIFI_PHY_STANDARD_holland:
case WIFI_PHY_STANDARD_80211a:
// IEEE Std 802.11-2007, section 17.3.3 and figure 17-4
// also section 17.3.2.3, table 17-4
// We return the duration of the SIGNAL field only, since the
// SERVICE field (which strictly speaking belongs to the PLCP
// header, see section 17.3.2 and figure 17-1) is sent using the
// payload mode.
return 4;
case WIFI_PHY_STANDARD_80211_10Mhz:
// IEEE Std 802.11-2007, section 17.3.2.3, table 17-4
return 8;
case WIFI_PHY_STANDARD_80211_5Mhz:
// IEEE Std 802.11-2007, section 17.3.2.3, table 17-4
return 16;
case WIFI_MOD_CLASS_OFDM:
{
switch (payloadMode.GetBandwidth ()) {
case 20000000:
default:
// IEEE Std 802.11-2007, section 17.3.3 and figure 17-4
// also section 17.3.2.3, table 17-4
// We return the duration of the SIGNAL field only, since the
// SERVICE field (which strictly speaking belongs to the PLCP
// header, see section 17.3.2 and figure 17-1) is sent using the
// payload mode.
return 4;
case 10000000:
// IEEE Std 802.11-2007, section 17.3.2.3, table 17-4
return 8;
case 5000000:
// IEEE Std 802.11-2007, section 17.3.2.3, table 17-4
return 16;
}
}
case WIFI_PHY_STANDARD_80211b:
if (preamble == WIFI_PREAMBLE_SHORT)
case WIFI_MOD_CLASS_DSSS:
if (preamble == WIFI_PREAMBLE_SHORT)
{
// IEEE Std 802.11-2007, section 18.2.2.2 and figure 18-2
return 24;
@@ -296,37 +301,39 @@ InterferenceHelper::GetPlcpHeaderDurationMicroSeconds (WifiMode payloadMode, Wif
{
// IEEE Std 802.11-2007, sections 18.2.2.1 and figure 18-1
return 48;
}
}
default:
NS_FATAL_ERROR("unknown standard");
NS_FATAL_ERROR("unsupported modulation class");
return 0;
}
}
uint32_t
InterferenceHelper::GetPlcpPreambleDurationMicroSeconds (WifiMode payloadMode, WifiPreamble preamble)
{
switch (payloadMode.GetStandard ())
switch (payloadMode.GetModulationClass ())
{
case WIFI_PHY_STANDARD_holland:
case WIFI_PHY_STANDARD_80211a:
// IEEE Std 802.11-2007, section 17.3.3, figure 17-4
// also section 17.3.2.3, table 17-4
return 16;
case WIFI_PHY_STANDARD_80211_10Mhz:
// IEEE Std 802.11-2007, section 17.3.3, table 17-4
// also section 17.3.2.3, table 17-4
return 32;
case WIFI_PHY_STANDARD_80211_5Mhz:
// IEEE Std 802.11-2007, section 17.3.3
// also section 17.3.2.3, table 17-4
return 64;
case WIFI_MOD_CLASS_OFDM:
{
switch (payloadMode.GetBandwidth ()) {
case 20000000:
default:
// IEEE Std 802.11-2007, section 17.3.3, figure 17-4
// also section 17.3.2.3, table 17-4
return 16;
case 10000000:
// IEEE Std 802.11-2007, section 17.3.3, table 17-4
// also section 17.3.2.3, table 17-4
return 32;
case 5000000:
// IEEE Std 802.11-2007, section 17.3.3
// also section 17.3.2.3, table 17-4
return 64;
}
}
case WIFI_PHY_STANDARD_80211b:
case WIFI_MOD_CLASS_DSSS:
if (preamble == WIFI_PREAMBLE_SHORT)
{
// IEEE Std 802.11-2007, section 18.2.2.2 and figure 18-2
@@ -337,9 +344,9 @@ InterferenceHelper::GetPlcpPreambleDurationMicroSeconds (WifiMode payloadMode, W
// IEEE Std 802.11-2007, sections 18.2.2.1 and figure 18-1
return 144;
}
default:
NS_FATAL_ERROR("unknown standard");
NS_FATAL_ERROR("unsupported modulation class");
return 0;
}
}
@@ -348,48 +355,39 @@ uint32_t
InterferenceHelper::GetPayloadDurationMicroSeconds (uint32_t size, WifiMode payloadMode)
{
NS_LOG_FUNCTION(size << payloadMode);
switch (payloadMode.GetStandard ())
switch (payloadMode.GetModulationClass ())
{
case WIFI_PHY_STANDARD_80211a:
case WIFI_PHY_STANDARD_holland:
case WIFI_PHY_STANDARD_80211_10Mhz:
case WIFI_PHY_STANDARD_80211_5Mhz:
case WIFI_MOD_CLASS_OFDM:
{
// IEEE Std 802.11-2007, section 17.3.2.3, table 17-4
// corresponds to T_{SYM} in the table
uint32_t symbolDurationUs;
switch (payloadMode.GetStandard ())
{
case WIFI_PHY_STANDARD_holland:
case WIFI_PHY_STANDARD_80211a:
symbolDurationUs = 4;
break;
case WIFI_PHY_STANDARD_80211_10Mhz:
symbolDurationUs = 8;
break;
case WIFI_PHY_STANDARD_80211_5Mhz:
symbolDurationUs = 16;
break;
case WIFI_PHY_STANDARD_80211b:
NS_FATAL_ERROR("can't happen here");
symbolDurationUs = 0; // quiet compiler
break;
default:
NS_FATAL_ERROR("unknown standard");
symbolDurationUs = 0; // quiet compiler
break;
}
uint32_t symbolDurationUs;
switch (payloadMode.GetBandwidth ()) {
case 20000000:
default:
symbolDurationUs = 4;
break;
case 10000000:
symbolDurationUs = 8;
break;
case 5000000:
symbolDurationUs = 16;
break;
}
// IEEE Std 802.11-2007, section 17.3.2.2, table 17-3
// corresponds to N_{DBPS} in the table
double numDataBitsPerSymbol = payloadMode.GetDataRate () * symbolDurationUs / 1e6;
// IEEE Std 802.11-2007, section 17.3.5.3, equation (17-11)
uint32_t numSymbols = lrint (ceil ((16 + size * 8.0 + 6.0)/numDataBitsPerSymbol));
return numSymbols*symbolDurationUs;
}
case WIFI_PHY_STANDARD_80211b:
case WIFI_MOD_CLASS_DSSS:
// IEEE Std 802.11-2007, section 18.2.3.5
NS_LOG_LOGIC(" size=" << size
<< " mode=" << payloadMode
@@ -397,7 +395,7 @@ InterferenceHelper::GetPayloadDurationMicroSeconds (uint32_t size, WifiMode payl
return lrint(ceil ((size * 8.0) / (payloadMode.GetDataRate () / 1.0e6)));
default:
NS_FATAL_ERROR("unknown standard");
NS_FATAL_ERROR("unsupported modulation class");
return 0;
}
}

View File

@@ -190,77 +190,90 @@ NistErrorRateModel::GetFec64QamBer (double snr, uint32_t nbits,
double
NistErrorRateModel::GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const
{
if (mode == WifiPhy::Get6mba () || mode == WifiPhy::Get3mb10Mhz () || mode == WifiPhy::Get1_5mb5Mhz ())
if (mode.GetModulationClass () == WIFI_MOD_CLASS_OFDM)
{
return GetFecBpskBer (snr,
nbits,
1 // b value
);
if (mode.GetConstellationSize () == 2)
{
if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
{
return GetFecBpskBer (snr,
nbits,
1 // b value
);
}
else
{
return GetFecBpskBer (snr,
nbits,
3 // b value
);
}
}
else if (mode.GetConstellationSize () == 4)
{
if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
{
return GetFecQpskBer (snr,
nbits,
1 // b value
);
}
else
{
return GetFecQpskBer (snr,
nbits,
3 // b value
);
}
}
else if (mode.GetConstellationSize () == 16)
{
if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
{
return GetFec16QamBer (snr,
nbits,
1 // b value
);
}
else
{
return GetFec16QamBer (snr,
nbits,
3 // b value
);
}
}
else if (mode.GetConstellationSize () == 64)
{
if (mode.GetCodeRate () == WIFI_CODE_RATE_2_3)
{
return GetFec64QamBer (snr,
nbits,
2 // b value
);
}
else
{
return GetFec64QamBer (snr,
nbits,
3 // b value
);
}
}
}
else if (mode == WifiPhy::Get9mba () || mode == WifiPhy::Get4_5mb10Mhz () || mode == WifiPhy::Get2_25mb5Mhz ())
else if (mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS)
{
return GetFecBpskBer (snr,
nbits,
3 // b value
);
}
else if (mode == WifiPhy::Get12mba () || mode == WifiPhy::Get6mb10Mhz () || mode == WifiPhy::Get3mb5Mhz ())
{
return GetFecQpskBer (snr,
nbits,
1 // b value
);
}
else if (mode == WifiPhy::Get18mba () || mode == WifiPhy::Get9mb10Mhz () || mode == WifiPhy::Get4_5mb5Mhz ())
{
return GetFecQpskBer (snr,
nbits,
3 // b value
);
}
else if (mode == WifiPhy::Get24mba () || mode == WifiPhy::Get12mb10Mhz () || mode == WifiPhy::Get6mb5Mhz ())
{
return GetFec16QamBer (snr,
nbits,
1 // b value
);
}
else if (mode == WifiPhy::Get36mba () || mode == WifiPhy::Get18mb10Mhz () || mode == WifiPhy::Get9mb5Mhz ())
{
return GetFec16QamBer (snr,
nbits,
3 // b value
);
}
else if (mode == WifiPhy::Get48mba () || mode == WifiPhy::Get24mb10Mhz () || mode == WifiPhy::Get12mb5Mhz ())
{
return GetFec64QamBer (snr,
nbits,
2 // b value
);
}
else if (mode == WifiPhy::Get54mba () || mode == WifiPhy::Get27mb10Mhz () || mode == WifiPhy::Get13_5mb5Mhz ())
{
return GetFec64QamBer (snr,
nbits,
3 // b value
);
}
else if (mode == WifiPhy::Get1mbb ())
{
return DsssErrorRateModel::GetDsssDbpskSuccessRate (snr,nbits);
}
else if (mode == WifiPhy::Get2mbb ())
{
return DsssErrorRateModel::GetDsssDqpskSuccessRate (snr,nbits);
}
else if (mode == WifiPhy::Get5_5mbb ())
{
return DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (snr,nbits);
}
else if (mode == WifiPhy::Get11mbb ())
{
return DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (snr,nbits);
switch (mode.GetDataRate ())
{
case 1000000:
return DsssErrorRateModel::GetDsssDbpskSuccessRate (snr, nbits);
case 2000000:
return DsssErrorRateModel::GetDsssDqpskSuccessRate (snr, nbits);
case 5500000:
return DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (snr, nbits);
case 11000000:
return DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (snr, nbits);
}
}
return 0;
}

View File

@@ -18,7 +18,9 @@
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
*/
#include "wifi-mode.h"
#include "ns3/simulator.h"
#include "ns3/assert.h"
#include "ns3/log.h"
namespace ns3 {
@@ -35,10 +37,7 @@ std::istream & operator >> (std::istream &is, WifiMode &mode)
{
std::string str;
is >> str;
if (!WifiModeFactory::GetFactory ()->Search (str, &mode))
{
is.setstate (std::ios_base::badbit);
}
mode = WifiModeFactory::GetFactory ()->Search (str);
return is;
}
@@ -60,23 +59,11 @@ WifiMode::GetDataRate (void) const
struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
return item->dataRate;
}
bool
WifiMode::IsModulationBpsk (void) const
enum WifiCodeRate
WifiMode::GetCodeRate (void) const
{
struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
return item->modulation == WifiMode::BPSK;
}
bool
WifiMode::IsModulationQam (void) const
{
struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
return item->modulation == WifiMode::QAM;
}
enum WifiMode::ModulationType
WifiMode::GetModulationType (void) const
{
struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
return item->modulation;
return item->codingRate;
}
uint8_t
WifiMode::GetConstellationSize (void) const
@@ -102,11 +89,11 @@ WifiMode::GetUid (void) const
{
return m_uid;
}
enum WifiPhyStandard
WifiMode::GetStandard () const
enum WifiModulationClass
WifiMode::GetModulationClass () const
{
struct WifiModeFactory::WifiModeItem *item = WifiModeFactory::GetFactory ()->Get (m_uid);
return item->standard;
return item->modClass;
}
WifiMode::WifiMode ()
: m_uid (0)
@@ -116,10 +103,7 @@ WifiMode::WifiMode (uint32_t uid)
{}
WifiMode::WifiMode (std::string name)
{
if (!WifiModeFactory::GetFactory ()->Search (name, this))
{
NS_FATAL_ERROR ("Invalid requested wifi mode: " << name);
}
*this = WifiModeFactory::GetFactory ()->Search (name);
}
ATTRIBUTE_HELPER_CPP (WifiMode);
@@ -127,130 +111,96 @@ ATTRIBUTE_HELPER_CPP (WifiMode);
WifiModeFactory::WifiModeFactory ()
{}
WifiMode
WifiModeFactory::CreateBpsk (std::string uniqueName,
bool isMandatory,
uint32_t bandwidth,
uint32_t dataRate,
uint32_t phyRate,
enum WifiPhyStandard standard)
{
WifiModeFactory *factory = GetFactory ();
uint32_t uid = factory->AllocateUid (uniqueName);
WifiModeItem *item = factory->Get (uid);
item->uniqueUid = uniqueName;
item->bandwidth = bandwidth;
item->dataRate = dataRate;
item->phyRate = phyRate;
item->modulation = WifiMode::BPSK;
item->constellationSize = 2;
item->isMandatory = isMandatory;
item->standard = standard;
return WifiMode (uid);
}
WifiMode
WifiModeFactory::CreateQpsk (std::string uniqueName,
bool isMandatory,
uint32_t bandwidth,
uint32_t dataRate,
uint32_t phyRate,
enum WifiPhyStandard standard)
WifiModeFactory::CreateWifiMode (std::string uniqueName,
enum WifiModulationClass modClass,
bool isMandatory,
uint32_t bandwidth,
uint32_t dataRate,
enum WifiCodeRate codingRate,
uint8_t constellationSize)
{
WifiModeFactory *factory = GetFactory ();
uint32_t uid = factory->AllocateUid (uniqueName);
WifiModeItem *item = factory->Get (uid);
item->uniqueUid = uniqueName;
item->bandwidth = bandwidth;
item->dataRate = dataRate;
item->phyRate = phyRate;
item->modulation = WifiMode::QPSK;
item->constellationSize = 4;
item->isMandatory = isMandatory;
item->standard = standard;
return WifiMode (uid);
}
item->modClass = modClass;
// The modulation class for this WifiMode must be valid.
NS_ASSERT (modClass != WIFI_MOD_CLASS_UNKNOWN);
WifiMode
WifiModeFactory::CreateQam (std::string uniqueName,
bool isMandatory,
uint32_t bandwidth,
uint32_t dataRate,
uint32_t phyRate,
uint8_t constellationSize,
enum WifiPhyStandard standard)
{
WifiModeFactory *factory = GetFactory ();
uint32_t uid = factory->AllocateUid (uniqueName);
WifiModeItem *item = factory->Get (uid);
item->uniqueUid = uniqueName;
item->bandwidth = bandwidth;
item->dataRate = dataRate;
item->phyRate = phyRate;
item->modulation = WifiMode::QAM;
item->codingRate = codingRate;
switch (codingRate) {
case WIFI_CODE_RATE_3_4:
item->phyRate = dataRate * 4 / 3;
break;
case WIFI_CODE_RATE_2_3:
item->phyRate = dataRate * 3 / 2;
break;
case WIFI_CODE_RATE_1_2:
item->phyRate = dataRate * 2 / 1;
break;
case WIFI_CODE_RATE_UNDEFINED:
default:
item->phyRate = dataRate;
break;
}
// Check for compatibility between modulation class and coding
// rate. If modulation class is DSSS then coding rate must be
// undefined, and vice versa. I could have done this with an
// assertion, but it seems better to always give the error (i.e.,
// not only in non-optimised builds) and the cycles that extra test
// here costs are only suffered at simulation setup.
if ((codingRate == WIFI_CODE_RATE_UNDEFINED) != (modClass == WIFI_MOD_CLASS_DSSS))
{
NS_FATAL_ERROR ("Error in creation of WifiMode named " << uniqueName << std::endl
<< "Code rate must be WIFI_CODE_RATE_UNDEFINED iff Modulation Class is WIFI_MOD_CLASS_DSSS");
}
item->constellationSize = constellationSize;
item->isMandatory = isMandatory;
item->standard = standard;
return WifiMode (uid);
}
WifiMode
WifiModeFactory::CreateDbpsk (std::string uniqueName,
bool isMandatory,
uint32_t bandwidth,
uint32_t dataRate,
uint32_t phyRate,
enum WifiPhyStandard standard)
{
WifiModeFactory *factory = GetFactory ();
uint32_t uid = factory->AllocateUid (uniqueName);
WifiModeItem *item = factory->Get (uid);
item->uniqueUid = uniqueName;
item->bandwidth = bandwidth;
item->dataRate = dataRate;
item->phyRate = phyRate;
item->modulation = WifiMode::DBPSK;
item->constellationSize = 2;
item->isMandatory = isMandatory;
item->standard = standard;
return WifiMode (uid);
}
WifiMode
WifiModeFactory::CreateDqpsk (std::string uniqueName,
bool isMandatory,
uint32_t bandwidth,
uint32_t dataRate,
uint32_t phyRate,
enum WifiPhyStandard standard)
{
WifiModeFactory *factory = GetFactory ();
uint32_t uid = factory->AllocateUid (uniqueName);
WifiModeItem *item = factory->Get (uid);
item->uniqueUid = uniqueName;
item->bandwidth = bandwidth;
item->dataRate = dataRate;
item->phyRate = phyRate;
item->modulation = WifiMode::DQPSK;
item->constellationSize = 4;
item->isMandatory = isMandatory;
item->standard = standard;
return WifiMode (uid);
}
bool
WifiModeFactory::Search (std::string name, WifiMode *mode)
WifiMode
WifiModeFactory::Search (std::string name)
{
WifiModeItemList::const_iterator i;
uint32_t j = 0;
for (WifiModeItemList::const_iterator i = m_itemList.begin ();
i != m_itemList.end (); i++)
for (i = m_itemList.begin (); i != m_itemList.end (); i++)
{
if (i->uniqueUid == name)
{
*mode = WifiMode (j);
return true;
return WifiMode (j);
}
j++;
}
*mode = WifiMode (0);
return false;
// If we get here then a matching WifiMode was not found above. This
// is a fatal problem, but we try to be helpful by displaying the
// list of WifiModes that are supported.
NS_LOG_UNCOND ("Could not find match for WifiMode named \""
<< name << "\". Valid options are:");
for (i = m_itemList.begin (); i != m_itemList.end (); i++)
{
NS_LOG_UNCOND (" " << i->uniqueUid);
}
// Empty fatal error to die. We've already unconditionally logged
// the helpful information.
NS_FATAL_ERROR ("");
// This next line is unreachable because of the fatal error
// immediately above, and that is fortunate, because we have no idea
// what is in WifiMode (0), but we do know it is not what our caller
// has requested by name. It's here only because it's the safest
// thing that'll give valid code.
return WifiMode (0);
}
uint32_t
@@ -291,10 +241,10 @@ WifiModeFactory::GetFactory (void)
item->bandwidth = 0;
item->dataRate = 0;
item->phyRate = 0;
item->modulation = WifiMode::UNKNOWN;
item->modClass = WIFI_MOD_CLASS_UNKNOWN;
item->constellationSize = 0;
item->codingRate = WIFI_CODE_RATE_UNDEFINED;
item->isMandatory = false;
item->standard = WIFI_PHY_UNKNOWN;
isFirstTime = false;
}
return &factory;

View File

@@ -29,6 +29,51 @@
namespace ns3 {
/**
* This enumeration defines the modulation classes per IEEE
* 802.11-2007, Section 9.6.1, Table 9-2.
*/
enum WifiModulationClass {
/** Modulation class unknown or unspecified. A WifiMode with this
WifiModulationClass has not been properly initialised. */
WIFI_MOD_CLASS_UNKNOWN = 0,
/** Infrared (IR) (Clause 16) */
WIFI_MOD_CLASS_IR,
/** Frequency-hopping spread spectrum (FHSS) PHY (Clause 14) */
WIFI_MOD_CLASS_FHSS,
/** DSSS PHY (Clause 15) and HR/DSSS PHY (Clause 18) */
WIFI_MOD_CLASS_DSSS,
/** ERP-PBCC PHY (19.6) */
WIFI_MOD_CLASS_ERP_PBCC,
/** DSSS-OFDM PHY (19.7) */
WIFI_MOD_CLASS_DSSS_OFDM,
/** ERP-OFDM PHY (19.5) */
WIFI_MOD_CLASS_ERP_OFDM,
/** OFDM PHY (Clause 17) */
WIFI_MOD_CLASS_OFDM,
/** HT PHY (Clause 20) */
WIFI_MOD_CLASS_HT
};
/**
* This enumeration defines the various convolutional coding rates
* used for the OFDM transmission modes in the IEEE 802.11
* standard. DSSS (for example) rates which do not have an explicit
* coding stage in their generation should have this parameter set to
* WIFI_CODE_RATE_UNDEFINED.
*/
enum WifiCodeRate {
/** No explicit coding (e.g., DSSS rates) */
WIFI_CODE_RATE_UNDEFINED,
/** Rate 3/4 */
WIFI_CODE_RATE_3_4,
/** Rate 2/3 */
WIFI_CODE_RATE_2_3,
/** Rate 1/2 */
WIFI_CODE_RATE_1_2
};
/**
* \brief represent a single transmission mode
*
@@ -40,15 +85,6 @@ namespace ns3 {
class WifiMode
{
public:
enum ModulationType {
BPSK,
QPSK,
DBPSK,
DQPSK,
QAM,
UNKNOWN
};
/**
* \returns the number of Hz used by this signal
*/
@@ -65,19 +101,9 @@ class WifiMode
*/
uint32_t GetDataRate (void) const;
/**
* \returns true if this mode uses a bpsk modulation, false
* otherwise.
* \returns the coding rate of this transmission mode
*/
bool IsModulationBpsk (void) const;
/**
* \returns true if this mode uses a qam modulation, false
* otherwise.
*/
bool IsModulationQam (void) const;
/**
* \returns the type of modulation used by this mode.
*/
enum ModulationType GetModulationType (void) const;
enum WifiCodeRate GetCodeRate (void) const;
/**
* \returns the size of the modulation constellation.
*/
@@ -104,11 +130,12 @@ class WifiMode
*/
uint32_t GetUid (void) const;
/**
*
* @return the WifiPhyStandard to which the WifiMode belongs
/**
*
* \returns the Modulation Class (see IEEE 802.11-2007 Section
* 9.6.1) to which this WifiMode belongs.
*/
enum WifiPhyStandard GetStandard () const;
enum WifiModulationClass GetModulationClass () const;
/**
* Create an invalid WifiMode. Calling any method on the
@@ -146,102 +173,29 @@ class WifiModeFactory
public:
/**
* \param uniqueName the name of the associated WifiMode. This name
* must be unique across _all_ instances.
* must be unique accross _all_ instances.
* \param modClass the class of modulation
* \param isMandatory true if this WifiMode is mandatory, false otherwise.
* \param bandwidth the bandwidth (Hz) of the signal generated when the
* associated WifiMode is used.
* \param dataRate the rate (bits/second) at which the user data is transmitted
* \param phyRate the rate (bits/second) at which the encoded user data is transmitted
* \param standard the Wifi Phy standard to apply
* The phyRate includes FEC so, is typically higher than the dataRate.
* \param codingRate if convolutional coding is used for this rate
* then this parameter specifies the convolutional coding rate
* used. If there is no explicit convolutional coding step (e.g.,
* for DSSS rates) then the caller should set this parameter to
* WIFI_CODE_RATE_UNCODED.
* \param constellationSize the order of the constellation used.
*
* Create a BPSK WifiMode.
* Create a WifiMode.
*/
static WifiMode CreateBpsk (std::string uniqueName,
bool isMandatory,
uint32_t bandwidth,
uint32_t dataRate,
uint32_t phyRate,
enum WifiPhyStandard standard);
/**
* \param uniqueName the name of the associated WifiMode. This name
* must be unique across _all_ instances.
* \param isMandatory true if this WifiMode is mandatory, false otherwise.
* \param bandwidth the bandwidth (Hz) of the signal generated when the
* associated WifiMode is used.
* \param dataRate the rate (bits/second) at which the user data is transmitted
* \param phyRate the rate (bits/second) at which the encoded user data is transmitted
* \param standard the Wifi Phy standard to apply
* The phyRate includes FEC so, is typically higher than the dataRate.
*
* Create a QPSK WifiMode.
*/
static WifiMode CreateQpsk (std::string uniqueName,
bool isMandatory,
uint32_t bandwidth,
uint32_t dataRate,
uint32_t phyRate,
enum WifiPhyStandard standard);
/**
* \param uniqueName the name of the associated WifiMode. This name
* must be unique across _all_ instances.
* \param isMandatory true if this WifiMode is mandatory, false otherwise.
* \param bandwidth the bandwidth (Hz) of the signal generated when the
* associated WifiMode is used.
* \param dataRate the rate (bits/second) at which the user data is transmitted
* \param phyRate the rate (bits/second) at which the encoded user data is transmitted
* The phyRate includes FEC so, is typically higher than the dataRate.
* \param constellationSize the number of elements included in the QAM constellation.
* \param standard the Wifi Phy standard to apply
*
* Create a QAM WifiMode.
*/
static WifiMode CreateQam (std::string uniqueName,
bool isMandatory,
uint32_t bandwidth,
uint32_t dataRate,
uint32_t phyRate,
uint8_t constellationSize,
enum WifiPhyStandard standard);
static WifiMode CreateWifiMode (std::string uniqueName,
enum WifiModulationClass modClass,
bool isMandatory,
uint32_t bandwidth,
uint32_t dataRate,
enum WifiCodeRate codingRate,
uint8_t constellationSize);
/**
* \param uniqueName the name of the associated WifiMode. This name
* must be unique across _all_ instances.
* \param isMandatory true if this WifiMode is mandatory, false otherwise.
* \param bandwidth the bandwidth (Hz) of the signal generated when the
* associated WifiMode is used.
* \param dataRate the rate (bits/second) at which the user data is transmitted
* \param phyRate the rate (bits/second) at which the encoded user data is transmitted
* \param standard the Wifi Phy standard to apply
* The phyRate includes FEC so, is typically higher than the dataRate.
*
* Create a DBPSK WifiMode.
*/
static WifiMode CreateDbpsk (std::string uniqueName,
bool isMandatory,
uint32_t bandwidth,
uint32_t dataRate,
uint32_t phyRate,
enum WifiPhyStandard standard);
/**
* \param uniqueName the name of the associated WifiMode. This name
* must be unique across _all_ instances.
* \param isMandatory true if this WifiMode is mandatory, false otherwise.
* \param bandwidth the bandwidth (Hz) of the signal generated when the
* associated WifiMode is used.
* \param dataRate the rate (bits/second) at which the user data is transmitted
* \param phyRate the rate (bits/second) at which the encoded user data is transmitted
* \param standard the Wifi Phy standard to apply
* The phyRate includes FEC so, is typically higher than the dataRate.
*
* Create a DQPSK WifiMode.
*/
static WifiMode CreateDqpsk (std::string uniqueName,
bool isMandatory,
uint32_t bandwidth,
uint32_t dataRate,
uint32_t phyRate,
enum WifiPhyStandard standard);
private:
friend class WifiMode;
friend std::istream & operator >> (std::istream &is, WifiMode &mode);
@@ -258,13 +212,13 @@ private:
uint32_t bandwidth;
uint32_t dataRate;
uint32_t phyRate;
enum WifiMode::ModulationType modulation;
enum WifiModulationClass modClass;
uint8_t constellationSize;
enum WifiCodeRate codingRate;
bool isMandatory;
enum WifiPhyStandard standard;
};
bool Search (std::string name, WifiMode *mode);
WifiMode Search (std::string name);
uint32_t AllocateUid (std::string uniqueName);
WifiModeItem *Get (uint32_t uid);

View File

@@ -82,7 +82,7 @@ PsrExperiment::PsrExperiment ()
{}
PsrExperiment::Input::Input ()
: distance (5.0),
txMode ("wifia-6mbs"),
txMode ("OfdmRate6Mbps"),
txPowerLevel (0),
packetSize (2304),
nPackets (400)
@@ -202,8 +202,8 @@ CollisionExperiment::Input::Input ()
: interval (MicroSeconds (0)),
xA (-5),
xB (5),
txModeA ("wifia-6mbs"),
txModeB ("wifia-6mbs"),
txModeA ("OfdmRate6Mbps"),
txModeB ("OfdmRate6Mbps"),
txPowerLevelA (0),
txPowerLevelB (0),
packetSizeA (2304),
@@ -310,35 +310,35 @@ static void PrintPsrVsDistance (int argc, char *argv[])
PsrExperiment experiment;
struct PsrExperiment::Output output;
input.txMode = "wifia-6mbs";
input.txMode = "OfdmRate6Mbps";
output = experiment.Run (input);
std::cout << " " << CalcPsr (output, input);
input.txMode = "wifia-9mbs";
input.txMode = "OfdmRate9Mbps";
output = experiment.Run (input);
std::cout << " " << CalcPsr (output, input);
input.txMode = "wifia-12mbs";
input.txMode = "OfdmRate12Mbps";
output = experiment.Run (input);
std::cout << " " << CalcPsr (output, input);
input.txMode = "wifia-18mbs";
input.txMode = "OfdmRate18Mbps";
output = experiment.Run (input);
std::cout << " " << CalcPsr (output, input);
input.txMode = "wifia-24mbs";
input.txMode = "OfdmRate24Mbps";
output = experiment.Run (input);
std::cout << " " << CalcPsr (output, input);
input.txMode = "wifia-36mbs";
input.txMode = "OfdmRate36Mbps";
output = experiment.Run (input);
std::cout << " " << CalcPsr (output, input);
input.txMode = "wifia-48mbs";
input.txMode = "OfdmRate48Mbps";
output = experiment.Run (input);
std::cout << " " << CalcPsr (output, input);
input.txMode = "wifia-54mbs";
input.txMode = "OfdmRate54Mbps";
output = experiment.Run (input);
std::cout << " " << CalcPsr (output, input);

View File

@@ -93,85 +93,6 @@ WifiPhy::~WifiPhy ()
NS_LOG_FUNCTION (this);
}
WifiMode
WifiPhy::Get6mba (void)
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifia-6mbs",
true,
20000000, 6000000, 12000000,
WIFI_PHY_STANDARD_80211a);
return mode;
}
WifiMode
WifiPhy::Get9mba (void)
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifia-9mbs",
false,
20000000, 9000000, 12000000,
WIFI_PHY_STANDARD_80211a);
return mode;
}
WifiMode
WifiPhy::Get12mba (void)
{
static WifiMode mode = WifiModeFactory::CreateQpsk ("wifia-12mbs",
true,
20000000, 12000000, 24000000,
WIFI_PHY_STANDARD_80211a);
return mode;
}
WifiMode
WifiPhy::Get18mba (void)
{
static WifiMode mode = WifiModeFactory::CreateQpsk ("wifia-18mbs",
false,
20000000, 18000000, 24000000,
WIFI_PHY_STANDARD_80211a);
return mode;
}
WifiMode
WifiPhy::Get24mba (void)
{
static WifiMode mode = WifiModeFactory::CreateQam ("wifia-24mbs",
true,
20000000, 24000000, 48000000,
16,
WIFI_PHY_STANDARD_80211a);
return mode;
}
WifiMode
WifiPhy::Get36mba (void)
{
static WifiMode mode = WifiModeFactory::CreateQam ("wifia-36mbs",
false,
20000000, 36000000, 48000000,
16,
WIFI_PHY_STANDARD_80211a);
return mode;
}
WifiMode
WifiPhy::Get48mba (void)
{
static WifiMode mode = WifiModeFactory::CreateQam ("wifia-48mbs",
false,
20000000, 48000000, 72000000,
64,
WIFI_PHY_STANDARD_80211a);
return mode;
}
WifiMode
WifiPhy::Get54mba (void)
{
static WifiMode mode = WifiModeFactory::CreateQam ("wifia-54mbs",
false,
20000000, 54000000, 72000000,
64,
WIFI_PHY_STANDARD_80211a);
return mode;
}
void
WifiPhy::NotifyTxBegin (Ptr<const Packet> packet)
{
@@ -220,203 +141,382 @@ WifiPhy::NotifyPromiscSniffTx (Ptr<const Packet> packet, uint16_t channelFreqMhz
m_phyPromiscSniffTxTrace (packet, channelFreqMhz, channelNumber, rate, isShortPreamble);
}
WifiMode
WifiPhy::Get1mbb (void)
/**
* Clause 15 rates (DSSS)
*/
WifiMode
WifiPhy::GetDsssRate1Mbps ()
{
static WifiMode mode = WifiModeFactory::CreateDbpsk ("wifib-1mbs",
true,
22000000, 1000000, 1000000,
WIFI_PHY_STANDARD_80211b);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("DsssRate1Mbps",
WIFI_MOD_CLASS_DSSS,
true,
22000000, 1000000,
WIFI_CODE_RATE_UNDEFINED,
2);
return mode;
}
WifiMode
WifiPhy::Get2mbb (void)
WifiMode
WifiPhy::GetDsssRate2Mbps ()
{
static WifiMode mode = WifiModeFactory::CreateDqpsk ("wifib-2mbs",
true,
22000000, 2000000, 2000000,
WIFI_PHY_STANDARD_80211b);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("DsssRate2Mbps",
WIFI_MOD_CLASS_DSSS,
true,
22000000, 2000000,
WIFI_CODE_RATE_UNDEFINED,
4);
return mode;
}
WifiMode
WifiPhy::Get5_5mbb (void)
/**
* Clause 18 rates (HR/DSSS)
*/
WifiMode
WifiPhy::GetDsssRate5_5Mbps ()
{
static WifiMode mode = WifiModeFactory::CreateDqpsk ("wifib-5.5mbs",
true,
22000000, 5500000, 5500000,
WIFI_PHY_STANDARD_80211b);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("DsssRate5_5Mbps",
WIFI_MOD_CLASS_DSSS,
true,
22000000, 5500000,
WIFI_CODE_RATE_UNDEFINED,
4);
return mode;
}
WifiMode
WifiPhy::Get11mbb (void)
WifiMode
WifiPhy::GetDsssRate11Mbps ()
{
static WifiMode mode = WifiModeFactory::CreateDqpsk ("wifib-11mbs",
true,
22000000, 11000000, 11000000,
WIFI_PHY_STANDARD_80211b);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("DsssRate11Mbps",
WIFI_MOD_CLASS_DSSS,
true,
22000000, 11000000,
WIFI_CODE_RATE_UNDEFINED,
4);
return mode;
}
WifiMode
WifiPhy::Get3mb10Mhz (void)
/**
* Clause 17 rates (OFDM)
*/
WifiMode
WifiPhy::GetOfdmRate6Mbps ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-3mbs-10Mhz",
true,
10000000, 3000000, 6000000,
WIFI_PHY_STANDARD_80211_10Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate6Mbps",
WIFI_MOD_CLASS_OFDM,
true,
20000000, 6000000,
WIFI_CODE_RATE_1_2,
2);
return mode;
}
WifiMode
WifiPhy::Get4_5mb10Mhz (void)
WifiMode
WifiPhy::GetOfdmRate9Mbps ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-4.5mbs-10Mhz",
false,
10000000, 4500000, 6000000,
WIFI_PHY_STANDARD_80211_10Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate9Mbps",
WIFI_MOD_CLASS_OFDM,
false,
20000000, 9000000,
WIFI_CODE_RATE_3_4,
2);
return mode;
}
WifiMode
WifiPhy::Get6mb10Mhz (void)
WifiMode
WifiPhy::GetOfdmRate12Mbps ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-6mbs-10Mhz",
true,
10000000, 6000000, 12000000,
WIFI_PHY_STANDARD_80211_10Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate12Mbps",
WIFI_MOD_CLASS_OFDM,
true,
20000000, 12000000,
WIFI_CODE_RATE_1_2,
4);
return mode;
}
WifiMode
WifiPhy::Get9mb10Mhz (void)
WifiMode
WifiPhy::GetOfdmRate18Mbps ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-9mbs-10Mhz",
false,
10000000, 9000000, 12000000,
WIFI_PHY_STANDARD_80211_10Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate18Mbps",
WIFI_MOD_CLASS_OFDM,
false,
20000000, 18000000,
WIFI_CODE_RATE_3_4,
4);
return mode;
}
WifiMode
WifiPhy::Get12mb10Mhz (void)
WifiMode
WifiPhy::GetOfdmRate24Mbps ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-12mbs-10Mhz",
true,
10000000, 12000000, 24000000,
WIFI_PHY_STANDARD_80211_10Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate24Mbps",
WIFI_MOD_CLASS_OFDM,
true,
20000000, 24000000,
WIFI_CODE_RATE_1_2,
16);
return mode;
}
WifiMode
WifiPhy::Get18mb10Mhz (void)
WifiMode
WifiPhy::GetOfdmRate36Mbps ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-18mbs-10Mhz",
false,
10000000, 18000000, 24000000,
WIFI_PHY_STANDARD_80211_10Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate36Mbps",
WIFI_MOD_CLASS_OFDM,
false,
20000000, 36000000,
WIFI_CODE_RATE_3_4,
16);
return mode;
}
WifiMode
WifiPhy::Get24mb10Mhz (void)
WifiMode
WifiPhy::GetOfdmRate48Mbps ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-24mbs-10Mhz",
false,
10000000, 24000000, 36000000,
WIFI_PHY_STANDARD_80211_10Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate48Mbps",
WIFI_MOD_CLASS_OFDM,
false,
20000000, 48000000,
WIFI_CODE_RATE_2_3,
64);
return mode;
}
WifiMode
WifiPhy::Get27mb10Mhz (void)
WifiMode
WifiPhy::GetOfdmRate54Mbps ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-27mbs-10Mhz",
false,
10000000, 27000000, 36000000,
WIFI_PHY_STANDARD_80211_10Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate54Mbps",
WIFI_MOD_CLASS_OFDM,
false,
20000000, 54000000,
WIFI_CODE_RATE_3_4,
64);
return mode;
}
WifiMode
WifiPhy::Get1_5mb5Mhz (void)
/* 10 MHz channel rates */
WifiMode
WifiPhy::GetOfdmRate3MbpsBW10MHz ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-1_5mbs-5Mhz",
true,
5000000, 1500000, 3000000,
WIFI_PHY_STANDARD_80211_5Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate3MbpsBW10MHz",
WIFI_MOD_CLASS_OFDM,
true,
10000000, 3000000,
WIFI_CODE_RATE_1_2,
2);
return mode;
}
WifiMode
WifiPhy::Get2_25mb5Mhz (void)
WifiMode
WifiPhy::GetOfdmRate4_5MbpsBW10MHz ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-2.25mbs-5Mhz",
false,
5000000, 2250000, 3000000,
WIFI_PHY_STANDARD_80211_5Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate4_5MbpsBW10MHz",
WIFI_MOD_CLASS_OFDM,
false,
10000000, 4500000,
WIFI_CODE_RATE_3_4,
2);
return mode;
}
WifiMode
WifiPhy::Get3mb5Mhz (void)
WifiMode
WifiPhy::GetOfdmRate6MbpsBW10MHz ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-3mbs-5Mhz",
true,
5000000, 3000000, 6000000,
WIFI_PHY_STANDARD_80211_5Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate6MbpsBW10MHz",
WIFI_MOD_CLASS_OFDM,
true,
10000000, 6000000,
WIFI_CODE_RATE_1_2,
4);
return mode;
}
WifiMode
WifiPhy::Get4_5mb5Mhz (void)
WifiMode
WifiPhy::GetOfdmRate9MbpsBW10MHz ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-4.5mbs-5Mhz",
false,
5000000, 4500000, 6000000,
WIFI_PHY_STANDARD_80211_5Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate9MbpsBW10MHz",
WIFI_MOD_CLASS_OFDM,
false,
10000000, 9000000,
WIFI_CODE_RATE_3_4,
4);
return mode;
}
WifiMode
WifiPhy::Get6mb5Mhz (void)
WifiMode
WifiPhy::GetOfdmRate12MbpsBW10MHz ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-6mbs-5Mhz",
true,
5000000, 6000000, 12000000,
WIFI_PHY_STANDARD_80211_5Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate12MbpsBW10MHz",
WIFI_MOD_CLASS_OFDM,
true,
10000000, 12000000,
WIFI_CODE_RATE_1_2,
16);
return mode;
}
WifiMode
WifiPhy::Get9mb5Mhz (void)
WifiMode
WifiPhy::GetOfdmRate18MbpsBW10MHz ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-9mbs-5Mhz",
false,
5000000, 9000000, 12000000,
WIFI_PHY_STANDARD_80211_5Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate18MbpsBW10MHz",
WIFI_MOD_CLASS_OFDM,
false,
10000000, 18000000,
WIFI_CODE_RATE_3_4,
16);
return mode;
}
WifiMode
WifiPhy::Get12mb5Mhz (void)
WifiMode
WifiPhy::GetOfdmRate24MbpsBW10MHz ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-12mbs-5Mhz",
false,
5000000, 12000000, 18000000,
WIFI_PHY_STANDARD_80211_5Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate24MbpsBW10MHz",
WIFI_MOD_CLASS_OFDM,
false,
10000000, 24000000,
WIFI_CODE_RATE_2_3,
64);
return mode;
}
WifiMode
WifiPhy::Get13_5mb5Mhz (void)
WifiMode
WifiPhy::GetOfdmRate27MbpsBW10MHz ()
{
static WifiMode mode = WifiModeFactory::CreateBpsk ("wifi-13.5mbs-5Mhz",
false,
5000000, 13500000, 18000000,
WIFI_PHY_STANDARD_80211_5Mhz);
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate27MbpsBW10MHz",
WIFI_MOD_CLASS_OFDM,
false,
10000000, 27000000,
WIFI_CODE_RATE_3_4,
64);
return mode;
}
/* 5 MHz channel rates */
WifiMode
WifiPhy::GetOfdmRate1_5MbpsBW5MHz ()
{
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate1_5MbpsBW5MHz",
WIFI_MOD_CLASS_OFDM,
true,
5000000, 1500000,
WIFI_CODE_RATE_1_2,
2);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate2_25MbpsBW5MHz ()
{
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate2_25MbpsBW5MHz",
WIFI_MOD_CLASS_OFDM,
false,
5000000, 2250000,
WIFI_CODE_RATE_3_4,
2);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate3MbpsBW5MHz ()
{
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate3MbpsBW5MHz",
WIFI_MOD_CLASS_OFDM,
true,
5000000, 3000000,
WIFI_CODE_RATE_1_2,
4);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate4_5MbpsBW5MHz ()
{
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate4_5MbpsBW5MHz",
WIFI_MOD_CLASS_OFDM,
false,
5000000, 4500000,
WIFI_CODE_RATE_3_4,
4);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate6MbpsBW5MHz ()
{
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate6MbpsBW5MHz",
WIFI_MOD_CLASS_OFDM,
true,
5000000, 6000000,
WIFI_CODE_RATE_1_2,
16);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate9MbpsBW5MHz ()
{
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate9MbpsBW5MHz",
WIFI_MOD_CLASS_OFDM,
false,
5000000, 9000000,
WIFI_CODE_RATE_3_4,
16);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate12MbpsBW5MHz ()
{
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate12MbpsBW5MHz",
WIFI_MOD_CLASS_OFDM,
false,
5000000, 12000000,
WIFI_CODE_RATE_2_3,
64);
return mode;
}
WifiMode
WifiPhy::GetOfdmRate13_5MbpsBW5MHz ()
{
static WifiMode mode =
WifiModeFactory::CreateWifiMode ("OfdmRate13_5MbpsBW5MHz",
WIFI_MOD_CLASS_OFDM,
false,
5000000, 13500000,
WIFI_CODE_RATE_3_4,
64);
return mode;
}
@@ -447,34 +547,34 @@ static class Constructor
{
public:
Constructor () {
ns3::WifiPhy::Get6mba ();
ns3::WifiPhy::Get9mba ();
ns3::WifiPhy::Get12mba ();
ns3::WifiPhy::Get18mba ();
ns3::WifiPhy::Get24mba ();
ns3::WifiPhy::Get36mba ();
ns3::WifiPhy::Get48mba ();
ns3::WifiPhy::Get54mba ();
ns3::WifiPhy::Get1mbb ();
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 ();
ns3::WifiPhy::GetDsssRate1Mbps ();
ns3::WifiPhy::GetDsssRate2Mbps ();
ns3::WifiPhy::GetDsssRate5_5Mbps ();
ns3::WifiPhy::GetDsssRate11Mbps ();
ns3::WifiPhy::GetOfdmRate6Mbps ();
ns3::WifiPhy::GetOfdmRate9Mbps ();
ns3::WifiPhy::GetOfdmRate12Mbps ();
ns3::WifiPhy::GetOfdmRate18Mbps ();
ns3::WifiPhy::GetOfdmRate24Mbps ();
ns3::WifiPhy::GetOfdmRate36Mbps ();
ns3::WifiPhy::GetOfdmRate48Mbps ();
ns3::WifiPhy::GetOfdmRate54Mbps ();
ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz ();
ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz ();
ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz ();
ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz ();
ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz ();
ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz ();
ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz ();
ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz ();
ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz ();
ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz ();
ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz ();
ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz ();
ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz ();
ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz ();
ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz ();
ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz ();
}
} g_constructor;
}

View File

@@ -274,34 +274,34 @@ public:
virtual Ptr<WifiChannel> GetChannel (void) const = 0;
static WifiMode Get6mba (void);
static WifiMode Get9mba (void);
static WifiMode Get12mba (void);
static WifiMode Get18mba (void);
static WifiMode Get24mba (void);
static WifiMode Get36mba (void);
static WifiMode Get48mba (void);
static WifiMode Get54mba (void);
static WifiMode Get1mbb (void);
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);
static WifiMode GetDsssRate1Mbps ();
static WifiMode GetDsssRate2Mbps ();
static WifiMode GetDsssRate5_5Mbps ();
static WifiMode GetDsssRate11Mbps ();
static WifiMode GetOfdmRate6Mbps ();
static WifiMode GetOfdmRate9Mbps ();
static WifiMode GetOfdmRate12Mbps ();
static WifiMode GetOfdmRate18Mbps ();
static WifiMode GetOfdmRate24Mbps ();
static WifiMode GetOfdmRate36Mbps ();
static WifiMode GetOfdmRate48Mbps ();
static WifiMode GetOfdmRate54Mbps ();
static WifiMode GetOfdmRate3MbpsBW10MHz ();
static WifiMode GetOfdmRate4_5MbpsBW10MHz ();
static WifiMode GetOfdmRate6MbpsBW10MHz ();
static WifiMode GetOfdmRate9MbpsBW10MHz ();
static WifiMode GetOfdmRate12MbpsBW10MHz ();
static WifiMode GetOfdmRate18MbpsBW10MHz ();
static WifiMode GetOfdmRate24MbpsBW10MHz ();
static WifiMode GetOfdmRate27MbpsBW10MHz ();
static WifiMode GetOfdmRate1_5MbpsBW5MHz ();
static WifiMode GetOfdmRate2_25MbpsBW5MHz ();
static WifiMode GetOfdmRate3MbpsBW5MHz ();
static WifiMode GetOfdmRate4_5MbpsBW5MHz ();
static WifiMode GetOfdmRate6MbpsBW5MHz ();
static WifiMode GetOfdmRate9MbpsBW5MHz ();
static WifiMode GetOfdmRate12MbpsBW5MHz ();
static WifiMode GetOfdmRate13_5MbpsBW5MHz ();
/**

View File

@@ -559,7 +559,7 @@ WifiRemoteStationManager::GetControlAnswerMode (Mac48Address address, WifiMode r
{
if (i->GetPhyRate () > mode.GetPhyRate () &&
i->GetPhyRate () <= reqMode.GetPhyRate () &&
i->GetModulationType () == reqMode.GetModulationType ())
i->GetModulationClass () == reqMode.GetModulationClass ())
{
mode = *i;
}

View File

@@ -171,113 +171,126 @@ YansErrorRateModel::GetFecQamBer (double snr, uint32_t nbits,
double
YansErrorRateModel::GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const
{
if (mode == WifiPhy::Get6mba () || mode == WifiPhy::Get3mb10Mhz () || mode == WifiPhy::Get1_5mb5Mhz ())
if (mode.GetModulationClass () == WIFI_MOD_CLASS_OFDM)
{
return GetFecBpskBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
10, // dFree
11 // adFree
);
if (mode.GetConstellationSize () == 2)
{
if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
{
return GetFecBpskBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
10, // dFree
11 // adFree
);
}
else
{
return GetFecBpskBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
5, // dFree
8 // adFree
);
}
}
else if (mode.GetConstellationSize () == 4)
{
if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
{
return GetFecQamBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
4, // m
10, // dFree
11, // adFree
0 // adFreePlusOne
);
}
else
{
return GetFecQamBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
4, // m
5, // dFree
8, // adFree
31 // adFreePlusOne
);
}
}
else if (mode.GetConstellationSize () == 16)
{
if (mode.GetCodeRate () == WIFI_CODE_RATE_1_2)
{
return GetFecQamBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
16, // m
10, // dFree
11, // adFree
0 // adFreePlusOne
);
}
else
{
return GetFecQamBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
16, // m
5, // dFree
8, // adFree
31 // adFreePlusOne
);
}
}
else if (mode.GetConstellationSize () == 64)
{
if (mode.GetCodeRate () == WIFI_CODE_RATE_2_3)
{
return GetFecQamBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
64, // m
6, // dFree
1, // adFree
16 // adFreePlusOne
);
}
else
{
return GetFecQamBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
64, // m
5, // dFree
8, // adFree
31 // adFreePlusOne
);
}
}
}
else if (mode == WifiPhy::Get9mba () || mode == WifiPhy::Get4_5mb10Mhz () || mode == WifiPhy::Get2_25mb5Mhz ())
else if (mode.GetModulationClass () == WIFI_MOD_CLASS_DSSS)
{
return GetFecBpskBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
5, // dFree
8 // adFree
);
}
else if (mode == WifiPhy::Get12mba () || mode == WifiPhy::Get6mb10Mhz () || mode == WifiPhy::Get3mb5Mhz ())
{
return GetFecQamBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
4, // m
10, // dFree
11, // adFree
0 // adFreePlusOne
);
}
else if (mode == WifiPhy::Get18mba () || mode == WifiPhy::Get9mb10Mhz () || mode == WifiPhy::Get4_5mb5Mhz ())
{
return GetFecQamBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
4, // m
5, // dFree
8, // adFree
31 // adFreePlusOne
);
}
else if (mode == WifiPhy::Get24mba () || mode == WifiPhy::Get12mb10Mhz () || mode == WifiPhy::Get6mb5Mhz ())
{
return GetFecQamBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
16, // m
10, // dFree
11, // adFree
0 // adFreePlusOne
);
}
else if (mode == WifiPhy::Get36mba () || mode == WifiPhy::Get18mb10Mhz () || mode == WifiPhy::Get9mb5Mhz ())
{
return GetFecQamBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
16, // m
5, // dFree
8, // adFree
31 // adFreePlusOne
);
}
else if (mode == WifiPhy::Get48mba () || mode == WifiPhy::Get24mb10Mhz () || mode == WifiPhy::Get12mb5Mhz ())
{
return GetFecQamBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
64, // m
6, // dFree
1, // adFree
16 // adFreePlusOne
);
}
else if (mode == WifiPhy::Get54mba () || mode == WifiPhy::Get27mb10Mhz () || mode == WifiPhy::Get13_5mb5Mhz ())
{
return GetFecQamBer (snr,
nbits,
mode.GetBandwidth (), // signal spread
mode.GetPhyRate (), // phy rate
64, // m
5, // dFree
8, // adFree
31 // adFreePlusOne
);
}
else if (mode == WifiPhy::Get1mbb ())
{
return DsssErrorRateModel::GetDsssDbpskSuccessRate (snr,nbits);
}
else if (mode == WifiPhy::Get2mbb ())
{
return DsssErrorRateModel::GetDsssDqpskSuccessRate (snr,nbits);
}
else if (mode == WifiPhy::Get5_5mbb ())
{
return DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (snr,nbits);
}
else if (mode == WifiPhy::Get11mbb ())
{
return DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (snr,nbits);
switch (mode.GetDataRate ())
{
case 1000000:
return DsssErrorRateModel::GetDsssDbpskSuccessRate (snr, nbits);
case 2000000:
return DsssErrorRateModel::GetDsssDqpskSuccessRate (snr, nbits);
case 5500000:
return DsssErrorRateModel::GetDsssDqpskCck5_5SuccessRate (snr, nbits);
case 11000000:
return DsssErrorRateModel::GetDsssDqpskCck11SuccessRate (snr, nbits);
}
}
return 0;
}

View File

@@ -534,14 +534,15 @@ YansWifiPhy::Configure80211a (void)
{
NS_LOG_FUNCTION (this);
m_channelStartingFrequency = 5e3; // 5.000 GHz
m_modes.push_back (WifiPhy::Get6mba ());
m_modes.push_back (WifiPhy::Get9mba ());
m_modes.push_back (WifiPhy::Get12mba ());
m_modes.push_back (WifiPhy::Get18mba ());
m_modes.push_back (WifiPhy::Get24mba ());
m_modes.push_back (WifiPhy::Get36mba ());
m_modes.push_back (WifiPhy::Get48mba ());
m_modes.push_back (WifiPhy::Get54mba ());
m_modes.push_back (WifiPhy::GetOfdmRate6Mbps ());
m_modes.push_back (WifiPhy::GetOfdmRate9Mbps ());
m_modes.push_back (WifiPhy::GetOfdmRate12Mbps ());
m_modes.push_back (WifiPhy::GetOfdmRate18Mbps ());
m_modes.push_back (WifiPhy::GetOfdmRate24Mbps ());
m_modes.push_back (WifiPhy::GetOfdmRate36Mbps ());
m_modes.push_back (WifiPhy::GetOfdmRate48Mbps ());
m_modes.push_back (WifiPhy::GetOfdmRate54Mbps ());
}
@@ -550,10 +551,11 @@ YansWifiPhy::Configure80211b (void)
{
NS_LOG_FUNCTION (this);
m_channelStartingFrequency = 2412; // 2.412 GHz
m_modes.push_back (WifiPhy::Get1mbb ());
m_modes.push_back (WifiPhy::Get2mbb ());
m_modes.push_back (WifiPhy::Get5_5mbb ());
m_modes.push_back (WifiPhy::Get11mbb ());
m_modes.push_back (WifiPhy::GetDsssRate1Mbps ());
m_modes.push_back (WifiPhy::GetDsssRate2Mbps ());
m_modes.push_back (WifiPhy::GetDsssRate5_5Mbps ());
m_modes.push_back (WifiPhy::GetDsssRate11Mbps ());
}
void
@@ -561,14 +563,15 @@ YansWifiPhy::Configure80211_10Mhz (void)
{
NS_LOG_FUNCTION (this);
m_channelStartingFrequency = 5e3; // 5.000 GHz, suppose 802.11a
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 ());
m_modes.push_back (WifiPhy::GetOfdmRate3MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate4_5MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate6MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate9MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate12MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate18MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate24MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate27MbpsBW10MHz ());
}
void
@@ -576,14 +579,15 @@ YansWifiPhy::Configure80211_5Mhz (void)
{
NS_LOG_FUNCTION (this);
m_channelStartingFrequency = 5e3; // 5.000 GHz, suppose 802.11a
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 ());
m_modes.push_back (WifiPhy::GetOfdmRate1_5MbpsBW5MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate2_25MbpsBW5MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate3MbpsBW5MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate4_5MbpsBW5MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate6MbpsBW5MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate9MbpsBW5MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate12MbpsBW5MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate13_5MbpsBW5MHz ());
}
void
@@ -591,11 +595,11 @@ YansWifiPhy::ConfigureHolland (void)
{
NS_LOG_FUNCTION (this);
m_channelStartingFrequency = 5e3; // 5.000 GHz
m_modes.push_back (WifiPhy::Get6mba ());
m_modes.push_back (WifiPhy::Get12mba ());
m_modes.push_back (WifiPhy::Get18mba ());
m_modes.push_back (WifiPhy::Get36mba ());
m_modes.push_back (WifiPhy::Get54mba ());
m_modes.push_back (WifiPhy::GetOfdmRate6Mbps ());
m_modes.push_back (WifiPhy::GetOfdmRate12Mbps ());
m_modes.push_back (WifiPhy::GetOfdmRate18Mbps ());
m_modes.push_back (WifiPhy::GetOfdmRate36Mbps ());
m_modes.push_back (WifiPhy::GetOfdmRate54Mbps ());
}
void
@@ -603,14 +607,15 @@ YansWifiPhy::Configure80211p_CCH (void)
{
NS_LOG_FUNCTION (this);
m_channelStartingFrequency = 5e3; // 802.11p works over the 5Ghz freq range
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 ());
m_modes.push_back (WifiPhy::GetOfdmRate3MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate4_5MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate6MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate9MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate12MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate18MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate24MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate27MbpsBW10MHz ());
}
void
@@ -618,14 +623,15 @@ YansWifiPhy::Configure80211p_SCH (void)
{
NS_LOG_FUNCTION (this);
m_channelStartingFrequency = 5e3; // 802.11p works over the 5Ghz freq range
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 ());
m_modes.push_back (WifiPhy::GetOfdmRate3MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate4_5MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate6MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate9MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate12MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate18MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate24MbpsBW10MHz ());
m_modes.push_back (WifiPhy::GetOfdmRate27MbpsBW10MHz ());
}
void

View File

@@ -140,7 +140,7 @@ ChainRegressionTest::CreateDevices ()
YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
wifiPhy.SetChannel (wifiChannel.Create ());
WifiHelper wifi = WifiHelper::Default ();
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("wifia-6mbs"), "RtsCtsThreshold", StringValue ("2200"));
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate6Mbps"), "RtsCtsThreshold", StringValue ("2200"));
NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, *m_nodes);
// 2. Setup TCP/IP & AODV

View File

@@ -115,7 +115,7 @@ Bug772ChainTest::CreateDevices ()
YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
wifiPhy.SetChannel (wifiChannel.Create ());
WifiHelper wifi = WifiHelper::Default ();
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("wifia-6mbs"), "RtsCtsThreshold", StringValue ("2200"));
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate6Mbps"), "RtsCtsThreshold", StringValue ("2200"));
NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, *m_nodes);
// 2. Setup TCP/IP & AODV

View File

@@ -69,7 +69,7 @@ LoopbackTestCase::DoRun ()
YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
wifiPhy.SetChannel (wifiChannel.Create ());
WifiHelper wifi = WifiHelper::Default ();
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("wifia-6mbs"), "RtsCtsThreshold", StringValue ("2200"));
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate6Mbps"), "RtsCtsThreshold", StringValue ("2200"));
NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, nodes);
// Setup TCP/IP & AODV

View File

@@ -96,7 +96,7 @@ Bug780Test::CreateNodes (void)
{
int nWifis = 3;
double SimTime = 200.0;
std::string phyMode ("wifib-1mbs");
std::string phyMode ("DsssRate1Mbps");
//sending one packets per sec
// Fix non-unicast data rate to be the same as that of unicast

View File

@@ -101,7 +101,7 @@ TcRegressionTest::CreateNodes ()
YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
wifiPhy.SetChannel (wifiChannel.Create ());
WifiHelper wifi = WifiHelper::Default ();
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("wifia-6mbs"), "RtsCtsThreshold", StringValue ("2200"));
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate6Mbps"), "RtsCtsThreshold", StringValue ("2200"));
NetDeviceContainer nd = wifi.Install (wifiPhy, wifiMac, c);
// setup IP addresses

View File

@@ -230,7 +230,7 @@ bool
WifiInterferenceTestCase::DoRun (void)
{
std::string phyMode ("wifib-1mbs");
std::string phyMode ("DsssRate1Mbps");
double Prss = -90; // -dBm
double Irss = -90; // -dBm
double delta = 0; // microseconds

View File

@@ -70,7 +70,7 @@ WifiMsduAggregatorThroughputTest::DoRun (void)
// scenario with 802.11b rates (transmit rate fixed to 1 Mbps, no
// less), but this approach tests the bit we need to without unduly
// increasing the complexity of the simulation.
std::string phyMode ("wifib-1mbs");
std::string phyMode ("DsssRate1Mbps");
wifi.SetStandard (WIFI_PHY_STANDARD_80211b);
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue (phyMode),