wifi: Add support for HE_TB preamble

This commit is contained in:
Sébastien Deronne
2019-06-30 20:49:13 +02:00
parent 8718921d33
commit 5af297ec1f
5 changed files with 71 additions and 17 deletions

View File

@@ -475,17 +475,17 @@ InterferenceHelper::CalculateHtPhyHeaderPer (Ptr<const Event> 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<const Event> 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<const Event> 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<const Event> 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<const Event> 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<const Event> 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<const Event> 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<const Event> 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<const Event> 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<const Event> 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);

View File

@@ -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:

View File

@@ -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<double> (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

View File

@@ -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

View File

@@ -183,6 +183,34 @@ uint32_t GetSize (Ptr<const Packet> 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;