17#include "ns3/boolean.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).",
65std::unique_ptr<WifiProtection>
75 const auto& hdr = mpdu->GetHeader();
78 if (dlMuPpdu || isEmlsrDestination ||
92 return std::make_unique<WifiNoProtection>();
112 std::unique_ptr<WifiProtection> protection;
124std::unique_ptr<WifiProtection>
149 std::unique_ptr<WifiProtection> protection;
162std::unique_ptr<WifiProtection>
171 return std::make_unique<WifiNoProtection>();
176 if (
const auto& protectedStas =
m_mac->GetFrameExchangeManager(
m_linkId)->GetProtectedStas();
179 return std::make_unique<WifiNoProtection>();
184 bool emlsrNeedRts =
false;
188 auto emlsrManager = staMac->GetEmlsrManager();
190 emlsrNeedRts = emlsrManager && staMac->IsEmlsrLink(
m_linkId) &&
191 (emlsrManager->GetElapsedMediumSyncDelayTimer(
m_linkId) ||
192 m_mac->GetLinkForPhy(emlsrManager->GetMainPhyId()) !=
m_linkId);
198 auto protection = std::make_unique<WifiRtsCtsProtection>();
199 protection->rtsTxVector =
202 protection->ctsTxVector =
204 protection->rtsTxVector.GetMode());
212 auto protection = std::make_unique<WifiCtsToSelfProtection>();
217 return std::make_unique<WifiNoProtection>();
220std::unique_ptr<WifiProtection>
226 auto receiver = mpdu->GetHeader().GetAddr1();
231 dlMuPpdu || isEmlsrDestination ||
234 const auto& protectedStas =
m_mac->GetFrameExchangeManager(
m_linkId)->GetProtectedStas();
235 const auto isProtected = protectedStas.contains(receiver);
240 (isEmlsrDestination && !isProtected);
249 return std::make_unique<WifiNoProtection>();
268 if (protection !=
nullptr)
316 if (isEmlsrDestination && !isProtected)
321 return std::unique_ptr<WifiMuRtsCtsProtection>(protection);
331std::unique_ptr<WifiProtection>
336 NS_ASSERT(mpdu->GetHeader().IsTrigger());
339 mpdu->GetPacket()->PeekHeader(trigger);
343 auto protection = std::make_unique<WifiMuRtsCtsProtection>();
350 protection->muRts.SetUlBandwidth(txWidth);
355 const auto& protectedStas =
m_mac->GetFrameExchangeManager(
m_linkId)->GetProtectedStas();
356 bool allProtected =
true;
357 bool isUnprotectedEmlsrDst =
false;
359 for (
const auto& userInfo : trigger)
364 auto staIt = staList.find(userInfo.GetAid12());
367 const auto isProtected = protectedStas.contains(staIt->second);
368 allProtected = allProtected && isProtected;
370 isUnprotectedEmlsrDst =
371 isUnprotectedEmlsrDst ||
377 isUnprotectedEmlsrDst;
382 return std::make_unique<WifiNoProtection>();
386 protection->muRtsTxVector =
391 protection->muRtsTxVector.SetChannelWidth(txWidth);
393 const auto modulation = protection->muRtsTxVector.GetModulationClass();
401 if (isUnprotectedEmlsrDst)
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
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,...
#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< const AttributeChecker > MakeBooleanChecker()
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.
Ptr< T1 > StaticCast(const Ptr< T2 > &p)
Cast a Ptr.
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
WifiMuRtsCtsProtection specifies that MU-RTS/CTS protection method is used.
CtrlTriggerHeader muRts
MU-RTS.
WifiTxVector muRtsTxVector
MU-RTS TXVECTOR.