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"
33 #undef NS_LOG_APPEND_CONTEXT
34 #define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] "
45 static TypeId tid =
TypeId (
"ns3::HtFrameExchangeManager")
47 .AddConstructor<HtFrameExchangeManager> ()
48 .SetGroupName (
"Wifi")
100 return m_mac->GetQosTxop (tid)->GetBaManager ();
109 if (!
m_mac->GetWifiRemoteStationManager ()->GetHtSupported (recipient))
113 else if (qosTxop->
GetBaManager ()->ExistsAgreement (recipient, tid)
120 uint32_t packets = qosTxop->
GetWifiMacQueue ()->GetNPacketsByTidAndAddress (tid, recipient);
123 ||
m_mac->GetWifiRemoteStationManager ()->GetVhtSupported ());
132 uint16_t
timeout,
bool immediateBAck)
179 uint16_t sequence =
m_txMiddle->GetNextSequenceNumberFor (&mpdu->GetHeader ());
180 mpdu->GetHeader ().SetSequenceNumber (sequence);
183 txParams.
m_txVector =
m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (mpdu->GetHeader ());
188 auto queue =
m_mac->GetQosTxop (tid)->GetWifiMacQueue ();
189 if (!queue->PushFront (mpdu))
191 NS_LOG_DEBUG (
"Queue is full, replace the oldest frame with the ADDBA Request frame");
192 queue->Replace (queue->Peek (), mpdu);
244 m_mac->GetQosTxop (reqHdr->
GetTid ())->PushFront (packet, hdr);
287 m_mac->GetQosTxop (tid)->GetWifiMacQueue ()->PushFront (Create<WifiMacQueueItem> (packet, hdr));
292 uint16_t startingSeq)
295 uint8_t tid = respHdr->
GetTid ();
300 m_mac->GetWifiRemoteStationManager ()->GetHtSupported ()
301 &&
m_mac->GetWifiRemoteStationManager ()->GetHtSupported (originator));
317 this, originator, tid,
false);
328 auto agreementIt =
m_agreements.find ({originator, tid});
332 agreementIt->second.Flush ();
377 && !
m_mac->GetWifiRemoteStationManager ()->NeedFragmentation (peekedItem))
379 return SendDataFrame (peekedItem, availableTime, initialFrame);
400 NS_LOG_DEBUG (
"Block Ack Manager returned no frame to send");
404 NS_ASSERT (peekedItem->GetHeader ().IsBlockAckReq ());
411 txParams.
m_txVector =
m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peekedItem->GetHeader ());
429 if (availableTime !=
Time::Min () && !initialFrame
432 NS_LOG_DEBUG (
"Not enough time to send the BAR frame returned by the Block Ack Manager");
444 Time availableTime,
bool initialFrame)
446 NS_ASSERT (peekedItem != 0 && peekedItem->GetHeader ().IsQosData ()
447 && !peekedItem->GetHeader ().GetAddr1 ().IsBroadcast ()
448 && !peekedItem->IsFragment ());
449 NS_LOG_FUNCTION (
this << *peekedItem << availableTime << initialFrame);
453 txParams.
m_txVector =
m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peekedItem->GetHeader ());
463 std::vector<Ptr<WifiMacQueueItem>> mpduList =
m_mpduAggregator->GetNextAmpdu (mpdu, txParams,
467 if (mpduList.size () > 1)
527 return Create<WifiPsdu> (mpdu,
false);
535 if (mpdu->GetHeader ().IsQosData ())
537 uint8_t tid = mpdu->GetHeader ().GetQosTid ();
546 else if (mpdu->GetHeader ().IsAction ())
575 mpdu->GetHeader ().GetAddr1 (), addBa.
GetTid ());
593 NS_LOG_DEBUG (
"Schedule a transmission from Block Ack Manager in a SIFS");
610 if (mpdu->GetHeader ().IsQosData ())
612 GetBaManager (mpdu->GetHeader ().GetQosTid ())->NotifyDiscardedMpdu (mpdu);
614 else if (mpdu->GetHeader ().IsAction ())
617 mpdu->GetPacket ()->PeekHeader (actionHdr);
620 uint8_t tid =
GetTid (mpdu->GetPacket (), mpdu->GetHeader ());
621 if (
GetBaManager (tid)->ExistsAgreementInState (mpdu->GetHeader ().GetAddr1 (), tid,
625 GetBaManager (tid)->NotifyAgreementNoReply (mpdu->GetHeader ().GetAddr1 (), tid);
628 mpdu->GetHeader ().GetAddr1 (), tid);
640 if (mpdu->GetHeader ().IsQosData ())
642 uint8_t tid = mpdu->GetHeader ().GetQosTid ();
673 uint16_t currentNextSeq =
m_txMiddle->PeekNextSequenceNumberFor (&hdr);
716 #ifdef NS3_BUILD_PROFILE_DEBUG
723 NS_ASSERT (mpdu->GetHeader ().IsCtl () || mpdu->IsQueued ());
789 NS_ASSERT_MSG (tids.size () <= 1,
"Multi-TID A-MPDUs are not supported");
821 NS_ABORT_MSG_IF (tids.size () > 1,
"Acknowledgment method incompatible with a Multi-TID A-MPDU");
822 uint8_t tid = *tids.begin ();
831 NS_ABORT_MSG (
"Unable to handle the selected acknowledgment method ("
858 std::array<std::optional<uint8_t>, 8> queueSizeForTid;
869 if (
m_mac->GetTypeOfStation () ==
STA
873 if (!queueSizeForTid[tid].has_value ())
906 NS_LOG_DEBUG (
"Transmitting a PSDU: " << *psdu <<
" TXVECTOR: " << txVector);
920 Time ppduDurationLimit)
const
928 if (txParams.
GetSize (receiver) > 0)
935 if (mpdu->GetHeader ().IsQosData ())
937 tid = mpdu->GetHeader ().GetQosTid ();
945 NS_ABORT_MSG (
"Cannot aggregate a non-QoS data frame to an A-MPDU that does"
946 " not contain any QoS data frame");
966 uint32_t maxAmpduSize =
m_mpduAggregator->GetMaxAmpduSize (receiver, tid, modulation);
968 if (maxAmpduSize == 0)
974 if (ampduSize > maxAmpduSize)
976 NS_LOG_DEBUG (
"the frame does not meet the constraint on max A-MPDU size ("
977 << maxAmpduSize <<
")");
985 Time availableTime)
const
987 NS_ASSERT (msdu != 0 && msdu->GetHeader ().IsQosData ());
994 std::unique_ptr<WifiProtection> protection;
996 bool protectionSwapped =
false;
1002 protectionTime = protection->protectionTime;
1006 protectionSwapped =
true;
1014 std::unique_ptr<WifiAcknowledgment> acknowledgment;
1015 acknowledgment =
GetAckManager ()->TryAggregateMsdu (msdu, txParams);
1016 bool acknowledgmentSwapped =
false;
1022 acknowledgmentTime = acknowledgment->acknowledgmentTime;
1026 acknowledgmentSwapped =
true;
1033 ppduDurationLimit = availableTime - protectionTime - acknowledgmentTime;
1040 if (protectionSwapped)
1044 if (acknowledgmentSwapped)
1061 Time ppduDurationLimit)
const
1063 NS_ASSERT (msdu != 0 && msdu->GetHeader ().IsQosData ());
1067 Mac48Address receiver = msdu->GetHeader ().GetAddr1 ();
1068 uint8_t tid = msdu->GetHeader ().GetQosTid ();
1072 uint16_t maxAmsduSize =
m_msduAggregator->GetMaxAmsduSize (receiver, tid, modulation);
1074 if (maxAmsduSize == 0)
1080 if (ret.first > maxAmsduSize)
1082 NS_LOG_DEBUG (
"No other MSDU can be aggregated: maximum A-MSDU size ("
1083 << maxAmsduSize <<
") reached ");
1108 m_mac->GetWifiRemoteStationManager ()->ReportDataFailed (*psdu->
begin ());
1147 m_mac->GetWifiRemoteStationManager ()->ReportAmpduTxStatus (recipient, 0, psdu->
GetNMpdus (),
1149 std::set<uint8_t> tids = psdu->
GetTids ();
1150 NS_ABORT_MSG_IF (tids.size () > 1,
"Multi-TID A-MPDUs not handled here");
1152 tid = *tids.begin ();
1160 if (
GetBaManager (tid)->NeedBarRetransmission (tid, recipient))
1162 NS_LOG_DEBUG (
"Missed Block Ack, transmit a BlockAckReq");
1177 NS_LOG_DEBUG (
"Missed Block Ack, do not transmit a BlockAckReq");
1180 m_mac->GetWifiRemoteStationManager ()->ReportFinalDataFailed (*psdu->
begin ());
1181 if (
GetBaManager (tid)->ExistsAgreementInState (recipient, tid,
1194 if (!
m_mac->GetWifiRemoteStationManager ()->NeedRetransmission (*psdu->
begin ()))
1196 NS_LOG_DEBUG (
"Missed Block Ack, do not retransmit the data frames");
1197 m_mac->GetWifiRemoteStationManager ()->ReportFinalDataFailed (*psdu->
begin ());
1207 NS_LOG_DEBUG (
"Missed Block Ack, retransmit data frames");
1208 GetBaManager (tid)->NotifyMissedBlockAck (recipient, tid);
1269 return it->second.GetBlockAckType ();
1277 NS_ASSERT (mpdu->GetHeader ().GetAddr1 ().IsGroup ()
1278 || mpdu->GetHeader ().GetAddr1 () ==
m_self);
1280 double rxSnr = rxSignalInfo.
snr;
1295 mpdu->GetPacket ()->PeekPacketTag (tag);
1296 m_mac->GetWifiRemoteStationManager ()->ReportRxOk (sender, rxSignalInfo, txVector);
1312 mpdu->GetPacket ()->PeekPacketTag (tag);
1316 mpdu->GetPacket ()->PeekHeader (blockAck);
1318 std::pair<uint16_t,uint16_t> ret =
GetBaManager (tid)->NotifyGotBlockAck (blockAck, hdr.
GetAddr2 (), {tid});
1319 m_mac->GetWifiRemoteStationManager ()->ReportAmpduTxStatus (hdr.
GetAddr2 (), ret.first, ret.second,
1341 mpdu->GetPacket ()->PeekHeader (blockAckReq);
1349 NS_LOG_DEBUG (
"There's not a valid agreement for this BlockAckReq");
1358 m_mac->GetWifiRemoteStationManager ()->GetBlockAckTxVector (sender, txVector),
1378 <<
" (" << *mpdu <<
")");
1380 agreementIt->second.NotifyReceivedMpdu (mpdu);
1386 this, hdr, txVector, rxSnr);
1399 const WifiTxVector& txVector,
const std::vector<bool>& perMpduStatus)
1401 std::set<uint8_t> tids = psdu->
GetTids ();
1404 if (tids.size () == 1)
1406 uint8_t tid = *tids.begin ();
1419 m_mac->GetWifiRemoteStationManager ()->GetBlockAckTxVector (psdu->
GetAddr2 (), txVector),
void SetImmediateBlockAck(void)
Set block ack policy to immediate Ack.
Mac48Address GetPeer(void) const
Return the peer address.
void SetDelayedBlockAck(void)
Set block ack policy to delayed Ack.
uint16_t GetTimeout(void) const
Return the timeout.
EventId m_inactivityEvent
inactivity event
uint8_t GetTid(void) const
Return the Traffic ID (TID).
BlockAckType GetBlockAckType(void) const
Get the type of the Block Acks sent by the recipient of this agreement.
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.
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 CtsTimeout(Ptr< WifiMacQueueItem > rts, const WifiTxVector &txVector)
Called when the CTS timeout expires.
Ptr< WifiMac > m_mac
the MAC layer on this station
virtual void SetWifiMac(const Ptr< WifiMac > mac)
Set the MAC layer to use.
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.
Mac48Address m_self
the MAC address of this device
WifiTxTimer m_txTimer
the timer set upon frame transmission
virtual void NotifyReceivedNormalAck(Ptr< WifiMacQueueItem > mpdu)
Notify other components that an MPDU was acknowledged.
void SendRts(const WifiTxParameters &txParams)
Send RTS to begin RTS-CTS-Data-Ack transaction.
Ptr< WifiProtectionManager > GetProtectionManager(void) const
Get the Protection Manager used by this node.
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.
void SendMpduWithProtection(Ptr< WifiMacQueueItem > mpdu, WifiTxParameters &txParams)
Send an MPDU with the given TX parameters (with the specified protection).
Ptr< MacRxMiddle > m_rxMiddle
the MAC RX Middle on this station
Ptr< WifiPhy > m_phy
the PHY layer on this station
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.
Mac48Address m_bssid
BSSID address (Mac48Address)
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
HtFrameExchangeManager handles the frame exchange sequences for HT stations.
Ptr< MpduAggregator > m_mpduAggregator
A-MPDU aggregator.
virtual uint16_t GetSupportedBaBufferSize(void) const
Get the maximum supported buffer size for a Block Ack agreement.
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...
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.
Ptr< MpduAggregator > GetMpduAggregator(void) const
Returns the aggregator used to construct A-MPDU subframes.
void SendAddBaResponse(const MgtAddBaRequestHeader *reqHdr, Mac48Address originator)
This method can be called to accept a received ADDBA Request.
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 SendPsdu(void)
Send the current PSDU, which can be acknowledged by a BlockAck frame or followed by a BlockAckReq fra...
virtual Ptr< WifiPsdu > GetWifiPsdu(Ptr< WifiMacQueueItem > mpdu, const WifiTxVector &txVector) const
Get a PSDU containing the given MPDU.
void DestroyBlockAckAgreement(Mac48Address originator, uint8_t tid)
Destroy a Block Ack agreement.
static TypeId GetTypeId(void)
Get the type ID.
void ForwardMpduDown(Ptr< WifiMacQueueItem > mpdu, WifiTxVector &txVector) override
Forward an MPDU down to the PHY layer.
Ptr< WifiPsdu > m_psdu
the A-MPDU being transmitted
Ptr< BlockAckManager > GetBaManager(uint8_t tid) const
Get the Block Ack Manager handling the given TID.
void RetransmitMpduAfterMissedAck(Ptr< WifiMacQueueItem > mpdu) const override
Retransmit an MPDU that was not acknowledged.
virtual void BlockAckTimeout(Ptr< WifiPsdu > psdu, const WifiTxVector &txVector)
Called when the BlockAck timeout expires.
virtual Time GetPsduDurationId(Time txDuration, const WifiTxParameters &txParams) const
Compute how to set the Duration/ID field of PSDUs that do not include fragments.
void CreateBlockAckAgreement(const MgtAddBaResponseHeader *respHdr, Mac48Address originator, uint16_t startingSeq)
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...
Ptr< MsduAggregator > GetMsduAggregator(void) const
Returns the aggregator used to construct A-MSDU subframes.
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...
void SetWifiMac(const Ptr< WifiMac > mac) override
Set the MAC layer to use.
void NotifyReceivedNormalAck(Ptr< WifiMacQueueItem > mpdu) override
Notify other components that an MPDU was acknowledged.
void SendPsduWithProtection(Ptr< WifiPsdu > psdu, WifiTxParameters &txParams)
Send a PSDU (A-MPDU or BlockAckReq frame) requesting a BlockAck frame or a BlockAckReq frame followed...
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...
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.
void DoDispose() override
Destructor implementation.
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...
WifiTxParameters m_txParams
the TX parameters for the current frame
void ReleaseSequenceNumber(Ptr< WifiMacQueueItem > mpdu) const override
Make the sequence number of the given MPDU available again if the MPDU has never been transmitted.
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...
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 NotifyTxToEdca(Ptr< const WifiPsdu > psdu) const
Notify the transmission of the given PSDU to the EDCAF associated with the AC the PSDU belongs to.
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...
virtual ~HtFrameExchangeManager()
std::map< AgreementKey, RecipientBlockAckAgreement > m_agreements
agreements
virtual void ForwardPsduDown(Ptr< const WifiPsdu > psdu, WifiTxVector &txVector)
Forward a PSDU down to the PHY layer.
void TransmissionSucceeded(void) override
Take necessary actions upon a transmission success.
void CalculateAcknowledgmentTime(WifiAcknowledgment *acknowledgment) const override
Calculate the time required to acknowledge a frame according to the given acknowledgment method.
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...
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...
BlockAckType GetBlockAckType(Mac48Address originator, uint8_t tid) const
Get the type of BlockAck frames sent to the given originator.
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...
void DequeuePsdu(Ptr< const WifiPsdu > psdu)
Dequeue the MPDUs of the given PSDU from the queue in which they are stored.
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...
Ptr< MsduAggregator > m_msduAggregator
A-MSDU aggregator.
void CtsTimeout(Ptr< WifiMacQueueItem > rts, const WifiTxVector &txVector) override
Called when the CTS timeout expires.
void SendBlockAck(const RecipientBlockAckAgreement &agreement, Time durationId, WifiTxVector &blockAckTxVector, double rxSnr)
Create a BlockAck frame with header equal to blockAck and start its transmission.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
void AddHeader(const Header &header)
Add header to this packet.
void AddPacketTag(const Tag &tag) const
Add a packet tag.
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Smart pointer class similar to boost::intrusive_ptr.
QosFrameExchangeManager handles the frame exchange sequences for QoS stations.
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...
Ptr< QosTxop > m_edca
the EDCAF that gained channel access
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 TransmissionSucceeded(void) override
Take necessary actions upon a transmission success.
void TransmissionFailed(void) override
Take necessary actions upon a transmission failure.
bool m_setQosQueueSize
whether to set the Queue Size subfield of the QoS Control field of QoS data frames
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...
bool StartTransmission(Ptr< Txop > edca) override
Request the FrameExchangeManager to start a frame exchange sequence.
void DoDispose() override
Destructor implementation.
void AddBaResponseTimeout(Mac48Address recipient, uint8_t tid)
Callback when ADDBA response is not received after timeout.
virtual Time GetRemainingTxop(void) const
Return the remaining duration in the current TXOP.
uint8_t GetBlockAckThreshold(void) const
Return the current threshold for block ack mechanism.
Time GetFailedAddBaTimeout(void) const
Get the timeout for failed BA agreement.
void CompleteMpduTx(Ptr< WifiMacQueueItem > mpdu)
Stores an MPDU (part of an A-MPDU) in block ack agreement (i.e.
Ptr< const WifiMacQueueItem > PrepareBlockAckRequest(Mac48Address recipient, uint8_t tid) const
uint8_t GetQosQueueSize(uint8_t tid, Mac48Address receiver) const
Get the value for the Queue Size subfield of the QoS Control field of a QoS data frame of the given T...
bool GetBaAgreementEstablished(Mac48Address address, uint8_t tid) const
void ResetBa(Mac48Address recipient, uint8_t tid)
Reset BA agreement after BA negotiation failed.
Time GetAddBaResponseTimeout(void) const
Get the timeout for ADDBA response.
Ptr< WifiMacQueueItem > GetNextMpdu(Ptr< const WifiMacQueueItem > peekedItem, WifiTxParameters &txParams, Time availableTime, bool initialFrame)
Prepare the frame to transmit starting from the MPDU that has been previously peeked by calling PeekN...
uint16_t GetBlockAckInactivityTimeout(void) const
Get the BlockAck inactivity timeout.
Ptr< BlockAckManager > GetBaManager(void)
Get the Block Ack Manager associated with this QosTxop.
bool UseExplicitBarAfterMissedBlockAck(void) const
Return true if an explicit BlockAckRequest is sent after a missed BlockAck.
uint16_t GetBaStartingSequence(Mac48Address address, uint8_t tid) const
Ptr< const WifiMacQueueItem > PeekNextMpdu(uint8_t tid=8, Mac48Address recipient=Mac48Address::GetBroadcast(), Ptr< const WifiMacQueueItem > item=nullptr)
Peek the next frame to transmit to the given receiver and of the given TID from the EDCA queue.
void ScheduleBar(Ptr< const WifiMacQueueItem > bar, bool skipIfNoDataQueued=false)
Maintains the scoreboard and the receive reordering buffer used by a recipient of a Block Ack agreeme...
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 ...
void SetMacRxMiddle(const Ptr< MacRxMiddle > rxMiddle)
Set the MAC RX Middle to use.
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Introspection did not find any typical Config paths.
void Set(double snr)
Set the SNR to the given value.
double Get(void) const
Return the SNR value.
Status code for association response.
void SetSuccess(void)
Set success bit to 0 (success).
Simulation virtual time values and global simulation resolution.
static Time Min()
Minimum representable Time Not to be confused with Min(Time,Time).
bool IsStrictlyNegative(void) const
Exactly equivalent to t < 0.
bool IsZero(void) const
Exactly equivalent to t == 0.
void UpdateFailedCw(void)
Update the value of the CW variable to take into account a transmission failure.
Ptr< WifiMacQueue > GetWifiMacQueue() const
Return the packet queue associated with this Txop.
Time GetTxopLimit(void) const
Return the TXOP limit.
void ResetCw(void)
Update the value of the CW variable to take into account a transmission success or a transmission abo...
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
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 Send(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector)
This function is a wrapper for the Send variant that accepts a WifiConstPsduMap as first argument.
WifiPhyBand GetPhyBand(void) const
Get the configured Wi-Fi band.
Time GetSlot(void) const
Return the slot duration for this PHY.
static Time CalculateTxDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, uint16_t staId=SU_STA_ID)
Time GetSifs(void) const
Return the Short Interframe Space (SIFS) for this PHY.
static Time CalculatePhyPreambleAndHeaderDuration(const WifiTxVector &txVector)
Time GetDuration(void) const
Get the duration from the Duration/ID field, which is common to all the MPDUs.
uint32_t GetSize(void) const
Return the size of the PSDU in bytes.
std::vector< Ptr< WifiMacQueueItem > >::const_iterator begin(void) const
Return a const iterator to the first MPDU.
const WifiMacHeader & GetHeader(std::size_t i) const
Get the header of the i-th MPDU.
std::size_t GetNMpdus(void) const
Return the number of MPDUs constituting the PSDU.
Ptr< const Packet > GetPayload(std::size_t i) const
Get the payload of the i-th MPDU.
bool IsAggregate(void) const
Return true if the PSDU is an S-MPDU or A-MPDU.
Mac48Address GetAddr2(void) const
Get the Transmitter Address (TA), which is common to all the MPDUs.
void SetDuration(Time duration)
Set the Duration/ID field on all the MPDUs.
Mac48Address GetAddr1(void) const
Get the Receiver Address (RA), which is common to all the MPDUs.
std::set< uint8_t > GetTids(void) const
Get the set of TIDs of the QoS Data frames included in the PSDU.
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.
This class stores the TX parameters (TX vector, protection mechanism, acknowledgment mechanism,...
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.
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.
std::unique_ptr< WifiProtection > m_protection
protection method
uint32_t GetSize(Mac48Address receiver) const
Get the size in bytes of the (A-)MPDU addressed to the given receiver.
uint32_t GetSizeIfAddMpdu(Ptr< const WifiMacQueueItem > mpdu) const
Get the size in bytes of the frame in case the given MPDU is added.
std::unique_ptr< WifiAcknowledgment > m_acknowledgment
acknowledgment method
const PsduInfo * GetPsduInfo(Mac48Address receiver) const
Get a pointer to the information about the PSDU addressed to the given receiver, if present,...
WifiTxVector m_txVector
TXVECTOR of the frame being prepared.
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.
bool IsRunning(void) const
Return true if the timer is running.
void Cancel(void)
Cancel the timer.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
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 SetAggregation(bool aggregation)
Sets if PSDU contains A-MPDU.
WifiModulationClass GetModulationClass(void) const
Get the modulation class specified by this TXVECTOR.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
#define NS_ABORT_IF(cond)
Abnormal program termination if a condition is true.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time Seconds(double value)
Construct a Time in the indicated unit.
uint8_t GetTid(Ptr< const Packet > packet, const WifiMacHeader hdr)
This function is useful to get traffic id of different packet types.
WifiModulationClass
This enumeration defines the modulation classes per (Table 10-6 "Modulation classes"; IEEE 802....
@ WIFI_MOD_CLASS_HT
HT (Clause 19)
void(* Time)(Time oldValue, Time newValue)
TracedValue callback signature for Time.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
uint32_t GetBlockAckRequestSize(BlockAckReqType type)
Return the total BlockAckRequest size (including FCS trailer).
uint32_t GetBlockAckSize(BlockAckType type)
Return the total BlockAck size (including FCS trailer).
U * PeekPointer(const Ptr< U > &p)
Ptr< T > Copy(Ptr< T > object)
Return a deep copy of a Ptr.
The different BlockAck variants.
RxSignalInfo structure containing info on the received signal.
double snr
SNR in linear scale.
WifiAcknowledgment is an abstract base struct.
Time acknowledgmentTime
time required by the acknowledgment method
const Method method
acknowledgment method
WifiBarBlockAck specifies that a BlockAckReq is sent to solicit a Block Ack response.
BlockAckType baType
BlockAck type.
WifiTxVector blockAckTxVector
BlockAck TXVECTOR.
WifiTxVector blockAckReqTxVector
BlockAckReq TXVECTOR.
BlockAckReqType barType
BlockAckReq type.
WifiBlockAck specifies that acknowledgment via Block Ack is required.
WifiTxVector blockAckTxVector
BlockAck TXVECTOR.
BlockAckType baType
BlockAck type.
WifiNoProtection specifies that no protection method is used.
information about the frame being prepared for a specific receiver
std::map< uint8_t, std::set< uint16_t > > seqNumbers
set of the sequence numbers of the MPDUs added for each TID
uint32_t ampduSize
the size in bytes of the A-MPDU if multiple MPDUs have been added, and zero otherwise