wifi: Extend MultiUserScheduler base class to support MLO

This commit is contained in:
Stefano Avallone
2022-12-07 15:06:03 +01:00
committed by Stefano Avallone
parent fe61cefc39
commit f979dd6971
3 changed files with 18 additions and 13 deletions

View File

@@ -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<WifiMpdu>
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> packet = Create<Packet>();
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++;
}

View File

@@ -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<WifiMpdu> GetTriggerFrame(const CtrlTriggerHeader& trigger) const;
Ptr<WifiMpdu> GetTriggerFrame(const CtrlTriggerHeader& trigger, uint8_t linkId) const;
/**
* Get the format of the last transmission, as determined by the last call

View File

@@ -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.