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());
218 auto protection = std::make_unique<WifiCtsToSelfProtection>();
223 return std::make_unique<WifiNoProtection>();
226std::unique_ptr<WifiProtection>
232 auto receiver = mpdu->GetHeader().GetAddr1();
237 dlMuPpdu || isEmlsrDestination ||
240 const auto& protectedStas =
m_mac->GetFrameExchangeManager(
m_linkId)->GetProtectedStas();
241 const auto isProtected = protectedStas.contains(receiver);
246 (isEmlsrDestination && !isProtected);
255 return std::make_unique<WifiNoProtection>();
274 if (protection !=
nullptr)
319 if (isEmlsrDestination && !isProtected)
327 return std::unique_ptr<WifiMuRtsCtsProtection>(protection);
337std::unique_ptr<WifiProtection>
342 NS_ASSERT(mpdu->GetHeader().IsTrigger());
345 mpdu->GetPacket()->PeekHeader(trigger);
349 auto protection = std::make_unique<WifiMuRtsCtsProtection>();
356 protection->muRts.SetUlBandwidth(txWidth);
361 const auto& protectedStas =
m_mac->GetFrameExchangeManager(
m_linkId)->GetProtectedStas();
362 bool allProtected =
true;
363 bool isUnprotectedEmlsrDst =
false;
365 for (
const auto& userInfo : trigger)
370 auto staIt = staList.find(userInfo.GetAid12());
373 const auto isProtected = protectedStas.contains(staIt->second);
374 allProtected = allProtected && isProtected;
376 isUnprotectedEmlsrDst =
377 isUnprotectedEmlsrDst ||
383 isUnprotectedEmlsrDst;
392 return std::make_unique<WifiNoProtection>();
396 protection->muRtsTxVector =
401 protection->muRtsTxVector.SetChannelWidth(txWidth);
403 const auto modulation = protection->muRtsTxVector.GetModulationClass();
408 if (isUnprotectedEmlsrDst)
412 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.
#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.