22 #include "ns3/simulator.h"
43 skipIfNoDataQueued (skipIfNoDataQueued)
55 .SetGroupName (
"Wifi")
57 .AddTraceSource (
"AgreementState",
58 "The state of the ADDBA handshake",
60 "ns3::BlockAckManager::AgreementStateTracedCallback")
96 it =
m_agreements.find (std::make_pair (recipient, tid));
102 return it->second.first.IsEstablished ();
104 return it->second.first.IsPending ();
106 return it->second.first.IsRejected ();
108 return it->second.first.IsNoReply ();
110 return it->second.first.IsReset ();
122 std::pair<Mac48Address, uint8_t> key (recipient, reqHdr->
GetTid ());
139 uint8_t tid = reqHdr->
GetTid ();
143 std::pair<OriginatorBlockAckAgreement, PacketQueue> value (agreement, queue);
163 for (std::list<Bar>::const_iterator i =
m_bars.begin (); i !=
m_bars.end (); )
165 if (i->bar->GetHeader ().GetAddr1 () == recipient && i->tid == tid)
179 uint16_t startingSeq)
182 uint8_t tid = respHdr->
GetTid ();
200 if (!it->second.first.IsEstablished ())
240 while (it != agreementIt->second.second.end ())
244 NS_LOG_DEBUG (
"Packet already in the queue of the BA agreement");
248 uint16_t dist = agreementIt->second.first.GetDistance ((*it)->GetHeader ().GetSequenceNumber ());
250 if (mpduDist < dist ||
258 agreementIt->second.second.insert (it, mpdu);
259 agreementIt->second.first.NotifyTransmittedMpdu (mpdu);
272 auto nextBar =
m_bars.begin ();
274 while (nextBar !=
m_bars.end ())
276 Mac48Address recipient = nextBar->bar->GetHeader ().GetAddr1 ();
279 && (!nextBar->bar->GetHeader ().IsBlockAckReq ()
280 ||
address != recipient || tid != nextBar->tid))
286 if (nextBar->bar->GetHeader ().IsBlockAckReq ())
292 nextBar =
m_bars.erase (nextBar);
295 if (nextBar->skipIfNoDataQueued
296 &&
m_queue->PeekByTidAndAddress (nextBar->tid, recipient) ==
m_queue->end ())
303 for (
auto mpduIt = it->second.second.begin (); mpduIt != it->second.second.end (); )
305 if (!(*mpduIt)->IsQueued ())
308 mpduIt = it->second.second.erase (mpduIt);
312 WifiMacQueue::ConstIterator queueIt = (*mpduIt)->GetQueueIterator ();
314 if ((*mpduIt)->GetTimeStamp () +
m_queue->GetMaxDelay () <= now)
317 it->second.first.NotifyDiscardedMpdu (*mpduIt);
322 m_queue->TtlExceeded (queueIt, now);
323 mpduIt = it->second.second.erase (mpduIt);
333 nextBar->bar->GetPacket ()->PeekHeader (reqHdr);
339 nextBar->bar = Create<const WifiMacQueueItem> (packet, nextBar->bar->GetHeader ());
362 return it->second.second.size ();
378 if (!(*mpduIt)->IsQueued ())
382 NS_LOG_DEBUG (
"MPDU is not stored in the EDCA queue, drop MPDU");
383 return it->second.second.erase (mpduIt);
389 m_queue->DequeueIfQueued (*mpduIt);
390 return it->second.second.erase (mpduIt);
394 WifiMacQueue::ConstIterator queueIt = (*mpduIt)->GetQueueIterator ();
401 NS_LOG_DEBUG (
"Old packet. Remove from the EDCA queue, too");
407 return it->second.second.erase (mpduIt);
410 auto nextIt = std::next (mpduIt);
412 if (
m_queue->TtlExceeded (queueIt, now))
428 (*mpduIt)->GetHeader ().SetRetry ();
429 (*mpduIt)->ResetInFlight ();
431 return it->second.second.erase (mpduIt);
438 NS_ASSERT (mpdu->GetHeader ().IsQosData ());
440 Mac48Address recipient = mpdu->GetHeader ().GetAddr1 ();
441 uint8_t tid = mpdu->GetHeader ().GetQosTid ();
448 for (
auto queueIt = it->second.second.begin (); queueIt != it->second.second.end (); ++queueIt)
450 if ((*queueIt)->GetHeader ().GetSequenceNumber () == mpdu->GetHeader ().GetSequenceNumber ())
457 it->second.first.NotifyAckedMpdu (mpdu);
475 for (
auto queueIt = it->second.second.begin (); queueIt != it->second.second.end (); ++queueIt)
485 std::pair<uint16_t,uint16_t>
487 const std::set<uint8_t>& tids,
size_t index)
490 uint16_t nSuccessfulMpdus = 0;
491 uint16_t nFailedMpdus = 0;
502 tid = *tids.begin ();
508 if (it->second.first.m_inactivityEvent.IsRunning ())
513 it->second.first.m_inactivityEvent.Cancel ();
524 for (
auto queueIt = it->second.second.begin (); queueIt != it->second.second.end (); )
526 uint16_t currentSeq = (*queueIt)->GetHeader ().GetSequenceNumber ();
529 it->second.first.NotifyAckedMpdu (*queueIt);
548 return {nSuccessfulMpdus, nFailedMpdus};
562 for (
auto mpduIt = it->second.second.begin (); mpduIt != it->second.second.end (); )
574 if (!mpdu->GetHeader ().IsQosData ())
580 if (!mpdu->GetHeader ().IsRetry () && !mpdu->IsInFlight ())
586 Mac48Address recipient = mpdu->GetHeader ().GetAddr1 ();
587 uint8_t tid = mpdu->GetHeader ().GetQosTid ();
595 uint16_t currStartingSeq = it->second.first.GetStartingSequence ();
603 it->second.first.NotifyDiscardedMpdu (mpdu);
607 for (
auto mpduIt = it->second.second.begin (); mpduIt != it->second.second.end (); )
609 if (it->second.first.GetDistance ((*mpduIt)->GetHeader ().GetSequenceNumber ()) >=
SEQNO_SPACE_HALF_SIZE)
611 m_queue->DequeueIfQueued (*mpduIt);
616 mpduIt = it->second.second.erase (mpduIt);
625 NS_LOG_DEBUG (
"Schedule a Block Ack Request for agreement (" << recipient <<
", " << +tid <<
")");
632 hdr.
SetAddr2 (mpdu->GetHeader ().GetAddr2 ());
633 hdr.
SetAddr3 (mpdu->GetHeader ().GetAddr3 ());
639 ScheduleBar (Create<const WifiMacQueueItem> (bar, hdr));
650 reqHdr.
SetType ((*it).second.first.GetBlockAckReqType ());
660 NS_ASSERT (bar->GetHeader ().IsBlockAckReq () || bar->GetHeader ().IsTrigger ());
663 if (bar->GetHeader ().IsBlockAckReq ())
666 bar->GetPacket ()->PeekHeader (reqHdr);
669 #ifdef NS3_BUILD_PROFILE_DEBUG
673 bar->GetPacket ()->PeekHeader (triggerHdr);
677 Bar request (bar, tid, skipIfNoDataQueued);
680 std::list<Bar>::const_iterator i =
m_bars.end ();
682 if (bar->GetHeader ().IsBlockAckReq ())
686 if (i->bar->GetHeader ().IsBlockAckReq ()
687 && i->bar->GetHeader ().GetAddr1 () == bar->GetHeader ().GetAddr1 () && i->tid == tid)
695 if (bar->GetHeader ().IsRetry ())
697 m_bars.push_front (request);
701 m_bars.insert (i, request);
718 if (!it->second.first.IsEstablished ())
723 it->second.first.SetStartingSequence (startingSeq);
732 if (!it->second.first.IsRejected ())
745 if (!it->second.first.IsNoReply ())
759 if (!it->second.first.IsReset ())
780 uint32_t packets =
m_queue->GetNPacketsByTidAndAddress (tid, recipient) +
801 for (
auto mpduIt = it->second.second.begin (); mpduIt != it->second.second.end (); )
806 if (mpduIt != it->second.second.begin ())
865 size = it->second.first.GetBufferSize ();
875 return it->second.first.GetBlockAckReqType ();
883 return it->second.first.GetBlockAckType ();
893 seqNum = it->second.first.GetStartingSequence ();