wifi: Adjust HePhy and HePpdu to support EHT MU PPDUs

EHT SU transmissions are carried in EHT MU PPDUs, which have the EHT-SIG field.
Makes no difference for HE PPDUs.
This commit is contained in:
Stefano Avallone
2023-01-17 13:20:44 +01:00
parent 939b266414
commit bdfa411183
2 changed files with 16 additions and 6 deletions

View File

@@ -217,7 +217,7 @@ HePhy::GetSigADuration(WifiPreamble preamble) const
Time
HePhy::GetSigBDuration(const WifiTxVector& txVector) const
{
if (txVector.IsDlMu()) // See section 27.3.10.8 of IEEE 802.11ax draft 4.0.
if (ns3::IsDlMu(txVector.GetPreambleType())) // See section 27.3.11.8 of IEEE 802.11ax-2021
{
NS_ASSERT(txVector.GetModulationClass() >= WIFI_MOD_CLASS_HE);
@@ -707,8 +707,18 @@ HePhy::ProcessSigB(Ptr<Event> event, PhyFieldRxStatus status)
return PhyFieldRxStatus(false, FILTERED, DROP);
}
}
m_currentMuPpduUid =
event->GetPpdu()->GetUid(); // to be able to correctly schedule start of OFDMA payload
if (event->GetTxVector().IsDlMu())
{
// When including a Trigger Frame, a DL MU PPDU solicits a TB PPDU.
// NOTE that the 'if' condition above is not needed for HE because SIG-B is only
// included in HE MU PPDUs, but it is necessary for EHT to avoid that a non-AP
// STA receiving a Trigger Frame sent as an EHT SU transmission (which carries
// the EHT-SIG field) stores the PPDU UID and uses it later to schedule the
// reception of the OFDMA payload of the TB PPDU (see HePhy::StartReceivePreamble())
// despite it lacks the TRIGVECTOR.
m_currentMuPpduUid =
event->GetPpdu()->GetUid(); // to be able to correctly schedule start of OFDMA payload
}
return status;
}
@@ -1713,7 +1723,7 @@ uint32_t
HePhy::GetSigBFieldSize(const WifiTxVector& txVector)
{
NS_ASSERT(txVector.GetModulationClass() >= WIFI_MOD_CLASS_HE);
NS_ASSERT(txVector.IsDlMu());
NS_ASSERT(ns3::IsDlMu(txVector.GetPreambleType()));
// Compute the number of bits used by common field.
// Assume that compression bit in HE-SIG-A is not set (i.e. not

View File

@@ -123,12 +123,12 @@ HePpdu::SetPhyHeaders(const WifiTxVector& txVector, Time ppduDuration)
3) -
3 - m);
m_lSig.SetLength(length);
if (txVector.IsDlMu())
if (ns3::IsDlMu(m_preamble))
{
m_heSig.SetMuFlag(true);
m_heSig.SetMcs(txVector.GetSigBMode().GetMcsValue());
}
else if (!txVector.IsUlMu())
else if (!ns3::IsUlMu(m_preamble))
{
m_heSig.SetMcs(txVector.GetMode().GetMcsValue());
m_heSig.SetNStreams(txVector.GetNss());