diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index ef63c785b..533cc5763 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -36,6 +36,7 @@ The required Doxygen version for documentation generation is version 1.11. - (applications) - The `ThreeGppHttpServer::LocalAddress` and `ThreeGppHttpServer::LocalPort` attributes have been renamed to `ThreeGppHttpServer::Remote` and `ThreeGppHttpServer::Port`, respectively. - (applications) - It is now possible to specify the address on which to bind the listening socket for UdpServer via the `Local` attribute. - (applications) - It is now possible to specify a port only for PacketSink to listen to any address (both IPv4 and IPv6). +- (wifi) - Added a `WifiDefaultProtectionManager::SkipMuRtsBeforeBsrp` attribute to avoid using MU-RTS to protect the transmission of a BSRP Trigger Frame. If this attribute is set to true (which is the default value), BSRP Trigger Frames can be used as Initial Control Frames for EMLSR clients ### Bugs fixed diff --git a/src/wifi/model/wifi-default-protection-manager.cc b/src/wifi/model/wifi-default-protection-manager.cc index 230d390d3..cc60e68e5 100644 --- a/src/wifi/model/wifi-default-protection-manager.cc +++ b/src/wifi/model/wifi-default-protection-manager.cc @@ -48,6 +48,12 @@ WifiDefaultProtectionManager::GetTypeId() "Initial Control Frame to an EMLSR client).", BooleanValue(false), MakeBooleanAccessor(&WifiDefaultProtectionManager::m_singleRtsPerTxop), + MakeBooleanChecker()) + .AddAttribute("SkipMuRtsBeforeBsrp", + "If enabled, MU-RTS is not used to protect the transmission of a BSRP " + "Trigger Frame.", + BooleanValue(true), + MakeBooleanAccessor(&WifiDefaultProtectionManager::m_skipMuRtsBeforeBsrp), MakeBooleanChecker()); return tid; } @@ -376,6 +382,10 @@ WifiDefaultProtectionManager::TryUlMuTransmission(Ptr mpdu, (m_sendMuRts && !allProtected && (!m_singleRtsPerTxop || protectedStas.empty())) || isUnprotectedEmlsrDst; + // if we are sending a BSRP TF and SkipMuRtsBeforeBsrpTf is true, do not use MU-RTS (even in + // case of unprotected EMLSR, because the BSRP TF is an ICF) + needMuRts = needMuRts && (!m_skipMuRtsBeforeBsrp || !trigger.IsBsrp()); + if (!needMuRts) { // No protection needed diff --git a/src/wifi/model/wifi-default-protection-manager.h b/src/wifi/model/wifi-default-protection-manager.h index 348e9e0fa..391c0f91d 100644 --- a/src/wifi/model/wifi-default-protection-manager.h +++ b/src/wifi/model/wifi-default-protection-manager.h @@ -87,8 +87,9 @@ class WifiDefaultProtectionManager : public WifiProtectionManager virtual std::unique_ptr TryUlMuTransmission(Ptr mpdu, const WifiTxParameters& txParams); - bool m_sendMuRts; //!< true for sending an MU-RTS to protect DL MU PPDUs - bool m_singleRtsPerTxop; //!< true for using protection only once in a TXOP + bool m_sendMuRts; //!< true for sending an MU-RTS to protect DL MU PPDUs + bool m_singleRtsPerTxop; //!< true for using protection only once in a TXOP + bool m_skipMuRtsBeforeBsrp; //!< whether to skip MU-RTS before BSRP TF }; } // namespace ns3 diff --git a/src/wifi/test/wifi-mac-ofdma-test.cc b/src/wifi/test/wifi-mac-ofdma-test.cc index 126743e0b..aae76dd96 100644 --- a/src/wifi/test/wifi-mac-ofdma-test.cc +++ b/src/wifi/test/wifi-mac-ofdma-test.cc @@ -2158,7 +2158,9 @@ OfdmaAckSequenceTest::DoRun() TimeValue(m_defaultTbPpduDuration)); mac.SetProtectionManager("ns3::WifiDefaultProtectionManager", "EnableMuRts", - BooleanValue(true)); + BooleanValue(true), + "SkipMuRtsBeforeBsrp", + BooleanValue(false)); mac.SetAckManager("ns3::WifiDefaultAckManager", "DlMuAckSequenceType", EnumValue(m_dlMuAckType));