28 #include "ns3/boolean.h"
29 #include "ns3/emlsr-manager.h"
30 #include "ns3/erp-ofdm-phy.h"
33 #include <type_traits>
46 TypeId(
"ns3::WifiDefaultProtectionManager")
50 .AddAttribute(
"EnableMuRts",
51 "If enabled, always protect a DL/UL MU frame exchange with MU-RTS/CTS.",
68 std::unique_ptr<WifiProtection>
82 (psduInfoMap.size() > 1 ||
83 (psduInfoMap.size() == 1 && psduInfoMap.begin()->first != mpdu->GetHeader().GetAddr1()));
84 auto isEmlsrDestination =
87 if (dlMuPpdu || isEmlsrDestination ||
101 return std::make_unique<WifiNoProtection>();
105 if (mpdu->GetHeader().IsTrigger())
121 std::unique_ptr<WifiProtection> protection;
134 std::unique_ptr<WifiProtection>
159 std::unique_ptr<WifiProtection> protection;
174 std::unique_ptr<WifiProtection>
184 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>();
231 std::unique_ptr<WifiProtection>
237 auto receiver = mpdu->GetHeader().GetAddr1();
240 (psduInfoMap.size() > 1 ||
241 (psduInfoMap.size() == 1 && psduInfoMap.begin()->first != receiver));
244 dlMuPpdu || isEmlsrDestination ||
251 (dlMuPpdu &&
m_sendMuRts && !isProtected) || (isEmlsrDestination && !isProtected);
260 return std::make_unique<WifiNoProtection>();
273 auto apMac = StaticCast<ApWifiMac>(
m_mac);
279 if (protection !=
nullptr)
323 if (isEmlsrDestination && !isProtected)
333 return std::unique_ptr<WifiMuRtsCtsProtection>(protection);
343 std::unique_ptr<WifiProtection>
348 NS_ASSERT(mpdu->GetHeader().IsTrigger());
351 mpdu->GetPacket()->PeekHeader(trigger);
355 auto protection = std::make_unique<WifiMuRtsCtsProtection>();
362 protection->muRts.SetUlBandwidth(txWidth);
365 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());
380 allProtected = allProtected && isProtected;
382 isUnprotectedEmlsrDst =
383 isUnprotectedEmlsrDst ||
387 bool needMuRts = (
m_sendMuRts && !allProtected) || isUnprotectedEmlsrDst;
392 return std::make_unique<WifiNoProtection>();
396 protection->muRtsTxVector =
401 protection->muRtsTxVector.SetChannelWidth(txWidth);
403 const auto modulation = protection->muRtsTxVector.GetModulationClass();
411 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.
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 > 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...
virtual std::unique_ptr< WifiProtection > GetPsduProtection(const WifiMacHeader &hdr, uint32_t size, const WifiTxVector &txVector) const
Select the protection method for a single PSDU.
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,...
uint32_t GetSizeIfAddMpdu(Ptr< const WifiMpdu > mpdu) const
Get the size in bytes of the frame in case the given MPDU is added.
const PsduInfoMap & GetPsduInfoMap() const
Get a const reference to the map containing information about PSDUs.
std::pair< uint32_t, uint32_t > GetSizeIfAggregateMsdu(Ptr< const WifiMpdu > msdu) const
Get the size in bytes of the frame in case the given MSDU is aggregated.
std::unique_ptr< WifiProtection > m_protection
protection method
const PsduInfo * GetPsduInfo(Mac48Address receiver) const
Get a pointer to the information about the PSDU addressed to the given receiver, if present,...
WifiTxVector m_txVector
TXVECTOR of the frame being prepared.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
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_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
#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.