22 #include "ns3/abort.h" 24 #include "ns3/wifi-mac-queue.h" 25 #include "ns3/mgt-headers.h" 26 #include "ns3/recipient-block-ack-agreement.h" 27 #include "ns3/wifi-utils.h" 28 #include "ns3/snr-tag.h" 29 #include "ns3/ctrl-headers.h" 31 #undef NS_LOG_APPEND_CONTEXT 32 #define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] " 43 static TypeId tid =
TypeId (
"ns3::HtFrameExchangeManager")
45 .AddConstructor<HtFrameExchangeManager> ()
46 .SetGroupName (
"Wifi")
98 return m_mac->GetQosTxop (tid)->GetBaManager ();
107 if (!
m_mac->GetWifiRemoteStationManager ()->GetHtSupported (recipient))
111 else if (qosTxop->
GetBaManager ()->ExistsAgreement (recipient, tid)
118 uint32_t packets = qosTxop->
GetWifiMacQueue ()->GetNPacketsByTidAndAddress (tid, recipient);
121 ||
m_mac->GetWifiRemoteStationManager ()->GetVhtSupported ());
130 uint16_t
timeout,
bool immediateBAck)
154 reqHdr.SetImmediateBlockAck ();
158 reqHdr.SetDelayedBlockAck ();
164 reqHdr.SetBufferSize (0);
167 reqHdr.SetStartingSequence (startingSeq);
235 m_mac->GetQosTxop (reqHdr->
GetTid ())->PushFront (packet, hdr);
278 m_mac->GetQosTxop (tid)->GetWifiMacQueue ()->PushFront (Create<WifiMacQueueItem> (packet, hdr));
283 uint16_t startingSeq)
286 uint8_t tid = respHdr->
GetTid ();
291 m_mac->GetWifiRemoteStationManager ()->GetHtSupported ()
292 &&
m_mac->GetWifiRemoteStationManager ()->GetHtSupported (originator));
296 agreement.SetImmediateBlockAck ();
300 agreement.SetDelayedBlockAck ();
308 this, originator, tid,
false);
320 auto agreementIt =
m_agreements.find ({originator, tid});
324 agreementIt->second.Flush ();
369 && !
m_mac->GetWifiRemoteStationManager ()->NeedFragmentation (peekedItem))
371 return SendDataFrame (peekedItem, availableTime, initialFrame);
392 NS_LOG_DEBUG (
"Block Ack Manager returned no frame to send");
396 NS_ASSERT (peekedItem->GetHeader ().IsBlockAckReq ());
403 txParams.
m_txVector =
m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peekedItem->GetHeader ());
404 txParams.m_protection = std::unique_ptr<WifiProtection> (
new WifiNoProtection);
405 txParams.m_acknowledgment =
GetAckManager ()->TryAddMpdu (peekedItem, txParams);
421 if (availableTime !=
Time::Min () && !initialFrame
424 NS_LOG_DEBUG (
"Not enough time to send the BAR frame returned by the Block Ack Manager");
436 Time availableTime,
bool initialFrame)
438 NS_ASSERT (peekedItem != 0 && peekedItem->GetHeader ().IsQosData ()
439 && !peekedItem->GetHeader ().GetAddr1 ().IsBroadcast ()
440 && !peekedItem->IsFragment ());
441 NS_LOG_FUNCTION (
this << *peekedItem << availableTime << initialFrame);
445 txParams.
m_txVector =
m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peekedItem->GetHeader ());
456 std::vector<Ptr<WifiMacQueueItem>> mpduList =
m_mpduAggregator->GetNextAmpdu (mpdu, txParams,
457 availableTime, queueIt);
460 if (mpduList.size () > 1)
520 return Create<WifiPsdu> (mpdu,
false);
586 NS_LOG_DEBUG (
"Schedule a transmission from Block Ack Manager in a SIFS");
603 if (mpdu->GetHeader ().IsQosData ())
605 GetBaManager (mpdu->GetHeader ().GetQosTid ())->NotifyDiscardedMpdu (mpdu);
607 else if (mpdu->GetHeader ().IsAction ())
610 mpdu->GetPacket ()->PeekHeader (actionHdr);
613 uint8_t tid =
GetTid (mpdu->GetPacket (), mpdu->GetHeader ());
614 if (
GetBaManager (tid)->ExistsAgreementInState (mpdu->GetHeader ().GetAddr1 (), tid,
618 GetBaManager (tid)->NotifyAgreementNoReply (mpdu->GetHeader ().GetAddr1 (), tid);
621 mpdu->GetHeader ().GetAddr1 (), tid);
666 uint16_t currentNextSeq =
m_txMiddle->PeekNextSequenceNumberFor (&hdr);
709 #ifdef NS3_BUILD_PROFILE_DEBUG 716 NS_ASSERT (mpdu->GetHeader ().IsCtl () || mpdu->IsQueued ());
767 if (!
m_mac->GetWifiRemoteStationManager ()->NeedRetransmission (*
m_psdu->
begin ()))
829 NS_ABORT_MSG_IF (tids.size () > 1,
"Acknowledgment method incompatible with a Multi-TID A-MPDU");
830 uint8_t tid = *tids.begin ();
839 NS_ABORT_MSG (
"Unable to handle the selected acknowledgment method (" 867 if (mpdu->GetHeader ().IsQosData ())
871 if (mpdu->GetHeader ().IsQosEosp ())
875 if (mpdu->GetHeader ().HasData ())
896 if (mpdu->GetQueueIteratorPairs ().size () > 1)
899 for (
const auto& queueIt : mpdu->GetQueueIteratorPairs ())
902 queueIt.queue->Dequeue (queueIt.it);
905 else if (mpdu->IsQueued ())
919 NS_LOG_DEBUG (
"Transmitting a PSDU: " << *psdu <<
" TXVECTOR: " << txVector);
936 Time ppduDurationLimit)
const 944 if (txParams.
GetSize (receiver) > 0)
951 if (mpdu->GetHeader ().IsQosData ())
953 tid = mpdu->GetHeader ().GetQosTid ();
961 NS_ABORT_MSG (
"Cannot aggregate a non-QoS data frame to an A-MPDU that does" 962 " not contain any QoS data frame");
982 uint32_t maxAmpduSize =
m_mpduAggregator->GetMaxAmpduSize (receiver, tid, modulation);
984 if (maxAmpduSize == 0)
990 if (ampduSize > maxAmpduSize)
992 NS_LOG_DEBUG (
"the frame does not meet the constraint on max A-MPDU size (" 993 << maxAmpduSize <<
")");
1001 Time availableTime)
const 1003 NS_ASSERT (msdu != 0 && msdu->GetHeader ().IsQosData ());
1010 std::unique_ptr<WifiProtection> protection;
1012 bool protectionSwapped =
false;
1018 protectionTime = protection->protectionTime;
1022 protectionSwapped =
true;
1030 std::unique_ptr<WifiAcknowledgment> acknowledgment;
1031 acknowledgment =
GetAckManager ()->TryAggregateMsdu (msdu, txParams);
1032 bool acknowledgmentSwapped =
false;
1038 acknowledgmentTime = acknowledgment->acknowledgmentTime;
1042 acknowledgmentSwapped =
true;
1049 ppduDurationLimit = availableTime - protectionTime - acknowledgmentTime;
1056 if (protectionSwapped)
1060 if (acknowledgmentSwapped)
1077 Time ppduDurationLimit)
const 1079 NS_ASSERT (msdu != 0 && msdu->GetHeader ().IsQosData ());
1083 Mac48Address receiver = msdu->GetHeader ().GetAddr1 ();
1084 uint8_t tid = msdu->GetHeader ().GetQosTid ();
1088 uint16_t maxAmsduSize =
m_msduAggregator->GetMaxAmsduSize (receiver, tid, modulation);
1090 if (maxAmsduSize == 0)
1096 if (ret.first > maxAmsduSize)
1098 NS_LOG_DEBUG (
"No other MSDU can be aggregated: maximum A-MSDU size (" 1099 << maxAmsduSize <<
") reached ");
1124 m_mac->GetWifiRemoteStationManager ()->ReportDataFailed (*psdu->
begin ());
1163 m_mac->GetWifiRemoteStationManager ()->ReportAmpduTxStatus (recipient, 0, psdu->
GetNMpdus (),
1165 std::set<uint8_t> tids = psdu->
GetTids ();
1166 NS_ABORT_MSG_IF (tids.size () > 1,
"Multi-TID A-MPDUs not handled here");
1168 tid = *tids.begin ();
1176 if (
GetBaManager (tid)->NeedBarRetransmission (tid, recipient))
1178 NS_LOG_DEBUG (
"Missed Block Ack, transmit a BlockAckReq");
1193 NS_LOG_DEBUG (
"Missed Block Ack, do not transmit a BlockAckReq");
1196 m_mac->GetWifiRemoteStationManager ()->ReportFinalDataFailed (*psdu->
begin ());
1197 if (
GetBaManager (tid)->ExistsAgreementInState (recipient, tid,
1202 if (
GetBaManager (tid)->GetNBufferedPackets (recipient, tid) > 0)
1204 GetBaManager (tid)->DiscardOutstandingMpdus (recipient, tid);
1222 if (!
m_mac->GetWifiRemoteStationManager ()->NeedRetransmission (*psdu->
begin ()))
1224 NS_LOG_DEBUG (
"Missed Block Ack, do not retransmit the data frames");
1225 m_mac->GetWifiRemoteStationManager ()->ReportFinalDataFailed (*psdu->
begin ());
1230 GetBaManager (tid)->DiscardOutstandingMpdus (recipient, tid);
1235 NS_LOG_DEBUG (
"Missed Block Ack, retransmit data frames");
1236 GetBaManager (tid)->NotifyMissedBlockAck (recipient, tid);
1297 return it->second.GetBlockAckType ();
1308 double rxSnr = rxSignalInfo.
snr;
1324 m_mac->GetWifiRemoteStationManager ()->ReportRxOk (sender, rxSignalInfo, txVector);
1376 NS_LOG_DEBUG (
"There's not a valid agreement for this BlockAckReq");
1385 m_mac->GetWifiRemoteStationManager ()->GetBlockAckTxVector (sender, txVector),
1405 <<
" (" << *mpdu <<
")");
1407 agreementIt->second.NotifyReceivedMpdu (mpdu);
1413 this, hdr, txVector, rxSnr);
1426 const WifiTxVector& txVector,
const std::vector<bool>& perMpduStatus)
1428 std::set<uint8_t> tids = psdu->
GetTids ();
1431 if (tids.size () == 1)
1433 uint8_t tid = *tids.begin ();
1446 m_mac->GetWifiRemoteStationManager ()->GetBlockAckTxVector (psdu->
GetAddr2 (), txVector),
WifiModulationClass
This enumeration defines the modulation classes per (Table 10-6 "Modulation classes"; IEEE 802...
virtual Ptr< WifiPsdu > GetWifiPsdu(Ptr< WifiMacQueueItem > mpdu, const WifiTxVector &txVector) const
Get a PSDU containing the given MPDU.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
void Set(double snr)
Set the SNR to the given value.
void ScheduleBar(Ptr< const WifiMacQueueItem > bar, bool skipIfNoDataQueued=false)
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Ptr< const WifiMacQueueItem > PeekNextMpdu(uint8_t tid=8, Mac48Address recipient=Mac48Address::GetBroadcast())
Peek the next frame to transmit to the given receiver and of the given TID from the block ack manager...
virtual bool IsWithinLimitsIfAggregateMsdu(Ptr< const WifiMacQueueItem > msdu, const WifiTxParameters &txParams, Time ppduDurationLimit) const
Check if the PSDU obtained by aggregating the given MSDU to the PSDU specified by the given TX parame...
Simulation virtual time values and global simulation resolution.
Smart pointer class similar to boost::intrusive_ptr.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
void SendCtsToSelf(const WifiTxParameters &txParams)
Send CTS for a CTS-to-self mechanism.
void ResetBa(Mac48Address recipient, uint8_t tid)
Reset BA agreement after BA negotiation failed.
WifiTxTimer m_txTimer
the timer set upon frame transmission
void ForwardMpduDown(Ptr< WifiMacQueueItem > mpdu, WifiTxVector &txVector) override
Forward an MPDU down to the PHY layer.
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
void SendMpduWithProtection(Ptr< WifiMacQueueItem > mpdu, WifiTxParameters &txParams)
Send an MPDU with the given TX parameters (with the specified protection).
void SendPsduWithProtection(Ptr< WifiPsdu > psdu, WifiTxParameters &txParams)
Send a PSDU (A-MPDU or BlockAckReq frame) requesting a BlockAck frame or a BlockAckReq frame followed...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
void SetDuration(Time duration)
Set the Duration/ID field on all the MPDUs.
void SendBlockAck(const RecipientBlockAckAgreement &agreement, Time durationId, WifiTxVector &blockAckTxVector, double rxSnr)
Create a BlockAck frame with header equal to blockAck and start its transmission. ...
Ptr< WifiProtectionManager > GetProtectionManager(void) const
Get the Protection Manager used by this node.
void CalculateAcknowledgmentTime(WifiAcknowledgment *acknowledgment) const override
Calculate the time required to acknowledge a frame according to the given acknowledgment method...
Ptr< WifiPhy > m_phy
the PHY layer on this station
static Time Min()
Minimum representable Time Not to be confused with Min(Time,Time).
void CreateBlockAckAgreement(const MgtAddBaResponseHeader *respHdr, Mac48Address originator, uint16_t startingSeq)
virtual void MissedBlockAck(Ptr< WifiPsdu > psdu, const WifiTxVector &txVector, bool &resetCw)
Take necessary actions when a BlockAck is missed, such as scheduling a BlockAckReq frame or the retra...
WifiPhyBand GetPhyBand(void) const
Get the configured Wi-Fi band.
std::unique_ptr< WifiProtection > m_protection
protection method
Maintains the scoreboard and the receive reordering buffer used by a recipient of a Block Ack agreeme...
void AggregateMsdu(Ptr< const WifiMacQueueItem > msdu)
Record that an MSDU is being aggregated to the last MPDU added to the frame that hase the same receiv...
void Clear(void)
Reset the TX parameters.
Time acknowledgmentTime
time required by the acknowledgment method
WifiAcknowledgment is an abstract base struct.
virtual bool NeedSetupBlockAck(Mac48Address recipient, uint8_t tid)
A Block Ack agreement needs to be established with the given recipient for the given TID if it does n...
WifiModulationClass GetModulationClass(void) const
Get the modulation class specified by this TXVECTOR.
virtual bool TryAggregateMsdu(Ptr< const WifiMacQueueItem > msdu, WifiTxParameters &txParams, Time availableTime) const
Check if aggregating an MSDU to the current MPDU (as specified by the given TX parameters) does not v...
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
U * PeekPointer(const Ptr< U > &p)
Information needed to remove an MSDU from the queue.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
ConstIterator it
iterator pointing to the MSDU in the queue
virtual void CalculateProtectionTime(WifiProtection *protection) const
Calculate the time required to protect a frame according to the given protection method.
Ptr< BlockAckManager > GetBaManager(void)
Get the Block Ack Manager associated with this QosTxop.
void(* Time)(Time oldValue, Time newValue)
TracedValue callback signature for Time.
uint16_t GetBaStartingSequence(Mac48Address address, uint8_t tid) const
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
bool StartFrameExchange(Ptr< QosTxop > edca, Time availableTime, bool initialFrame) override
Start a frame exchange (including protection frames and acknowledgment frames as needed) that fits wi...
virtual Time GetRemainingTxop(void) const
Return the remaining duration in the current TXOP.
WifiTxVector blockAckReqTxVector
BlockAckReq TXVECTOR.
Ptr< ChannelAccessManager > m_channelAccessManager
the channel access manager
uint8_t GetBlockAckThreshold(void) const
Return the current threshold for block ack mechanism.
bool UseExplicitBarAfterMissedBlockAck(void) const
Return true if an explicit BlockAckRequest is sent after a missed BlockAck.
const Method method
acknowledgment method
virtual void CalculateAcknowledgmentTime(WifiAcknowledgment *acknowledgment) const
Calculate the time required to acknowledge a frame according to the given acknowledgment method...
virtual void CtsTimeout(Ptr< WifiMacQueueItem > rts, const WifiTxVector &txVector)
Called when the CTS timeout expires.
Ptr< WifiAckManager > GetAckManager(void) const
Get the Acknowledgment Manager used by this node.
double Get(void) const
Return the SNR value.
BlockAckType baType
BlockAck type.
Ptr< RegularWifiMac > m_mac
the MAC layer on this station
Ptr< MsduAggregator > m_msduAggregator
A-MSDU aggregator.
void SetMacRxMiddle(const Ptr< MacRxMiddle > rxMiddle)
Set the MAC RX Middle to use.
uint32_t GetSize(void) const
Return the size of the PSDU in bytes.
bool StartTransmission(Ptr< Txop > edca) override
Request the FrameExchangeManager to start a frame exchange sequence.
virtual void ForwardPsduDown(Ptr< const WifiPsdu > psdu, WifiTxVector &txVector)
Forward a PSDU down to the PHY layer.
WifiMode GetMode(uint16_t staId=SU_STA_ID) const
If this TX vector is associated with an SU PPDU, return the selected payload transmission mode...
void DoDispose() override
Destructor implementation.
void DestroyBlockAckAgreement(Mac48Address originator, uint8_t tid)
Destroy a Block Ack agreement.
Ptr< WifiPsdu > m_psdu
the A-MPDU being transmitted
static Time CalculateTxDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, uint16_t staId=SU_STA_ID)
void UpdateFailedCw(void)
Update the value of the CW variable to take into account a transmission failure.
Time GetAddBaResponseTimeout(void) const
Get the timeout for ADDBA response.
void SetWifiMac(const Ptr< RegularWifiMac > mac) override
Set the MAC layer to use.
void TransmissionSucceeded(void) override
Take necessary actions upon a transmission success.
RxSignalInfo structure containing info on the received signal.
void SetSuccess(void)
Set success bit to 0 (success).
Mac48Address m_bssid
BSSID address (Mac48Address)
const WifiMacHeader & GetHeader(void) const
Get the header stored in this item.
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.
bool IsZero(void) const
Exactly equivalent to t == 0.
QosFrameExchangeManager handles the frame exchange sequences for QoS stations.
virtual bool IsWithinSizeAndTimeLimits(uint32_t ppduPayloadSize, Mac48Address receiver, const WifiTxParameters &txParams, Time ppduDurationLimit) const
Check whether the transmission time of the frame being built (as described by the given TX parameters...
uint16_t GetBlockAckInactivityTimeout(void) const
Get the BlockAck inactivity timeout.
Reason GetReason(void) const
Get the reason why the timer was started.
const PsduInfo * GetPsduInfo(Mac48Address receiver) const
Get a pointer to the information about the PSDU addressed to the given receiver, if present...
void DequeueMpdu(Ptr< WifiMacQueueItem > mpdu) override
Dequeue the given MPDU from the queue in which it is stored.
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
WifiTxVector blockAckTxVector
BlockAck TXVECTOR.
Time GetDuration(void) const
Get the duration from the Duration/ID field, which is common to all the MPDUs.
Mac48Address GetAddr2(void) const
Get the Transmitter Address (TA), which is common to all the MPDUs.
uint32_t GetBlockAckRequestSize(BlockAckReqType type)
Return the total BlockAckRequest size (including FCS trailer).
const WifiMacHeader & GetHeader(std::size_t i) const
Get the header of the i-th MPDU.
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...
Mac48Address GetPeer(void) const
Return the peer address.
Mac48Address m_self
the MAC address of this device
virtual bool IsWithinAmpduSizeLimit(uint32_t ampduSize, Mac48Address receiver, uint8_t tid, WifiModulationClass modulation) const
Check whether an A-MPDU of the given size meets the constraint on the maximum size for A-MPDUs sent t...
virtual void BlockAckTimeout(Ptr< WifiPsdu > psdu, const WifiTxVector &txVector)
Called when the BlockAck timeout expires.
Ptr< const Packet > GetPacket(void) const
Get the packet stored in this item.
Status code for association response.
void TransmissionSucceeded(void) override
Take necessary actions upon a transmission success.
void EndReceiveAmpdu(Ptr< const WifiPsdu > psdu, const RxSignalInfo &rxSignalInfo, const WifiTxVector &txVector, const std::vector< bool > &perMpduStatus) override
This method is called when the reception of an A-MPDU including multiple MPDUs is completed...
WifiTxVector m_txVector
TXVECTOR of the frame being prepared.
std::size_t GetNMpdus(void) const
Return the number of MPDUs constituting the PSDU.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void SendRts(const WifiTxParameters &txParams)
Send RTS to begin RTS-CTS-Data-Ack transaction.
void SendPsdu(void)
Send the current PSDU, which can be acknowledged by a BlockAck frame or followed by a BlockAckReq fra...
virtual ~HtFrameExchangeManager()
void SetAggregation(bool aggregation)
Sets if PSDU contains A-MPDU.
WifiTxVector blockAckTxVector
BlockAck TXVECTOR.
void RetransmitMpduAfterMissedCts(Ptr< WifiMacQueueItem > mpdu) const override
Retransmit an MPDU that was not sent because a CTS was not received.
Ptr< WifiMacQueueItem > Dequeue(void) override
Dequeue the packet in the front of the queue.
void CompleteMpduTx(Ptr< WifiMacQueueItem > mpdu)
Stores an MPDU (part of an A-MPDU) in block ack agreement (i.e.
WifiBarBlockAck specifies that a BlockAckReq is sent to solicit a Block Ack response.
std::map< uint8_t, std::set< uint16_t > > seqNumbers
set of the sequence numbers of the MPDUs added for each TID
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
void RetransmitMpduAfterMissedAck(Ptr< WifiMacQueueItem > mpdu) const override
Retransmit an MPDU that was not acknowledged.
std::set< uint8_t > GetTids(void) const
Get the set of TIDs of the QoS Data frames included in the PSDU.
void Cancel(void)
Cancel the timer.
bool IsRunning(void) const
Return true if the timer is running.
static void SetQosAckPolicy(Ptr< WifiMacQueueItem > item, const WifiAcknowledgment *acknowledgment)
Set the QoS Ack policy for the given MPDU, which must be a QoS data frame.
void DoDispose() override
Destructor implementation.
uint8_t GetTid(Ptr< const Packet > packet, const WifiMacHeader hdr)
This function is useful to get traffic id of different packet types.
Ptr< QosTxop > m_edca
the EDCAF that gained channel access
bool IsWithinLimitsIfAddMpdu(Ptr< const WifiMacQueueItem > mpdu, const WifiTxParameters &txParams, Time ppduDurationLimit) const override
Check if the PSDU obtained by aggregating the given MPDU to the PSDU specified by the given TX parame...
virtual Time GetPsduDurationId(Time txDuration, const WifiTxParameters &txParams) const
Compute how to set the Duration/ID field of PSDUs that do not include fragments.
WifiBlockAck specifies that acknowledgment via Block Ack is required.
information about the frame being prepared for a specific receiver
virtual uint16_t GetSupportedBaBufferSize(void) const
Get the maximum supported buffer size for a Block Ack agreement.
virtual void SetWifiMac(const Ptr< RegularWifiMac > mac)
Set the MAC layer to use.
void SendNormalAck(const WifiMacHeader &hdr, const WifiTxVector &dataTxVector, double dataSnr)
Send Normal Ack.
std::map< AgreementKey, RecipientBlockAckAgreement > m_agreements
agreements
WifiTxParameters m_txParams
the TX parameters for the current frame
virtual void NotifyTxToEdca(Ptr< const WifiPsdu > psdu) const
Notify the transmission of the given PSDU to the EDCAF associated with the AC the PSDU belongs to...
uint32_t GetSize(Mac48Address receiver) const
Get the size in bytes of the (A-)MPDU addressed to the given receiver.
Ptr< BlockAckManager > GetBaManager(uint8_t tid) const
Get the Block Ack Manager handling the given TID.
#define NS_ABORT_IF(cond)
Abnormal program termination if a condition is true.
Ptr< MpduAggregator > GetMpduAggregator(void) const
Returns the aggregator used to construct A-MPDU subframes.
WifiMacQueue * queue
pointer to the queue where the MSDU is enqueued
void SetQosQueueSize(Ptr< WifiMacQueueItem > mpdu)
Set the Queue Size subfield of the QoS Control field of the given QoS data frame. ...
The different BlockAck variants.
void FillBlockAckBitmap(CtrlBAckResponseHeader *blockAckHeader, std::size_t index=0) const
Set the Starting Sequence Number subfield of the Block Ack Starting Sequence Control subfield of the ...
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Time GetSifs(void) const
Return the Short Interframe Space (SIFS) for this PHY.
void ReceiveMpdu(Ptr< WifiMacQueueItem > mpdu, RxSignalInfo rxSignalInfo, const WifiTxVector &txVector, bool inAmpdu) override
This method handles the reception of an MPDU (possibly included in an A-MPDU)
void AddPacketTag(const Tag &tag) const
Add a packet tag.
Ptr< MsduAggregator > GetMsduAggregator(void) const
Returns the aggregator used to construct A-MSDU subframes.
BlockAckType GetBlockAckType(void) const
Get the type of the Block Acks sent by the recipient of this agreement.
double snr
SNR in linear scale.
BlockAckType baType
BlockAck type.
bool IsStrictlyNegative(void) const
Exactly equivalent to t < 0.
uint32_t GetSizeIfAddMpdu(Ptr< const WifiMacQueueItem > mpdu) const
Get the size in bytes of the frame in case the given MPDU is added.
bool GetBaAgreementEstablished(Mac48Address address, uint8_t tid) const
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
uint32_t GetBlockAckSize(BlockAckType type)
Return the total BlockAck size (including FCS trailer).
std::pair< uint32_t, uint32_t > GetSizeIfAggregateMsdu(Ptr< const WifiMacQueueItem > msdu) const
Get the size in bytes of the frame in case the given MSDU is aggregated.
Time Seconds(double value)
Construct a Time in the indicated unit.
Ptr< const WifiMacQueueItem > PrepareBlockAckRequest(Mac48Address recipient, uint8_t tid) const
Ptr< WifiMacQueue > GetWifiMacQueue() const
Return the packet queue associated with this Txop.
This class stores the TX parameters (TX vector, protection mechanism, acknowledgment mechanism...
void SendAddBaResponse(const MgtAddBaRequestHeader *reqHdr, Mac48Address originator)
This method can be called to accept a received ADDBA Request.
Time GetSlot(void) const
Return the slot duration for this PHY.
virtual bool SendDataFrame(Ptr< const WifiMacQueueItem > peekedItem, Time availableTime, bool initialFrame)
Given a non-broadcast QoS data frame, prepare the PSDU to transmit by attempting A-MSDU and A-MPDU ag...
std::vector< Ptr< WifiMacQueueItem > >::const_iterator begin(void) const
Return a const iterator to the first MPDU.
static Time CalculatePhyPreambleAndHeaderDuration(const WifiTxVector &txVector)
void Send(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector)
This function is a wrapper for the Send variant that accepts a WifiConstPsduMap as first argument...
WifiNoProtection specifies that no protection method is used.
void NotifyReceivedNormalAck(Ptr< WifiMacQueueItem > mpdu) override
Notify other components that an MPDU was acknowledged.
uint32_t ampduSize
the size in bytes of the A-MPDU if multiple MPDUs have been added, and zero otherwise ...
void ReceiveMpdu(Ptr< WifiMacQueueItem > mpdu, RxSignalInfo rxSignalInfo, const WifiTxVector &txVector, bool inAmpdu) override
This method handles the reception of an MPDU (possibly included in an A-MPDU)
virtual void RetransmitMpduAfterMissedAck(Ptr< WifiMacQueueItem > mpdu) const
Retransmit an MPDU that was not acknowledged.
BlockAckType GetBlockAckType(Mac48Address originator, uint8_t tid) const
Get the type of BlockAck frames sent to the given originator.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
void TransmissionFailed(void) override
Take necessary actions upon a transmission failure.
void SendDelbaFrame(Mac48Address addr, uint8_t tid, bool byOriginator)
Sends DELBA frame to cancel a block ack agreement with STA addressed by addr for TID tid...
void NotifyPacketDiscarded(Ptr< const WifiMacQueueItem > mpdu) override
Pass the given MPDU, discarded because of the max retry limit was reached, to the MPDU dropped callba...
static std::size_t GetDistance(uint16_t seqNumber, uint16_t startingSeqNumber)
Get the distance between the given starting sequence number and the given sequence number...
std::unique_ptr< WifiAcknowledgment > m_acknowledgment
acknowledgment method
virtual void NotifyReceivedNormalAck(Ptr< WifiMacQueueItem > mpdu)
Notify other components that an MPDU was acknowledged.
BlockAckReqType barType
BlockAckReq type.
virtual bool SendMpduFromBaManager(Ptr< QosTxop > edca, Time availableTime, bool initialFrame)
If the Block Ack Manager associated with the given EDCA has a BlockAckReq frame to transmit (the dura...
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...
Mac48Address GetAddr1(void) const
Get the Receiver Address (RA), which is common to all the MPDUs.
bool PeekPacketTag(Tag &tag) const
Search a matching tag and call Tag::Deserialize if it is found.
void SendAddBaRequest(Mac48Address recipient, uint8_t tid, uint16_t startingSeq, uint16_t timeout, bool immediateBAck)
Sends an ADDBA Request to establish a block ack agreement with STA addressed by recipient for TID tid...
Ptr< WifiMacQueueItem > GetNextMpdu(Ptr< const WifiMacQueueItem > peekedItem, WifiTxParameters &txParams, Time availableTime, bool initialFrame, WifiMacQueueItem::QueueIteratorPair &queueIt)
Prepare the frame to transmit starting from the MPDU that has been previously peeked by calling PeekN...
Ptr< const Packet > GetPayload(std::size_t i) const
Get the payload of the i-th MPDU.
Time GetFailedAddBaTimeout(void) const
Get the timeout for failed BA agreement.
Ptr< MacRxMiddle > m_rxMiddle
the MAC RX Middle on this station
Ptr< MpduAggregator > m_mpduAggregator
A-MPDU aggregator.
Ptr< MacTxMiddle > m_txMiddle
the MAC TX Middle on this station
void ResetCw(void)
Update the value of the CW variable to take into account a transmission success or a transmission abo...
virtual bool StartFrameExchange(Ptr< QosTxop > edca, Time availableTime, bool initialFrame)
Start a frame exchange (including protection frames and acknowledgment frames as needed) that fits wi...
a unique identifier for an interface.
void DequeuePsdu(Ptr< const WifiPsdu > psdu)
Dequeue the MPDUs of the given PSDU from the queue in which they are stored.
HtFrameExchangeManager handles the frame exchange sequences for HT stations.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
void CtsTimeout(Ptr< WifiMacQueueItem > rts, const WifiTxVector &txVector) override
Called when the CTS timeout expires.
uint8_t GetTid(void) const
Return the Traffic ID (TID).
static TypeId GetTypeId(void)
Get the type ID.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
void AddBaResponseTimeout(Mac48Address recipient, uint8_t tid)
Callback when ADDBA response is not received after timeout.
bool GetBaAgreementEstablished(Mac48Address originator, uint8_t tid) const
Return true if a Block Ack agreement has been established with the given originator for the given TID...
Introspection did not find any typical Config paths.
WifiMacHeader::QosAckPolicy GetAckPolicyForTid(uint8_t tid) const
Get the QoS Ack Policy of the QoS Data frames included in the PSDU that have the given TID...
void AddHeader(const Header &header)
Add header to this packet.
bool IsAggregate(void) const
Return true if the PSDU is an S-MPDU or A-MPDU.
Time GetTxopLimit(void) const
Return the TXOP limit.
virtual void RetransmitMpduAfterMissedCts(Ptr< WifiMacQueueItem > mpdu) const
Retransmit an MPDU that was not sent because a CTS was not received.