A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
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
33namespace ns3
34{
35
36class EhtFrameExchangeManager;
37class MgtEmlOmn;
38class WifiMpdu;
39
46class EmlsrManager : public Object
47{
48 public:
53 static TypeId GetTypeId();
55 ~EmlsrManager() override;
56
63
70
74 std::optional<Time> GetTransitionTimeout() const;
75
81 void SetMediumSyncDuration(Time duration);
82
87
95
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
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;
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.
virtual std::optional< uint8_t > ResendNotification(Ptr< const WifiMpdu > mpdu)=0
A previous EML Operating Mode Notification frame was dropped.
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...
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
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
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.
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