22 #include "ns3/simulator.h"
108 m_lastRxReceivedOk (true),
202 return *std::max_element (
list.begin (),
list.end ());
316 uint32_t nIntSlots = (diff /
GetSlot ()).GetHigh () + 1;
345 std::vector<Ptr<Txop> > internalCollisionTxops;
346 for (Txops::iterator j = i; j !=
m_txops.end (); j++,
k++)
352 NS_LOG_DEBUG (
"dcf " <<
k <<
" needs access. backoff expired. internal collision. slots=" <<
359 internalCollisionTxops.push_back (otherTxop);
375 for (
auto& collidingTxop : internalCollisionTxops)
377 collidingTxop->NotifyInternalCollision ();
386 k = std::distance (
m_txops.begin (), i);
418 Time accessGrantedStart;
421 accessGrantedStart =
MostRecent ({rxAccessStart,
424 ackTimeoutAccessStart,
425 ctsTimeoutAccessStart,
426 switchingAccessStart}
431 accessGrantedStart =
MostRecent ({rxAccessStart,
435 ackTimeoutAccessStart,
436 ctsTimeoutAccessStart,
437 switchingAccessStart}
440 NS_LOG_INFO (
"access grant start=" << accessGrantedStart <<
441 ", rx access start=" << rxAccessStart <<
442 ", busy access start=" << busyAccessStart <<
443 ", tx access start=" << txAccessStart <<
444 ", nav access start=" << navAccessStart);
445 return accessGrantedStart;
456 return mostRecentEvent;
491 if (txop->IsQosTxop ())
495 uint32_t
n =
std::min (nIntSlots, txop->GetBackoffSlots ());
497 Time backoffUpdateBound = backoffStart + (
n *
GetSlot ());
498 txop->UpdateBackoffSlotsNow (
n, backoffUpdateBound);
512 bool accessTimeoutNeeded =
false;
521 accessTimeoutNeeded =
true;
522 expectedBackoffEnd =
std::min (expectedBackoffEnd, tmp);
526 NS_LOG_DEBUG (
"Access timeout needed: " << accessTimeoutNeeded);
527 if (accessTimeoutNeeded)
529 NS_LOG_DEBUG (
"expected backoff end=" << expectedBackoffEnd);
651 uint32_t remainingSlots = txop->GetBackoffSlots ();
652 if (remainingSlots > 0)
654 txop->UpdateBackoffSlotsNow (remainingSlots, now);
655 NS_ASSERT (txop->GetBackoffSlots () == 0);
659 txop->NotifyChannelSwitching ();
681 txop->NotifySleep ();
710 uint32_t remainingSlots = txop->GetBackoffSlots ();
711 if (remainingSlots > 0)
714 NS_ASSERT (txop->GetBackoffSlots () == 0);
718 txop->NotifyWakeUp ();
729 uint32_t remainingSlots = txop->GetBackoffSlots ();
730 if (remainingSlots > 0)
733 NS_ASSERT (txop->GetBackoffSlots () == 0);
767 if (newNavEnd > lastNavEnd)
Manage a set of ns3::Txop.
Time MostRecent(std::initializer_list< Time > list) const
Return the most recent time.
void AccessTimeout(void)
Called when access timeout should occur (e.g.
virtual ~ChannelAccessManager()
bool m_off
flag whether it is in off state
void NotifyRxStartNow(Time duration)
void UpdateBackoff(void)
Update backoff slots for all Txops.
Time m_lastRxStart
the last receive start time
Time GetBackoffEndFor(Ptr< Txop > txop)
Return the time when the backoff procedure ended (or will ended) for the given Txop.
void DoDispose(void) override
Destructor implementation.
bool m_lastRxReceivedOk
the last receive OK
void NotifyCtsTimeoutResetNow(void)
Notify that CTS timer has reset.
void NotifyOnNow(void)
Notify the Txop that the device has been resumed from off mode.
Ptr< WifiPhy > m_phy
pointer to the PHY
void NotifyTxStartNow(Time duration)
Time m_lastRxDuration
the last receive duration time
void DoRestartAccessTimeoutIfNeeded(void)
Time m_lastSwitchingDuration
the last switching duration time
Time m_lastSwitchingStart
the last switching start time
Time m_lastAckTimeoutEnd
the last Ack timeout end time
void NotifyAckTimeoutStartNow(Time duration)
Notify that ack timer has started for the given duration.
bool m_sleeping
flag whether it is in sleeping state
void NotifyRxEndOkNow(void)
Notify the Txop that a packet reception was just completed successfully.
void SetupFrameExchangeManager(Ptr< FrameExchangeManager > feManager)
Set up the Frame Exchange Manager.
void NotifyCtsTimeoutStartNow(Time duration)
Notify that CTS timer has started for the given duration.
void RequestAccess(Ptr< Txop > txop)
Time m_lastTxStart
the last transmit start time
bool IsBusy(void) const
Check if the device is busy sending or receiving, or NAV or CCA busy.
void NotifyMaybeCcaBusyStartNow(Time duration)
void RemovePhyListener(Ptr< WifiPhy > phy)
Remove current registered listener for PHY events.
void NotifySleepNow(void)
Notify the Txop that the device has been put in sleep mode.
void SetupPhyListener(Ptr< WifiPhy > phy)
Set up listener for PHY events.
Time m_lastCtsTimeoutEnd
the last CTS timeout end time
void NotifyWakeupNow(void)
Notify the Txop that the device has been resumed from sleep mode.
Ptr< FrameExchangeManager > m_feManager
pointer to the Frame Exchange Manager
void NotifyOffNow(void)
Notify the Txop that the device has been put in off mode.
Time m_lastBusyStart
the last busy start time
Time m_lastNavDuration
the last NAV duration time
PhyListener * m_phyListener
the PHY listener
virtual Time GetSlot(void) const
Return the slot duration for this PHY.
void NotifySwitchingStartNow(Time duration)
void DoGrantDcfAccess(void)
Grant access to Txop using DCF/EDCF contention rules.
Txops m_txops
the vector of managed Txops
Time m_lastTxDuration
the last transmit duration time
virtual Time GetSifs(void) const
Return the Short Interframe Space (SIFS) for this PHY.
Time m_lastBusyDuration
the last busy duration time
void NotifyAckTimeoutResetNow(void)
Notify that ack timer has reset.
void NotifyNavResetNow(Time duration)
Time GetAccessGrantStart(bool ignoreNav=false) const
Access will never be granted to the medium before the time returned by this method.
bool NeedBackoffUponAccess(Ptr< Txop > txop)
Determine if a new backoff needs to be generated when a packet is queued for transmission.
virtual Time GetEifsNoDifs(void) const
Return the EIFS duration minus a DIFS.
void Add(Ptr< Txop > txop)
Time GetBackoffStartFor(Ptr< Txop > txop)
Return the time when the backoff procedure started for the given Txop.
Time m_lastNavStart
the last NAV start time
void NotifyNavStartNow(Time duration)
EventId m_accessTimeout
the access timeout ID
void NotifyRxEndErrorNow(void)
Notify the Txop that a packet reception was just completed unsuccessfully.
bool IsRunning(void) const
This method is syntactic sugar for !IsExpired().
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
bool IsExpired(void) const
This method is syntactic sugar for the ns3::Simulator::IsExpired method.
void NotifySwitchingStart(Time duration)
void NotifyRxEndError(void)
We have received the last bit of a packet for which NotifyRxStart was invoked first and,...
void NotifyOn(void)
Notify listeners that we went to switch on.
PhyListener(ns3::ChannelAccessManager *cam)
Create a PhyListener for the given ChannelAccessManager.
ns3::ChannelAccessManager * m_cam
ChannelAccessManager to forward events to.
void NotifyRxEndOk(void)
We have received the last bit of a packet for which NotifyRxStart was invoked first and,...
void NotifyWakeup(void)
Notify listeners that we woke up.
void NotifyMaybeCcaBusyStart(Time duration)
void NotifyOff(void)
Notify listeners that we went to switch off.
void NotifyTxStart(Time duration, double txPowerDbm)
void NotifySleep(void)
Notify listeners that we went to sleep.
void NotifyRxStart(Time duration)
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static Time GetMaximumSimulationTime(void)
Get the maximum representable simulation time.
static Time Now(void)
Return the current simulation virtual time.
static Time GetDelayLeft(const EventId &id)
Get the remaining time until this event will execute.
Simulation virtual time values and global simulation resolution.
TimeWithUnit As(const enum Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
virtual ChannelAccessStatus GetAccessStatus(void) const
virtual void NotifyAccessRequested(void)
Notify that access request has been received.
virtual bool IsQosTxop() const
Check for QoS TXOP.
void UpdateBackoffSlotsNow(uint32_t nSlots, Time backoffUpdateBound)
Update backoff slots that nSlots has passed.
Time GetBackoffStart(void) const
Return the time when the backoff procedure started.
uint32_t GetBackoffSlots(void) const
Return the current number of backoff slots.
virtual bool HasFramesToTransmit(void)
Check if the Txop has frames to transmit.
uint8_t GetAifsn(void) const
Return the number of slots that make up an AIFS.
Time GetSlot(void) const
Return the slot duration for this PHY.
void NotifyChannelAccessRequested(void)
Notify the PHY that an access to the channel was requested.
Time GetSifs(void) const
Return the Short Interframe Space (SIFS) for this PHY.
Time GetAckTxTime(void) const
Return the estimated Ack TX time for this PHY.
receive notifications about PHY events.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time Seconds(double value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.