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 Time
HePhy::GetSigBDuration(const WifiTxVector& txVector) const 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); NS_ASSERT(txVector.GetModulationClass() >= WIFI_MOD_CLASS_HE);
@@ -707,8 +707,18 @@ HePhy::ProcessSigB(Ptr<Event> event, PhyFieldRxStatus status)
return PhyFieldRxStatus(false, FILTERED, DROP); return PhyFieldRxStatus(false, FILTERED, DROP);
} }
} }
m_currentMuPpduUid = if (event->GetTxVector().IsDlMu())
event->GetPpdu()->GetUid(); // to be able to correctly schedule start of OFDMA payload {
// 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; return status;
} }
@@ -1713,7 +1723,7 @@ uint32_t
HePhy::GetSigBFieldSize(const WifiTxVector& txVector) HePhy::GetSigBFieldSize(const WifiTxVector& txVector)
{ {
NS_ASSERT(txVector.GetModulationClass() >= WIFI_MOD_CLASS_HE); 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. // Compute the number of bits used by common field.
// Assume that compression bit in HE-SIG-A is not set (i.e. not // 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) -
3 - m); 3 - m);
m_lSig.SetLength(length); m_lSig.SetLength(length);
if (txVector.IsDlMu()) if (ns3::IsDlMu(m_preamble))
{ {
m_heSig.SetMuFlag(true); m_heSig.SetMuFlag(true);
m_heSig.SetMcs(txVector.GetSigBMode().GetMcsValue()); m_heSig.SetMcs(txVector.GetSigBMode().GetMcsValue());
} }
else if (!txVector.IsUlMu()) else if (!ns3::IsUlMu(m_preamble))
{ {
m_heSig.SetMcs(txVector.GetMode().GetMcsValue()); m_heSig.SetMcs(txVector.GetMode().GetMcsValue());
m_heSig.SetNStreams(txVector.GetNss()); m_heSig.SetNStreams(txVector.GetNss());