A Discrete-Event Network Simulator
API
frame-exchange-manager.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 FRAME_EXCHANGE_MANAGER_H
22 #define FRAME_EXCHANGE_MANAGER_H
23 
24 #include "ns3/object.h"
25 #include "qos-txop.h"
26 #include "wifi-tx-vector.h"
27 #include "wifi-psdu.h"
28 #include "wifi-mac.h"
29 #include "mac-rx-middle.h"
30 #include "mac-tx-middle.h"
31 #include "wifi-phy.h"
32 #include "wifi-tx-timer.h"
33 #include "wifi-tx-parameters.h"
34 // Needed to compile wave bindings
35 #include "ns3/wifi-protection-manager.h"
36 #include "ns3/wifi-ack-manager.h"
37 #include "channel-access-manager.h"
38 
39 namespace ns3 {
40 
41 struct RxSignalInfo;
42 struct WifiProtection;
43 struct WifiAcknowledgment;
44 
52 {
53 public:
58  static TypeId GetTypeId (void);
60  virtual ~FrameExchangeManager ();
61 
70 
78  virtual bool StartTransmission (Ptr<Txop> dcf);
79 
91  void Receive (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
92  WifiTxVector txVector, std::vector<bool> perMpduStatus);
93 
99  virtual void SetWifiMac (const Ptr<WifiMac> mac);
105  virtual void SetMacTxMiddle (const Ptr<MacTxMiddle> txMiddle);
111  virtual void SetMacRxMiddle (const Ptr<MacRxMiddle> rxMiddle);
117  virtual void SetChannelAccessManager (const Ptr<ChannelAccessManager> channelAccessManager);
123  virtual void SetWifiPhy (const Ptr<WifiPhy> phy);
127  virtual void ResetPhy (void);
133  virtual void SetProtectionManager (Ptr<WifiProtectionManager> protectionManager);
139  virtual void SetAckManager (Ptr<WifiAckManager> ackManager);
145  virtual void SetAddress (Mac48Address address);
151  virtual void SetBssid (Mac48Address bssid);
157  virtual void SetDroppedMpduCallback (DroppedMpdu callback);
163  void SetAckedMpduCallback (AckedMpdu callback);
167  void SetPromisc (void);
174  bool IsPromisc (void) const;
175 
181  const WifiTxTimer& GetWifiTxTimer (void) const;
182 
189 
197  virtual void CalculateProtectionTime (WifiProtection* protection) const;
198 
204  Ptr<WifiAckManager> GetAckManager (void) const;
205 
213  virtual void CalculateAcknowledgmentTime (WifiAcknowledgment* acknowledgment) const;
214 
220  virtual void NotifyInternalCollision (Ptr<Txop> txop);
221 
229  virtual void NotifySwitchingStartNow (Time duration);
230 
236  void NotifySleepNow (void);
237 
243  void NotifyOffNow (void);
244 
245 protected:
246  void DoDispose () override;
247 
258 
268 
275  virtual void UpdateNav (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector);
276 
280  virtual void NavResetTimeout (void);
281 
290  virtual void ReceiveMpdu (Ptr<WifiMacQueueItem> mpdu, RxSignalInfo rxSignalInfo,
291  const WifiTxVector& txVector, bool inAmpdu);
292 
302  virtual void EndReceiveAmpdu (Ptr<const WifiPsdu> psdu, const RxSignalInfo& rxSignalInfo,
303  const WifiTxVector& txVector, const std::vector<bool>& perMpduStatus);
304 
314  virtual void ReceivedNormalAck (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector,
315  const WifiTxVector& ackTxVector, const RxSignalInfo& rxInfo, double snr);
316 
323 
329  virtual void RetransmitMpduAfterMissedAck (Ptr<WifiMacQueueItem> mpdu) const;
330 
337  virtual void ReleaseSequenceNumber (Ptr<WifiMacQueueItem> mpdu) const;
338 
346 
355  virtual void PreProcessFrame (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector);
356 
367  virtual Time GetTxDuration (uint32_t ppduPayloadSize, Mac48Address receiver,
368  const WifiTxParameters& txParams) const;
369 
377  void UpdateTxDuration (Mac48Address receiver, WifiTxParameters& txParams) const;
378 
388  virtual uint32_t GetPsduSize (Ptr<const WifiMacQueueItem> mpdu, const WifiTxVector& txVector) const;
389 
401  bool m_promisc;
404 
411  virtual void ForwardMpduDown (Ptr<WifiMacQueueItem> mpdu, WifiTxVector& txVector);
412 
418  virtual void DequeueMpdu (Ptr<const WifiMacQueueItem> mpdu);
419 
431  virtual Time GetFrameDurationId (const WifiMacHeader& header, uint32_t size,
432  const WifiTxParameters& txParams,
433  Ptr<Packet> fragmentedPacket) const;
434 
444  virtual Time GetRtsDurationId (const WifiTxVector& rtsTxVector, Time txDuration, Time response) const;
445 
451  void SendRts (const WifiTxParameters& txParams);
452 
460  void SendCtsAfterRts (const WifiMacHeader& rtsHdr, WifiMode rtsTxMode, double rtsSnr);
461 
469  void DoSendCtsAfterRts (const WifiMacHeader& rtsHdr, WifiTxVector& ctsTxVector, double rtsSnr);
470 
480  virtual Time GetCtsToSelfDurationId (const WifiTxVector& ctsTxVector, Time txDuration,
481  Time response) const;
482 
488  void SendCtsToSelf (const WifiTxParameters& txParams);
489 
497  void SendNormalAck (const WifiMacHeader& hdr, const WifiTxVector& dataTxVector, double dataSnr);
498 
506 
511  virtual void TransmissionSucceeded (void);
512 
517  virtual void TransmissionFailed (void);
518 
525  virtual void NormalAckTimeout (Ptr<WifiMacQueueItem> mpdu, const WifiTxVector& txVector);
526 
533  virtual void CtsTimeout (Ptr<WifiMacQueueItem> rts, const WifiTxVector& txVector);
540  void DoCtsTimeout (Ptr<WifiPsdu> psdu);
541 
542 private:
553  void RxStartIndication (WifiTxVector txVector, Time psduDuration);
554 
558  void SendMpdu (void);
559 
563  virtual void Reset (void);
564 
571 };
572 
573 } //namespace ns3
574 
575 #endif /* FRAME_EXCHANGE_MANAGER_H */
Callback template class.
Definition: callback.h:1279
An identifier for simulation events.
Definition: event-id.h:54
FrameExchangeManager is a base class handling the basic frame exchange sequences for non-QoS stations...
void SetPromisc(void)
Enable promiscuous mode.
Callback< void, Ptr< const WifiMacQueueItem > > AckedMpdu
typedef for a callback to invoke when an MPDU is successfully acknowledged.
void DoCtsTimeout(Ptr< WifiPsdu > psdu)
Take required actions when the CTS timer fired after sending an RTS to protect the given PSDU expires...
virtual void SetAckManager(Ptr< WifiAckManager > ackManager)
Set the Acknowledgment Manager to use.
void NotifyOffNow(void)
This method is typically invoked by the PhyListener to notify the MAC layer that the device has been ...
virtual void NotifyInternalCollision(Ptr< Txop > txop)
Notify that an internal collision has occurred for the given Txop.
virtual void CtsTimeout(Ptr< WifiMacQueueItem > rts, const WifiTxVector &txVector)
Called when the CTS timeout expires.
Callback< void, WifiMacDropReason, Ptr< const WifiMacQueueItem > > DroppedMpdu
typedef for a callback to invoke when an MPDU is dropped.
Ptr< WifiMac > m_mac
the MAC layer on this station
virtual void ForwardMpduDown(Ptr< WifiMacQueueItem > mpdu, WifiTxVector &txVector)
Forward an MPDU down to the PHY layer.
DroppedMpdu m_droppedMpduCallback
the dropped MPDU callback
virtual void SetWifiMac(const Ptr< WifiMac > mac)
Set the MAC layer to use.
virtual void TransmissionSucceeded(void)
Take necessary actions upon a transmission success.
const WifiTxTimer & GetWifiTxTimer(void) const
Get a const reference to the WifiTxTimer object.
virtual void UpdateNav(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector)
Update the NAV, if needed, based on the Duration/ID of the given psdu.
Ptr< WifiAckManager > m_ackManager
Acknowledgment manager.
void UpdateTxDuration(Mac48Address receiver, WifiTxParameters &txParams) const
Update the TX duration field of the given TX parameters after that the PSDU addressed to the given re...
virtual void CalculateAcknowledgmentTime(WifiAcknowledgment *acknowledgment) const
Calculate the time required to acknowledge a frame according to the given acknowledgment method.
Ptr< MacTxMiddle > m_txMiddle
the MAC TX Middle on this station
void SendNormalAck(const WifiMacHeader &hdr, const WifiTxVector &dataTxVector, double dataSnr)
Send Normal Ack.
Ptr< Packet > m_fragmentedPacket
the MSDU being fragmented
virtual void SetDroppedMpduCallback(DroppedMpdu callback)
Set the callback to invoke when an MPDU is dropped.
static TypeId GetTypeId(void)
Get the type ID.
Mac48Address m_self
the MAC address of this device
WifiTxTimer m_txTimer
the timer set upon frame transmission
void SendCtsAfterRts(const WifiMacHeader &rtsHdr, WifiMode rtsTxMode, double rtsSnr)
Send CTS after receiving RTS.
virtual void NotifyReceivedNormalAck(Ptr< WifiMacQueueItem > mpdu)
Notify other components that an MPDU was acknowledged.
virtual Time GetRtsDurationId(const WifiTxVector &rtsTxVector, Time txDuration, Time response) const
Compute how to set the Duration/ID field of an RTS frame to send to protect a frame transmitted with ...
virtual void ReceivedNormalAck(Ptr< WifiMacQueueItem > mpdu, const WifiTxVector &txVector, const WifiTxVector &ackTxVector, const RxSignalInfo &rxInfo, double snr)
Perform the actions needed when a Normal Ack is received.
Ptr< WifiProtectionManager > m_protectionManager
Protection manager.
Ptr< WifiMacQueueItem > GetFirstFragmentIfNeeded(Ptr< WifiMacQueueItem > mpdu)
Fragment the given MPDU if needed.
void SendRts(const WifiTxParameters &txParams)
Send RTS to begin RTS-CTS-Data-Ack transaction.
virtual void NotifySwitchingStartNow(Time duration)
Ptr< WifiProtectionManager > GetProtectionManager(void) const
Get the Protection Manager used by this node.
virtual void SetBssid(Mac48Address bssid)
Set the Basic Service Set Identification.
void SendCtsToSelf(const WifiTxParameters &txParams)
Send CTS for a CTS-to-self mechanism.
virtual void NotifyPacketDiscarded(Ptr< const WifiMacQueueItem > mpdu)
Pass the given MPDU, discarded because of the max retry limit was reached, to the MPDU dropped callba...
virtual void RetransmitMpduAfterMissedAck(Ptr< WifiMacQueueItem > mpdu) const
Retransmit an MPDU that was not acknowledged.
virtual void CalculateProtectionTime(WifiProtection *protection) const
Calculate the time required to protect a frame according to the given protection method.
virtual void SetAddress(Mac48Address address)
Set the MAC address.
void SendMpduWithProtection(Ptr< WifiMacQueueItem > mpdu, WifiTxParameters &txParams)
Send an MPDU with the given TX parameters (with the specified protection).
virtual bool StartTransmission(Ptr< Txop > dcf)
Request the FrameExchangeManager to start a frame exchange sequence.
Ptr< WifiMacQueueItem > m_mpdu
the MPDU being transmitted
virtual void EndReceiveAmpdu(Ptr< const WifiPsdu > psdu, const RxSignalInfo &rxSignalInfo, const WifiTxVector &txVector, const std::vector< bool > &perMpduStatus)
This method is called when the reception of an A-MPDU including multiple MPDUs is completed.
Ptr< WifiMacQueueItem > GetNextFragment(void)
Get the next fragment of the current MSDU.
Ptr< MacRxMiddle > m_rxMiddle
the MAC RX Middle on this station
Ptr< Txop > m_dcf
the DCF/EDCAF that gained channel access
virtual void ReceiveMpdu(Ptr< WifiMacQueueItem > mpdu, RxSignalInfo rxSignalInfo, const WifiTxVector &txVector, bool inAmpdu)
This method handles the reception of an MPDU (possibly included in an A-MPDU)
Ptr< WifiPhy > m_phy
the PHY layer on this station
virtual void TransmissionFailed(void)
Take necessary actions upon a transmission failure.
Ptr< WifiAckManager > GetAckManager(void) const
Get the Acknowledgment Manager used by this node.
virtual void ReleaseSequenceNumber(Ptr< WifiMacQueueItem > mpdu) const
Make the sequence number of the given MPDU available again if the MPDU has never been transmitted.
void Receive(Ptr< WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > perMpduStatus)
This method is intended to be called by the PHY layer every time an MPDU is received and also when th...
void SetAckedMpduCallback(AckedMpdu callback)
Set the callback to invoke when an MPDU is successfully acked.
virtual void PreProcessFrame(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector)
Perform actions that are possibly needed when receiving any frame, independently of whether the frame...
virtual Time GetFrameDurationId(const WifiMacHeader &header, uint32_t size, const WifiTxParameters &txParams, Ptr< Packet > fragmentedPacket) const
Compute how to set the Duration/ID field of a frame being transmitted with the given TX parameters.
virtual Time GetCtsToSelfDurationId(const WifiTxVector &ctsTxVector, Time txDuration, Time response) const
Compute how to set the Duration/ID field of a CTS-to-self frame to send to protect a frame transmitte...
void DoSendCtsAfterRts(const WifiMacHeader &rtsHdr, WifiTxVector &ctsTxVector, double rtsSnr)
Send CTS after receiving RTS.
void SendMpdu(void)
Send the current MPDU, which can be acknowledged by a Normal Ack.
void NotifySleepNow(void)
This method is typically invoked by the PhyListener to notify the MAC layer that the device has been ...
Mac48Address m_bssid
BSSID address (Mac48Address)
virtual void SetWifiPhy(const Ptr< WifiPhy > phy)
Set the PHY layer to use.
AckedMpdu m_ackedMpduCallback
the acknowledged MPDU callback
virtual void DequeueMpdu(Ptr< const WifiMacQueueItem > mpdu)
Dequeue the given MPDU from the queue in which it is stored.
Ptr< ChannelAccessManager > m_channelAccessManager
the channel access manager
bool m_promisc
Flag if the device is operating in promiscuous mode.
virtual void NormalAckTimeout(Ptr< WifiMacQueueItem > mpdu, const WifiTxVector &txVector)
Called when the Ack timeout expires.
virtual void SetChannelAccessManager(const Ptr< ChannelAccessManager > channelAccessManager)
Set the channel access manager to use.
bool m_moreFragments
true if a fragment has to be sent after a SIFS
Time m_navEnd
NAV expiration time.
virtual void NavResetTimeout(void)
Reset the NAV upon expiration of the NAV reset timer.
virtual void SetMacTxMiddle(const Ptr< MacTxMiddle > txMiddle)
Set the MAC TX Middle to use.
virtual void SetMacRxMiddle(const Ptr< MacRxMiddle > rxMiddle)
Set the MAC RX Middle to use.
virtual void SetProtectionManager(Ptr< WifiProtectionManager > protectionManager)
Set the Protection Manager to use.
bool IsPromisc(void) const
Check if the device is operating in promiscuous mode.
virtual void Reset(void)
Reset this frame exchange manager.
void DoDispose() override
Destructor implementation.
WifiTxParameters m_txParams
the TX parameters for the current frame
virtual uint32_t GetPsduSize(Ptr< const WifiMacQueueItem > mpdu, const WifiTxVector &txVector) const
Get the size in bytes of the given MPDU, which is to be transmitted with the given TXVECTOR.
void RxStartIndication(WifiTxVector txVector, Time psduDuration)
EventId m_navResetEvent
the event to reset the NAV after an RTS
virtual void ResetPhy(void)
Remove WifiPhy associated with this FrameExchangeManager.
virtual Time GetTxDuration(uint32_t ppduPayloadSize, Mac48Address receiver, const WifiTxParameters &txParams) const
Get the updated TX duration of the frame associated with the given TX parameters if the size of the P...
an EUI-48 address
Definition: mac48-address.h:44
A base class which provides memory management and object aggregation.
Definition: object.h:88
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
a unique identifier for an interface.
Definition: type-id.h:59
Implements the IEEE 802.11 MAC header.
represent a single transmission mode
Definition: wifi-mode.h:48
This class stores the TX parameters (TX vector, protection mechanism, acknowledgment mechanism,...
This class is used to handle the timer that a station starts when transmitting a frame that solicits ...
Definition: wifi-tx-timer.h:48
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
address
Definition: first.py:44
Every class exported by the ns3 library is enclosed in the ns3 namespace.
mac
Definition: third.py:99
phy
Definition: third.py:93
RxSignalInfo structure containing info on the received signal.
Definition: phy-entity.h:67
WifiAcknowledgment is an abstract base struct.
WifiProtection is an abstract base struct.