wifi: Extend MultiUserScheduler base class to support MLO
This commit is contained in:
committed by
Stefano Avallone
parent
fe61cefc39
commit
f979dd6971
@@ -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++;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user