diff --git a/src/wifi/model/he/he-frame-exchange-manager.cc b/src/wifi/model/he/he-frame-exchange-manager.cc index d4b4c7bbd..8ff0e1bd2 100644 --- a/src/wifi/model/he/he-frame-exchange-manager.cc +++ b/src/wifi/model/he/he-frame-exchange-manager.cc @@ -504,6 +504,23 @@ HeFrameExchangeManager::CtsTimeout(Ptr rts, const WifiTxVector& txVect m_psduMap.clear(); } +void +HeFrameExchangeManager::TransmissionSucceeded() +{ + NS_LOG_FUNCTION(this); + + // A multi-user transmission may succeed even if some stations did not respond. + // Remove such stations from the set of stations for which protection is not needed + // in the current TXOP. + for (const auto& address : m_txTimer.GetStasExpectedToRespond()) + { + NS_LOG_DEBUG(address << " did not respond, hence it is no longer protected"); + m_protectedStas.erase(address); + } + + VhtFrameExchangeManager::TransmissionSucceeded(); +} + void HeFrameExchangeManager::SendPsduMap() { diff --git a/src/wifi/model/he/he-frame-exchange-manager.h b/src/wifi/model/he/he-frame-exchange-manager.h index 60fa7616c..876e95711 100644 --- a/src/wifi/model/he/he-frame-exchange-manager.h +++ b/src/wifi/model/he/he-frame-exchange-manager.h @@ -163,6 +163,7 @@ class HeFrameExchangeManager : public VhtFrameExchangeManager void NavResetTimeout() override; void StartProtection(const WifiTxParameters& txParams) override; void ProtectionCompleted() override; + void TransmissionSucceeded() override; /** * Clear the TXOP holder if the intra-BSS NAV counted down to zero (includes the case