|
|
| 538 |
if (ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED)) |
538 |
if (ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED)) |
| 539 |
{ |
539 |
{ |
| 540 |
bool foundFirstLost = false; |
540 |
bool foundFirstLost = false; |
|
|
541 |
uint32_t nSuccessfulMpdus = 0; |
| 542 |
uint32_t nFailedMpdus = 0; |
| 541 |
AgreementsI it = m_agreements.find (std::make_pair (recipient, tid)); |
543 |
AgreementsI it = m_agreements.find (std::make_pair (recipient, tid)); |
| 542 |
PacketQueueI queueEnd = it->second.second.end (); |
544 |
PacketQueueI queueEnd = it->second.second.end (); |
| 543 |
|
545 |
|
|
|
| 560 |
if (blockAck->IsFragmentReceived ((*queueIt).hdr.GetSequenceNumber (), |
562 |
if (blockAck->IsFragmentReceived ((*queueIt).hdr.GetSequenceNumber (), |
| 561 |
(*queueIt).hdr.GetFragmentNumber ())) |
563 |
(*queueIt).hdr.GetFragmentNumber ())) |
| 562 |
{ |
564 |
{ |
|
|
565 |
nSuccessfulMpdus++; |
| 563 |
queueIt = it->second.second.erase (queueIt); |
566 |
queueIt = it->second.second.erase (queueIt); |
| 564 |
} |
567 |
} |
| 565 |
else |
568 |
else |
|
|
| 570 |
sequenceFirstLost = (*queueIt).hdr.GetSequenceNumber (); |
573 |
sequenceFirstLost = (*queueIt).hdr.GetSequenceNumber (); |
| 571 |
(*it).second.first.SetStartingSequence (sequenceFirstLost); |
574 |
(*it).second.first.SetStartingSequence (sequenceFirstLost); |
| 572 |
} |
575 |
} |
| 573 |
|
576 |
nFailedMpdus++; |
| 574 |
if (!AlreadyExists ((*queueIt).hdr.GetSequenceNumber (), recipient, tid)) |
577 |
if (!AlreadyExists ((*queueIt).hdr.GetSequenceNumber (), recipient, tid)) |
| 575 |
{ |
578 |
{ |
| 576 |
InsertInRetryQueue (queueIt); |
579 |
InsertInRetryQueue (queueIt); |
| 577 |
} |
580 |
} |
| 578 |
|
|
|
| 579 |
queueIt++; |
581 |
queueIt++; |
| 580 |
} |
582 |
} |
| 581 |
} |
583 |
} |
|
|
| 590 |
while (queueIt != queueEnd |
592 |
while (queueIt != queueEnd |
| 591 |
&& (*queueIt).hdr.GetSequenceNumber () == currentSeq) |
593 |
&& (*queueIt).hdr.GetSequenceNumber () == currentSeq) |
| 592 |
{ |
594 |
{ |
| 593 |
//notify remote station of successful transmission |
595 |
nSuccessfulMpdus++; |
| 594 |
m_stationManager->ReportDataOk ((*queueIt).hdr.GetAddr1 (), &(*queueIt).hdr, 0, txMode, 0); |
|
|
| 595 |
if (!m_txOkCallback.IsNull ()) |
596 |
if (!m_txOkCallback.IsNull ()) |
| 596 |
{ |
597 |
{ |
| 597 |
m_txOkCallback ((*queueIt).hdr); |
598 |
m_txOkCallback ((*queueIt).hdr); |
|
|
| 607 |
sequenceFirstLost = (*queueIt).hdr.GetSequenceNumber (); |
608 |
sequenceFirstLost = (*queueIt).hdr.GetSequenceNumber (); |
| 608 |
(*it).second.first.SetStartingSequence (sequenceFirstLost); |
609 |
(*it).second.first.SetStartingSequence (sequenceFirstLost); |
| 609 |
} |
610 |
} |
| 610 |
//notify remote station of unsuccessful transmission |
611 |
nFailedMpdus++; |
| 611 |
m_stationManager->ReportDataFailed ((*queueIt).hdr.GetAddr1 (), &(*queueIt).hdr); |
|
|
| 612 |
if (!m_txFailedCallback.IsNull ()) |
612 |
if (!m_txFailedCallback.IsNull ()) |
| 613 |
{ |
613 |
{ |
| 614 |
m_txFailedCallback ((*queueIt).hdr); |
614 |
m_txFailedCallback ((*queueIt).hdr); |
|
|
| 628 |
} |
628 |
} |
| 629 |
} |
629 |
} |
| 630 |
} |
630 |
} |
|
|
631 |
m_stationManager->ReportAmpduTxStatus ((*queueIt).hdr.GetAddr1 (), &(*queueIt).hdr, nSuccessfulMpdus, nFailedMpdus); |
| 631 |
} |
632 |
} |
| 632 |
} |
633 |
} |
| 633 |
uint16_t newSeq = m_txMiddle->GetNextSeqNumberByTidAndAddress (tid, recipient); |
634 |
uint16_t newSeq = m_txMiddle->GetNextSeqNumberByTidAndAddress (tid, recipient); |