Round Robin circular scheduling upgrade

This commit is contained in:
Marco Miozzo
2011-05-06 09:44:24 +02:00
parent 5169067a7e
commit 64fd586543
2 changed files with 44 additions and 11 deletions

View File

@@ -208,7 +208,8 @@ RrSchedulerMemberSchedSapProvider::SchedUlCqiInfoReq (const struct SchedUlCqiInf
RrFfMacScheduler::RrFfMacScheduler ()
: m_cschedSapUser (0),
m_schedSapUser (0),
m_schedTtiDelay (2) // WILD ACK: based on a m_macChTtiDelay = 1
m_schedTtiDelay (2), // WILD ACK: based on a m_macChTtiDelay = 1
m_nextRnti (0)
{
m_cschedSapProvider = new RrSchedulerMemberCschedSapProvider (this);
m_schedSapProvider = new RrSchedulerMemberSchedSapProvider (this);
@@ -369,7 +370,7 @@ RrFfMacScheduler::GetRbgSize (int dlbandwidth)
void
RrFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::SchedDlTriggerReqParameters& params)
{
NS_LOG_FUNCTION (this);
NS_LOG_FUNCTION (this << " Frame no. " << (params.m_sfnSf>>4) << " subframe no. " << (0xF & params.m_sfnSf));
// API generated by RLC for triggering the scheduling of a DL subframe
// Get the actual active flows (queue!=0)
@@ -404,7 +405,7 @@ RrFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched
}
}
}
if (nflows == 0)
{
return;
@@ -421,16 +422,40 @@ RrFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched
int rbgAllocated = 0;
FfMacSchedSapUser::SchedDlConfigIndParameters ret;
// round robin assignment to all UE-LC registered
it = m_rlcBufferReq.begin ();
//for (it = m_rlcBufferReq.begin (); it != m_rlcBufferReq.end (); it++)
while (it != m_rlcBufferReq.end ())
// round robin assignment to all UE-LC registered starting from the subsequent of the one
// served last scheduling trigger
NS_LOG_DEBUG (this << " next to be served " << m_nextRnti << " nflows " << nflows);
if (m_nextRnti!=0)
{
for (it = m_rlcBufferReq.begin (); it != m_rlcBufferReq.end (); it++)
{
if ((*it).m_rnti == m_nextRnti)
{
break;
}
}
if (it == m_rlcBufferReq.end ())
{
NS_LOG_ERROR (this << " no user found");
}
}
else
{
it = m_rlcBufferReq.begin ();
}
do
{
itLcRnti = lcActivesPerRnti.find ((*it).m_rnti);
if (itLcRnti==lcActivesPerRnti.end ())
{
// skip this entry
it++;
if (it==m_rlcBufferReq.end ())
{
// restart from the first
it = m_rlcBufferReq.begin ();
}
continue;
}
int lcNum = (*itLcRnti).second;
@@ -445,7 +470,7 @@ RrFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched
std::map <uint16_t,uint8_t>::iterator itCqi = m_p10CqiRxed.find (newEl.m_rnti);
if (itCqi == m_p10CqiRxed.end ())
{
newDci.m_mcs.push_back (1); // no info on this user -> lowest MCS
newDci.m_mcs.push_back (0); // no info on this user -> lowest MCS
}
else
{
@@ -455,7 +480,7 @@ RrFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched
std::vector <struct RlcPduListElement_s> newRlcPduLe;
int totRbg = lcNum * rbgPerFlow;
int tbSize = (LteAmc::GetTbSizeFromMcs (newDci.m_mcs.at (0), totRbg * rbgSize) / 8);
//NS_LOG_DEBUG (this << "Allocate user " << newEl.m_rnti << " LCs " << (uint16_t)(*itLcRnti).second << " bytes " << tbSize);
NS_LOG_DEBUG (this << "Allocate user " << newEl.m_rnti << " LCs " << (uint16_t)(*itLcRnti).second << " bytes " << tbSize << " PRBs " << totRbg * rbgSize << " mcs " << (uint16_t) newDci.m_mcs.at (0));
uint16_t rlcPduSize = tbSize / lcNum;
for (int i = 0; i < lcNum ; i++)
{
@@ -465,12 +490,16 @@ RrFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched
newRlcEl.m_size = rlcPduSize;
newRlcPduLe.push_back (newRlcEl);
it++;
if (it==m_rlcBufferReq.end ())
{
// restart from the first
it = m_rlcBufferReq.begin ();
}
}
uint32_t rbgMask = 0;
for (int i = 0; i < totRbg; i++)
{
rbgMask = rbgMask + (0x1 << rbgAllocated);
//NS_LOG_DEBUG (this << " Allocated RBG " << rbgAllocated);
rbgAllocated++;
}
newDci.m_rbBitmap = rbgMask; // (32 bit bitmap see 7.1.6 of 36.213)
@@ -492,9 +521,11 @@ RrFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched
ret.m_buildDataList.push_back (newEl);
if (rbgAllocated == rbgNum)
{
NS_LOG_DEBUG (this << " FULL " << (*it).m_rnti);
m_nextRnti = (*it).m_rnti; // store last RNTI served
break; // no more RGB to be allocated
}
} // end while
} while ((*it).m_rnti != m_nextRnti);
ret.m_nrOfPdcchOfdmSymbols = 1; // TODO: check correct value according the DCIs txed

View File

@@ -159,6 +159,8 @@ private:
FfMacCschedSapProvider::CschedCellConfigReqParameters m_cschedCellConfig;
uint8_t m_schedTtiDelay; // delay between scheduling and reception (based on m_macChTtiDelay)
uint16_t m_nextRnti; // RNTI of the next user to be served next scheduling
};