28#include "ns3/boolean.h"
29#include "ns3/emlsr-manager.h"
30#include "ns3/erp-ofdm-phy.h"
46 TypeId(
"ns3::WifiDefaultProtectionManager")
50 .AddAttribute(
"EnableMuRts",
51 "If enabled, always protect a DL/UL MU frame exchange with MU-RTS/CTS.",
55 .AddAttribute(
"SingleRtsPerTxop",
56 "If enabled, a protection mechanism (RTS or MU-RTS) is normally used no "
57 "more than once in a TXOP, regardless of the destination of the data "
58 "frame (unless required for specific purposes, such as transmitting an "
59 "Initial Control Frame to an EMLSR client).",
76std::unique_ptr<WifiProtection>
86 const auto& hdr = mpdu->GetHeader();
89 if (dlMuPpdu || isEmlsrDestination ||
103 return std::make_unique<WifiNoProtection>();
123 std::unique_ptr<WifiProtection> protection;
135std::unique_ptr<WifiProtection>
160 std::unique_ptr<WifiProtection> protection;
173std::unique_ptr<WifiProtection>
182 return std::make_unique<WifiNoProtection>();
190 return std::make_unique<WifiNoProtection>();
195 bool emlsrNeedRts =
false;
197 if (
auto staMac = DynamicCast<StaWifiMac>(
m_mac))
199 auto emlsrManager = staMac->GetEmlsrManager();
201 emlsrNeedRts = emlsrManager && staMac->IsEmlsrLink(
m_linkId) &&
202 (emlsrManager->GetElapsedMediumSyncDelayTimer(
m_linkId) ||
209 auto protection = std::make_unique<WifiRtsCtsProtection>();
210 protection->rtsTxVector =
213 protection->ctsTxVector =
215 protection->rtsTxVector.GetMode());
223 auto protection = std::make_unique<WifiCtsToSelfProtection>();
228 return std::make_unique<WifiNoProtection>();
231std::unique_ptr<WifiProtection>
237 auto receiver = mpdu->GetHeader().GetAddr1();
242 dlMuPpdu || isEmlsrDestination ||
246 const auto isProtected = protectedStas.contains(receiver);
251 (isEmlsrDestination && !isProtected);
260 return std::make_unique<WifiNoProtection>();
273 auto apMac = StaticCast<ApWifiMac>(
m_mac);
279 if (protection !=
nullptr)
327 if (isEmlsrDestination && !isProtected)
332 return std::unique_ptr<WifiMuRtsCtsProtection>(protection);
342std::unique_ptr<WifiProtection>
347 NS_ASSERT(mpdu->GetHeader().IsTrigger());
350 mpdu->GetPacket()->PeekHeader(trigger);
354 auto protection = std::make_unique<WifiMuRtsCtsProtection>();
361 protection->muRts.SetUlBandwidth(txWidth);
364 const auto& staList = StaticCast<ApWifiMac>(
m_mac)->GetStaList(
m_linkId);
367 bool allProtected =
true;
368 bool isUnprotectedEmlsrDst =
false;
370 for (
const auto& userInfo : trigger)
375 auto staIt = staList.find(userInfo.GetAid12());
378 const auto isProtected = protectedStas.contains(staIt->second);
379 allProtected = allProtected && isProtected;
381 isUnprotectedEmlsrDst =
382 isUnprotectedEmlsrDst ||
388 isUnprotectedEmlsrDst;
393 return std::make_unique<WifiNoProtection>();
397 protection->muRtsTxVector =
402 protection->muRtsTxVector.SetChannelWidth(txWidth);
404 const auto modulation = protection->muRtsTxVector.GetModulationClass();
412 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...
Ptr< FrameExchangeManager > GetFrameExchangeManager(uint8_t linkId=SINGLE_LINK_OP_ID) const
Get the Frame Exchange Manager associated with the given link.
TypeOfStation GetTypeOfStation() const
Return the type of station.
std::optional< uint8_t > GetLinkForPhy(Ptr< const WifiPhy > phy) const
Get the ID of the link (if any) on which the given PHY is operating.
WifiProtectionManager is an abstract base class.
Ptr< WifiMac > m_mac
MAC which is using this Protection Manager.
void AddUserInfoToMuRts(CtrlTriggerHeader &muRts, uint16_t 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(uint16_t channelWidth)
Sets the selected channelWidth (in MHz)
WifiModulationClass GetModulationClass() const
Get the modulation class specified by this TXVECTOR.
uint16_t 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< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
WifiMuRtsCtsProtection specifies that MU-RTS/CTS protection method is used.
CtrlTriggerHeader muRts
MU-RTS.
WifiTxVector muRtsTxVector
MU-RTS TXVECTOR.