diff --git a/src/wifi/model/channel-access-manager.cc b/src/wifi/model/channel-access-manager.cc index da9ad82ec..4664e3dee 100644 --- a/src/wifi/model/channel-access-manager.cc +++ b/src/wifi/model/channel-access-manager.cc @@ -1028,6 +1028,14 @@ void ChannelAccessManager::NotifyNavResetNow(Time duration) { NS_LOG_FUNCTION(this << duration); + + if (!m_phy) + { + NS_LOG_DEBUG("Do not reset NAV, CTS may have been missed due to the main PHY switching " + "to another link to take over a TXOP while receiving the CTS"); + return; + } + NS_LOG_DEBUG("nav reset for=" << duration); UpdateBackoff(); m_lastNavEnd = Simulator::Now() + duration; diff --git a/src/wifi/model/eht/eht-frame-exchange-manager.cc b/src/wifi/model/eht/eht-frame-exchange-manager.cc index 9c493c8e3..5314f8df4 100644 --- a/src/wifi/model/eht/eht-frame-exchange-manager.cc +++ b/src/wifi/model/eht/eht-frame-exchange-manager.cc @@ -294,6 +294,30 @@ EhtFrameExchangeManager::ForwardPsduMapDown(WifiConstPsduMap psduMap, WifiTxVect } } +void +EhtFrameExchangeManager::NavResetTimeout() +{ + NS_LOG_FUNCTION(this); + if (UsingOtherEmlsrLink()) + { + // the CTS may have been missed because another EMLSR link is being used; do not reset NAV + return; + } + HeFrameExchangeManager::NavResetTimeout(); +} + +void +EhtFrameExchangeManager::IntraBssNavResetTimeout() +{ + NS_LOG_FUNCTION(this); + if (UsingOtherEmlsrLink()) + { + // the CTS may have been missed because another EMLSR link is being used; do not reset NAV + return; + } + HeFrameExchangeManager::IntraBssNavResetTimeout(); +} + void EhtFrameExchangeManager::EmlsrSwitchToListening(const Mac48Address& address, const Time& delay) { diff --git a/src/wifi/model/eht/eht-frame-exchange-manager.h b/src/wifi/model/eht/eht-frame-exchange-manager.h index 72071f7df..bfb953610 100644 --- a/src/wifi/model/eht/eht-frame-exchange-manager.h +++ b/src/wifi/model/eht/eht-frame-exchange-manager.h @@ -113,6 +113,8 @@ class EhtFrameExchangeManager : public HeFrameExchangeManager RxSignalInfo rxSignalInfo, const WifiTxVector& txVector, bool inAmpdu) override; + void NavResetTimeout() override; + void IntraBssNavResetTimeout() override; /** * This method is intended to be called when an AP MLD detects that an EMLSR client previously