diff --git a/src/lte/model/lte-enb-mac.cc b/src/lte/model/lte-enb-mac.cc index 040bc74f0..8fa1a7073 100644 --- a/src/lte/model/lte-enb-mac.cc +++ b/src/lte/model/lte-enb-mac.cc @@ -782,9 +782,6 @@ LteEnbMac::DoSchedDlConfigInd (FfMacSchedSapUser::SchedDlConfigIndParameters ind { for (uint16_t k = 0; k < ind.m_buildDataList.at (i).m_rlcPduList.at (j).size (); k++) { -// NS_ASSERT_MSG (ind.m_buildDataList.at (i).m_dci.m_ndi.size ()<=1, " NOT MIMO, layer " << k); -// NS_ASSERT_MSG (ind.m_buildDataList.size ()>i, " I " << i); -// NS_ASSERT_MSG (ind.m_buildDataList.at (i).m_dci.m_ndi.size ()>k, " k " << ind.m_buildDataList.at (i).m_rlcPduList.at (j).size ()); if (ind.m_buildDataList.at (i).m_dci.m_ndi.at (k) == 1) { // New Data -> retrieve it from RLC diff --git a/src/lte/model/pf-ff-mac-scheduler.cc b/src/lte/model/pf-ff-mac-scheduler.cc index ad9fa1d47..00d476682 100644 --- a/src/lte/model/pf-ff-mac-scheduler.cc +++ b/src/lte/model/pf-ff-mac-scheduler.cc @@ -590,6 +590,12 @@ PfFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched std::vector dlInfoListUntxed; for (uint8_t i = 0; i < m_dlInfoListBuffered.size (); i++) { + std::set ::iterator itRnti = rntiAllocated.find (m_dlInfoListBuffered.at (i).m_rnti); + if (itRnti!=rntiAllocated.end ()) + { + // RNTI already allocated for retx + continue; + } uint8_t nLayers = m_dlInfoListBuffered.at (i).m_harqStatus.size (); std::vector retx; NS_LOG_DEBUG (this << " Processing DLHARQ-FEEDBACK"); @@ -753,17 +759,7 @@ PfFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched dci.m_rv.at (j) ++; (*itHarq).second.at (harqId).m_rv.at (j)++; NS_LOG_DEBUG (this << " layer " << (uint16_t)j << " RV " << (uint16_t)dci.m_rv.at (j)); - newEl.m_rlcPduList.push_back ((*itRlcPdu).second.at (j).at (dci.m_harqProcess)); } - // NS_ASSERT_MSG ((*itRlcPdu).second.size () >dci.m_harqProcess, " size " << (*itRlcPdu).second.size ()); - // NS_ASSERT ((*itRlcPdu).second.at (j).size () > dci.m_harqProcess); - // newEl.m_rlcPduList.push_back ((*itRlcPdu).second.at (j).at (dci.m_harqProcess)); - // NS_LOG_DEBUG (this << " size 1 " << (*itRlcPdu).second.size () << " size 2 " << (*itRlcPdu).second.at (j).size ()); - // NS_ASSERT_MSG ((*itRlcPdu).second.at (j).at (dci.m_harqProcess).size () <= 1, " MIMO ERRROR 1"); - // for (uint16_t k = 0; k < (*itRlcPdu).second.at (j).at (dci.m_harqProcess).size (); k++) - // { - // NS_LOG_DEBUG (this << " k " << k); - // } } else { @@ -774,7 +770,26 @@ PfFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched dci.m_tbsSize.at (j) = 0; NS_LOG_DEBUG (this << " layer " << (uint16_t)j << " no retx"); } - } + } + for (uint16_t k = 0; k < (*itRlcPdu).second.at (0).at (dci.m_harqProcess).size (); k++) + { + std::vector rlcPduListPerLc; + for (uint8_t j = 0; j < nLayers; j++) + { + if (retx.at (j)) + { + if (j < dci.m_ndi.size ()) + { + rlcPduListPerLc.push_back ((*itRlcPdu).second.at (j).at (dci.m_harqProcess).at (k)); + } + } + } + + if (rlcPduListPerLc.size ()>0) + { + newEl.m_rlcPduList.push_back (rlcPduListPerLc); + } + } newEl.m_rnti = rnti; newEl.m_dci = dci; (*itHarq).second.at (harqId).m_rv = dci.m_rv; @@ -1032,9 +1047,7 @@ PfFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched { NS_FATAL_ERROR ("Unable to find RlcPdcList in HARQ buffer for RNTI " << (*itMap).first); } - // NS_ASSERT_MSG ((*itRlcPdu).second.at (j).at (newDci.m_harqProcess).size () <= 1, " MIMO ERR 4" <<(*itRlcPdu).second.at (j).at (newDci.m_harqProcess).size () ); (*itRlcPdu).second.at (j).at (newDci.m_harqProcess).push_back (newRlcEl); - // NS_ASSERT_MSG ((*itRlcPdu).second.at (j).at (newDci.m_harqProcess).size () <= 1, " MIMO ERR 3" <<(*itRlcPdu).second.at (j).at (newDci.m_harqProcess).size () ); } } newEl.m_rlcPduList.push_back (newRlcPduLe); diff --git a/src/lte/model/rr-ff-mac-scheduler.cc b/src/lte/model/rr-ff-mac-scheduler.cc index 57202beb2..49621305b 100644 --- a/src/lte/model/rr-ff-mac-scheduler.cc +++ b/src/lte/model/rr-ff-mac-scheduler.cc @@ -552,6 +552,12 @@ RrFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched std::vector dlInfoListUntxed; for (uint8_t i = 0; i < m_dlInfoListBuffered.size (); i++) { + std::set ::iterator itRnti = rntiAllocated.find (m_dlInfoListBuffered.at (i).m_rnti); + if (itRnti!=rntiAllocated.end ()) + { + // RNTI already allocated for retx + continue; + } uint8_t nLayers = m_dlInfoListBuffered.at (i).m_harqStatus.size (); std::vector retx; NS_LOG_DEBUG (this << " Processing DLHARQ-FEEDBACK"); @@ -715,17 +721,7 @@ RrFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched dci.m_rv.at (j) ++; (*itHarq).second.at (harqId).m_rv.at (j)++; NS_LOG_DEBUG (this << " layer " << (uint16_t)j << " RV " << (uint16_t)dci.m_rv.at (j)); - newEl.m_rlcPduList.push_back ((*itRlcPdu).second.at (j).at (dci.m_harqProcess)); } -// NS_ASSERT_MSG ((*itRlcPdu).second.size () >dci.m_harqProcess, " size " << (*itRlcPdu).second.size ()); -// NS_ASSERT ((*itRlcPdu).second.at (j).size () > dci.m_harqProcess); -// newEl.m_rlcPduList.push_back ((*itRlcPdu).second.at (j).at (dci.m_harqProcess)); -// NS_LOG_DEBUG (this << " size 1 " << (*itRlcPdu).second.size () << " size 2 " << (*itRlcPdu).second.at (j).size ()); -// NS_ASSERT_MSG ((*itRlcPdu).second.at (j).at (dci.m_harqProcess).size () <= 1, " MIMO ERRROR 1"); -// for (uint16_t k = 0; k < (*itRlcPdu).second.at (j).at (dci.m_harqProcess).size (); k++) -// { -// NS_LOG_DEBUG (this << " k " << k); -// } } else { @@ -737,6 +733,26 @@ RrFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched NS_LOG_DEBUG (this << " layer " << (uint16_t)j << " no retx"); } } + + for (uint16_t k = 0; k < (*itRlcPdu).second.at (0).at (dci.m_harqProcess).size (); k++) + { + std::vector rlcPduListPerLc; + for (uint8_t j = 0; j < nLayers; j++) + { + if (retx.at (j)) + { + if (j < dci.m_ndi.size ()) + { + rlcPduListPerLc.push_back ((*itRlcPdu).second.at (j).at (dci.m_harqProcess).at (k)); + } + } + } + + if (rlcPduListPerLc.size ()>0) + { + newEl.m_rlcPduList.push_back (rlcPduListPerLc); + } + } newEl.m_rnti = rnti; newEl.m_dci = dci; (*itHarq).second.at (harqId).m_rv = dci.m_rv; @@ -926,9 +942,7 @@ RrFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched { NS_FATAL_ERROR ("Unable to find RlcPdcList in HARQ buffer for RNTI " << (*it).m_rnti); } - // NS_ASSERT_MSG ((*itRlcPdu).second.at (j).at (newDci.m_harqProcess).size () <= 1, " MIMO ERR 4" <<(*itRlcPdu).second.at (j).at (newDci.m_harqProcess).size () ); (*itRlcPdu).second.at (j).at (newDci.m_harqProcess).push_back (newRlcEl); - // NS_ASSERT_MSG ((*itRlcPdu).second.at (j).at (newDci.m_harqProcess).size () <= 1, " MIMO ERR 3" <<(*itRlcPdu).second.at (j).at (newDci.m_harqProcess).size () ); } }