diff --git a/src/wifi/model/he/he-frame-exchange-manager.cc b/src/wifi/model/he/he-frame-exchange-manager.cc index ca2cdcbde..464333543 100644 --- a/src/wifi/model/he/he-frame-exchange-manager.cc +++ b/src/wifi/model/he/he-frame-exchange-manager.cc @@ -1234,7 +1234,9 @@ HeFrameExchangeManager::SendQosNullFramesInTbPpdu (const CtrlTriggerHeader& trig if (trigger.GetCsRequired () && hdr.GetAddr2 () != m_txopHolder && m_navEnd > Simulator::Now ()) { - NS_LOG_DEBUG ("Carrier Sensing required and channel busy, do nothing"); + NS_LOG_DEBUG ("Carrier Sensing required and channel busy (TA=" << hdr.GetAddr2 () + << ", TxopHolder=" << m_txopHolder << ", NAV end=" << m_navEnd.As (Time::S) + << "), do nothing"); return; } @@ -1296,6 +1298,21 @@ HeFrameExchangeManager::SendQosNullFramesInTbPpdu (const CtrlTriggerHeader& trig SendPsduMapWithProtection (WifiPsduMap {{staId, psdu}}, txParams); } +void +HeFrameExchangeManager::SetTxopHolder (Ptr psdu, const WifiTxVector& txVector) +{ + NS_LOG_FUNCTION (this << psdu << txVector); + + if (psdu->GetHeader (0).IsTrigger ()) + { + m_txopHolder = psdu->GetAddr2 (); + } + else if (!txVector.IsUlMu ()) // the sender of a TB PPDU is not the TXOP holder + { + VhtFrameExchangeManager::SetTxopHolder (psdu, txVector); + } +} + void HeFrameExchangeManager::ReceiveMpdu (Ptr mpdu, RxSignalInfo rxSignalInfo, const WifiTxVector& txVector, bool inAmpdu) diff --git a/src/wifi/model/he/he-frame-exchange-manager.h b/src/wifi/model/he/he-frame-exchange-manager.h index 63ccf6757..8c7b12276 100644 --- a/src/wifi/model/he/he-frame-exchange-manager.h +++ b/src/wifi/model/he/he-frame-exchange-manager.h @@ -63,6 +63,7 @@ public: bool StartFrameExchange (Ptr edca, Time availableTime, bool initialFrame) override; void SetWifiMac (const Ptr mac) override; void CalculateAcknowledgmentTime (WifiAcknowledgment* acknowledgment) const override; + void SetTxopHolder (Ptr psdu, const WifiTxVector& txVector) override; /** * Set the Multi-user Scheduler associated with this Frame Exchange Manager.