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 
std::string GetReasonString(Reason reason) const
Get a string associated with the given reason.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
Callback template class.
Definition: callback.h:1278
Callback< void, uint8_t, Ptr< const WifiMacQueueItem >, const WifiTxVector & > MpduResponseTimeout
MPDU response timeout callback typedef.
Callback< void, uint8_t, Ptr< const WifiPsdu >, const WifiTxVector & > PsduResponseTimeout
PSDU response timeout callback typedef.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
virtual ~WifiTxTimer()
Reason
The reason why the timer was started.
Definition: wifi-tx-timer.h:54
void SetMpduResponseTimeoutCallback(MpduResponseTimeout callback) const
Set the callback to invoke when the TX timer following the transmission of an MPDU expires...
PsduMapResponseTimeout m_psduMapResponseTimeoutCallback
the PSDU map response timeout callback
EventId m_timeoutEvent
the timeout event after a missing response
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.
Reason GetReason(void) const
Get the reason why the timer was started.
bool m_rescheduled
whether the timer has been already rescheduled
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void Timeout(MEM mem_ptr, OBJ obj, Args... args)
This method is called when the timer expires.
This class is used to handle the timer that a station starts when transmitting a frame that solicits ...
Definition: wifi-tx-timer.h:47
WifiTxTimer()
Default constructor.
void Cancel(void)
Cancel the timer.
bool IsRunning(void) const
Return true if the timer is running.
MpduResponseTimeout m_mpduResponseTimeoutCallback
the MPDU response timeout callback
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...
An identifier for simulation events.
Definition: event-id.h:53
Callback< void, uint8_t, WifiPsduMap *, const std::set< Mac48Address > *, std::size_t > PsduMapResponseTimeout
PSDU map response timeout callback typedef.
void FeedTraceSource(Ptr< WifiMacQueueItem > item, WifiTxVector txVector)
This method is called when the timer expires to feed the MPDU response timeout callback.
void SetPsduMapResponseTimeoutCallback(PsduMapResponseTimeout callback) const
Set the callback to invoke when the TX timer following the transmission of a PSDU map expires...
Ptr< EventImpl > m_endRxEvent
event to schedule upon RXSTART.indication
std::unordered_map< uint16_t, Ptr< WifiPsdu > > WifiPsduMap
Map of PSDUs indexed by STA-ID.
PsduResponseTimeout m_psduResponseTimeoutCallback
the PSDU response timeout callback
Reason m_reason
the reason why the timer was started
Time GetDelayLeft(void) const
Get the remaining time until the timer will expire.