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 
30 namespace ns3 {
31 
32 class WifiMacQueueItem;
33 class WifiPsdu;
34 class WifiTxVector;
35 
44 {
45 public:
50  enum Reason : uint8_t
51  {
56  };
57 
59  WifiTxTimer ();
60 
61  virtual ~WifiTxTimer ();
62 
77  template<typename MEM, typename OBJ, typename... Args>
78  void Set (Reason reason, const Time &delay, MEM mem_ptr, OBJ obj, Args... args);
79 
87  void Reschedule (const Time &delay);
88 
95  Reason GetReason (void) const;
96 
103  std::string GetReasonString (Reason reason) const;
104 
110  bool IsRunning (void) const;
111 
115  void Cancel (void);
116 
123  Time GetDelayLeft (void) const;
124 
129 
134 
142 
150 
151 private:
163  template<typename MEM, typename OBJ, typename... Args>
164  void Timeout (MEM mem_ptr, OBJ obj, Args... args);
165 
174  template<typename... Args>
175  void FeedTraceSource (Args... args);
176 
181 
186 };
187 
188 } // namespace ns3
189 
190 
191 /***************************************************************
192  * Declaration of member function template specialization.
193  ***************************************************************/
194 
195 namespace ns3 {
196 
204 template<>
205 void WifiTxTimer::FeedTraceSource<Ptr<WifiMacQueueItem>, WifiTxVector> (Ptr<WifiMacQueueItem> item,
206  WifiTxVector txVector);
207 
215 template<>
216 void WifiTxTimer::FeedTraceSource<Ptr<WifiPsdu>, WifiTxVector> (Ptr<WifiPsdu> psdu,
217  WifiTxVector txVector);
218 
219 } // namespace ns3
220 
221 
222 /***************************************************************
223  * Implementation of the templates declared above.
224  ***************************************************************/
225 
226 namespace ns3 {
227 
228 template<typename MEM, typename OBJ, typename... Args>
229 void
230 WifiTxTimer::Set (Reason reason, const Time &delay, MEM mem_ptr, OBJ obj, Args... args)
231 {
232  typedef void (WifiTxTimer::*TimeoutType)(MEM, OBJ, Args...);
233 
234  m_timeoutEvent = Simulator::Schedule<TimeoutType> (delay, &WifiTxTimer::Timeout, this, mem_ptr, obj, args...);
235  m_reason = reason;
236  m_rescheduled = false;
237 
238  // create an event to schedule if the PHY notifies the reception of a response
239  m_endRxEvent = Ptr<EventImpl> (MakeEvent<TimeoutType> (&WifiTxTimer::Timeout, this, mem_ptr, obj,
240  std::forward<Args> (args)... ), false);
241 }
242 
243 template<typename MEM, typename OBJ, typename... Args>
244 void
245 WifiTxTimer::Timeout (MEM mem_ptr, OBJ obj, Args... args)
246 {
247  FeedTraceSource (std::forward<Args> (args)...);
248 
249  // Invoke the method set by the user
250  ((*obj).*mem_ptr)(std::forward<Args> (args)...);
251 }
252 
253 template<typename... Args>
254 void
256 {
257 }
258 
259 } //namespace ns3
260 
261 #endif /* WIFI_TX_TIMER_H */
262 
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
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
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:50
void SetMpduResponseTimeoutCallback(MpduResponseTimeout callback) const
Set the callback to invoke when the TX timer following the transmission of an MPDU expires...
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:43
WifiTxTimer()
Default constructor.
void Cancel(void)
Cancel the timer.
bool IsRunning(void) const
Return true if the timer is running.
MpduResponseTimeout m_mpduResponseTimeoutCallback
the PSDU 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
void FeedTraceSource(Args... args)
This method is called when the timer expires to feed the trace sources reporting timeout events...
Ptr< EventImpl > m_endRxEvent
event to schedule upon RXSTART.indication
PsduResponseTimeout m_psduResponseTimeoutCallback
Reason m_reason
the reason why the timer was started
Time GetDelayLeft(void) const
Get the remaining time until the timer will expire.