A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
channel-access-manager.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2005,2006 INRIA
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
7 */
8
9#ifndef CHANNEL_ACCESS_MANAGER_H
10#define CHANNEL_ACCESS_MANAGER_H
11
12#include "wifi-phy-common.h"
14
15#include "ns3/event-id.h"
16#include "ns3/nstime.h"
17#include "ns3/object.h"
18#include "ns3/traced-callback.h"
19
20#include <algorithm>
21#include <map>
22#include <memory>
23#include <unordered_map>
24#include <vector>
25
26class EmlsrUlTxopTest;
28
29namespace ns3
30{
31
32class WifiPhy;
33class PhyListener;
34class Txop;
35class FrameExchangeManager;
36enum AcIndex : uint8_t; // opaque enum declaration
37
38/**
39 * @brief Manage a set of ns3::Txop
40 * @ingroup wifi
41 *
42 * Handle a set of independent ns3::Txop, each of which represents
43 * a single DCF within a MAC stack. Each ns3::Txop has a priority
44 * implicitly associated with it (the priority is determined when the
45 * ns3::Txop is added to the ChannelAccessManager: the first Txop to be
46 * added gets the highest priority, the second, the second highest
47 * priority, and so on.) which is used to handle "internal" collisions.
48 * i.e., when two local Txop are expected to get access to the
49 * medium at the same time, the highest priority local Txop wins
50 * access to the medium and the other Txop suffers a "internal"
51 * collision.
52 */
54{
55 /// Allow test cases to access private members
56 friend class ::EmlsrUlTxopTest;
57 friend class ::EmlsrCcaBusyTest;
58
59 public:
61 ~ChannelAccessManager() override;
62
63 /**
64 * @brief Get the type ID.
65 * @return the object TypeId
66 */
67 static TypeId GetTypeId();
68
69 /**
70 * Set up (or reactivate) listener for PHY events on the given PHY. The new (or reactivated)
71 * listener becomes the active listener and the previous active listener attached to another
72 * PHY, if any, is deactivated.
73 *
74 * @param phy the WifiPhy to listen to
75 */
77 /**
78 * Remove current registered listener for PHY events on the given PHY.
79 *
80 * @param phy the WifiPhy to listen to
81 */
83 /**
84 * Deactivate current registered listener for PHY events on the given PHY. All notifications
85 * but channel switch notifications coming from an inactive listener are ignored.
86 *
87 * @param phy the WifiPhy to listen to
88 */
90 /**
91 * Set the ID of the link this Channel Access Manager is associated with.
92 *
93 * @param linkId the ID of the link this Channel Access Manager is associated with
94 */
95 void SetLinkId(uint8_t linkId);
96 /**
97 * Set up the Frame Exchange Manager.
98 *
99 * @param feManager the Frame Exchange Manager
100 */
102
103 /**
104 * @param txop a new Txop.
105 *
106 * The ChannelAccessManager does not take ownership of this pointer so, the callee
107 * must make sure that the Txop pointer will stay valid as long
108 * as the ChannelAccessManager is valid. Note that the order in which Txop
109 * objects are added to a ChannelAccessManager matters: the first Txop added
110 * has the highest priority, the second Txop added, has the second
111 * highest priority, etc.
112 */
113 void Add(Ptr<Txop> txop);
114
115 /**
116 * Determine if a new backoff needs to be generated as per letter a) of Section 10.23.2.2
117 * of IEEE 802.11-2020 ("EDCA backoff procedure"). This method is called upon the occurrence
118 * of events such as the enqueuing of a packet or the unblocking of some links after they
119 * have been blocked for some reason (e.g., wait for ADDBA Response, wait for TX on another
120 * EMLSR link to finish, etc.). The <i>checkMediumBusy</i> argument allows to generate a new
121 * backoff regardless of the busy/idle state of the medium, as per Section 35.3.16.4 of
122 * 802.11be D4.0.
123 *
124 * @param txop the Txop requesting to generate a backoff
125 * @param hadFramesToTransmit whether packets available for transmission were queued just
126 * before the occurrence of the event triggering this call
127 * @param checkMediumBusy whether generation of backoff (also) depends on the busy/idle state
128 * of the medium
129 * @return true if backoff needs to be generated, false otherwise
130 */
131 bool NeedBackoffUponAccess(Ptr<Txop> txop, bool hadFramesToTransmit, bool checkMediumBusy);
132
133 /**
134 * @param txop a Txop
135 *
136 * Notify the ChannelAccessManager that a specific Txop needs access to the
137 * medium. The ChannelAccessManager is then responsible for starting an access
138 * timer and, invoking FrameExchangeManager::StartTransmission when the access
139 * is granted if it ever gets granted.
140 */
141 void RequestAccess(Ptr<Txop> txop);
142
143 /**
144 * Access will never be granted to the medium _before_
145 * the time returned by this method.
146 *
147 * @param ignoreNav flag whether NAV should be ignored
148 *
149 * @returns the absolute time at which access could start to be granted
150 */
151 Time GetAccessGrantStart(bool ignoreNav = false) const;
152
153 /**
154 * Return the time when the backoff procedure
155 * started for the given Txop.
156 *
157 * @param txop the Txop
158 *
159 * @return the time when the backoff procedure started
160 */
162
163 /**
164 * Return the time when the backoff procedure
165 * ended (or will end) for the given Txop.
166 *
167 * @param txop the Txop
168 *
169 * @return the time when the backoff procedure ended (or will end)
170 */
171 Time GetBackoffEndFor(Ptr<Txop> txop) const;
172
173 /**
174 * @return the time until the NAV has been set
175 */
176 Time GetNavEnd() const;
177
178 /**
179 * @param qosTxop a QosTxop that needs to be disabled
180 * @param duration the amount of time during which the QosTxop is disabled
181 *
182 * Disable the given EDCA for the given amount of time. This EDCA will not be
183 * granted channel access during this period and the backoff timer will be frozen.
184 * After this period, the EDCA will start normal operations again by resuming
185 * the backoff timer.
186 */
187 void DisableEdcaFor(Ptr<Txop> qosTxop, Time duration);
188
189 /**
190 * Set the member variable indicating whether the backoff should be invoked when an AC gains
191 * the right to start a TXOP but it does not transmit any frame (e.g., due to constraints
192 * associated with EMLSR operations), provided that the queue is not actually empty.
193 *
194 * @param enable whether to enable backoff generation when no TX is performed in a TXOP
195 */
196 void SetGenerateBackoffOnNoTx(bool enable);
197
198 /**
199 * @return whether the backoff should be invoked when an AC gains the right to start a TXOP
200 * but it does not transmit any frame (e.g., due to constraints associated with EMLSR
201 * operations), provided that the queue is not actually empty
202 */
203 bool GetGenerateBackoffOnNoTx() const;
204
205 /**
206 * Return the width of the largest primary channel that has been idle for the
207 * given time interval before the given time, if any primary channel has been
208 * idle, or zero, otherwise.
209 *
210 * @param interval the given time interval
211 * @param end the given end time
212 * @return the width of the largest primary channel that has been idle for the given time
213 * interval before the given time, if any primary channel has been idle, or zero, otherwise
214 */
216
217 /**
218 * @param indices a set of indices (starting at 0) specifying the 20 MHz channels to test
219 * @return true if per-20 MHz CCA indicates busy for at least one of the
220 * specified 20 MHz channels, false otherwise
221 */
222 bool GetPer20MHzBusy(const std::set<uint8_t>& indices) const;
223
224 /**
225 * @param duration expected duration of reception
226 *
227 * Notify the Txop that a packet reception started
228 * for the expected duration.
229 */
230 void NotifyRxStartNow(Time duration);
231 /**
232 * Notify the Txop that a packet reception was just
233 * completed successfully.
234 */
235 void NotifyRxEndOkNow();
236 /**
237 * Notify the Txop that a packet reception was just
238 * completed unsuccessfuly.
239 */
240 void NotifyRxEndErrorNow();
241 /**
242 * @param duration expected duration of transmission
243 *
244 * Notify the Txop that a packet transmission was
245 * just started and is expected to last for the specified
246 * duration.
247 */
248 void NotifyTxStartNow(Time duration);
249 /**
250 * @param duration expected duration of CCA busy period
251 * @param channelType the channel type for which the CCA busy state is reported.
252 * @param per20MhzDurations vector that indicates for how long each 20 MHz subchannel
253 * (corresponding to the index of the element in the vector) is busy and where a zero
254 * duration indicates that the subchannel is idle. The vector is non-empty if the PHY supports
255 * 802.11ax or later and if the operational channel width is larger than 20 MHz.
256 *
257 * Notify the Txop that a CCA busy period has just started.
258 */
259 void NotifyCcaBusyStartNow(Time duration,
260 WifiChannelListType channelType,
261 const std::vector<Time>& per20MhzDurations);
262 /**
263 * @param phyListener the PHY listener that sent this notification
264 * @param duration expected duration of channel switching period
265 *
266 * Notify the Txop that a channel switching period has just started.
267 * During switching state, new packets can be enqueued in Txop/QosTxop
268 * but they won't access to the medium until the end of the channel switching.
269 */
270 void NotifySwitchingStartNow(PhyListener* phyListener, Time duration);
271 /**
272 * Notify the Txop that the device has been put in sleep mode.
273 */
274 void NotifySleepNow();
275 /**
276 * Notify the Txop that the device has been put in off mode.
277 */
278 void NotifyOffNow();
279 /**
280 * Notify the Txop that the device has been resumed from sleep mode.
281 */
282 void NotifyWakeupNow();
283 /**
284 * Notify the Txop that the device has been resumed from off mode.
285 */
286 void NotifyOnNow();
287 /**
288 * @param duration the value of the received NAV.
289 *
290 * Called at end of RX
291 */
292 void NotifyNavResetNow(Time duration);
293 /**
294 * @param duration the value of the received NAV.
295 *
296 * Called at end of RX
297 */
298 void NotifyNavStartNow(Time duration);
299 /**
300 * Notify that ack timer has started for the given duration.
301 *
302 * @param duration the duration of the timer
303 */
304 void NotifyAckTimeoutStartNow(Time duration);
305 /**
306 * Notify that ack timer has reset.
307 */
309 /**
310 * Notify that CTS timer has started for the given duration.
311 *
312 * @param duration the duration of the timer
313 */
314 void NotifyCtsTimeoutStartNow(Time duration);
315 /**
316 * Notify that CTS timer has reset.
317 */
319
320 /**
321 * Check if the device is busy sending or receiving,
322 * or NAV or CCA busy.
323 *
324 * @return true if the device is busy,
325 * false otherwise
326 */
327 bool IsBusy() const;
328
329 /**
330 * Reset the state variables of this channel access manager.
331 */
332 void ResetState();
333 /**
334 * Reset the backoff for the given DCF/EDCAF.
335 *
336 * @param txop the given DCF/EDCAF
337 */
338 void ResetBackoff(Ptr<Txop> txop);
339
340 /**
341 * Reset the backoff for all the DCF/EDCAF. Additionally, cancel the access timeout event.
342 */
343 void ResetAllBackoffs();
344
345 /**
346 * Notify that the given PHY is about to switch to the given operating channel, which is
347 * used by the given link. This notification is sent by the EMLSR Manager when a PHY object
348 * switches operating channel to operate on another link.
349 *
350 * @param phy the PHY object that is going to switch channel
351 * @param channel the new operating channel of the given PHY
352 * @param linkId the ID of the link on which the given PHY is going to operate
353 */
355 const WifiPhyOperatingChannel& channel,
356 uint8_t linkId);
357
358 protected:
359 void DoInitialize() override;
360 void DoDispose() override;
361
362 private:
363 /**
364 * Get current registered listener for PHY events on the given PHY.
365 *
366 * @param phy the given PHY
367 * @return the current registered listener for PHY events on the given PHY
368 */
369 std::shared_ptr<PhyListener> GetPhyListener(Ptr<WifiPhy> phy) const;
370
371 /**
372 * Initialize the structures holding busy end times per channel type (primary, secondary, etc.)
373 * and per 20 MHz channel. All values are set to the current time.
374 */
375 void InitLastBusyStructs();
376
377 /**
378 * Resize the structures holding busy end times per channel type (primary, secondary, etc.)
379 * and per 20 MHz channel. If a value (e.g., the busy end time for secondary40 channel) already
380 * exists, it is not changed; otherwise, it is set to the current time.
381 */
383 /**
384 * Update backoff slots for all Txops.
385 */
386 void UpdateBackoff();
387
388 /**
389 * This overload is provided to enable caching the value returned by GetAccessGrantStart(),
390 * which is independent of the given Txop object.
391 *
392 * @param txop the Txop
393 * @param accessGrantStart the value returned by GetAccessGrantStart()
394 *
395 * @return the time when the backoff procedure started
396 */
397 Time GetBackoffStartFor(Ptr<Txop> txop, Time accessGrantStart) const;
398
399 /**
400 * This overload is provided to enable caching the value returned by GetAccessGrantStart(),
401 * which is independent of the given Txop object.
402 *
403 * @param txop the Txop
404 * @param accessGrantStart the value returned by GetAccessGrantStart()
405 *
406 * @return the time when the backoff procedure ended (or will end)
407 */
408 Time GetBackoffEndFor(Ptr<Txop> txop, Time accessGrantStart) const;
409
410 /**
411 * This method determines whether the medium has been idle during a period (of
412 * non-null duration) immediately preceding the time this method is called. If
413 * so, the last idle start time and end time for each channel type are updated.
414 * Otherwise, no change is made by this method.
415 * This method is normally called when we are notified of the start of a
416 * transmission, reception, CCA Busy or switching to correctly maintain the
417 * information about the last idle period.
418 */
420
422
423 /**
424 * Called when access timeout should occur
425 * (e.g. backoff procedure expired).
426 */
427 void AccessTimeout();
428
429 /**
430 * Grant access to Txop using DCF/EDCF contention rules
431 */
432 void DoGrantDcfAccess();
433
434 /**
435 * Return the Short Interframe Space (SIFS) for this PHY.
436 *
437 * @return the SIFS duration
438 */
439 virtual Time GetSifs() const;
440
441 /**
442 * Return the slot duration for this PHY.
443 *
444 * @return the slot duration
445 */
446 virtual Time GetSlot() const;
447
448 /**
449 * Return the EIFS duration minus a DIFS.
450 *
451 * @return the EIFS duration minus a DIFS
452 */
453 virtual Time GetEifsNoDifs() const;
454
455 /**
456 * Structure defining start time and end time for a given state.
457 */
458 struct Timespan
459 {
460 Time start{0}; //!< start time
461 Time end{0}; //!< end time
462 };
463
464 /**
465 * typedef for a vector of Txops
466 */
467 typedef std::vector<Ptr<Txop>> Txops;
468
469 Txops m_txops; //!< the vector of managed Txops
470 Time m_lastAckTimeoutEnd; //!< the last Ack timeout end time
471 Time m_lastCtsTimeoutEnd; //!< the last CTS timeout end time
472 Time m_lastNavEnd; //!< the last NAV end time
473 Timespan m_lastRx; //!< the last receive start and end time
474 bool m_lastRxReceivedOk; //!< the last receive OK
475 Time m_lastTxEnd; //!< the last transmit end time
476 std::map<WifiChannelListType, Time>
477 m_lastBusyEnd; //!< the last busy end time for each channel type
478 std::vector<Time> m_lastPer20MHzBusyEnd; /**< the last busy end time per 20 MHz channel
479 (HE stations and channel width > 20 MHz only) */
480 std::map<WifiChannelListType, Timespan>
481 m_lastIdle; //!< the last idle start and end time for each channel type
482 Time m_lastSwitchingEnd; //!< the last switching end time
483 bool m_sleeping; //!< flag whether it is in sleeping state
484 bool m_off; //!< flag whether it is in off state
485 Time m_eifsNoDifs; //!< EIFS no DIFS time
486 EventId m_accessTimeout; //!< the access timeout ID
487 bool m_generateBackoffOnNoTx; //!< whether the backoff should be invoked when the AC gains the
488 //!< right to start a TXOP but it does not transmit any frame
489 //!< (e.g., due to constraints associated with EMLSR operations),
490 //!< provided that the queue is not actually empty
491 bool m_proactiveBackoff; //!< whether a new backoff value is generated when a CCA busy period
492 //!< starts and the backoff counter is zero
493
494 /// Information associated with each PHY that is going to operate on another EMLSR link
496 {
497 WifiPhyOperatingChannel channel; //!< new operating channel
498 uint8_t linkId; //!< ID of the EMLSR link on which the PHY is going to operate
499 };
500
501 /// Store information about the PHY objects that are going to operate on another EMLSR link
502 std::unordered_map<Ptr<WifiPhy>, EmlsrLinkSwitchInfo> m_switchingEmlsrLinks;
503
504 /// Maps each PHY listener to the associated PHY
505 using PhyListenerMap = std::unordered_map<Ptr<WifiPhy>, std::shared_ptr<PhyListener>>;
506
507 PhyListenerMap m_phyListeners; //!< the PHY listeners
508 Ptr<WifiPhy> m_phy; //!< pointer to the unique active PHY
509 Ptr<FrameExchangeManager> m_feManager; //!< pointer to the Frame Exchange Manager
510 uint8_t m_linkId; //!< the ID of the link this object is associated with
511 uint8_t m_nSlotsLeft; //!< fire the NSlotsLeftAlert trace source when the
512 //!< backoff counter with the minimum value among all
513 //!< ACs reaches this value
514
515 /**
516 * TracedCallback signature for NSlotsLeft alerts.
517 *
518 * @param linkId the ID of this link
519 * @param aci the index of the AC that triggered the NSlotsLeft alert
520 * @param backoffDelay delay until backoff counts down to zero
521 */
522 typedef void (*NSlotsLeftCallback)(uint8_t linkId, AcIndex aci, const Time& backoffDelay);
523
524 /// TracedCallback for NSlotsLeft alerts typedef
526
527 NSlotsLeftTracedCallback m_nSlotsLeftCallback; //!< traced callback for NSlotsLeft alerts
528};
529
530} // namespace ns3
531
532#endif /* CHANNEL_ACCESS_MANAGER_H */
Test CCA busy notifications on EMLSR clients.
Test the transmission of UL frames from EMLSR clients.
Manage a set of ns3::Txop.
bool m_proactiveBackoff
whether a new backoff value is generated when a CCA busy period starts and the backoff counter is zer...
std::vector< Time > m_lastPer20MHzBusyEnd
the last busy end time per 20 MHz channel (HE stations and channel width > 20 MHz only)
bool IsBusy() const
Check if the device is busy sending or receiving, or NAV or CCA busy.
void ResetBackoff(Ptr< Txop > txop)
Reset the backoff for the given DCF/EDCAF.
void NotifyRxEndErrorNow()
Notify the Txop that a packet reception was just completed unsuccessfuly.
bool m_off
flag whether it is in off state
void NotifySwitchingStartNow(PhyListener *phyListener, Time duration)
NSlotsLeftTracedCallback m_nSlotsLeftCallback
traced callback for NSlotsLeft alerts
Time GetBackoffStartFor(Ptr< Txop > txop) const
Return the time when the backoff procedure started for the given Txop.
void ResetState()
Reset the state variables of this channel access manager.
void NotifySwitchingEmlsrLink(Ptr< WifiPhy > phy, const WifiPhyOperatingChannel &channel, uint8_t linkId)
Notify that the given PHY is about to switch to the given operating channel, which is used by the giv...
void ResetAllBackoffs()
Reset the backoff for all the DCF/EDCAF.
void NotifyWakeupNow()
Notify the Txop that the device has been resumed from sleep mode.
bool m_lastRxReceivedOk
the last receive OK
std::unordered_map< Ptr< WifiPhy >, EmlsrLinkSwitchInfo > m_switchingEmlsrLinks
Store information about the PHY objects that are going to operate on another EMLSR link.
std::map< WifiChannelListType, Timespan > m_lastIdle
the last idle start and end time for each channel type
Ptr< WifiPhy > m_phy
pointer to the unique active PHY
void NotifyAckTimeoutResetNow()
Notify that ack timer has reset.
void SetGenerateBackoffOnNoTx(bool enable)
Set the member variable indicating whether the backoff should be invoked when an AC gains the right t...
void NotifyRxEndOkNow()
Notify the Txop that a packet reception was just completed successfully.
virtual Time GetEifsNoDifs() const
Return the EIFS duration minus a DIFS.
uint8_t m_linkId
the ID of the link this object is associated with
uint8_t m_nSlotsLeft
fire the NSlotsLeftAlert trace source when the backoff counter with the minimum value among all ACs r...
void NotifyCcaBusyStartNow(Time duration, WifiChannelListType channelType, const std::vector< Time > &per20MhzDurations)
Time m_lastAckTimeoutEnd
the last Ack timeout end time
Time m_eifsNoDifs
EIFS no DIFS time.
virtual Time GetSlot() const
Return the slot duration for this PHY.
void NotifyAckTimeoutStartNow(Time duration)
Notify that ack timer has started for the given duration.
void AccessTimeout()
Called when access timeout should occur (e.g.
void(* NSlotsLeftCallback)(uint8_t linkId, AcIndex aci, const Time &backoffDelay)
TracedCallback signature for NSlotsLeft alerts.
Time GetBackoffEndFor(Ptr< Txop > txop) const
Return the time when the backoff procedure ended (or will end) for the given Txop.
void UpdateBackoff()
Update backoff slots for all Txops.
void DeactivatePhyListener(Ptr< WifiPhy > phy)
Deactivate current registered listener for PHY events on the given PHY.
bool m_sleeping
flag whether it is in sleeping state
void SetLinkId(uint8_t linkId)
Set the ID of the link this Channel Access Manager is associated with.
void SetupFrameExchangeManager(Ptr< FrameExchangeManager > feManager)
Set up the Frame Exchange Manager.
bool NeedBackoffUponAccess(Ptr< Txop > txop, bool hadFramesToTransmit, bool checkMediumBusy)
Determine if a new backoff needs to be generated as per letter a) of Section 10.23....
void NotifyCtsTimeoutStartNow(Time duration)
Notify that CTS timer has started for the given duration.
void RequestAccess(Ptr< Txop > txop)
Time m_lastSwitchingEnd
the last switching end time
Timespan m_lastRx
the last receive start and end time
std::map< WifiChannelListType, Time > m_lastBusyEnd
the last busy end time for each channel type
void RemovePhyListener(Ptr< WifiPhy > phy)
Remove current registered listener for PHY events on the given PHY.
bool m_generateBackoffOnNoTx
whether the backoff should be invoked when the AC gains the right to start a TXOP but it does not tra...
Time m_lastTxEnd
the last transmit end time
void SetupPhyListener(Ptr< WifiPhy > phy)
Set up (or reactivate) listener for PHY events on the given PHY.
Time m_lastCtsTimeoutEnd
the last CTS timeout end time
MHz_u GetLargestIdlePrimaryChannel(Time interval, Time end)
Return the width of the largest primary channel that has been idle for the given time interval before...
void DoDispose() override
Destructor implementation.
void NotifySleepNow()
Notify the Txop that the device has been put in sleep mode.
Ptr< FrameExchangeManager > m_feManager
pointer to the Frame Exchange Manager
void UpdateLastIdlePeriod()
This method determines whether the medium has been idle during a period (of non-null duration) immedi...
std::vector< Ptr< Txop > > Txops
typedef for a vector of Txops
std::unordered_map< Ptr< WifiPhy >, std::shared_ptr< PhyListener > > PhyListenerMap
Maps each PHY listener to the associated PHY.
void DisableEdcaFor(Ptr< Txop > qosTxop, Time duration)
void DoInitialize() override
Initialize() implementation.
Txops m_txops
the vector of managed Txops
bool GetPer20MHzBusy(const std::set< uint8_t > &indices) const
static TypeId GetTypeId()
Get the type ID.
void DoGrantDcfAccess()
Grant access to Txop using DCF/EDCF contention rules.
void ResizeLastBusyStructs()
Resize the structures holding busy end times per channel type (primary, secondary,...
std::shared_ptr< PhyListener > GetPhyListener(Ptr< WifiPhy > phy) const
Get current registered listener for PHY events on the given PHY.
Time m_lastNavEnd
the last NAV end time
void NotifyCtsTimeoutResetNow()
Notify that CTS timer has reset.
void NotifyOffNow()
Notify the Txop that the device has been put in off mode.
Time GetAccessGrantStart(bool ignoreNav=false) const
Access will never be granted to the medium before the time returned by this method.
void NotifyOnNow()
Notify the Txop that the device has been resumed from off mode.
PhyListenerMap m_phyListeners
the PHY listeners
virtual Time GetSifs() const
Return the Short Interframe Space (SIFS) for this PHY.
EventId m_accessTimeout
the access timeout ID
void InitLastBusyStructs()
Initialize the structures holding busy end times per channel type (primary, secondary,...
An identifier for simulation events.
Definition event-id.h:45
A base class which provides memory management and object aggregation.
Definition object.h:78
Listener for PHY events.
Smart pointer class similar to boost::intrusive_ptr.
Simulation virtual time values and global simulation resolution.
Definition nstime.h:94
a unique identifier for an interface.
Definition type-id.h:48
Class that keeps track of all information about the current PHY operating channel.
WifiChannelListType
Enumeration of the possible channel-list parameter elements defined in Table 8-5 of IEEE 802....
AcIndex
This enumeration defines the Access Categories as an enumeration with values corresponding to the AC ...
Definition qos-utils.h:62
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Structure defining start time and end time for a given state.
Declaration of the following enums: