16#include "ns3/boolean.h" 
   17#include "ns3/eht-frame-exchange-manager.h" 
   18#include "ns3/emlsr-manager.h" 
   19#include "ns3/erp-ofdm-phy.h" 
   35        TypeId(
"ns3::WifiDefaultProtectionManager")
 
   39            .AddAttribute(
"EnableMuRts",
 
   40                          "If enabled, always protect a DL/UL MU frame exchange with MU-RTS/CTS.",
 
   44            .AddAttribute(
"SingleRtsPerTxop",
 
   45                          "If enabled, a protection mechanism (RTS or MU-RTS) is normally used no " 
   46                          "more than once in a TXOP, regardless of the destination of the data " 
   47                          "frame (unless required for specific purposes, such as transmitting an " 
   48                          "Initial Control Frame to an EMLSR client).",
 
   52            .AddAttribute(
"SkipMuRtsBeforeBsrp",
 
   53                          "If enabled, MU-RTS is not used to protect the transmission of a BSRP " 
 
   71std::unique_ptr<WifiProtection>
 
   81    const auto& hdr = mpdu->GetHeader();
 
   84    if (dlMuPpdu || isEmlsrDestination ||
 
   98        return std::make_unique<WifiNoProtection>();
 
  118    std::unique_ptr<WifiProtection> protection;
 
 
  130std::unique_ptr<WifiProtection>
 
  155    std::unique_ptr<WifiProtection> protection;
 
 
  168std::unique_ptr<WifiProtection>
 
  177        return std::make_unique<WifiNoProtection>();
 
  182    if (
const auto& protectedStas = 
m_mac->GetFrameExchangeManager(
m_linkId)->GetProtectedStas();
 
  185        return std::make_unique<WifiNoProtection>();
 
  190    bool emlsrNeedRts = 
false;
 
  194        auto emlsrManager = staMac->GetEmlsrManager();
 
  196        emlsrNeedRts = emlsrManager && staMac->IsEmlsrLink(
m_linkId) &&
 
  197                       (emlsrManager->GetElapsedMediumSyncDelayTimer(
m_linkId) ||
 
  198                        m_mac->GetLinkForPhy(emlsrManager->GetMainPhyId()) != 
m_linkId);
 
  204        auto protection = std::make_unique<WifiRtsCtsProtection>();
 
  205        protection->rtsTxVector =
 
  208        protection->ctsTxVector =
 
  210                                                          protection->rtsTxVector.GetMode());
 
  217        auto protection = std::make_unique<WifiCtsToSelfProtection>();
 
  222    return std::make_unique<WifiNoProtection>();
 
 
  225std::unique_ptr<WifiProtection>
 
  231    auto receiver = mpdu->GetHeader().GetAddr1();
 
  236        dlMuPpdu || isEmlsrDestination ||
 
  239    const auto& protectedStas = 
m_mac->GetFrameExchangeManager(
m_linkId)->GetProtectedStas();
 
  240    const auto isProtected = protectedStas.contains(receiver);
 
  245        (isEmlsrDestination && !isProtected);
 
  254        return std::make_unique<WifiNoProtection>();
 
  272        if (protection != 
nullptr)
 
  305            const auto isPunctured =
 
  306                std::find(inactiveSubchannels.cbegin(), inactiveSubchannels.cend(), 
true) !=
 
  307                inactiveSubchannels.cend();
 
  308            const auto muRtsVariant = ((txWidth == 
MHz_u{320}) || isPunctured)
 
  335        if (isEmlsrDestination && !isProtected)
 
  343        return std::unique_ptr<WifiMuRtsCtsProtection>(protection);
 
 
  353std::unique_ptr<WifiProtection>
 
  358    NS_ASSERT(mpdu->GetHeader().IsTrigger());
 
  361    mpdu->GetPacket()->PeekHeader(trigger);
 
  365    auto protection = std::make_unique<WifiMuRtsCtsProtection>();
 
  372    protection->muRts.SetVariant(trigger.
GetVariant());
 
  373    protection->muRts.SetUlBandwidth(txWidth);
 
  378    const auto& protectedStas = 
m_mac->GetFrameExchangeManager(
m_linkId)->GetProtectedStas();
 
  379    bool allProtected = 
true;
 
  380    bool isUnprotectedEmlsrDst = 
false;
 
  382    for (
const auto& userInfo : trigger)
 
  387        auto staIt = staList.find(userInfo.GetAid12());
 
  390        const auto isProtected = protectedStas.contains(staIt->second);
 
  391        allProtected = allProtected && isProtected;
 
  393        isUnprotectedEmlsrDst =
 
  394            isUnprotectedEmlsrDst ||
 
  400        isUnprotectedEmlsrDst;
 
  409        return std::make_unique<WifiNoProtection>();
 
  413    protection->muRtsTxVector =
 
  418    protection->muRtsTxVector.SetChannelWidth(txWidth);
 
  420    const auto modulation = protection->muRtsTxVector.GetModulationClass();
 
  425    if (isUnprotectedEmlsrDst)
 
  429        ehtFem->SetIcfPaddingAndTxVector(protection->muRts, protection->muRtsTxVector);
 
 
AttributeValue implementation for Boolean.
static WifiMode GetErpOfdmRate6Mbps()
Return a WifiMode for ERP-OFDM at 6 Mbps.
Smart pointer class similar to boost::intrusive_ptr.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
WifiDefaultProtectionManager is the default protection manager, which selects the protection method f...
std::unique_ptr< WifiProtection > TryAddMpdu(Ptr< const WifiMpdu > mpdu, const WifiTxParameters &txParams) override
Determine the protection method to use if the given MPDU is added to the current frame.
~WifiDefaultProtectionManager() override
bool m_sendMuRts
true for sending an MU-RTS to protect DL MU PPDUs
bool m_skipMuRtsBeforeBsrp
whether to skip MU-RTS before BSRP TF
std::unique_ptr< WifiProtection > TryAggregateMsdu(Ptr< const WifiMpdu > msdu, const WifiTxParameters &txParams) override
Determine the protection method to use if the given MSDU is aggregated to the current frame.
bool m_singleRtsPerTxop
true for using protection only once in a TXOP
WifiDefaultProtectionManager()
static TypeId GetTypeId()
Get the type ID.
virtual std::unique_ptr< WifiProtection > TryUlMuTransmission(Ptr< const WifiMpdu > mpdu, const WifiTxParameters &txParams)
Calculate the protection method for the UL MU transmission solicited by the given Trigger Frame.
virtual std::unique_ptr< WifiProtection > GetPsduProtection(const WifiMacHeader &hdr, const WifiTxParameters &txParams) const
Select the protection method for a single PSDU.
virtual std::unique_ptr< WifiProtection > TryAddMpduToMuPpdu(Ptr< const WifiMpdu > mpdu, const WifiTxParameters &txParams)
Calculate the protection method to use if the given MPDU is added to the current DL MU PPDU (represen...
WifiProtectionManager is an abstract base class.
Ptr< WifiMac > m_mac
MAC which is using this Protection Manager.
void AddUserInfoToMuRts(CtrlTriggerHeader &muRts, MHz_u txWidth, const Mac48Address &receiver) const
Add a User Info field to the given MU-RTS Trigger Frame to solicit a CTS from the station with the gi...
Ptr< WifiRemoteStationManager > GetWifiRemoteStationManager() const
uint8_t m_linkId
ID of the link this Protection Manager is operating on.
This class stores the TX parameters (TX vector, protection mechanism, acknowledgment mechanism,...
const PsduInfoMap & GetPsduInfoMap() const
Get a const reference to the map containing information about PSDUs.
std::unique_ptr< WifiProtection > m_protection
protection method
bool LastAddedIsFirstMpdu(Mac48Address receiver) const
Check if the last added MPDU is the first MPDU for the given receiver.
WifiTxVector m_txVector
TXVECTOR of the frame being prepared.
void SetChannelWidth(MHz_u channelWidth)
Sets the selected channelWidth.
WifiModulationClass GetModulationClass() const
Get the modulation class specified by this TXVECTOR.
MHz_u GetChannelWidth() const
void SetMode(WifiMode mode)
Sets the selected payload transmission mode.
const std::vector< bool > & GetInactiveSubchannels() const
Get the 20 MHz subchannels that are punctured.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Ptr< const AttributeChecker > MakeBooleanChecker()
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
@ WIFI_MOD_CLASS_HR_DSSS
HR/DSSS (Clause 16)
@ WIFI_MOD_CLASS_DSSS
DSSS (Clause 15)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.
Ptr< T1 > StaticCast(const Ptr< T2 > &p)
Cast a Ptr.
WifiMuRtsCtsProtection specifies that MU-RTS/CTS protection method is used.
CtrlTriggerHeader muRts
MU-RTS.
WifiTxVector muRtsTxVector
MU-RTS TXVECTOR.