From a4626d178a8a26e96b80bb2996672f8086a96b42 Mon Sep 17 00:00:00 2001 From: Stefano Avallone Date: Sat, 18 Dec 2021 18:36:27 +0100 Subject: [PATCH] wifi: Set TXOP holder when receiving a Trigger Frame --- .../model/he/he-frame-exchange-manager.cc | 19 ++++++++++++++++++- src/wifi/model/he/he-frame-exchange-manager.h | 1 + 2 files changed, 19 insertions(+), 1 deletion(-) 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.