wifi: Add support for HE_TB preamble
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user