From 5af297ec1f5befbaf1cab556c03ed2e65d3e0010 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deronne?= Date: Sun, 30 Jun 2019 20:49:13 +0200 Subject: [PATCH] wifi: Add support for HE_TB preamble --- src/wifi/model/interference-helper.cc | 24 +++++++++++------------ src/wifi/model/wifi-phy.cc | 2 ++ src/wifi/model/wifi-ppdu.cc | 16 ++++++++++----- src/wifi/model/wifi-utils.cc | 18 +++++++++++++++++ src/wifi/model/wifi-utils.h | 28 +++++++++++++++++++++++++++ 5 files changed, 71 insertions(+), 17 deletions(-) diff --git a/src/wifi/model/interference-helper.cc b/src/wifi/model/interference-helper.cc index 086108c9d..873f0a4bd 100644 --- a/src/wifi/model/interference-helper.cc +++ b/src/wifi/model/interference-helper.cc @@ -475,17 +475,17 @@ InterferenceHelper::CalculateHtPhyHeaderPer (Ptr event, NiChanges * Time previous = j->first; WifiPreamble preamble = txVector.GetPreambleType (); WifiMode mcsHeaderMode; - if (preamble == WIFI_PREAMBLE_HT_MF || preamble == WIFI_PREAMBLE_HT_GF) + if (IsHt (preamble)) { //mode for PHY header fields sent with HT modulation mcsHeaderMode = WifiPhy::GetHtPhyHeaderMode (); } - else if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_VHT_MU) + else if (IsVht (preamble)) { //mode for PHY header fields sent with VHT modulation mcsHeaderMode = WifiPhy::GetVhtPhyHeaderMode (); } - else if (preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_HE_MU) + else if (IsHe (preamble)) { //mode for PHY header fields sent with HE modulation mcsHeaderMode = WifiPhy::GetHePhyHeaderMode (); @@ -535,7 +535,7 @@ InterferenceHelper::CalculateHtPhyHeaderPer (Ptr event, NiChanges * { psr *= CalculateChunkSuccessRate (snr, phyPayloadStart - phyTrainingSymbolsStart, mcsHeaderMode, txVector); //Case 3ai: VHT or HE format - if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) + if (IsVht (preamble) || IsHe (preamble)) { //SIG-A is sent using non-HT OFDM modulation psr *= CalculateChunkSuccessRate (snr, phyTrainingSymbolsStart - previous, headerMode, txVector); @@ -553,7 +553,7 @@ InterferenceHelper::CalculateHtPhyHeaderPer (Ptr event, NiChanges * { psr *= CalculateChunkSuccessRate (snr, current - phyTrainingSymbolsStart, mcsHeaderMode, txVector); //Case 3bi: VHT or HE format - if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) + if (IsVht (preamble) || IsHe (preamble)) { //SIG-A is sent using non-HT OFDM modulation psr *= CalculateChunkSuccessRate (snr, phyTrainingSymbolsStart - previous, headerMode, txVector); @@ -570,7 +570,7 @@ InterferenceHelper::CalculateHtPhyHeaderPer (Ptr event, NiChanges * else { //Case 3ci: VHT or HE format - if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) + if (IsVht (preamble) || IsHe (preamble)) { //SIG-A is sent using non-HT OFDM modulation psr *= CalculateChunkSuccessRate (snr, current - previous, headerMode, txVector); @@ -598,7 +598,7 @@ InterferenceHelper::CalculateHtPhyHeaderPer (Ptr event, NiChanges * NS_LOG_DEBUG ("Case 4ai - previous in L-SIG and current after payload start: nothing to do"); } //Case 4aii: VHT or HE format - else if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) + else if (IsVht (preamble) || IsHe (preamble)) { psr *= CalculateChunkSuccessRate (snr, phyPayloadStart - phyTrainingSymbolsStart, mcsHeaderMode, txVector); psr *= CalculateChunkSuccessRate (snr, phyTrainingSymbolsStart - phyLSigHeaderEnd, headerMode, txVector); @@ -616,7 +616,7 @@ InterferenceHelper::CalculateHtPhyHeaderPer (Ptr event, NiChanges * { NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT)); //Case 4bi: VHT or HE format - if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) + if (IsVht (preamble) || IsHe (preamble)) { psr *= CalculateChunkSuccessRate (snr, current - phyTrainingSymbolsStart, mcsHeaderMode, txVector); psr *= CalculateChunkSuccessRate (snr, phyTrainingSymbolsStart - phyLSigHeaderEnd, headerMode, txVector); @@ -634,7 +634,7 @@ InterferenceHelper::CalculateHtPhyHeaderPer (Ptr event, NiChanges * { NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT)); //Case 4ci: VHT format - if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) + if (IsVht (preamble) || IsHe (preamble)) { psr *= CalculateChunkSuccessRate (snr, current - phyLSigHeaderEnd, headerMode, txVector); NS_LOG_DEBUG ("Case 4ci - previous is in L-SIG and current in SIG-A: mode=" << headerMode << ", psr=" << psr); @@ -666,7 +666,7 @@ InterferenceHelper::CalculateHtPhyHeaderPer (Ptr event, NiChanges * NS_LOG_DEBUG ("Case 5ai - previous is in the preamble and current is after payload start: nothing to do"); } //Case 5aii: VHT or HE format - else if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) + else if (IsVht (preamble) || IsHe (preamble)) { psr *= CalculateChunkSuccessRate (snr, phyPayloadStart - phyTrainingSymbolsStart, mcsHeaderMode, txVector); psr *= CalculateChunkSuccessRate (snr, phyTrainingSymbolsStart - phyLSigHeaderEnd, headerMode, txVector); @@ -684,7 +684,7 @@ InterferenceHelper::CalculateHtPhyHeaderPer (Ptr event, NiChanges * { NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT)); //Case 5bi: VHT or HE format - if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) + if (IsVht (preamble) || IsHe (preamble)) { psr *= CalculateChunkSuccessRate (snr, current - phyTrainingSymbolsStart, mcsHeaderMode, txVector); psr *= CalculateChunkSuccessRate (snr, phyTrainingSymbolsStart - phyLSigHeaderEnd, headerMode, txVector); @@ -702,7 +702,7 @@ InterferenceHelper::CalculateHtPhyHeaderPer (Ptr event, NiChanges * { NS_ASSERT ((preamble != WIFI_PREAMBLE_LONG) && (preamble != WIFI_PREAMBLE_SHORT)); //Case 5ci: VHT or HE format - if (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_VHT_MU || preamble == WIFI_PREAMBLE_HE_MU) + if (IsVht (preamble) || IsHe (preamble)) { psr *= CalculateChunkSuccessRate (snr, current - phyLSigHeaderEnd, headerMode, txVector); NS_LOG_DEBUG ("Case 5ci - previous is in preamble and current in SIG-A: mode=" << headerMode << ", psr=" << psr); diff --git a/src/wifi/model/wifi-phy.cc b/src/wifi/model/wifi-phy.cc index 00dcca1b4..109d19b33 100644 --- a/src/wifi/model/wifi-phy.cc +++ b/src/wifi/model/wifi-phy.cc @@ -1963,6 +1963,7 @@ WifiPhy::GetPhyTrainingSymbolDuration (WifiTxVector txVector) return MicroSeconds (4 + (4 * Ndltf)); case WIFI_PREAMBLE_HE_SU: case WIFI_PREAMBLE_HE_MU: + case WIFI_PREAMBLE_HE_TB: return MicroSeconds (4 + (8 * Ndltf)); default: return MicroSeconds (0); @@ -1993,6 +1994,7 @@ WifiPhy::GetPhySigA1Duration (WifiPreamble preamble) case WIFI_PREAMBLE_HE_SU: case WIFI_PREAMBLE_VHT_MU: case WIFI_PREAMBLE_HE_MU: + case WIFI_PREAMBLE_HE_TB: //VHT-SIG-A1 and HE-SIG-A1 return MicroSeconds (4); default: diff --git a/src/wifi/model/wifi-ppdu.cc b/src/wifi/model/wifi-ppdu.cc index 767717a39..8d74505b5 100644 --- a/src/wifi/model/wifi-ppdu.cc +++ b/src/wifi/model/wifi-ppdu.cc @@ -124,7 +124,7 @@ WifiPpdu::SetPhyHeaders (WifiTxVector txVector, Time ppduDuration, WifiPhyBand b sigExtension = 6; } uint8_t m = 0; - if (m_preamble == WIFI_PREAMBLE_HE_SU) + if ((m_preamble == WIFI_PREAMBLE_HE_SU) || (m_preamble == WIFI_PREAMBLE_HE_TB)) { m = 2; } @@ -138,8 +138,14 @@ WifiPpdu::SetPhyHeaders (WifiTxVector txVector, Time ppduDuration, WifiPhyBand b } uint16_t length = ((ceil ((static_cast (ppduDuration.GetNanoSeconds () - (20 * 1000) - (sigExtension * 1000)) / 1000) / 4.0) * 3) - 3 - m); m_lSig.SetLength (length); - m_heSig.SetMuFlag (m_preamble == WIFI_PREAMBLE_HE_MU); - m_heSig.SetMcs (txVector.GetMode ().GetMcsValue ()); + if (m_preamble == WIFI_PREAMBLE_HE_MU) + { + m_heSig.SetMuFlag (true); + } + else if (m_preamble != WIFI_PREAMBLE_HE_TB) + { + m_heSig.SetMcs (txVector.GetMode ().GetMcsValue ()); + } m_heSig.SetBssColor (txVector.GetBssColor ()); m_heSig.SetChannelWidth (m_channelWidth); m_heSig.SetGuardIntervalAndLtfSize (txVector.GetGuardInterval (), 2/*NLTF currently unused*/); @@ -422,7 +428,7 @@ WifiPpdu::GetTxDuration (void) const sigExtension = 6; } uint8_t m = 0; - if (m_preamble == WIFI_PREAMBLE_HE_SU) + if ((m_preamble == WIFI_PREAMBLE_HE_SU) || (m_preamble == WIFI_PREAMBLE_HE_TB)) { m = 2; } @@ -446,7 +452,7 @@ WifiPpdu::GetTxDuration (void) const bool WifiPpdu::IsMu (void) const { - return ((m_preamble == WIFI_PREAMBLE_VHT_MU) || (m_preamble == WIFI_PREAMBLE_HE_MU)); + return ((m_preamble == WIFI_PREAMBLE_VHT_MU) || (m_preamble == WIFI_PREAMBLE_HE_MU) || (m_preamble == WIFI_PREAMBLE_HE_TB)); } WifiModulationClass diff --git a/src/wifi/model/wifi-utils.cc b/src/wifi/model/wifi-utils.cc index 1f2a4ee05..dbf82d585 100644 --- a/src/wifi/model/wifi-utils.cc +++ b/src/wifi/model/wifi-utils.cc @@ -264,4 +264,22 @@ GetPpduMaxTime (WifiPreamble preamble) return duration; } +bool +IsHt (WifiPreamble preamble) +{ + return (preamble == WIFI_PREAMBLE_HT_MF || preamble == WIFI_PREAMBLE_HT_GF); +} + +bool +IsVht (WifiPreamble preamble) +{ + return (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_VHT_MU); +} + +bool +IsHe (WifiPreamble preamble) +{ + return (preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_HE_MU || preamble == WIFI_PREAMBLE_HE_TB || preamble == WIFI_PREAMBLE_HE_ER_SU); +} + } //namespace ns3 diff --git a/src/wifi/model/wifi-utils.h b/src/wifi/model/wifi-utils.h index e0f47de48..183427e3b 100644 --- a/src/wifi/model/wifi-utils.h +++ b/src/wifi/model/wifi-utils.h @@ -183,6 +183,34 @@ uint32_t GetSize (Ptr packet, const WifiMacHeader *hdr, bool isAmp */ Time GetPpduMaxTime (WifiPreamble preamble); +/** + * Return whether the preamble is a HT format preamble. + * + * \param preamble the preamble type + * + * \return true if the preamble is a HT format preamble, + * false otherwise + */ +bool IsHt (WifiPreamble preamble); +/** + * Return whether the preamble is a VHT format preamble. + * + * \param preamble the preamble type + * + * \return true if the preamble is a VHT format preamble, + * false otherwise + */ +bool IsVht (WifiPreamble preamble); +/** + * Return whether the preamble is a HE format preamble. + * + * \param preamble the preamble type + * + * \return true if the preamble is a HE format preamble, + * false otherwise + */ +bool IsHe (WifiPreamble preamble); + /// Size of the space of sequence numbers const uint16_t SEQNO_SPACE_SIZE = 4096;