--- a/src/wifi/model/interference-helper.cc Sat May 07 22:05:29 2011 +0200
+++ b/src/wifi/model/interference-helper.cc Mon May 09 22:03:43 2011 +0200
@@ -189,211 +189,6 @@
return end > now ? end - now : MicroSeconds (0);
}
-WifiMode
-InterferenceHelper::GetPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble)
-{
- 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_ERP_OFDM:
- return WifiPhy::GetErpOfdmRate6Mbps ();
-
- 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.GetModulationClass ())
- {
- 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_MOD_CLASS_ERP_OFDM:
- return 16;
-
- 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;
- }
- else // WIFI_PREAMBLE_LONG
- {
- // IEEE Std 802.11-2007, sections 18.2.2.1 and figure 18-1
- return 48;
- }
-
- default:
- NS_FATAL_ERROR ("unsupported modulation class");
- return 0;
- }
-}
-
-uint32_t
-InterferenceHelper::GetPlcpPreambleDurationMicroSeconds (WifiMode payloadMode, WifiPreamble preamble)
-{
- switch (payloadMode.GetModulationClass ())
- {
- 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_MOD_CLASS_ERP_OFDM:
- return 4;
-
- 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 72;
- }
- else // WIFI_PREAMBLE_LONG
- {
- // IEEE Std 802.11-2007, sections 18.2.2.1 and figure 18-1
- return 144;
- }
-
- default:
- NS_FATAL_ERROR ("unsupported modulation class");
- return 0;
- }
-}
-
-uint32_t
-InterferenceHelper::GetPayloadDurationMicroSeconds (uint32_t size, WifiMode payloadMode)
-{
- NS_LOG_FUNCTION (size << payloadMode);
-
- switch (payloadMode.GetModulationClass ())
- {
- case WIFI_MOD_CLASS_OFDM:
- case WIFI_MOD_CLASS_ERP_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.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));
-
- // Add signal extension for ERP PHY
- if (payloadMode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM)
- {
- return numSymbols * symbolDurationUs + 6;
- }
- else
- {
- return numSymbols * symbolDurationUs;
- }
- }
-
- case WIFI_MOD_CLASS_DSSS:
- // IEEE Std 802.11-2007, section 18.2.3.5
- NS_LOG_LOGIC (" size=" << size
- << " mode=" << payloadMode
- << " rate=" << payloadMode.GetDataRate () );
- return lrint (ceil ((size * 8.0) / (payloadMode.GetDataRate () / 1.0e6)));
-
- default:
- NS_FATAL_ERROR ("unsupported modulation class");
- return 0;
- }
-}
-
-Time
-InterferenceHelper::CalculateTxDuration (uint32_t size, WifiMode payloadMode, WifiPreamble preamble)
-{
- uint32_t duration = GetPlcpPreambleDurationMicroSeconds (payloadMode, preamble)
- + GetPlcpHeaderDurationMicroSeconds (payloadMode, preamble)
- + GetPayloadDurationMicroSeconds (size, payloadMode);
- return MicroSeconds (duration);
-}
-
void
InterferenceHelper::AppendEvent (Ptr<InterferenceHelper::Event> event)
{
@@ -470,9 +265,9 @@
Time previous = (*j).GetTime ();
WifiMode payloadMode = event->GetPayloadMode ();
WifiPreamble preamble = event->GetPreambleType ();
- WifiMode headerMode = GetPlcpHeaderMode (payloadMode, preamble);
- Time plcpHeaderStart = (*j).GetTime () + MicroSeconds (GetPlcpPreambleDurationMicroSeconds (payloadMode, preamble));
- Time plcpPayloadStart = plcpHeaderStart + MicroSeconds (GetPlcpHeaderDurationMicroSeconds (payloadMode, preamble));
+ WifiMode headerMode = WifiPhy::GetPlcpHeaderMode (payloadMode, preamble);
+ Time plcpHeaderStart = (*j).GetTime () + MicroSeconds (WifiPhy::GetPlcpPreambleDurationMicroSeconds (payloadMode, preamble));
+ Time plcpPayloadStart = plcpHeaderStart + MicroSeconds (WifiPhy::GetPlcpHeaderDurationMicroSeconds (payloadMode, preamble));
double noiseInterferenceW = (*j).GetDelta ();
double powerW = event->GetRxPowerW ();