From ecbd57326b00ec43a885bb5dbf051cddc97a2751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deronne?= Date: Sun, 14 Jun 2015 17:33:42 +0200 Subject: [PATCH] cleanup wifi-phy --- src/wifi/model/wifi-phy.cc | 486 ++++++++++++++++---------------- src/wifi/model/wifi-phy.h | 144 +++++----- src/wifi/model/yans-wifi-phy.cc | 2 +- 3 files changed, 303 insertions(+), 329 deletions(-) diff --git a/src/wifi/model/wifi-phy.cc b/src/wifi/model/wifi-phy.cc index 2c6a895b2..05abde536 100644 --- a/src/wifi/model/wifi-phy.cc +++ b/src/wifi/model/wifi-phy.cc @@ -117,31 +117,28 @@ WifiPhy::~WifiPhy () NS_LOG_FUNCTION (this); } -//return the L-SIG WifiMode WifiPhy::GetMFPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble) { - switch (payloadMode.GetBandwidth ()) - { - case 20000000: - return WifiPhy::GetOfdmRate6_5MbpsBW20MHz (); - case 40000000: - return WifiPhy::GetOfdmRate13_5MbpsBW40MHz (); - default: - return WifiPhy::GetOfdmRate6_5MbpsBW20MHz (); - } + switch (payloadMode.GetBandwidth ()) + { + case 20000000: + default: + return WifiPhy::GetOfdmRate6_5MbpsBW20MHz (); + case 40000000: + return WifiPhy::GetOfdmRate13_5MbpsBW40MHz (); + } } Time WifiPhy::GetPlcpHtTrainingSymbolDuration (WifiPreamble preamble, WifiTxVector txvector) { uint8_t Ndltf, Neltf; - //We suppose here that STBC = 0. //If STBC > 0, we need a different mapping between Nss and Nltf (IEEE 802.11n-2012 standard, page 1682). if (txvector.GetNss () < 3) { - Ndltf = txvector.GetNss(); + Ndltf = txvector.GetNss (); } else { @@ -149,7 +146,7 @@ WifiPhy::GetPlcpHtTrainingSymbolDuration (WifiPreamble preamble, WifiTxVector tx } if (txvector.GetNess () < 3) { - Neltf = txvector.GetNess(); + Neltf = txvector.GetNess (); } else { @@ -158,32 +155,29 @@ WifiPhy::GetPlcpHtTrainingSymbolDuration (WifiPreamble preamble, WifiTxVector tx switch (preamble) { - case WIFI_PREAMBLE_HT_MF: - return MicroSeconds(4 + (4 * Ndltf) + (4 * Neltf)); - case WIFI_PREAMBLE_HT_GF: - return MicroSeconds((4 * Ndltf) + (4 * Neltf)); - default: - // no training for non HT - return MicroSeconds(0); + case WIFI_PREAMBLE_HT_MF: + return MicroSeconds (4 + (4 * Ndltf) + (4 * Neltf)); + case WIFI_PREAMBLE_HT_GF: + return MicroSeconds ((4 * Ndltf) + (4 * Neltf)); + default: + //no training for non HT + return MicroSeconds (0); } } -//return L-SIG Time WifiPhy::GetPlcpHtSigHeaderDuration (WifiPreamble preamble) { - switch (preamble) - { - case WIFI_PREAMBLE_HT_MF: - // HT-SIG - return MicroSeconds(8); - case WIFI_PREAMBLE_HT_GF: - //HT-SIG - return MicroSeconds(8); - default: - // no HT-SIG for non HT - return MicroSeconds(0); - } + switch (preamble) + { + case WIFI_PREAMBLE_HT_MF: + case WIFI_PREAMBLE_HT_GF: + //HT-SIG + return MicroSeconds (8); + default: + //no HT-SIG for non HT + return MicroSeconds (0); + } } WifiMode @@ -191,81 +185,78 @@ WifiPhy::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: - // (Section 18.3.2 "PLCP frame format"; IEEE Std 802.11-2012) - // 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 (); - } - } - //Added by Ghada to support 11n - case WIFI_MOD_CLASS_HT: - { //return the HT-SIG - // IEEE Std 802.11n, 20.3.23 - switch (preamble) - { - case WIFI_PREAMBLE_HT_MF: + case WIFI_MOD_CLASS_OFDM: + { + switch (payloadMode.GetBandwidth ()) + { + case 5000000: + return WifiPhy::GetOfdmRate1_5MbpsBW5MHz (); + case 10000000: + return WifiPhy::GetOfdmRate3MbpsBW10MHz (); + default: + //(Section 18.3.2 "PLCP frame format"; IEEE Std 802.11-2012) + //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_HT: + { + //return the HT-SIG + //IEEE Std 802.11n, 20.3.23 + switch (preamble) + { + case WIFI_PREAMBLE_HT_MF: switch (payloadMode.GetBandwidth ()) { - case 20000000: + case 20000000: return WifiPhy::GetOfdmRate13MbpsBW20MHz (); - case 40000000: + case 40000000: return WifiPhy::GetOfdmRate27MbpsBW40MHz (); - default: + default: return WifiPhy::GetOfdmRate13MbpsBW20MHz (); } - case WIFI_PREAMBLE_HT_GF: - switch (payloadMode.GetBandwidth ()) + case WIFI_PREAMBLE_HT_GF: + switch (payloadMode.GetBandwidth ()) { - case 20000000: + case 20000000: return WifiPhy::GetOfdmRate13MbpsBW20MHz (); - case 40000000: + case 40000000: return WifiPhy::GetOfdmRate27MbpsBW40MHz (); - default: + default: return WifiPhy::GetOfdmRate13MbpsBW20MHz (); } - default: + default: return WifiPhy::GetOfdmRate6Mbps (); - } - } + } + } case WIFI_MOD_CLASS_ERP_OFDM: return WifiPhy::GetErpOfdmRate6Mbps (); - case WIFI_MOD_CLASS_DSSS: if (preamble == WIFI_PREAMBLE_LONG) { - // (Section 16.2.3 "PLCP field definitions" and Section 17.2.2.2 "Long PPDU format"; IEEE Std 802.11-2012) + //(Section 16.2.3 "PLCP field definitions" and Section 17.2.2.2 "Long PPDU format"; IEEE Std 802.11-2012) return WifiPhy::GetDsssRate1Mbps (); } - else // WIFI_PREAMBLE_SHORT + else //WIFI_PREAMBLE_SHORT { - // (Section 17.2.2.3 "Short PPDU format"; IEEE Std 802.11-2012) + //(Section 17.2.2.3 "Short PPDU format"; IEEE Std 802.11-2012) return WifiPhy::GetDsssRate2Mbps (); } - default: NS_FATAL_ERROR ("unsupported modulation class"); return WifiMode (); } } - Time WifiPhy::GetPlcpHeaderDuration (WifiMode payloadMode, WifiPreamble preamble) { if (preamble == WIFI_PREAMBLE_NONE) - { + { return MicroSeconds(0); - } + } switch (payloadMode.GetModulationClass ()) { case WIFI_MOD_CLASS_OFDM: @@ -274,55 +265,50 @@ WifiPhy::GetPlcpHeaderDuration (WifiMode payloadMode, WifiPreamble preamble) { case 20000000: default: - // (Section 18.3.3 "PLCP preamble (SYNC))" and Figure 18-4 "OFDM training structure"; IEEE Std 802.11-2012) - // also (Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012) - // We return the duration of the SIGNAL field only, since the - // SERVICE field (which strictly speaking belongs to the PLCP - // header, see Section 18.3.2 and Figure 18-1) is sent using the - // payload mode. - return MicroSeconds(4); + //(Section 18.3.3 "PLCP preamble (SYNC))" and Figure 18-4 "OFDM training structure"; IEEE Std 802.11-2012) + //also (Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012) + //We return the duration of the SIGNAL field only, since the + //SERVICE field (which strictly speaking belongs to the PLCP + //header, see Section 18.3.2 and Figure 18-1) is sent using the + //payload mode. + return MicroSeconds (4); case 10000000: - // (Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012) - return MicroSeconds(8); + //(Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012) + return MicroSeconds (8); case 5000000: - // (Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012) - return MicroSeconds(16); + //(Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012) + return MicroSeconds (16); } } - //Added by Ghada to support 11n case WIFI_MOD_CLASS_HT: - { //IEEE 802.11n Figure 20.1 - switch (preamble) - { - case WIFI_PREAMBLE_HT_MF: - // L-SIG - return MicroSeconds(4); - case WIFI_PREAMBLE_HT_GF: - //L-SIG - return MicroSeconds(0); - default: - // L-SIG - return MicroSeconds(4); - } + { + //L-SIG + //IEEE 802.11n Figure 20.1 + switch (preamble) + { + case WIFI_PREAMBLE_HT_MF: + default: + return MicroSeconds (4); + case WIFI_PREAMBLE_HT_GF: + return MicroSeconds (0); + } } case WIFI_MOD_CLASS_ERP_OFDM: - return MicroSeconds(4); - + return MicroSeconds (4); case WIFI_MOD_CLASS_DSSS: if (preamble == WIFI_PREAMBLE_SHORT) { - // (Section 17.2.2.3 "Short PPDU format" and Figure 17-2 "Short PPDU format"; IEEE Std 802.11-2012) - return MicroSeconds(24); + //(Section 17.2.2.3 "Short PPDU format" and Figure 17-2 "Short PPDU format"; IEEE Std 802.11-2012) + return MicroSeconds (24); } - else // WIFI_PREAMBLE_LONG + else //WIFI_PREAMBLE_LONG { - // (Section 17.2.2.2 "Long PPDU format" and Figure 17-1 "Short PPDU format"; IEEE Std 802.11-2012) - return MicroSeconds(48); + //(Section 17.2.2.2 "Long PPDU format" and Figure 17-1 "Short PPDU format"; IEEE Std 802.11-2012) + return MicroSeconds (48); } - default: NS_FATAL_ERROR ("unsupported modulation class"); - return MicroSeconds(0); + return MicroSeconds (0); } } @@ -330,95 +316,91 @@ Time WifiPhy::GetPlcpPreambleDuration (WifiMode payloadMode, WifiPreamble preamble) { if (preamble == WIFI_PREAMBLE_NONE) - { - return MicroSeconds(0); - } + { + return MicroSeconds (0); + } switch (payloadMode.GetModulationClass ()) { - case WIFI_MOD_CLASS_OFDM: - { - switch (payloadMode.GetBandwidth ()) - { - case 20000000: - default: - // (Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure" - // also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012) - return MicroSeconds(16); - case 10000000: - // (Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure" - // also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012) - return MicroSeconds(32); - case 5000000: - // (Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure" - // also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012) - return MicroSeconds(64); - } - } - case WIFI_MOD_CLASS_HT: - { + case WIFI_MOD_CLASS_OFDM: + { + switch (payloadMode.GetBandwidth ()) + { + case 20000000: + default: + //(Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure" + //also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012) + return MicroSeconds (16); + case 10000000: + //(Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure" + //also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012) + return MicroSeconds (32); + case 5000000: + //(Section 18.3.3 "PLCP preamble (SYNC))" Figure 18-4 "OFDM training structure" + //also Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012) + return MicroSeconds (64); + } + } + case WIFI_MOD_CLASS_HT: //IEEE 802.11n Figure 20.1 the training symbols before L_SIG or HT_SIG - return MicroSeconds(16); - } - case WIFI_MOD_CLASS_ERP_OFDM: - return MicroSeconds(16); - - case WIFI_MOD_CLASS_DSSS: - if (preamble == WIFI_PREAMBLE_SHORT) - { - // (Section 17.2.2.3 "Short PPDU format)" Figure 17-2 "Short PPDU format"; IEEE Std 802.11-2012) - return MicroSeconds(72); - } - else // WIFI_PREAMBLE_LONG - { - // (Section 17.2.2.2 "Long PPDU format)" Figure 17-1 "Long PPDU format"; IEEE Std 802.11-2012) - return MicroSeconds(144); - } - default: - NS_FATAL_ERROR ("unsupported modulation class"); - return MicroSeconds(0); + return MicroSeconds (16); + case WIFI_MOD_CLASS_ERP_OFDM: + return MicroSeconds (16); + case WIFI_MOD_CLASS_DSSS: + if (preamble == WIFI_PREAMBLE_SHORT) + { + //(Section 17.2.2.3 "Short PPDU format)" Figure 17-2 "Short PPDU format"; IEEE Std 802.11-2012) + return MicroSeconds (72); + } + else //WIFI_PREAMBLE_LONG + { + //(Section 17.2.2.2 "Long PPDU format)" Figure 17-1 "Long PPDU format"; IEEE Std 802.11-2012) + return MicroSeconds (144); + } + default: + NS_FATAL_ERROR ("unsupported modulation class"); + return MicroSeconds (0); } } Time WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) { - WifiMode payloadMode = txvector.GetMode(); + WifiMode payloadMode = txvector.GetMode (); NS_LOG_FUNCTION (size << payloadMode); switch (payloadMode.GetModulationClass ()) { - case WIFI_MOD_CLASS_OFDM: - case WIFI_MOD_CLASS_ERP_OFDM: - { - // (Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012 - // corresponds to T_{SYM} in the table) - Time symbolDuration; - - switch (payloadMode.GetBandwidth ()) - { - case 20000000: - default: - symbolDuration = MicroSeconds(4); - break; - case 10000000: - symbolDuration = MicroSeconds(8); - break; - case 5000000: - symbolDuration = MicroSeconds(16); - break; + case WIFI_MOD_CLASS_OFDM: + case WIFI_MOD_CLASS_ERP_OFDM: + { + //(Section 18.3.2.4 "Timing related parameters" Table 18-5 "Timing-related parameters"; IEEE Std 802.11-2012 + //corresponds to T_{SYM} in the table) + Time symbolDuration; + switch (payloadMode.GetBandwidth ()) + { + case 20000000: + default: + symbolDuration = MicroSeconds (4); + break; + case 10000000: + symbolDuration = MicroSeconds (8); + break; + case 5000000: + symbolDuration = MicroSeconds (16); + break; } - // (Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012) - // corresponds to N_{DBPS} in the table - double numDataBitsPerSymbol = payloadMode.GetDataRate () * symbolDuration.GetNanoSeconds() / 1e9; + //(Section 18.3.2.3 "Modulation-dependent parameters" Table 18-4 "Modulation-dependent parameters"; IEEE Std 802.11-2012) + //corresponds to N_{DBPS} in the table + double numDataBitsPerSymbol = payloadMode.GetDataRate () * symbolDuration.GetNanoSeconds () / 1e9; - // (Section 18.3.5.4 "Pad bits (PAD)" Equation 18-11; IEEE Std 802.11-2012) + //(Section 18.3.5.4 "Pad bits (PAD)" Equation 18-11; IEEE Std 802.11-2012) uint32_t numSymbols; if (packetType == 1 && preamble != WIFI_PREAMBLE_NONE) { //First packet in an A-MPDU - numSymbols= ceil((16 + size * 8.0 + 6) / (numDataBitsPerSymbol)); + numSymbols = ceil ((16 + size * 8.0 + 6) / numDataBitsPerSymbol); if (incFlag == 1) { m_totalAmpduSize += size; @@ -428,7 +410,7 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble else if (packetType == 1 && preamble == WIFI_PREAMBLE_NONE) { //consecutive packets in an A-MPDU - numSymbols= ((size * 8.0) / (numDataBitsPerSymbol)); + numSymbols = ((size * 8.0) / numDataBitsPerSymbol); if (incFlag == 1) { m_totalAmpduSize += size; @@ -439,7 +421,7 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble { //last packet in an A-MPDU uint32_t totalAmpduSize = m_totalAmpduSize + size; - numSymbols = lrint (ceil((16 + totalAmpduSize * 8.0 + 6) / (numDataBitsPerSymbol))); + numSymbols = lrint (ceil ((16 + totalAmpduSize * 8.0 + 6) / numDataBitsPerSymbol)); numSymbols -= m_totalAmpduNumSymbols; if (incFlag == 1) { @@ -450,15 +432,15 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble else if (packetType == 0 && preamble != WIFI_PREAMBLE_NONE) { //Not an A-MPDU - numSymbols = lrint (ceil ((16 + size * 8.0 + 6.0) / (numDataBitsPerSymbol))); + numSymbols = lrint (ceil ((16 + size * 8.0 + 6.0) / numDataBitsPerSymbol)); } else NS_FATAL_ERROR ("Wrong combination of preamble and packet type"); - // Add signal extension for ERP PHY + //Add signal extension for ERP PHY if (payloadMode.GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM) { - return Time (numSymbols * symbolDuration) + MicroSeconds(6); + return Time (numSymbols * symbolDuration) + MicroSeconds (6); } else { @@ -467,51 +449,56 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble } case WIFI_MOD_CLASS_HT: { - Time symbolDuration; - double m_Stbc; + Time symbolDuration; + double m_Stbc; //if short GI data rate is used then symbol duration is 3.6us else symbol duration is 4us //In the future has to create a stationmanager that only uses these data rates if sender and reciever support GI - if (payloadMode.GetUniqueName() == "OfdmRate135MbpsBW40MHzShGi" || payloadMode.GetUniqueName() == "OfdmRate65MbpsBW20MHzShGi" ) - { - symbolDuration = NanoSeconds(3600); - } - else - { - switch (payloadMode.GetDataRate ()/ (txvector.GetNss())) - { //shortGi - case 7200000: - case 14400000: - case 21700000: - case 28900000: - case 43300000: - case 57800000: - case 72200000: - case 15000000: - case 30000000: - case 45000000: - case 60000000: - case 90000000: - case 120000000: - case 150000000: - symbolDuration = NanoSeconds(3600); - break; - default: - symbolDuration = MicroSeconds(4); + if (payloadMode.GetUniqueName () == "OfdmRate135MbpsBW40MHzShGi" || payloadMode.GetUniqueName () == "OfdmRate65MbpsBW20MHzShGi" ) + { + symbolDuration = NanoSeconds (3600); + } + else + { + switch (payloadMode.GetDataRate () / (txvector.GetNss ())) + { + //shortGi + case 7200000: + case 14400000: + case 21700000: + case 28900000: + case 43300000: + case 57800000: + case 72200000: + case 15000000: + case 30000000: + case 45000000: + case 60000000: + case 90000000: + case 120000000: + case 150000000: + symbolDuration = NanoSeconds (3600); + break; + default: + symbolDuration = MicroSeconds (4); } - } - if (txvector.IsStbc()) - m_Stbc=2; - else - m_Stbc=1; - double numDataBitsPerSymbol = payloadMode.GetDataRate () * txvector.GetNss() * symbolDuration.GetNanoSeconds() / 1e9; - //check tables 20-35 and 20-36 in the standard to get cases when nes =2 - double Nes=1; - // IEEE Std 802.11n, section 20.3.11, equation (20-32) + } + + if (txvector.IsStbc ()) + m_Stbc = 2; + else + m_Stbc = 1; + + //check tables 20-35 and 20-36 in the standard to get cases when nes =2 + double Nes = 1; + + //IEEE Std 802.11n, section 20.3.11, equation (20-32) uint32_t numSymbols; + double numDataBitsPerSymbol = payloadMode.GetDataRate () * txvector.GetNss () * symbolDuration.GetNanoSeconds () / 1e9; + if (packetType == 1 && preamble != WIFI_PREAMBLE_NONE) { //First packet in an A-MPDU - numSymbols = ceil(m_Stbc*(16 + size * 8.0 + 6*Nes) / (m_Stbc* numDataBitsPerSymbol)); + numSymbols = ceil (m_Stbc * (16 + size * 8.0 + 6 * Nes) / (m_Stbc * numDataBitsPerSymbol)); if (incFlag == 1) { m_totalAmpduSize += size; @@ -521,7 +508,7 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble else if (packetType == 1 && preamble == WIFI_PREAMBLE_NONE) { //consecutive packets in an A-MPDU - numSymbols = m_Stbc* ((size * 8.0 ) / (m_Stbc* numDataBitsPerSymbol)); + numSymbols = m_Stbc * ((size * 8.0 ) / (m_Stbc * numDataBitsPerSymbol)); if (incFlag == 1) { m_totalAmpduSize += size; @@ -531,8 +518,8 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble else if (packetType == 2 && preamble == WIFI_PREAMBLE_NONE) { //last packet in an A-MPDU - uint32_t totalAmpduSize = m_totalAmpduSize+size; - numSymbols = lrint (m_Stbc* ceil((16 + totalAmpduSize * 8.0 + 6*Nes) / (m_Stbc* numDataBitsPerSymbol))); + uint32_t totalAmpduSize = m_totalAmpduSize + size; + numSymbols = lrint (m_Stbc * ceil ((16 + totalAmpduSize * 8.0 + 6 * Nes) / (m_Stbc * numDataBitsPerSymbol))); NS_ASSERT (m_totalAmpduNumSymbols <= numSymbols); numSymbols -= m_totalAmpduNumSymbols; if (incFlag == 1) @@ -542,30 +529,28 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble } } else if (packetType == 0 && preamble != WIFI_PREAMBLE_NONE) - //Not an A-MPDU { - numSymbols = lrint (m_Stbc*ceil ((16 + size * 8.0 + 6.0*Nes) / (m_Stbc* numDataBitsPerSymbol))); + //Not an A-MPDU + numSymbols = lrint (m_Stbc * ceil ((16 + size * 8.0 + 6.0 * Nes) / (m_Stbc * numDataBitsPerSymbol))); } else NS_FATAL_ERROR ("Wrong combination of preamble and packet type"); if (frequency >= 2400 && frequency <= 2500 && ((packetType == 0 && preamble != WIFI_PREAMBLE_NONE) || (packetType == 2 && preamble == WIFI_PREAMBLE_NONE))) //at 2.4 GHz { - return Time (numSymbols * symbolDuration) + MicroSeconds(6); + return Time (numSymbols * symbolDuration) + MicroSeconds (6); } - else //at 5 GHz + else //at 5 GHz { return Time (numSymbols * symbolDuration); } - } case WIFI_MOD_CLASS_DSSS: - // (Section 17.2.3.6 "Long PLCP LENGTH field"; IEEE Std 802.11-2012) + //(Section 17.2.3.6 "Long PLCP LENGTH field"; IEEE Std 802.11-2012) NS_LOG_LOGIC (" size=" << size << " mode=" << payloadMode - << " rate=" << payloadMode.GetDataRate () ); + << " rate=" << payloadMode.GetDataRate ()); return MicroSeconds (lrint (ceil ((size * 8.0) / (payloadMode.GetDataRate () / 1.0e6)))); - default: NS_FATAL_ERROR ("unsupported modulation class"); return MicroSeconds (0); @@ -573,24 +558,21 @@ WifiPhy::GetPayloadDuration (uint32_t size, WifiTxVector txvector, WifiPreamble } Time -WifiPhy::CalculateTxDuration (uint32_t size, WifiTxVector txvector, WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) +WifiPhy::CalculatePlcpPreambleAndHeaderDuration (WifiTxVector txvector, WifiPreamble preamble) { - WifiMode payloadMode=txvector.GetMode(); + WifiMode payloadMode = txvector.GetMode (); Time duration = GetPlcpPreambleDuration (payloadMode, preamble) - + GetPlcpHeaderDuration (payloadMode, preamble) - + GetPlcpHtSigHeaderDuration (preamble) - + GetPlcpHtTrainingSymbolDuration (preamble, txvector) - + GetPayloadDuration (size, txvector, preamble, frequency, packetType, incFlag); + + GetPlcpHeaderDuration (payloadMode, preamble) + + GetPlcpHtSigHeaderDuration (preamble) + + GetPlcpHtTrainingSymbolDuration (preamble, txvector); return duration; } + Time -WifiPhy::CalculatePlcpDuration (WifiTxVector txvector, WifiPreamble preamble) +WifiPhy::CalculateTxDuration (uint32_t size, WifiTxVector txvector, WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag) { - WifiMode payloadMode=txvector.GetMode(); - Time duration = GetPlcpPreambleDuration (payloadMode, preamble) - + GetPlcpHeaderDuration (payloadMode, preamble) - + GetPlcpHtSigHeaderDuration (preamble) - + GetPlcpHtTrainingSymbolDuration (preamble, txvector); + Time duration = CalculatePlcpPreambleAndHeaderDuration (txvector, preamble) + + GetPayloadDuration (size, txvector, preamble, frequency, packetType, incFlag); return duration; } @@ -914,6 +896,7 @@ WifiPhy::GetOfdmRate54Mbps () return mode; } + // 10 MHz channel rates WifiMode @@ -1020,6 +1003,7 @@ WifiPhy::GetOfdmRate27MbpsBW10MHz () return mode; } + // 5 MHz channel rates WifiMode @@ -1126,6 +1110,7 @@ WifiPhy::GetOfdmRate13_5MbpsBW5MHz () return mode; } + // Clause 20 WifiMode @@ -1140,6 +1125,7 @@ WifiPhy::GetOfdmRate6_5MbpsBW20MHz () 2); return mode; } + WifiMode WifiPhy::GetOfdmRate7_2MbpsBW20MHz () { @@ -1178,6 +1164,7 @@ WifiPhy::GetOfdmRate14_4MbpsBW20MHz () 4); return mode; } + WifiMode WifiPhy::GetOfdmRate19_5MbpsBW20MHz () { @@ -1204,7 +1191,6 @@ WifiPhy::GetOfdmRate21_7MbpsBW20MHz () return mode; } - WifiMode WifiPhy::GetOfdmRate26MbpsBW20MHz () { @@ -1283,7 +1269,6 @@ WifiPhy::GetOfdmRate57_8MbpsBW20MHz () return mode; } - WifiMode WifiPhy::GetOfdmRate58_5MbpsBW20MHz () { @@ -1374,6 +1359,7 @@ WifiPhy::GetOfdmRate27MbpsBW40MHz () 4); return mode; } + WifiMode WifiPhy::GetOfdmRate30MbpsBW40MHz () { @@ -1399,6 +1385,7 @@ WifiPhy::GetOfdmRate40_5MbpsBW40MHz () 4); return mode; } + WifiMode WifiPhy::GetOfdmRate45MbpsBW40MHz () { @@ -1450,6 +1437,7 @@ WifiPhy::GetOfdmRate81MbpsBW40MHz () 16); return mode; } + WifiMode WifiPhy::GetOfdmRate90MbpsBW40MHz () { @@ -1475,6 +1463,7 @@ WifiPhy::GetOfdmRate108MbpsBW40MHz () 64); return mode; } + WifiMode WifiPhy::GetOfdmRate120MbpsBW40MHz () { @@ -1487,6 +1476,7 @@ WifiPhy::GetOfdmRate120MbpsBW40MHz () 64); return mode; } + WifiMode WifiPhy::GetOfdmRate121_5MbpsBW40MHz () { @@ -1499,6 +1489,7 @@ WifiPhy::GetOfdmRate121_5MbpsBW40MHz () 64); return mode; } + WifiMode WifiPhy::GetOfdmRate135MbpsBW40MHzShGi () { @@ -1511,6 +1502,7 @@ WifiPhy::GetOfdmRate135MbpsBW40MHzShGi () 64); return mode; } + WifiMode WifiPhy::GetOfdmRate135MbpsBW40MHz () { @@ -1538,7 +1530,6 @@ WifiPhy::GetOfdmRate150MbpsBW40MHz () } - std::ostream& operator<< (std::ostream& os, enum WifiPhy::State state) { switch (state) @@ -1561,8 +1552,6 @@ std::ostream& operator<< (std::ostream& os, enum WifiPhy::State state) } } - - } // namespace ns3 namespace { @@ -1642,4 +1631,5 @@ public: ns3::WifiPhy::GetOfdmRate150MbpsBW40MHz (); } } g_constructor; + } diff --git a/src/wifi/model/wifi-phy.h b/src/wifi/model/wifi-phy.h index 67075d5a2..6dbf58587 100644 --- a/src/wifi/model/wifi-phy.h +++ b/src/wifi/model/wifi-phy.h @@ -82,7 +82,6 @@ public: * unless they have received a cca busy report. */ virtual void NotifyTxStart (Time duration, double txPowerDbm) = 0; - /** * \param duration the expected busy duration. * @@ -163,12 +162,12 @@ public: * arg3: TXVECTOR of packet * arg4: type of preamble used for packet. */ - typedef Callback, double, WifiTxVector, enum WifiPreamble> RxOkCallback; + typedef Callback, double, WifiTxVector, enum WifiPreamble> RxOkCallback; /** * arg1: packet received unsuccessfully * arg2: snr of packet */ - typedef Callback, double> RxErrorCallback; + typedef Callback, double> RxErrorCallback; static TypeId GetTypeId (void); @@ -289,24 +288,25 @@ public: * \param txvector the transmission parameters used for this packet * \param preamble the type of preamble to use for this packet. * \param frequency the channel center frequency (MHz) - * \param packetType the type of the packet 0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU + * \param packetType the type of the packet 0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU * \param incFlag this flag is used to indicate that the static variables need to be update or not. This function is called a couple of times for the same packet so static variables should not be increased each time. - * \return the total amount of time this PHY will stay busy for - * the transmission of these bytes. + * + * \return the total amount of time this PHY will stay busy for the transmission of these bytes. */ Time CalculateTxDuration (uint32_t size, WifiTxVector txvector, enum WifiPreamble preamble, double frequency, uint8_t packetType, uint8_t incFlag); /** * \param txvector the transmission parameters used for this packet * \param preamble the type of preamble to use for this packet. - * \return the total amount of time this PHY will stay busy for the transmission of the plcp. + * + * \return the total amount of time this PHY will stay busy for the transmission of the PLCP preamble and PLCP header. */ - Time CalculatePlcpDuration (WifiTxVector txvector, enum WifiPreamble preamble); + Time CalculatePlcpPreambleAndHeaderDuration (WifiTxVector txvector, enum WifiPreamble preamble); /** * \param preamble the type of preamble * \param txvector the transmission parameters used for this packet - + * * \return the training symbol duration */ static Time GetPlcpHtTrainingSymbolDuration (WifiPreamble preamble, WifiTxVector txvector); @@ -323,8 +323,6 @@ public: * \return the duration of the HT-SIG in Mixed Format and greenfield format PLCP header */ static Time GetPlcpHtSigHeaderDuration (WifiPreamble preamble); - - /** * \param payloadMode the WifiMode use for the transmission of the payload * \param preamble the type of preamble @@ -332,7 +330,6 @@ public: * \return the WifiMode used for the transmission of the PLCP header */ static WifiMode GetPlcpHeaderMode (WifiMode payloadMode, WifiPreamble preamble); - /** * \param payloadMode the WifiMode use for the transmission of the payload * \param preamble the type of preamble @@ -340,7 +337,6 @@ public: * \return the duration of the PLCP header */ static Time GetPlcpHeaderDuration (WifiMode payloadMode, WifiPreamble preamble); - /** * \param payloadMode the WifiMode use for the transmission of the payload * \param preamble the type of preamble @@ -348,13 +344,12 @@ public: * \return the duration of the PLCP preamble */ static Time GetPlcpPreambleDuration (WifiMode payloadMode, WifiPreamble preamble); - /** * \param size the number of bytes in the packet to send * \param txvector the transmission parameters used for this packet - * \param preamble the type of preamble to use for this packet. + * \param preamble the type of preamble to use for this packet * \param frequency the channel center frequency (MHz) - * \param packetType the type of the packet 0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU + * \param packetType the type of the packet (0 is not A-MPDU, 1 is a MPDU that is part of an A-MPDU and 2 is the last MPDU in an A-MPDU) * \param incFlag this flag is used to indicate that the static variables need to be update or not. This function is called a couple of times for the same packet so static variables should not be increased each time * * \return the duration of the payload @@ -393,6 +388,7 @@ public: * necessarily proper) of the BSSBasicRateSet. * * \param mode index in array of supported modes + * * \return the mode whose index is specified. * * \sa WifiPhy::GetNModes() @@ -402,17 +398,21 @@ public: * Check if the given WifiMode is supported by the PHY. * * \param mode the wifi mode to check + * * \return true if the given mode is supported, * false otherwise */ virtual bool IsModeSupported (WifiMode mode) const = 0; + /** * \param txMode the transmission mode * \param ber the probability of bit error rate + * * \return the minimum snr which is required to achieve * the requested ber for the specified transmission mode. (W/W) */ virtual double CalculateSnr (WifiMode txMode, double ber) const = 0; + /** * The WifiPhy::NBssMembershipSelectors() method is used * (e.g., by a WifiRemoteStationManager) to determine the set of @@ -420,12 +420,9 @@ public: * can support - a set of WifiMode objects which we call the * BssMembershipSelectorSet, and which is stored as WifiPhy::m_bssMembershipSelectorSet. * - * This was introduced with 11n - * * \return the memebership selector whose index is specified. */ - virtual uint32_t GetNBssMembershipSelectors (void) const=0; - + virtual uint32_t GetNBssMembershipSelectors (void) const = 0; /** * The WifiPhy::BssMembershipSelector() method is used * (e.g., by a WifiRemoteStationManager) to determine the set of @@ -433,12 +430,11 @@ public: * can support - a set of WifiMode objects which we call the * BssMembershipSelectorSet, and which is stored as WifiPhy::m_bssMembershipSelectorSet. * - * This was introduced with 11n - * * \param selector index in array of supported memberships + * * \return the memebership selector whose index is specified. */ - virtual uint32_t GetBssMembershipSelector (uint32_t selector) const=0; + virtual uint32_t GetBssMembershipSelector (uint32_t selector) const = 0; /** * The WifiPhy::GetMembershipSelectorModes() method is used * (e.g., by a WifiRemoteStationManager) to determine the set of @@ -446,14 +442,13 @@ public: * can support - a set of WifiMode objects which we call the * BssMembershipSelectorSet, and which is stored as WifiPhy::m_bssMembershipSelectorSet. * - * This was introduced with 11n - * * \param selector index in array of supported memberships + * * \return a WifiModeList that contains the WifiModes associrated with the selected index. * * \sa WifiPhy::GetMembershipSelectorModes() */ - virtual WifiModeList GetMembershipSelectorModes(uint32_t selector)=0; + virtual WifiModeList GetMembershipSelectorModes(uint32_t selector) = 0; /** * The WifiPhy::GetNMcs() method is used * (e.g., by a WifiRemoteStationManager) to determine the set of @@ -461,8 +456,6 @@ public: * can support - a set of MCS indexes which we call the * DeviceMcsSet, and which is stored as WifiPhy::m_deviceMcsSet. * - * This was introduced with 11n - * * \return the MCS index whose index is specified. */ virtual uint8_t GetNMcs (void) const=0; @@ -473,31 +466,31 @@ public: * can support - a set of MCS indexes which we call the * DeviceMcsSet, and which is stored as WifiPhy::m_deviceMcsSet. * - * This was introduced with 11n - * * \param mcs index in array of supported MCS + * * \return the MCS index whose index is specified. */ - virtual uint8_t GetMcs (uint8_t mcs) const=0; + virtual uint8_t GetMcs (uint8_t mcs) const = 0; /** * For a given WifiMode finds the corresponding MCS value and returns it * as defined in the IEEE 802.11n standard * * \param mode the WifiMode + * * \return the MCS number that corresponds to the given WifiMode */ - virtual uint32_t WifiModeToMcs (WifiMode mode)=0; + virtual uint32_t WifiModeToMcs (WifiMode mode) = 0; /** * For a given MCS finds the corresponding WifiMode and returns it * as defined in the IEEE 802.11n standard. * * \param mcs the MCS number + * * \return the WifiMode that corresponds to the given MCS number */ - virtual WifiMode McsToWifiMode (uint8_t mcs)=0; + virtual WifiMode McsToWifiMode (uint8_t mcs) = 0; - /** * \brief Set channel number. * @@ -846,7 +839,6 @@ public: * \return a WifiMode for OFDM at 135Mbps with 40MHz channel spacing */ static WifiMode GetOfdmRate135MbpsBW40MHz (); - //Rates for clause 20 with short guard interval /** * Return a WifiMode for OFDM at 7.2Mbps with 20MHz channel spacing. * @@ -946,58 +938,52 @@ public: */ static WifiMode GetOfdmRate150MbpsBW40MHz (); - /** - * Public method used to fire a PhyTxBegin trace. Implemented for encapsulation - * purposes. + * Public method used to fire a PhyTxBegin trace. + * Implemented for encapsulation purposes. * * \param packet the packet being transmitted */ void NotifyTxBegin (Ptr packet); - /** - * Public method used to fire a PhyTxEnd trace. Implemented for encapsulation - * purposes. + * Public method used to fire a PhyTxEnd trace. + * Implemented for encapsulation purposes. * * \param packet the packet that was transmitted */ void NotifyTxEnd (Ptr packet); - /** - * Public method used to fire a PhyTxDrop trace. Implemented for encapsulation - * purposes. + * Public method used to fire a PhyTxDrop trace. + * Implemented for encapsulation purposes. * * \param packet the packet that was failed to transmitted */ void NotifyTxDrop (Ptr packet); - /** - * Public method used to fire a PhyRxBegin trace. Implemented for encapsulation - * purposes. + * Public method used to fire a PhyRxBegin trace. + * Implemented for encapsulation purposes. * * \param packet the packet being received */ void NotifyRxBegin (Ptr packet); - /** - * Public method used to fire a PhyRxEnd trace. Implemented for encapsulation - * purposes. + * Public method used to fire a PhyRxEnd trace. + * Implemented for encapsulation purposes. * * \param packet the packet received */ void NotifyRxEnd (Ptr packet); - /** - * Public method used to fire a PhyRxDrop trace. Implemented for encapsulation - * purposes. + * Public method used to fire a PhyRxDrop trace. + * Implemented for encapsulation purposes. * * \param packet the packet that was not successfully received */ void NotifyRxDrop (Ptr packet); /** - * Public method used to fire a MonitorSniffer trace for a wifi packet - * being received. Implemented for encapsulation purposes. + * Public method used to fire a MonitorSniffer trace for a wifi packet being received. + * Implemented for encapsulation purposes. * * \param packet the packet being received * \param channelFreqMhz the frequency in MHz at which the packet is @@ -1038,7 +1024,7 @@ public: * \param isShortPreamble true if short preamble is used, false otherwise * \param txVector the txvector that holds rx parameters * \param signalDbm signal power in dBm - * \param noiseDbm noise power in dBm + * \param noiseDbm noise power in dBm */ typedef void (* MonitorSnifferRxCallback) (Ptr packet, uint16_t channelFreqMhz, @@ -1047,8 +1033,8 @@ public: double signalDbm, double noiseDbm); /** - * Public method used to fire a MonitorSniffer trace for a wifi packet - * being transmitted. Implemented for encapsulation purposes. + * Public method used to fire a MonitorSniffer trace for a wifi packet being transmitted. + * Implemented for encapsulation purposes. * * \param packet the packet being transmitted * \param channelFreqMhz the frequency in MHz at which the packet is @@ -1080,10 +1066,9 @@ public: uint16_t channelNumber, uint32_t rate, bool isShortPreamble, WifiTxVector txvector); - /** * Assign a fixed random variable stream number to the random variables - * used by this model. Return the number of streams (possibly zero) that + * used by this model. Return the number of streams (possibly zero) that * have been assigned. * * \param stream first stream index to use @@ -1094,69 +1079,68 @@ public: /** * \param freq the operating frequency on this node. */ - virtual void SetFrequency (uint32_t freq)=0; + virtual void SetFrequency (uint32_t freq) = 0; /** * \return the operating frequency on this node */ - virtual uint32_t GetFrequency (void) const=0; + virtual uint32_t GetFrequency (void) const = 0; /** * \param tx the number of transmitters on this node. */ - virtual void SetNumberOfTransmitAntennas (uint32_t tx)=0; - + virtual void SetNumberOfTransmitAntennas (uint32_t tx) = 0; /** * \return the number of transmit antenna on this device */ - virtual uint32_t GetNumberOfTransmitAntennas (void) const=0; + virtual uint32_t GetNumberOfTransmitAntennas (void) const = 0; /** * \param rx the number of receivers on this node. */ - virtual void SetNumberOfReceiveAntennas (uint32_t rx)=0 ; + virtual void SetNumberOfReceiveAntennas (uint32_t rx) = 0; /** * \return the number of receivers on this node. */ - virtual uint32_t GetNumberOfReceiveAntennas (void) const=0; + virtual uint32_t GetNumberOfReceiveAntennas (void) const = 0; /** * \param guardInterval Enable or disable short guard interval */ - virtual void SetGuardInterval (bool guardInterval)=0; - /** - * \return true if short guard interval is supported, false otherwise + virtual void SetGuardInterval (bool guardInterval) = 0; + /** + * \return true if short guard interval is supported, false otherwise */ virtual bool GetGuardInterval (void) const = 0; /** * \param ldpc Enable or disable LDPC */ - virtual void SetLdpc (bool ldpc)=0; + virtual void SetLdpc (bool ldpc) = 0; /** * \return true if LDPC is supported, false otherwise */ - virtual bool GetLdpc (void) const=0; + virtual bool GetLdpc (void) const = 0; /** * \param stbc Enable or disable STBC is supported */ - virtual void SetStbc (bool stbc)=0; + virtual void SetStbc (bool stbc) = 0; /** - * \return true if STBC is supported, false otherwise + * \return true if STBC is supported, false otherwise */ - virtual bool GetStbc (void) const=0; - + virtual bool GetStbc (void) const = 0; /** * \param greenfield Enable or disable GreenField */ - virtual void SetGreenfield (bool greenfield)=0; + virtual void SetGreenfield (bool greenfield) = 0; /** * \return true if Greenfield is supported, false otherwise */ - virtual bool GetGreenfield (void) const=0; + virtual bool GetGreenfield (void) const = 0; /** * \return true if channel bonding 40 MHz is supported, false otherwise */ virtual bool GetChannelBonding (void) const = 0; /** - * \param channelbonding Enable or disable channel bonding + * \param channelbonding Enable or disable channel bonding */ - virtual void SetChannelBonding (bool channelbonding) = 0 ; + virtual void SetChannelBonding (bool channelbonding) = 0; + private: /** diff --git a/src/wifi/model/yans-wifi-phy.cc b/src/wifi/model/yans-wifi-phy.cc index 2a7577b6a..5b4065448 100644 --- a/src/wifi/model/yans-wifi-phy.cc +++ b/src/wifi/model/yans-wifi-phy.cc @@ -533,7 +533,7 @@ YansWifiPhy::StartReceivePlcp (Ptr packet, rxPowerDbm += m_rxGainDb; double rxPowerW = DbmToW (rxPowerDbm); Time endRx = Simulator::Now () + rxDuration; - Time plcpDuration = CalculatePlcpDuration (txVector, preamble); + Time plcpDuration = CalculatePlcpPreambleAndHeaderDuration (txVector, preamble); Ptr event; event = m_interference.Add (packet->GetSize (),