From 56511e5108e6d0857ab4edd944d1c4e695408f2a Mon Sep 17 00:00:00 2001 From: Stefano Avallone Date: Fri, 8 Sep 2023 22:11:01 +0200 Subject: [PATCH] wifi: Do not reset NAV while using another EMLSR link CTS may have been missed due to the main PHY switching to another link to take over a TXOP while receiving the CTS. --- src/wifi/model/channel-access-manager.cc | 8 +++++++ .../model/eht/eht-frame-exchange-manager.cc | 24 +++++++++++++++++++ .../model/eht/eht-frame-exchange-manager.h | 2 ++ 3 files changed, 34 insertions(+) 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