diff --git a/src/wifi/model/ap-wifi-mac.cc b/src/wifi/model/ap-wifi-mac.cc index 0bff6b39c..a8311df29 100644 --- a/src/wifi/model/ap-wifi-mac.cc +++ b/src/wifi/model/ap-wifi-mac.cc @@ -1539,7 +1539,10 @@ ApWifiMac::Receive(Ptr mpdu, uint8_t linkId) mpdu->GetHeader().GetAddr1() == GetFrameExchangeManager(*apLinkId)->GetAddress()) { Mac48Address to = hdr->GetAddr3(); - if (to == GetAddress()) + // Address3 can be our MLD address (e.g., this is an MPDU containing a single MSDU + // addressed to us) or a BSSID (e.g., this is an MPDU containing an A-MSDU) + if (to == GetAddress() || + (hdr->IsQosData() && hdr->IsQosAmsdu() && to == mpdu->GetHeader().GetAddr1())) { NS_LOG_DEBUG("frame for me from=" << from); if (hdr->IsQosData()) diff --git a/src/wifi/model/block-ack-manager.cc b/src/wifi/model/block-ack-manager.cc index 445508e5d..16539e813 100644 --- a/src/wifi/model/block-ack-manager.cc +++ b/src/wifi/model/block-ack-manager.cc @@ -418,7 +418,7 @@ BlockAckManager::HandleInFlightMpdu(uint8_t linkId, return it->second.second.erase(mpduIt); } - WifiMacHeader& hdr = (*mpduIt)->GetHeader(); + const WifiMacHeader& hdr = (*mpduIt)->GetHeader(); NS_ASSERT(hdr.GetAddr1() == it->first.first); NS_ASSERT(hdr.IsQosData() && hdr.GetQosTid() == it->first.second); @@ -468,7 +468,7 @@ BlockAckManager::NotifyGotAck(uint8_t linkId, Ptr mpdu) NS_LOG_FUNCTION(this << linkId << *mpdu); NS_ASSERT(mpdu->GetHeader().IsQosData()); - Mac48Address recipient = mpdu->GetHeader().GetAddr1(); + Mac48Address recipient = mpdu->GetOriginal()->GetHeader().GetAddr1(); uint8_t tid = mpdu->GetHeader().GetQosTid(); auto it = m_originatorAgreements.find({recipient, tid}); @@ -495,7 +495,7 @@ BlockAckManager::NotifyMissedAck(uint8_t linkId, Ptr mpdu) NS_LOG_FUNCTION(this << linkId << *mpdu); NS_ASSERT(mpdu->GetHeader().IsQosData()); - Mac48Address recipient = mpdu->GetHeader().GetAddr1(); + Mac48Address recipient = mpdu->GetOriginal()->GetHeader().GetAddr1(); uint8_t tid = mpdu->GetHeader().GetQosTid(); auto it = m_originatorAgreements.find({recipient, tid}); @@ -712,7 +712,7 @@ void BlockAckManager::NotifyGotMpdu(Ptr mpdu) { NS_LOG_FUNCTION(this << *mpdu); - auto originator = mpdu->GetHeader().GetAddr2(); + auto originator = mpdu->GetOriginal()->GetHeader().GetAddr2(); NS_ASSERT(mpdu->GetHeader().IsQosData()); auto tid = mpdu->GetHeader().GetQosTid(); diff --git a/src/wifi/model/he/he-frame-exchange-manager.cc b/src/wifi/model/he/he-frame-exchange-manager.cc index 5a6698e13..a8c9bfe37 100644 --- a/src/wifi/model/he/he-frame-exchange-manager.cc +++ b/src/wifi/model/he/he-frame-exchange-manager.cc @@ -1582,9 +1582,10 @@ HeFrameExchangeManager::ReceiveMpdu(Ptr mpdu, mpdu->GetPacket()->PeekHeader(blockAckReq); NS_ABORT_MSG_IF(blockAckReq.IsMultiTid(), "Multi-TID BlockAckReq not supported"); uint8_t tid = blockAckReq.GetTidInfo(); - GetBaManager(tid)->NotifyGotBlockAckRequest(sender, - tid, - blockAckReq.GetStartingSequence()); + GetBaManager(tid)->NotifyGotBlockAckRequest( + m_mac->GetMldAddress(sender).value_or(sender), + tid, + blockAckReq.GetStartingSequence()); // Block Acknowledgment context acknowledgment->stationsReceivingMultiStaBa.emplace(std::make_pair(sender, tid), index); @@ -1758,8 +1759,11 @@ HeFrameExchangeManager::ReceiveMpdu(Ptr mpdu, mpdu->GetPacket()->PeekHeader(blockAck); uint8_t tid = blockAck.GetTidInfo(); std::pair ret = - GetBaManager(tid)->NotifyGotBlockAck(m_linkId, blockAck, hdr.GetAddr2(), {tid}); - GetWifiRemoteStationManager()->ReportAmpduTxStatus(hdr.GetAddr2(), + GetBaManager(tid)->NotifyGotBlockAck(m_linkId, + blockAck, + m_mac->GetMldAddress(sender).value_or(sender), + {tid}); + GetWifiRemoteStationManager()->ReportAmpduTxStatus(sender, ret.first, ret.second, rxSignalInfo.snr, @@ -1838,12 +1842,12 @@ HeFrameExchangeManager::ReceiveMpdu(Ptr mpdu, tid = *tids.begin(); } - std::pair ret = - GetBaManager(tid)->NotifyGotBlockAck(m_linkId, - blockAck, - hdr.GetAddr2(), - {tid}, - index); + std::pair ret = GetBaManager(tid)->NotifyGotBlockAck( + m_linkId, + blockAck, + m_mac->GetMldAddress(hdr.GetAddr2()).value_or(hdr.GetAddr2()), + {tid}, + index); GetWifiRemoteStationManager()->ReportAmpduTxStatus(hdr.GetAddr2(), ret.first, ret.second, @@ -1923,7 +1927,7 @@ HeFrameExchangeManager::ReceiveMpdu(Ptr mpdu, NS_ABORT_MSG_IF(blockAckReq.IsMultiTid(), "Multi-TID BlockAckReq not supported"); uint8_t tid = blockAckReq.GetTidInfo(); - auto agreement = GetBaManager(tid)->GetAgreementAsRecipient(sender, tid); + auto agreement = m_mac->GetBaAgreementEstablishedAsRecipient(sender, tid); if (!agreement) { @@ -1931,9 +1935,10 @@ HeFrameExchangeManager::ReceiveMpdu(Ptr mpdu, return; } - GetBaManager(tid)->NotifyGotBlockAckRequest(sender, - tid, - blockAckReq.GetStartingSequence()); + GetBaManager(tid)->NotifyGotBlockAckRequest( + m_mac->GetMldAddress(sender).value_or(sender), + tid, + blockAckReq.GetStartingSequence()); NS_LOG_DEBUG("Schedule Block Ack in TB PPDU"); Simulator::Schedule(m_phy->GetSifs(), diff --git a/src/wifi/model/ht/ht-frame-exchange-manager.cc b/src/wifi/model/ht/ht-frame-exchange-manager.cc index be5840fae..3fc980772 100644 --- a/src/wifi/model/ht/ht-frame-exchange-manager.cc +++ b/src/wifi/model/ht/ht-frame-exchange-manager.cc @@ -706,7 +706,7 @@ HtFrameExchangeManager::ReleaseSequenceNumber(Ptr mpdu) const NS_LOG_FUNCTION(this << *mpdu); // the MPDU should be still in the queue, unless it expired. - const WifiMacHeader& hdr = mpdu->GetHeader(); + const WifiMacHeader& hdr = mpdu->GetOriginal()->GetHeader(); if (hdr.IsQosData()) { uint8_t tid = hdr.GetQosTid(); @@ -1193,7 +1193,12 @@ HtFrameExchangeManager::MissedBlockAck(Ptr psdu, { NS_LOG_FUNCTION(this << psdu << txVector << resetCw); - Mac48Address recipient = psdu->GetAddr1(); + auto recipient = psdu->GetAddr1(); + auto recipientMld = recipient; + if (auto optAddr = GetWifiRemoteStationManager()->GetMldAddress(recipient)) + { + recipientMld = *optAddr; + } bool isBar; uint8_t tid; @@ -1220,7 +1225,7 @@ HtFrameExchangeManager::MissedBlockAck(Ptr psdu, if (edca->UseExplicitBarAfterMissedBlockAck() || isBar) { // we have to send a BlockAckReq, if needed - if (GetBaManager(tid)->NeedBarRetransmission(tid, recipient)) + if (GetBaManager(tid)->NeedBarRetransmission(tid, recipientMld)) { NS_LOG_DEBUG("Missed Block Ack, transmit a BlockAckReq"); if (isBar) @@ -1267,7 +1272,7 @@ HtFrameExchangeManager::MissedBlockAck(Ptr psdu, else { NS_LOG_DEBUG("Missed Block Ack, retransmit data frames"); - GetBaManager(tid)->NotifyMissedBlockAck(m_linkId, recipient, tid); + GetBaManager(tid)->NotifyMissedBlockAck(m_linkId, recipientMld, tid); resetCw = false; } } @@ -1283,7 +1288,12 @@ HtFrameExchangeManager::SendBlockAck(const RecipientBlockAckAgreement& agreement WifiMacHeader hdr; hdr.SetType(WIFI_MAC_CTL_BACKRESP); - hdr.SetAddr1(agreement.GetPeer()); + auto addr1 = agreement.GetPeer(); + if (auto originator = GetWifiRemoteStationManager()->GetAffiliatedStaAddress(addr1)) + { + addr1 = *originator; + } + hdr.SetAddr1(addr1); hdr.SetAddr2(m_self); hdr.SetDsNotFrom(); hdr.SetDsNotTo(); @@ -1368,8 +1378,11 @@ HtFrameExchangeManager::ReceiveMpdu(Ptr mpdu, mpdu->GetPacket()->PeekHeader(blockAck); uint8_t tid = blockAck.GetTidInfo(); std::pair ret = - GetBaManager(tid)->NotifyGotBlockAck(m_linkId, blockAck, hdr.GetAddr2(), {tid}); - GetWifiRemoteStationManager()->ReportAmpduTxStatus(hdr.GetAddr2(), + GetBaManager(tid)->NotifyGotBlockAck(m_linkId, + blockAck, + m_mac->GetMldAddress(sender).value_or(sender), + {tid}); + GetWifiRemoteStationManager()->ReportAmpduTxStatus(sender, ret.first, ret.second, rxSnr, @@ -1399,7 +1412,7 @@ HtFrameExchangeManager::ReceiveMpdu(Ptr mpdu, NS_ABORT_MSG_IF(blockAckReq.IsMultiTid(), "Multi-TID BlockAckReq not supported"); uint8_t tid = blockAckReq.GetTidInfo(); - auto agreement = GetBaManager(tid)->GetAgreementAsRecipient(sender, tid); + auto agreement = m_mac->GetBaAgreementEstablishedAsRecipient(sender, tid); if (!agreement) { @@ -1407,9 +1420,10 @@ HtFrameExchangeManager::ReceiveMpdu(Ptr mpdu, return; } - GetBaManager(tid)->NotifyGotBlockAckRequest(sender, - tid, - blockAckReq.GetStartingSequence()); + GetBaManager(tid)->NotifyGotBlockAckRequest( + m_mac->GetMldAddress(sender).value_or(sender), + tid, + blockAckReq.GetStartingSequence()); NS_LOG_DEBUG("Schedule Block Ack"); Simulator::Schedule( @@ -1478,7 +1492,7 @@ HtFrameExchangeManager::EndReceiveAmpdu(Ptr psdu, { // Normal Ack or Implicit Block Ack Request NS_LOG_DEBUG("Schedule Block Ack"); - auto agreement = GetBaManager(tid)->GetAgreementAsRecipient(psdu->GetAddr2(), tid); + auto agreement = m_mac->GetBaAgreementEstablishedAsRecipient(psdu->GetAddr2(), tid); NS_ASSERT(agreement); Simulator::Schedule( diff --git a/src/wifi/model/qos-txop.cc b/src/wifi/model/qos-txop.cc index 444923020..e972caeca 100644 --- a/src/wifi/model/qos-txop.cc +++ b/src/wifi/model/qos-txop.cc @@ -281,7 +281,8 @@ QosTxop::PrepareBlockAckRequest(Mac48Address recipient, uint8_t tid) const NS_LOG_FUNCTION(this << recipient << +tid); NS_ASSERT(QosUtilsMapTidToAc(tid) == m_ac); - CtrlBAckRequestHeader reqHdr = m_baManager->GetBlockAckReqHeader(recipient, tid); + CtrlBAckRequestHeader reqHdr = + m_baManager->GetBlockAckReqHeader(m_mac->GetMldAddress(recipient).value_or(recipient), tid); Ptr bar = Create(); bar->AddHeader(reqHdr); @@ -507,9 +508,10 @@ QosTxop::GetNextMpdu(uint8_t linkId, // Note that PeekNextMpdu() temporarily assigns the next available sequence number // to the peeked frame NS_ASSERT(!m_mac->GetBaAgreementEstablishedAsOriginator(recipient, tid) || - IsInWindow(peekedItem->GetHeader().GetSequenceNumber(), - GetBaStartingSequence(recipient, tid), - GetBaBufferSize(recipient, tid))); + IsInWindow( + peekedItem->GetHeader().GetSequenceNumber(), + GetBaStartingSequence(peekedItem->GetOriginal()->GetHeader().GetAddr1(), tid), + GetBaBufferSize(peekedItem->GetOriginal()->GetHeader().GetAddr1(), tid))); // try A-MSDU aggregation if (m_mac->GetHtSupported() && !recipient.IsBroadcast() && @@ -674,7 +676,9 @@ QosTxop::CompleteMpduTx(Ptr mpdu) if (m_mac->GetBaAgreementEstablishedAsOriginator(mpdu->GetHeader().GetAddr1(), mpdu->GetHeader().GetQosTid())) { - m_baManager->StorePacket(mpdu); + NS_ASSERT(mpdu->IsQueued()); + NS_ASSERT(m_queue->GetAc() == mpdu->GetQueueAc()); + m_baManager->StorePacket(m_queue->GetOriginal(mpdu)); } } diff --git a/src/wifi/model/wifi-default-ack-manager.cc b/src/wifi/model/wifi-default-ack-manager.cc index 165672df7..81458cdb8 100644 --- a/src/wifi/model/wifi-default-ack-manager.cc +++ b/src/wifi/model/wifi-default-ack-manager.cc @@ -96,15 +96,15 @@ WifiDefaultAckManager::GetMaxDistFromStartingSeq(Ptr mpdu, { NS_LOG_FUNCTION(this << *mpdu << &txParams); - const WifiMacHeader& hdr = mpdu->GetHeader(); - Mac48Address receiver = hdr.GetAddr1(); + auto receiver = mpdu->GetHeader().GetAddr1(); + auto origReceiver = mpdu->GetOriginal()->GetHeader().GetAddr1(); - uint8_t tid = hdr.GetQosTid(); + uint8_t tid = mpdu->GetHeader().GetQosTid(); Ptr edca = m_mac->GetQosTxop(tid); - NS_ABORT_MSG_IF(!m_mac->GetBaAgreementEstablishedAsOriginator(receiver, tid), + NS_ABORT_MSG_IF(!m_mac->GetBaAgreementEstablishedAsOriginator(origReceiver, tid), "An established Block Ack agreement is required"); - uint16_t startingSeq = edca->GetBaStartingSequence(receiver, tid); + uint16_t startingSeq = edca->GetBaStartingSequence(origReceiver, tid); uint16_t maxDistFromStartingSeq = (mpdu->GetHeader().GetSequenceNumber() - startingSeq + SEQNO_SPACE_SIZE) % SEQNO_SPACE_SIZE; NS_ABORT_MSG_IF(maxDistFromStartingSeq >= SEQNO_SPACE_HALF_SIZE, @@ -143,7 +143,7 @@ WifiDefaultAckManager::IsResponseNeeded(Ptr mpdu, NS_LOG_FUNCTION(this << *mpdu << &txParams); uint8_t tid = mpdu->GetHeader().GetQosTid(); - Mac48Address receiver = mpdu->GetHeader().GetAddr1(); + Mac48Address receiver = mpdu->GetOriginal()->GetHeader().GetAddr1(); Ptr edca = m_mac->GetQosTxop(tid); // An immediate response (Ack or Block Ack) is needed if any of the following holds: @@ -295,8 +295,9 @@ WifiDefaultAckManager::TryAddMpdu(Ptr mpdu, const WifiTxParamete // we get here if a response is needed uint8_t tid = GetTid(mpdu->GetPacket(), hdr); + auto origReceiver = mpdu->GetOriginal()->GetHeader().GetAddr1(); if (!hdr.IsBlockAckReq() && txParams.GetSize(receiver) == 0 && - hdr.GetSequenceNumber() == m_mac->GetQosTxop(tid)->GetBaStartingSequence(receiver, tid)) + hdr.GetSequenceNumber() == m_mac->GetQosTxop(tid)->GetBaStartingSequence(origReceiver, tid)) { NS_LOG_DEBUG("Sending a single MPDU, no previous frame to ack: request Normal Ack"); WifiNormalAck* acknowledgment = new WifiNormalAck;