diff --git a/src/lte/model/lte-enb-mac.cc b/src/lte/model/lte-enb-mac.cc index 0f2b244d2..aba96b535 100644 --- a/src/lte/model/lte-enb-mac.cc +++ b/src/lte/model/lte-enb-mac.cc @@ -368,7 +368,7 @@ LteEnbMac::DoDispose () m_ulCeReceived.clear (); m_dlInfoListReceived.clear (); m_ulInfoListReceived.clear (); -m_miDlHarqProcessesPackets.clear (); + m_miDlHarqProcessesPackets.clear (); delete m_macSapProvider; delete m_cmacSapProvider; delete m_schedSapUser; @@ -769,6 +769,7 @@ LteEnbMac::DoRemoveUe (uint16_t rnti) params.m_rnti = rnti; m_cschedSapProvider->CschedUeReleaseReq (params); m_rlcAttached.erase (rnti); + m_miDlHarqProcessesPackets.erase (rnti); } void diff --git a/src/lte/model/pf-ff-mac-scheduler.cc b/src/lte/model/pf-ff-mac-scheduler.cc index 03937246a..99233e357 100644 --- a/src/lte/model/pf-ff-mac-scheduler.cc +++ b/src/lte/model/pf-ff-mac-scheduler.cc @@ -382,7 +382,24 @@ void PfFfMacScheduler::DoCschedLcReleaseReq (const struct FfMacCschedSapProvider::CschedLcReleaseReqParameters& params) { NS_LOG_FUNCTION (this); - // TODO: Implementation of the API + for (uint16_t i = 0; i < params.m_logicalChannelIdentity.size (); i++) + { + std::map::iterator it = m_rlcBufferReq.begin (); + std::map::iterator temp; + while (it!=m_rlcBufferReq.end ()) + { + if (((*it).first.m_rnti == params.m_rnti) && ((*it).first.m_lcId == params.m_logicalChannelIdentity.at (i))) + { + temp = it; + it++; + m_rlcBufferReq.erase (temp); + } + else + { + it++; + } + } + } return; } @@ -390,7 +407,34 @@ void PfFfMacScheduler::DoCschedUeReleaseReq (const struct FfMacCschedSapProvider::CschedUeReleaseReqParameters& params) { NS_LOG_FUNCTION (this); - // TODO: Implementation of the API + + m_uesTxMode.erase (params.m_rnti); + m_dlHarqCurrentProcessId.erase (params.m_rnti); + m_dlHarqProcessesStatus.erase (params.m_rnti); + m_dlHarqProcessesDciBuffer.erase (params.m_rnti); + m_dlHarqProcessesRlcPduListBuffer.erase (params.m_rnti); + m_ulHarqCurrentProcessId.erase (params.m_rnti); + m_ulHarqProcessesStatus.erase (params.m_rnti); + m_ulHarqProcessesDciBuffer.erase (params.m_rnti); + m_flowStatsDl.erase (params.m_rnti); + m_flowStatsUl.erase (params.m_rnti); + m_ceBsrRxed.erase (params.m_rnti); + std::map::iterator it = m_rlcBufferReq.begin (); + std::map::iterator temp; + while (it!=m_rlcBufferReq.end ()) + { + if ((*it).first.m_rnti == params.m_rnti) + { + temp = it; + it++; + m_rlcBufferReq.erase (temp); + } + else + { + it++; + } + } + return; } diff --git a/src/lte/model/rr-ff-mac-scheduler.cc b/src/lte/model/rr-ff-mac-scheduler.cc index 6802ab1fb..179efdbb3 100644 --- a/src/lte/model/rr-ff-mac-scheduler.cc +++ b/src/lte/model/rr-ff-mac-scheduler.cc @@ -350,7 +350,7 @@ void RrFfMacScheduler::DoCschedLcConfigReq (const struct FfMacCschedSapProvider::CschedLcConfigReqParameters& params) { NS_LOG_FUNCTION (this); - // Not used at this stage + // Not used at this stage (LCs updated by DoSchedDlRlcBufferReq) return; } @@ -358,7 +358,21 @@ void RrFfMacScheduler::DoCschedLcReleaseReq (const struct FfMacCschedSapProvider::CschedLcReleaseReqParameters& params) { NS_LOG_FUNCTION (this); - // TODO: Implementation of the API + for (uint16_t i = 0; i < params.m_logicalChannelIdentity.size (); i++) + { + std::list::iterator it = m_rlcBufferReq.begin (); + while (it!=m_rlcBufferReq.end ()) + { + if (((*it).m_rnti == params.m_rnti)&&((*it).m_logicalChannelIdentity == params.m_logicalChannelIdentity.at (i))) + { + it = m_rlcBufferReq.erase (it); + } + else + { + it++; + } + } + } return; } @@ -366,7 +380,30 @@ void RrFfMacScheduler::DoCschedUeReleaseReq (const struct FfMacCschedSapProvider::CschedUeReleaseReqParameters& params) { NS_LOG_FUNCTION (this); - // TODO: Implementation of the API + + m_uesTxMode.erase (params.m_rnti); + m_dlHarqCurrentProcessId.erase (params.m_rnti); + m_dlHarqProcessesStatus.erase (params.m_rnti); + m_dlHarqProcessesDciBuffer.erase (params.m_rnti); + m_dlHarqProcessesRlcPduListBuffer.erase (params.m_rnti); + m_ulHarqCurrentProcessId.erase (params.m_rnti); + m_ulHarqProcessesStatus.erase (params.m_rnti); + m_ulHarqProcessesDciBuffer.erase (params.m_rnti); + m_ceBsrRxed.erase (params.m_rnti); + std::list::iterator it = m_rlcBufferReq.begin (); + while (it != m_rlcBufferReq.end ()) + { + NS_LOG_DEBUG (this << " Erase RNTI " << (*it).m_rnti << " LC " << (uint16_t)(*it).m_logicalChannelIdentity); + if ((*it).m_rnti == params.m_rnti) + { + it = m_rlcBufferReq.erase (it); + } + else + { + it++; + } + } + return; } diff --git a/src/lte/test/test-lte-rrc.cc b/src/lte/test/test-lte-rrc.cc index 428c5232a..0383c45d7 100644 --- a/src/lte/test/test-lte-rrc.cc +++ b/src/lte/test/test-lte-rrc.cc @@ -84,7 +84,7 @@ std::string LteRrcConnectionEstablishmentTestCase::BuildNameString (uint32_t nUe } LteRrcConnectionEstablishmentTestCase::LteRrcConnectionEstablishmentTestCase (uint32_t nUes, uint32_t nBearers, uint32_t tConnBase, uint32_t tConnIncrPerUe, uint32_t delayDiscStart, bool useIdealRrc) - : TestCase (BuildNameString (nUes, nBearers, tConnBase, tConnIncrPerUe, delayDiscStart)), + : TestCase (BuildNameString (nUes, nBearers, tConnBase, tConnIncrPerUe, delayDiscStart, useIdealRrc)), m_nUes (nUes), m_nBearers (nBearers), m_tConnBase (tConnBase), @@ -275,13 +275,14 @@ LteRrcTestSuite::LteRrcTestSuite () AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 4, 0, 20, 0, 1, useIdealRrc)); AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 4, 0, 20, 300, 1, useIdealRrc)); AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 20, 0, 10, 1, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 50, 0, 0, 0, 1));, useIdealRrc + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 50, 0, 0, 0, 1, useIdealRrc)); // // time consuming tests with a lot of UEs // AddTestCase (new LteRrcConnectionEstablishmentTestCase (100, 0, 10, 0, 1)); // AddTestCase (new LteRrcConnectionEstablishmentTestCase (100, 0, 10, 1, 1)); // AddTestCase (new LteRrcConnectionEstablishmentTestCase (200, 0, 10, 0, 1)); // AddTestCase (new LteRrcConnectionEstablishmentTestCase (200, 0, 10, 1, 1)); + } } static LteRrcTestSuite g_lteRrcTestSuiteInstance;