21 #include "ns3/assert.h"
22 #include "ns3/simulator.h"
23 #include "ns3/fatal-error.h"
58 recipient (recipient),
62 NS_LOG_FUNCTION (
this << bar << recipient << static_cast<uint32_t> (tid) << immediate);
89 NS_LOG_FUNCTION (
this << recipient << static_cast<uint32_t> (tid) << state);
91 it =
m_agreements.find (std::make_pair (recipient, tid));
97 return it->second.first.IsInactive ();
99 return it->second.first.IsEstablished ();
101 return it->second.first.IsPending ();
103 return it->second.first.IsUnsuccessful ();
115 std::pair<Mac48Address, uint8_t> key (recipient, reqHdr->
GetTid ());
120 agreement.SetBufferSize (0);
125 agreement.SetImmediateBlockAck ();
129 agreement.SetDelayedBlockAck ();
133 std::pair<OriginatorBlockAckAgreement, PacketQueue> value (agreement, queue);
147 if ((*i)->hdr.GetAddr1 () == recipient && (*i)->hdr.GetQosTid () == tid)
158 for (std::list<Bar>::iterator i =
m_bars.begin (); i !=
m_bars.end ();)
160 if (i->recipient == recipient && i->tid == tid)
176 uint8_t tid = respHdr->
GetTid ();
214 Item item (packet, hdr, tStamp);
217 it->second.second.push_back (item);
230 packet = queueIt->packet;
253 i->second.second.erase (queueIt);
283 uint32_t nPackets = 0;
288 uint16_t currentSeq = 0;
289 while (queueIt != (*it).second.second.end ())
291 currentSeq = (*queueIt).hdr.GetSequenceNumber ();
294 while (queueIt != (*it).second.second.end () && (*queueIt).hdr.GetSequenceNumber () == currentSeq)
308 uint32_t nPackets = 0;
309 uint16_t currentSeq = 0;
312 std::list<PacketQueueI>::const_iterator it =
m_retryPackets.begin ();
315 if ((*it)->hdr.GetAddr1 () == recipient && (*it)->hdr.GetQosTid () == tid)
317 currentSeq = (*it)->hdr.GetSequenceNumber ();
320 while (it !=
m_retryPackets.end () && (*it)->hdr.GetSequenceNumber () == currentSeq)
341 uint16_t sequenceFirstLost = 0;
347 bool foundFirstLost =
false;
351 if (it->second.first.m_inactivityEvent.IsRunning ())
356 it->second.first.m_inactivityEvent.Cancel ();
365 for (
PacketQueueI queueIt = it->second.second.begin (); queueIt != queueEnd;)
368 (*queueIt).hdr.GetFragmentNumber ()))
370 queueIt = it->second.second.erase (queueIt);
376 foundFirstLost =
true;
377 sequenceFirstLost = (*queueIt).hdr.GetSequenceNumber ();
378 (*it).second.first.SetStartingSequence (sequenceFirstLost);
387 for (
PacketQueueI queueIt = it->second.second.begin (); queueIt != queueEnd;)
391 uint16_t currentSeq = (*queueIt).hdr.GetSequenceNumber ();
392 while (queueIt != queueEnd
393 && (*queueIt).hdr.GetSequenceNumber () == currentSeq)
395 queueIt = it->second.second.erase (queueIt);
402 foundFirstLost =
true;
403 sequenceFirstLost = (*queueIt).hdr.GetSequenceNumber ();
404 (*it).second.first.SetStartingSequence (sequenceFirstLost);
445 if ((*it).second.first.IsBlockAckRequestNeeded ()
484 NS_LOG_FUNCTION (
this << recipient << static_cast<uint32_t> (tid) << startingSeq);
489 it->second.first.SetStartingSequence (startingSeq);
507 NS_LOG_FUNCTION (
this << recipient << static_cast<uint32_t> (tid) << nextSeqNumber);
519 nextSeq = nextSeqNumber;
521 it->second.first.NotifyMpduTransmission (nextSeq);
525 Bar request (bar, recipient, tid, it->second.first.IsImmediateBlockAck ());
526 m_bars.push_back (request);
540 NS_LOG_FUNCTION (
this << recipient << static_cast<uint32_t> (tid) << startingSeq);
597 if (j->second.second.empty ())
603 for (
PacketQueueI i = j->second.second.begin (); i != j->second.second.end (); i++)
615 if ((*it)->hdr.GetAddr1 () == j->second.first.GetPeer ()
616 && (*it)->hdr.GetQosTid () == j->second.first.GetTid ()
617 && (*it)->hdr.GetSequenceNumber () == i->hdr.GetSequenceNumber ())
628 j->second.second.erase (j->second.second.begin (), end);
629 j->second.first.SetStartingSequence (end->hdr.GetSequenceNumber ());
672 std::list<PacketQueueI>::const_iterator it =
m_retryPackets.begin ();
675 if ((*it)->hdr.GetAddr1 () == recipient && (*it)->hdr.GetQosTid () == tid)
677 return (*it)->hdr.GetSequenceNumber ();