A Discrete-Event Network Simulator
API
emlsr-manager.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2023 Universita' degli Studi di Napoli Federico II
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Author: Stefano Avallone <stavallo@unina.it>
18  */
19 
20 #ifndef EMLSR_MANAGER_H
21 #define EMLSR_MANAGER_H
22 
23 #include "ns3/ctrl-headers.h"
24 #include "ns3/mac48-address.h"
25 #include "ns3/object.h"
26 #include "ns3/sta-wifi-mac.h"
27 #include "ns3/wifi-phy-operating-channel.h"
28 
29 #include <map>
30 #include <optional>
31 #include <set>
32 
33 namespace ns3
34 {
35 
36 class EhtFrameExchangeManager;
37 class MgtEmlOmn;
38 class WifiMpdu;
39 
46 class EmlsrManager : public Object
47 {
48  public:
53  static TypeId GetTypeId();
54  EmlsrManager();
55  ~EmlsrManager() override;
56 
63 
70 
74  std::optional<Time> GetTransitionTimeout() const;
75 
81  void SetMediumSyncDuration(Time duration);
82 
87 
94  void SetMediumSyncOfdmEdThreshold(int8_t threshold);
95 
100  int8_t GetMediumSyncOfdmEdThreshold() const;
101 
109  void SetMediumSyncMaxNTxops(std::optional<uint8_t> nTxops);
110 
115  std::optional<uint8_t> GetMediumSyncMaxNTxops() const;
116 
120  uint8_t GetMainPhyId() const;
121 
129  void SetEmlsrLinks(const std::set<uint8_t>& linkIds);
130 
134  const std::set<uint8_t>& GetEmlsrLinks() const;
135 
142  void SetCamStateReset(bool enable);
143 
148  bool GetCamStateReset() const;
149 
155  void SetAuxPhyTxCapable(bool capable);
156 
160  bool GetAuxPhyTxCapable() const;
161 
168  void NotifyMgtFrameReceived(Ptr<const WifiMpdu> mpdu, uint8_t linkId);
169 
175  void NotifyIcfReceived(uint8_t linkId);
176 
184  void NotifyUlTxopStart(uint8_t linkId, std::optional<Time> timeToCtsEnd);
185 
191  void NotifyTxopEnd(uint8_t linkId);
192 
201  std::optional<Time> GetElapsedMediumSyncDelayTimer(uint8_t linkId) const;
202 
210  void CancelMediumSyncDelayTimer(uint8_t linkId);
211 
219  void DecrementMediumSyncDelayNTxops(uint8_t linkId);
220 
230  void ResetMediumSyncDelayNTxops(uint8_t linkId);
231 
239  bool MediumSyncDelayNTxopsExceeded(uint8_t linkId);
240 
241  protected:
242  void DoDispose() override;
243 
247  Ptr<StaWifiMac> GetStaMac() const;
248 
253  Ptr<EhtFrameExchangeManager> GetEhtFem(uint8_t linkId) const;
254 
258  virtual uint8_t GetLinkToSendEmlOmn() = 0;
259 
267  virtual std::optional<uint8_t> ResendNotification(Ptr<const WifiMpdu> mpdu) = 0;
268 
274  const WifiPhyOperatingChannel& GetChannelForMainPhy(uint8_t linkId) const;
275 
281  const WifiPhyOperatingChannel& GetChannelForAuxPhy(uint8_t linkId) const;
282 
293  void SwitchMainPhy(uint8_t linkId, bool noSwitchDelay, bool resetBackoff, bool requestAccess);
294 
295  static constexpr bool RESET_BACKOFF = true;
296  static constexpr bool DONT_RESET_BACKOFF = false;
297  static constexpr bool REQUEST_ACCESS = true;
298  static constexpr bool DONT_REQUEST_ACCESS =
299  false;
300 
308  void SwitchAuxPhy(uint8_t currLinkId, uint8_t nextLinkId);
309 
317  void SetCcaEdThresholdOnLinkSwitch(Ptr<WifiPhy> phy, uint8_t linkId);
318 
323 
326  uint8_t m_mainPhyId;
327  uint16_t m_auxPhyMaxWidth;
330 
331  private:
338  void SetMainPhyId(uint8_t mainPhyId);
339 
347 
351  void SendEmlOmn();
352 
360  void StartMediumSyncDelayTimer(uint8_t linkId);
361 
367  void MediumSyncDelayTimerExpired(uint8_t linkId);
368 
375  virtual void DoNotifyMgtFrameReceived(Ptr<const WifiMpdu> mpdu, uint8_t linkId) = 0;
376 
382  virtual void DoNotifyIcfReceived(uint8_t linkId) = 0;
383 
389  virtual void DoNotifyUlTxopStart(uint8_t linkId) = 0;
390 
396  virtual void DoNotifyTxopEnd(uint8_t linkId) = 0;
397 
403  void TxOk(Ptr<const WifiMpdu> mpdu);
404 
412 
417  void ChangeEmlsrMode();
418 
424 
428  virtual void NotifyEmlsrModeChanged() = 0;
429 
436  virtual void NotifyMainPhySwitch(uint8_t currLinkId, uint8_t nextLinkId) = 0;
437 
442  {
444  std::optional<uint8_t> msdNTxopsLeft;
446  };
447 
449  std::optional<Time> m_emlsrTransitionTimeout;
453  std::optional<uint8_t> m_msdMaxNTxops;
454 
455  std::map<uint8_t, MediumSyncDelayStatus>
457  std::map<Ptr<WifiPhy>, double> m_prevCcaEdThreshold;
461 
462  std::set<uint8_t> m_emlsrLinks;
463  std::optional<std::set<uint8_t>> m_nextEmlsrLinks;
471  std::map<uint8_t, WifiPhyOperatingChannel>
473  std::map<uint8_t, WifiPhyOperatingChannel>
475 };
476 
477 } // namespace ns3
478 
479 #endif /* EMLSR_MANAGER_H */
EmlsrManager is an abstract base class defining the API that EHT non-AP MLDs with EMLSR activated can...
Definition: emlsr-manager.h:47
void SendEmlOmn()
Send an EML Operating Mode Notification frame.
Time GetMediumSyncDuration() const
void ComputeOperatingChannels()
Compute the operating channels that the main PHY and the aux PHY(s) must switch to in order to operat...
void SetTransitionTimeout(Time timeout)
Set the Transition Timeout advertised by the associated AP with EMLSR activated.
void CancelMediumSyncDelayTimer(uint8_t linkId)
Cancel the MediumSyncDelay timer associated with the given link and take the appropriate actions.
bool m_auxPhyTxCapable
whether Aux PHYs are capable of transmitting PPDUs
bool MediumSyncDelayNTxopsExceeded(uint8_t linkId)
Return whether no more TXOP attempt is allowed on the given link.
std::optional< Time > GetTransitionTimeout() const
void ChangeEmlsrMode()
This method is called to make an EMLSR mode change effective after the transition delay has elapsed o...
Ptr< EhtFrameExchangeManager > GetEhtFem(uint8_t linkId) const
void TxDropped(WifiMacDropReason reason, Ptr< const WifiMpdu > mpdu)
Notify that the given MPDU has been discarded for the given reason.
void TxOk(Ptr< const WifiMpdu > mpdu)
Notify the acknowledgment of the given MPDU.
virtual void NotifyMainPhySwitch(uint8_t currLinkId, uint8_t nextLinkId)=0
Notify subclass that the main PHY is switching channel to operate on another link.
void MediumSyncDelayTimerExpired(uint8_t linkId)
Take the appropriate actions when the MediumSyncDelay timer expires or is cancelled.
void SwitchMainPhy(uint8_t linkId, bool noSwitchDelay, bool resetBackoff, bool requestAccess)
Switch channel on the Main PHY so that it operates on the given link.
bool GetCamStateReset() const
void NotifyUlTxopStart(uint8_t linkId, std::optional< Time > timeToCtsEnd)
Notify the start of an UL TXOP on the given link.
void SetEmlsrLinks(const std::set< uint8_t > &linkIds)
Take actions to enable EMLSR mode on the given set of links, if non-empty, or disable EMLSR mode,...
void SetMediumSyncOfdmEdThreshold(int8_t threshold)
Set the Medium Synchronization OFDM ED threshold (dBm) to use while the MediumSyncDelay timer is runn...
uint8_t m_mainPhyId
ID of main PHY (position in the vector of PHYs held by WifiNetDevice)
int8_t GetMediumSyncOfdmEdThreshold() const
void NotifyIcfReceived(uint8_t linkId)
Notify the reception of an initial Control frame on the given link.
std::map< uint8_t, MediumSyncDelayStatus > m_mediumSyncDelayStatus
the status of MediumSyncDelay timers (link ID-indexed)
void NotifyMgtFrameReceived(Ptr< const WifiMpdu > mpdu, uint8_t linkId)
Notify the reception of a management frame addressed to us.
virtual uint8_t GetLinkToSendEmlOmn()=0
std::map< uint8_t, WifiPhyOperatingChannel > m_auxPhyChannels
link ID-indexed map of operating channels for the aux PHYs
virtual void DoNotifyUlTxopStart(uint8_t linkId)=0
Notify the subclass of the start of an UL TXOP on the given link.
Ptr< StaWifiMac > m_staMac
the MAC of the managed non-AP MLD
virtual void DoNotifyMgtFrameReceived(Ptr< const WifiMpdu > mpdu, uint8_t linkId)=0
Notify the subclass of the reception of a management frame addressed to us.
Time m_emlsrPaddingDelay
EMLSR Padding delay.
void SetMediumSyncMaxNTxops(std::optional< uint8_t > nTxops)
Set the maximum number of TXOPs a non-AP STA is allowed to attempt to initiate while the MediumSyncDe...
void NotifyTxopEnd(uint8_t linkId)
Notify the end of a TXOP on the given link.
Time m_emlsrTransitionDelay
EMLSR Transition delay.
void SetWifiMac(Ptr< StaWifiMac > mac)
Set the wifi MAC.
void DecrementMediumSyncDelayNTxops(uint8_t linkId)
Decrement the counter indicating the number of TXOP attempts left while the MediumSyncDelay timer is ...
bool GetAuxPhyTxCapable() const
const std::set< uint8_t > & GetEmlsrLinks() const
Time m_mediumSyncDuration
duration of the MediumSyncDelay timer
std::optional< Time > m_emlsrTransitionTimeout
Transition timeout advertised by APs with EMLSR activated.
void ResetMediumSyncDelayNTxops(uint8_t linkId)
Reset the counter indicating the number of TXOP attempts left while the MediumSyncDelay timer is runn...
std::optional< Time > GetElapsedMediumSyncDelayTimer(uint8_t linkId) const
Check whether the MediumSyncDelay timer is running for the STA operating on the given link.
virtual void DoNotifyTxopEnd(uint8_t linkId)=0
Notify the subclass of the end of a TXOP on the given link.
std::map< Ptr< WifiPhy >, double > m_prevCcaEdThreshold
the CCA sensitivity threshold (dBm) to restore once the MediumSyncDelay timer expires or the PHY move...
void SetAuxPhyTxCapable(bool capable)
Set the member variable indicating whether Aux PHYs are capable of transmitting PPDUs.
std::optional< std::set< uint8_t > > m_nextEmlsrLinks
ID of the links that will become the EMLSR links when the pending notification frame is acknowledged.
void SetCcaEdThresholdOnLinkSwitch(Ptr< WifiPhy > phy, uint8_t linkId)
Set the CCA ED threshold (if needed) on the given PHY that is switching channel to operate on the giv...
virtual void NotifyEmlsrModeChanged()=0
Notify subclass that EMLSR mode changed.
void SetMainPhyId(uint8_t mainPhyId)
Set the ID of main PHY (position in the vector of PHYs held by WifiNetDevice).
const WifiPhyOperatingChannel & GetChannelForMainPhy(uint8_t linkId) const
~EmlsrManager() override
void ApplyMaxChannelWidthAndModClassOnAuxPhys()
Adjust the operating channel of all the aux PHYs to meet the constraint on the maximum channel width ...
void SetMediumSyncDuration(Time duration)
Set the duration of the MediumSyncDelay timer.
static constexpr bool RESET_BACKOFF
reset backoff on main PHY switch
Time m_lastAdvTransitionDelay
last advertised transition delay
static constexpr bool REQUEST_ACCESS
request channel access when PHY switch ends
static constexpr bool DONT_REQUEST_ACCESS
do not request channel access when PHY switch ends
void DoDispose() override
Destructor implementation.
void StartMediumSyncDelayTimer(uint8_t linkId)
Start the MediumSyncDelay timer and take the appropriate actions, if the timer is not already running...
int8_t m_msdOfdmEdThreshold
MediumSyncDelay OFDM ED threshold.
std::map< uint8_t, WifiPhyOperatingChannel > m_mainPhyChannels
link ID-indexed map of operating channels for the main PHY
std::optional< uint8_t > m_msdMaxNTxops
MediumSyncDelay max number of TXOPs.
Ptr< StaWifiMac > GetStaMac() const
Time m_lastAdvPaddingDelay
last advertised padding delay
WifiModulationClass m_auxPhyMaxModClass
max modulation class supported by aux PHYs
void SwitchAuxPhy(uint8_t currLinkId, uint8_t nextLinkId)
Switch channel on the Aux PHY operating on the given current link so that it operates on the given ne...
uint8_t GetMainPhyId() const
std::optional< uint8_t > GetMediumSyncMaxNTxops() const
void SetCamStateReset(bool enable)
Set the member variable indicating whether the state of the CAM should be reset when the main PHY swi...
virtual std::optional< uint8_t > ResendNotification(Ptr< const WifiMpdu > mpdu)=0
A previous EML Operating Mode Notification frame was dropped.
EventId m_transitionTimeoutEvent
Timer started after the successful transmission of an EML Operating Mode Notification frame.
uint16_t m_auxPhyMaxWidth
max channel width (MHz) supported by aux PHYs
virtual void DoNotifyIcfReceived(uint8_t linkId)=0
Notify the subclass of the reception of an initial Control frame on the given link.
const WifiPhyOperatingChannel & GetChannelForAuxPhy(uint8_t linkId) const
bool m_resetCamState
whether to reset the state of CAM when main PHY switches channel
static TypeId GetTypeId()
Get the type ID.
std::set< uint8_t > m_emlsrLinks
ID of the EMLSR links (empty if EMLSR mode is disabled)
static constexpr bool DONT_RESET_BACKOFF
do not reset backoff on main PHY switch
MgtEmlOmn GetEmlOmn()
An identifier for simulation events.
Definition: event-id.h:55
Implement the header for Action frames of type EML Operating Mode Notification.
A base class which provides memory management and object aggregation.
Definition: object.h:89
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
a unique identifier for an interface.
Definition: type-id.h:59
Class that keeps track of all information about the current PHY operating channel.
WifiMacDropReason
The reason why an MPDU was dropped.
Definition: wifi-mac.h:77
WifiModulationClass
This enumeration defines the modulation classes per (Table 10-6 "Modulation classes"; IEEE 802....
Every class exported by the ns3 library is enclosed in the ns3 namespace.
mac
Definition: third.py:92
phy
Definition: third.py:89
ns3::Time timeout
Information about the status of the MediumSyncDelay timer associated with a link.
std::optional< uint8_t > msdNTxopsLeft
number of TXOP attempts left while the MediumSyncDelay timer is running
EventId timer
the MediumSyncDelay timer