# HG changeset patch # User Federico Maguolo # Date 1195809835 -3600 # Node ID 00b5eb43dba2087f99f72974aab55181724eb51a # Parent 6acd0dca66f901c1a05d4db62e063eacfe118aba Improve the accuracy of 802.11a tx duration calculations. diff -r 6acd0dca66f9 -r 00b5eb43dba2 src/devices/wifi/mac-parameters.cc --- a/src/devices/wifi/mac-parameters.cc Fri Nov 23 11:36:16 2007 +0100 +++ b/src/devices/wifi/mac-parameters.cc Fri Nov 23 10:23:55 2007 +0100 @@ -32,8 +32,8 @@ m_maxSlrc = WifiDefaultParameters::GetMaxSlrc (); // ensure something not too stupid is set by default. - NS_ASSERT (WifiDefaultParameters::GetPhyStandard () == WifiDefaultParameters::PHY_STANDARD_80211a || - WifiDefaultParameters::GetPhyStandard () == WifiDefaultParameters::PHY_STANDARD_holland); + NS_ASSERT (WifiDefaultParameters::GetPhyStandard () == WIFI_PHY_STANDARD_80211a || + WifiDefaultParameters::GetPhyStandard () == WIFI_PHY_STANDARD_holland); uint32_t ctsAckSize = (2 + 2 + 6) * 8; // bits double dataRate = (6e6 / 2); // mb/s Time delay = Seconds (ctsAckSize / dataRate); @@ -43,8 +43,8 @@ void MacParameters::Initialize (Time ctsDelay, Time ackDelay) { - NS_ASSERT (WifiDefaultParameters::GetPhyStandard () == WifiDefaultParameters::PHY_STANDARD_80211a || - WifiDefaultParameters::GetPhyStandard () == WifiDefaultParameters::PHY_STANDARD_holland); + NS_ASSERT (WifiDefaultParameters::GetPhyStandard () == WIFI_PHY_STANDARD_80211a || + WifiDefaultParameters::GetPhyStandard () == WIFI_PHY_STANDARD_holland); // these values are really 802.11a specific m_sifs = MicroSeconds (16); diff -r 6acd0dca66f9 -r 00b5eb43dba2 src/devices/wifi/wifi-default-parameters.cc --- a/src/devices/wifi/wifi-default-parameters.cc Fri Nov 23 11:36:16 2007 +0100 +++ b/src/devices/wifi/wifi-default-parameters.cc Fri Nov 23 10:23:55 2007 +0100 @@ -25,11 +25,11 @@ namespace WifiDefaultParameters { -static EnumDefaultValue g_phyStandard +static EnumDefaultValue g_phyStandard ("WifiPhyStandard", "Describe the set of physical-layer tx modes and parameters", - PHY_STANDARD_80211a, "80211a", - PHY_STANDARD_holland, "holland", + WIFI_PHY_STANDARD_80211a, "80211a", + WIFI_PHY_STANDARD_holland, "holland", 0, (void*)0); static NumericDefaultValue g_maxSsrc @@ -189,7 +189,7 @@ { return g_apBeaconInterval.GetValue (); } -enum PhyStandard +enum WifiPhyStandard GetPhyStandard (void) { return g_phyStandard.GetValue (); diff -r 6acd0dca66f9 -r 00b5eb43dba2 src/devices/wifi/wifi-default-parameters.h --- a/src/devices/wifi/wifi-default-parameters.h Fri Nov 23 11:36:16 2007 +0100 +++ b/src/devices/wifi/wifi-default-parameters.h Fri Nov 23 10:23:55 2007 +0100 @@ -23,15 +23,13 @@ #include #include "ns3/nstime.h" #include "ssid.h" +#include "wifi-phy-standard.h" namespace ns3 { namespace WifiDefaultParameters { -enum PhyStandard { - PHY_STANDARD_80211a, - PHY_STANDARD_holland, -}; + enum RateControlAlgorithm { CONSTANT_RATE, ARF, @@ -54,7 +52,7 @@ uint32_t GetRtsCtsThreshold (void); uint32_t GetFragmentationThreshold (void); Time GetApBeaconInterval (void); -enum PhyStandard GetPhyStandard (void); +enum WifiPhyStandard GetPhyStandard (void); enum RateControlAlgorithm GetRateControlAlgorithm (void); enum PhyModeParameter GetConstantDataRate (void); enum PhyModeParameter GetConstantCtlRate (void); diff -r 6acd0dca66f9 -r 00b5eb43dba2 src/devices/wifi/wifi-phy-standard.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/devices/wifi/wifi-phy-standard.h Fri Nov 23 10:23:55 2007 +0100 @@ -0,0 +1,32 @@ +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2007 INRIA + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Mathieu Lacage + */ +#ifndef WIFI_PHY_STANDARD_H +#define WIFI_PHY_STANDARD_H + +namespace ns3 { + +enum WifiPhyStandard { + WIFI_PHY_STANDARD_80211a, + WIFI_PHY_STANDARD_holland +}; + +} // namespace ns3 + +#endif /* WIFI_PHY_STANDARD_H */ diff -r 6acd0dca66f9 -r 00b5eb43dba2 src/devices/wifi/wifi-phy.cc --- a/src/devices/wifi/wifi-phy.cc Fri Nov 23 11:36:16 2007 +0100 +++ b/src/devices/wifi/wifi-phy.cc Fri Nov 23 10:23:55 2007 +0100 @@ -192,13 +192,14 @@ m_previousStateChangeTime (Seconds (0)), m_device (device), m_endSyncEvent (), - m_random (0.0, 1.0) + m_random (0.0, 1.0), + m_standard (WifiDefaultParameters::GetPhyStandard ()) { - switch (WifiDefaultParameters::GetPhyStandard ()) { - case WifiDefaultParameters::PHY_STANDARD_80211a: + switch (m_standard) { + case WIFI_PHY_STANDARD_80211a: Configure80211a (); break; - case WifiDefaultParameters::PHY_STANDARD_holland: + case WIFI_PHY_STANDARD_holland: ConfigureHolland (); break; default: @@ -407,11 +408,11 @@ void WifiPhy::Configure80211aParameters (void) { - m_plcpLongPreambleDelayUs = 20; - m_plcpShortPreambleDelayUs = 20; + m_plcpLongPreambleDelayUs = 16; + m_plcpShortPreambleDelayUs = 16; m_longPlcpHeaderMode = g_6mba; m_shortPlcpHeaderMode = g_6mba; - m_plcpHeaderLength = 4 + 1 + 12 + 1 + 6 + 16 + 6; + m_plcpHeaderLength = 4 + 1 + 12 + 1 + 6; /* 4095 bytes at a 6Mb/s rate with a 1/2 coding rate. */ m_maxPacketDuration = Seconds (4095.0*8.0/6000000.0*(1.0/2.0)); } @@ -539,18 +540,19 @@ WifiPhy::CalculateTxDuration (uint32_t size, WifiMode payloadMode, WifiPreamble preamble) const { uint64_t delay = 0; - switch (preamble) { - case WIFI_PREAMBLE_LONG: + switch (m_standard) { + case WIFI_PHY_STANDARD_80211a: + case WIFI_PHY_STANDARD_holland: { delay += m_plcpLongPreambleDelayUs; - delay += m_plcpHeaderLength * 1000000 / m_longPlcpHeaderMode.GetDataRate (); - break; - case WIFI_PREAMBLE_SHORT: - delay += m_plcpShortPreambleDelayUs; - delay += m_plcpHeaderLength * 1000000 / m_shortPlcpHeaderMode.GetDataRate (); + // symbol duration is 4us + delay += 4; + delay += lrint (ceil ((size * 8 + 16 + 6) / payloadMode.GetDataRate () / 4e-6) * 4); + } break; + default: + // quiet compiler. + NS_ASSERT (false); break; } - uint64_t nbits = size * 8; - delay += nbits * 1000000 / payloadMode.GetDataRate (); return MicroSeconds (delay); } diff -r 6acd0dca66f9 -r 00b5eb43dba2 src/devices/wifi/wifi-phy.h --- a/src/devices/wifi/wifi-phy.h Fri Nov 23 11:36:16 2007 +0100 +++ b/src/devices/wifi/wifi-phy.h Fri Nov 23 10:23:55 2007 +0100 @@ -34,6 +34,7 @@ #include "ns3/random-variable.h" #include "wifi-mode.h" #include "wifi-preamble.h" +#include "wifi-phy-standard.h" namespace ns3 { @@ -338,6 +339,7 @@ Events m_events; UniformVariable m_random; CallbackTraceSource m_stateLogger; + WifiPhyStandard m_standard; }; } // namespace ns3 diff -r 6acd0dca66f9 -r 00b5eb43dba2 src/devices/wifi/wscript --- a/src/devices/wifi/wscript Fri Nov 23 11:36:16 2007 +0100 +++ b/src/devices/wifi/wscript Fri Nov 23 10:23:55 2007 +0100 @@ -43,5 +43,6 @@ 'wifi-mode.h', 'ssid.h', 'wifi-preamble.h', + 'wifi-phy-standard.h', 'wifi-phy.h', ]