From ed6a08165b35d0b4a6caa78f08cd5eca3f7e4fc8 Mon Sep 17 00:00:00 2001 From: Marco Miozzo Date: Thu, 10 Nov 2011 17:46:15 +0100 Subject: [PATCH] Bug-fix in RrFfMacScheduler::DoSchedDlTriggerReq when scheduling multiple LCs per UE --- src/lte/model/rr-ff-mac-scheduler.cc | 19 +++++++++++++------ src/lte/model/rr-ff-mac-scheduler.h | 4 +++- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/lte/model/rr-ff-mac-scheduler.cc b/src/lte/model/rr-ff-mac-scheduler.cc index fb12f2e33..173f6de66 100644 --- a/src/lte/model/rr-ff-mac-scheduler.cc +++ b/src/lte/model/rr-ff-mac-scheduler.cc @@ -315,7 +315,7 @@ RrFfMacScheduler::DoSchedDlRlcBufferReq (const struct FfMacSchedSapProvider::Sch { NS_LOG_FUNCTION (this << params.m_rnti << (uint32_t) params.m_logicalChannelIdentity); // API generated by RLC for updating RLC parameters on a LC (tx and retx queues) - std::vector::iterator it; + std::list::iterator it; bool newLc = true; for (it = m_rlcBufferReq.begin (); it != m_rlcBufferReq.end (); it++) { @@ -368,20 +368,27 @@ RrFfMacScheduler::GetRbgSize (int dlbandwidth) return (-1); } +bool +RrFfMacScheduler::SortRlcBufferReq (FfMacSchedSapProvider::SchedDlRlcBufferReqParameters i,FfMacSchedSapProvider::SchedDlRlcBufferReqParameters j) +{ + return (i.m_rnti> 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) - std::vector::iterator it; + std::list::iterator it; + m_rlcBufferReq.sort (SortRlcBufferReq); int nflows = 0; std::map lcActivesPerRnti; std::map ::iterator itLcRnti; for (it = m_rlcBufferReq.begin (); it != m_rlcBufferReq.end (); it++) { +// NS_LOG_INFO (this << " User " << (*it).m_rnti << " LC " << (uint16_t)(*it).m_logicalChannelIdentity); // remove old entries of this UE-LC if ( ((*it).m_rlcTransmissionQueueSize > 0) || ((*it).m_rlcRetransmissionQueueSize > 0) @@ -407,7 +414,7 @@ RrFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched } } } - + if (nflows == 0) { return; @@ -483,13 +490,13 @@ RrFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched std::vector 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 << " PRBs " << totRbg * rbgSize << " mcs " << (uint16_t) newDci.m_mcs.at (0)); + 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++) { RlcPduListElement_s newRlcEl; newRlcEl.m_logicalChannelIdentity = (*it).m_logicalChannelIdentity; - //NS_LOG_DEBUG (this << "LCID " << (uint32_t) newRlcEl.m_logicalChannelIdentity << " size " << rlcPduSize); + NS_LOG_DEBUG (this << "LCID " << (uint32_t) newRlcEl.m_logicalChannelIdentity << " size " << rlcPduSize << " ID " << (*it).m_rnti); newRlcEl.m_size = rlcPduSize; newRlcPduLe.push_back (newRlcEl); it++; diff --git a/src/lte/model/rr-ff-mac-scheduler.h b/src/lte/model/rr-ff-mac-scheduler.h index e77bbab23..b906700e1 100644 --- a/src/lte/model/rr-ff-mac-scheduler.h +++ b/src/lte/model/rr-ff-mac-scheduler.h @@ -118,11 +118,13 @@ private: int GetRbgSize (int dlbandwidth); + + static bool SortRlcBufferReq (FfMacSchedSapProvider::SchedDlRlcBufferReqParameters i,FfMacSchedSapProvider::SchedDlRlcBufferReqParameters j); /* * Vectors of UE's RLC info */ - std::vector m_rlcBufferReq; + std::list m_rlcBufferReq; /* * Map of UE's DL CQI P01 received