diff --git a/src/wifi/model/he/multi-user-scheduler.cc b/src/wifi/model/he/multi-user-scheduler.cc index b50c2a6a5..6d70dfcea 100644 --- a/src/wifi/model/he/multi-user-scheduler.cc +++ b/src/wifi/model/he/multi-user-scheduler.cc @@ -168,9 +168,12 @@ MultiUserScheduler::AccessReqTimeout() // request channel access if not requested yet auto edca = m_apMac->GetQosTxop(m_accessReqAc); - if (edca->GetAccessStatus(SINGLE_LINK_OP_ID) == Txop::NOT_REQUESTED) + for (uint8_t linkId = 0; linkId < m_apMac->GetNLinks(); linkId++) { - m_apMac->GetChannelAccessManager()->RequestAccess(edca); + if (edca->GetAccessStatus(linkId) == Txop::NOT_REQUESTED) + { + m_apMac->GetChannelAccessManager(linkId)->RequestAccess(edca); + } } // restart timer @@ -255,9 +258,9 @@ MultiUserScheduler::GetUlMuInfo() } Ptr -MultiUserScheduler::GetTriggerFrame(const CtrlTriggerHeader& trigger) const +MultiUserScheduler::GetTriggerFrame(const CtrlTriggerHeader& trigger, uint8_t linkId) const { - NS_LOG_FUNCTION(this); + NS_LOG_FUNCTION(this << linkId); Ptr packet = Create(); packet->AddHeader(trigger); @@ -266,14 +269,14 @@ MultiUserScheduler::GetTriggerFrame(const CtrlTriggerHeader& trigger) const if (trigger.GetNUserInfoFields() == 1) { auto aid = trigger.begin()->GetAid12(); - auto aidAddrMapIt = m_apMac->GetStaList().find(aid); - NS_ASSERT(aidAddrMapIt != m_apMac->GetStaList().end()); + auto aidAddrMapIt = m_apMac->GetStaList(linkId).find(aid); + NS_ASSERT(aidAddrMapIt != m_apMac->GetStaList(linkId).end()); receiver = aidAddrMapIt->second; } WifiMacHeader hdr(WIFI_MAC_CTL_TRIGGER); hdr.SetAddr1(receiver); - hdr.SetAddr2(m_apMac->GetAddress()); + hdr.SetAddr2(GetHeFem(linkId)->GetAddress()); hdr.SetDsNotTo(); hdr.SetDsNotFrom(); @@ -300,12 +303,13 @@ MultiUserScheduler::GetMaxSizeOfQosNullAmpdu(const CtrlTriggerHeader& trigger) c uint8_t maxNTids = 0; for (const auto& userInfo : trigger) { - const auto staIt = m_apMac->GetStaList().find(userInfo.GetAid12()); - NS_ASSERT(staIt != m_apMac->GetStaList().cend()); + auto address = m_apMac->GetMldOrLinkAddressByAid(userInfo.GetAid12()); + NS_ASSERT_MSG(address, "AID " << userInfo.GetAid12() << " not found"); + uint8_t staNTids = 0; for (uint8_t tid = 0; tid < 8; tid++) { - if (m_apMac->GetBaAgreementEstablishedAsRecipient(staIt->second, tid)) + if (m_apMac->GetBaAgreementEstablishedAsRecipient(*address, tid)) { staNTids++; } diff --git a/src/wifi/model/he/multi-user-scheduler.h b/src/wifi/model/he/multi-user-scheduler.h index 9fdf989f1..694de9dfc 100644 --- a/src/wifi/model/he/multi-user-scheduler.h +++ b/src/wifi/model/he/multi-user-scheduler.h @@ -140,9 +140,10 @@ class MultiUserScheduler : public Object * Get an MPDU containing the given Trigger Frame. * * \param trigger the given Trigger Frame + * \param linkId the ID of the link on which the Trigger Frame has to be sent * \return an MPDU containing the given Trigger Frame */ - Ptr GetTriggerFrame(const CtrlTriggerHeader& trigger) const; + Ptr GetTriggerFrame(const CtrlTriggerHeader& trigger, uint8_t linkId) const; /** * Get the format of the last transmission, as determined by the last call diff --git a/src/wifi/model/he/rr-multi-user-scheduler.cc b/src/wifi/model/he/rr-multi-user-scheduler.cc index 611618241..8a3d44fa6 100644 --- a/src/wifi/model/he/rr-multi-user-scheduler.cc +++ b/src/wifi/model/he/rr-multi-user-scheduler.cc @@ -309,7 +309,7 @@ RrMultiUserScheduler::TrySendingBsrpTf() m_trigger = CtrlTriggerHeader(TriggerFrameType::BSRP_TRIGGER, txVector); txVector.SetGuardInterval(m_trigger.GetGuardInterval()); - auto item = GetTriggerFrame(m_trigger); + auto item = GetTriggerFrame(m_trigger, m_linkId); m_triggerMacHdr = item->GetHeader(); m_txParams.Clear(); @@ -423,7 +423,7 @@ RrMultiUserScheduler::TrySendingBasicTf() m_trigger = CtrlTriggerHeader(TriggerFrameType::BASIC_TRIGGER, txVector); txVector.SetGuardInterval(m_trigger.GetGuardInterval()); - auto item = GetTriggerFrame(m_trigger); + auto item = GetTriggerFrame(m_trigger, m_linkId); m_triggerMacHdr = item->GetHeader(); // compute the maximum amount of time that can be granted to stations.