diff --git a/src/wifi/model/he/he-frame-exchange-manager.cc b/src/wifi/model/he/he-frame-exchange-manager.cc index 2da2bb8a7..78ffbea93 100644 --- a/src/wifi/model/he/he-frame-exchange-manager.cc +++ b/src/wifi/model/he/he-frame-exchange-manager.cc @@ -1465,7 +1465,7 @@ HeFrameExchangeManager::SendQosNullFramesInTbPpdu(const CtrlTriggerHeader& trigg if (trigger.GetCsRequired() && hdr.GetAddr2() != m_txopHolder && m_navEnd > Simulator::Now()) { NS_LOG_DEBUG("Carrier Sensing required and channel busy (TA=" - << hdr.GetAddr2() << ", TxopHolder=" << m_txopHolder + << hdr.GetAddr2() << ", TxopHolder=" << (m_txopHolder ? *m_txopHolder : "") << ", NAV end=" << m_navEnd.As(Time::S) << "), do nothing"); return; } diff --git a/src/wifi/model/qos-frame-exchange-manager.cc b/src/wifi/model/qos-frame-exchange-manager.cc index 623861e5f..c26bb7d79 100644 --- a/src/wifi/model/qos-frame-exchange-manager.cc +++ b/src/wifi/model/qos-frame-exchange-manager.cc @@ -664,6 +664,13 @@ QosFrameExchangeManager::PreProcessFrame(Ptr psdu, const WifiTxV } } + // before updating the NAV, check if the NAV counted down to zero. In such a + // case, clear the saved TXOP holder address. + if (m_navEnd <= Simulator::Now()) + { + m_txopHolder.reset(); + } + FrameExchangeManager::PreProcessFrame(psdu, txVector); } @@ -698,6 +705,14 @@ QosFrameExchangeManager::SetTxopHolder(Ptr psdu, const WifiTxVec } } +void +QosFrameExchangeManager::NavResetTimeout() +{ + NS_LOG_FUNCTION(this); + m_txopHolder.reset(); + FrameExchangeManager::NavResetTimeout(); +} + void QosFrameExchangeManager::ReceiveMpdu(Ptr mpdu, RxSignalInfo rxSignalInfo, diff --git a/src/wifi/model/qos-frame-exchange-manager.h b/src/wifi/model/qos-frame-exchange-manager.h index c7a7679b2..aa1f4e02c 100644 --- a/src/wifi/model/qos-frame-exchange-manager.h +++ b/src/wifi/model/qos-frame-exchange-manager.h @@ -22,6 +22,8 @@ #include "frame-exchange-manager.h" +#include + namespace ns3 { @@ -111,6 +113,7 @@ class QosFrameExchangeManager : public FrameExchangeManager bool inAmpdu) override; void PreProcessFrame(Ptr psdu, const WifiTxVector& txVector) override; void PostProcessFrame(Ptr psdu, const WifiTxVector& txVector) override; + void NavResetTimeout() override; Time GetFrameDurationId(const WifiMacHeader& header, uint32_t size, const WifiTxParameters& txParams, @@ -174,10 +177,10 @@ class QosFrameExchangeManager : public FrameExchangeManager */ virtual void SetTxopHolder(Ptr psdu, const WifiTxVector& txVector); - Ptr m_edca; //!< the EDCAF that gained channel access - Mac48Address m_txopHolder; //!< MAC address of the TXOP holder - bool m_setQosQueueSize; /**< whether to set the Queue Size subfield of the - QoS Control field of QoS data frames */ + Ptr m_edca; //!< the EDCAF that gained channel access + std::optional m_txopHolder; //!< MAC address of the TXOP holder + bool m_setQosQueueSize; /**< whether to set the Queue Size subfield of the + QoS Control field of QoS data frames */ private: /**