A Discrete-Event Network Simulator
API
wifi-tx-timer.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2020 Universita' degli Studi di Napoli Federico II
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Stefano Avallone <stavallo@unina.it>
19  */
20 
21 #ifndef WIFI_TX_TIMER_H
22 #define WIFI_TX_TIMER_H
23 
24 #include "ns3/event-id.h"
25 #include "ns3/nstime.h"
26 #include "ns3/simulator.h"
27 #include "ns3/traced-callback.h"
28 #include <functional>
29 #include <unordered_map>
30 
31 namespace ns3 {
32 
33 class WifiMacQueueItem;
34 class WifiPsdu;
35 class WifiTxVector;
36 class Mac48Address;
37 
38 typedef std::unordered_map <uint16_t /* staId */, Ptr<WifiPsdu> /* PSDU */> WifiPsduMap;
39 
48 {
49 public:
54  enum Reason : uint8_t
55  {
65  };
66 
68  WifiTxTimer ();
69 
70  virtual ~WifiTxTimer ();
71 
86  template<typename MEM, typename OBJ, typename... Args>
87  void Set (Reason reason, const Time &delay, MEM mem_ptr, OBJ obj, Args... args);
88 
96  void Reschedule (const Time &delay);
97 
104  Reason GetReason (void) const;
105 
112  std::string GetReasonString (Reason reason) const;
113 
119  bool IsRunning (void) const;
120 
124  void Cancel (void);
125 
132  Time GetDelayLeft (void) const;
133 
138 
143 
148 
156 
164 
172 
173 private:
185  template<typename MEM, typename OBJ, typename... Args>
186  void Timeout (MEM mem_ptr, OBJ obj, Args... args);
187 
195  void FeedTraceSource (Ptr<WifiMacQueueItem> item, WifiTxVector txVector);
196 
204  void FeedTraceSource (Ptr<WifiPsdu> psdu, WifiTxVector txVector);
205 
214  void FeedTraceSource (WifiPsduMap* psduMap, std::set<Mac48Address>* missingStations,
215  std::size_t nTotalStations);
216 
221 
228 };
229 
230 } // namespace ns3
231 
232 
233 /***************************************************************
234  * Implementation of the templates declared above.
235  ***************************************************************/
236 
237 namespace ns3 {
238 
239 template<typename MEM, typename OBJ, typename... Args>
240 void
241 WifiTxTimer::Set (Reason reason, const Time &delay, MEM mem_ptr, OBJ obj, Args... args)
242 {
243  typedef void (WifiTxTimer::*TimeoutType)(MEM, OBJ, Args...);
244 
245  m_timeoutEvent = Simulator::Schedule<TimeoutType> (delay, &WifiTxTimer::Timeout, this, mem_ptr, obj, args...);
246  m_reason = reason;
247  m_rescheduled = false;
248 
249  // create an event to schedule if the PHY notifies the reception of a response
250  m_endRxEvent = Ptr<EventImpl> (MakeEvent<TimeoutType> (&WifiTxTimer::Timeout, this, mem_ptr, obj,
251  std::forward<Args> (args)... ), false);
252 }
253 
254 template<typename MEM, typename OBJ, typename... Args>
255 void
256 WifiTxTimer::Timeout (MEM mem_ptr, OBJ obj, Args... args)
257 {
258  FeedTraceSource (std::forward<Args> (args)...);
259 
260  // Invoke the method set by the user
261  ((*obj).*mem_ptr)(std::forward<Args> (args)...);
262 }
263 
264 } //namespace ns3
265 
266 #endif /* WIFI_TX_TIMER_H */
267 
Callback template class.
Definition: callback.h:1279
An identifier for simulation events.
Definition: event-id.h:54
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:104
This class is used to handle the timer that a station starts when transmitting a frame that solicits ...
Definition: wifi-tx-timer.h:48
void Timeout(MEM mem_ptr, OBJ obj, Args... args)
This method is called when the timer expires.
virtual ~WifiTxTimer()
Reason GetReason(void) const
Get the reason why the timer was started.
void Set(Reason reason, const Time &delay, MEM mem_ptr, OBJ obj, Args... args)
This method is called when a frame soliciting a response is transmitted.
Time GetDelayLeft(void) const
Get the remaining time until the timer will expire.
bool IsRunning(void) const
Return true if the timer is running.
Ptr< EventImpl > m_endRxEvent
event to schedule upon RXSTART.indication
Reason
The reason why the timer was started.
Definition: wifi-tx-timer.h:55
@ WAIT_NORMAL_ACK_AFTER_DL_MU_PPDU
Definition: wifi-tx-timer.h:60
MpduResponseTimeout m_mpduResponseTimeoutCallback
the MPDU response timeout callback
void FeedTraceSource(Ptr< WifiMacQueueItem > item, WifiTxVector txVector)
This method is called when the timer expires to feed the MPDU response timeout callback.
void Cancel(void)
Cancel the timer.
PsduMapResponseTimeout m_psduMapResponseTimeoutCallback
the PSDU map response timeout callback
Callback< void, uint8_t, WifiPsduMap *, const std::set< Mac48Address > *, std::size_t > PsduMapResponseTimeout
PSDU map response timeout callback typedef.
Callback< void, uint8_t, Ptr< const WifiMacQueueItem >, const WifiTxVector & > MpduResponseTimeout
MPDU response timeout callback typedef.
Reason m_reason
the reason why the timer was started
Callback< void, uint8_t, Ptr< const WifiPsdu >, const WifiTxVector & > PsduResponseTimeout
PSDU response timeout callback typedef.
void SetPsduMapResponseTimeoutCallback(PsduMapResponseTimeout callback) const
Set the callback to invoke when the TX timer following the transmission of a PSDU map expires.
WifiTxTimer()
Default constructor.
PsduResponseTimeout m_psduResponseTimeoutCallback
the PSDU response timeout callback
std::string GetReasonString(Reason reason) const
Get a string associated with the given reason.
void SetMpduResponseTimeoutCallback(MpduResponseTimeout callback) const
Set the callback to invoke when the TX timer following the transmission of an MPDU expires.
void SetPsduResponseTimeoutCallback(PsduResponseTimeout callback) const
Set the callback to invoke when the TX timer following the transmission of a PSDU expires.
void Reschedule(const Time &delay)
Reschedule the timer to time out the given amount of time from the moment this function is called.
bool m_rescheduled
whether the timer has been already rescheduled
EventId m_timeoutEvent
the timeout event after a missing response
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::unordered_map< uint16_t, Ptr< WifiPsdu > > WifiPsduMap
Map of PSDUs indexed by STA-ID.