diff --git a/src/lte/model/lte-common.cc b/src/lte/model/lte-common.cc index cf018fa01..e5b100d32 100644 --- a/src/lte/model/lte-common.cc +++ b/src/lte/model/lte-common.cc @@ -98,6 +98,42 @@ LteFfConverter::getMinFpS11dot3Value () //static double g_lowestFpS11dot3Value = -4096; // 0x8001 (1000 0000 0000 0000) +uint32_t BufferSizeLevelBsrTable[64] = { + + 0, 10, 12, 14, 17, 19, 22, 26, 31, 36, 42, 49, 57, 67, 78, 91, + 107, 125, 146, 171, 200, 234, 274, 321, 376, 440, 515, 603, + 706, 826, 967, 1132, 1326, 1552, 1817, 2127, 2490, 2915, 3413, + 3995, 4677, 5476, 6411, 7505, 8787, 10287, 12043, 14099, 16507, + 19325, 22624, 26487, 31009, 36304, 42502, 49759, 58255, + 68201, 79846, 93749, 109439, 128125, 150000, 150000 + +}; + +uint32_t +BufferSizeLevelBsr::BsrId2BufferSize (uint8_t val) +{ + return BufferSizeLevelBsrTable[val]; +} + +uint8_t +BufferSizeLevelBsr::BufferSize2BsrId (uint32_t val) +{ + int index = 0; + if (BufferSizeLevelBsrTable[63] < val) + { + index = 63; + } + else + { + while (BufferSizeLevelBsrTable[index] < val) + { + index++; + } + } + + return (index); +} + }; // namespace ns3 diff --git a/src/lte/model/lte-common.h b/src/lte/model/lte-common.h index 9326572e7..1911102e9 100644 --- a/src/lte/model/lte-common.h +++ b/src/lte/model/lte-common.h @@ -64,6 +64,18 @@ public: //static const double MIN_FP_S11DOT3_VALUE = -4096; +}; + +class BufferSizeLevelBsr +{ + + public: + static uint32_t BsrId2BufferSize (uint8_t val); + static uint8_t BufferSize2BsrId (uint32_t val); + + static int m_bufferSizeLevelBsr[64]; + + }; diff --git a/src/lte/model/lte-ue-mac.cc b/src/lte/model/lte-ue-mac.cc index 55b4e80e7..c3ddc3072 100644 --- a/src/lte/model/lte-ue-mac.cc +++ b/src/lte/model/lte-ue-mac.cc @@ -32,6 +32,7 @@ #include #include #include +#include NS_LOG_COMPONENT_DEFINE ("LteUeMac"); @@ -41,18 +42,6 @@ namespace ns3 { NS_OBJECT_ENSURE_REGISTERED (LteUeMac); - -int BufferSizeLevelBsr[64] = { - - 0, 10, 12, 14, 17, 19, 22, 26, 31, 36, 42, 49, 57, 67, 78, 91, 107, 125, 146, - 171, 200, 234, 274, 321, 376, 440, 515, 603, 706, 826, 967, 1132, 1326, 1552, - 1817, 2127, 2490, 2915, 3413, 3995, 4677, 5476, 6411, 7505, 8787, 10287, - 12043, 14099, 16507, 19325, 22624, 26487, 31009, 36304, 42502, 49759, 58255, - 68201, 79846, 93749, 109439, 128125, 150000, 150000 - -}; - - /////////////////////////////////////////////////////////// // SAP forwarders /////////////////////////////////////////////////////////// @@ -298,18 +287,7 @@ LteUeMac::SendReportBufferStatus (void) for (it = m_ulBsrReceived.begin (); it != m_ulBsrReceived.end (); it++) { int queue = (*it).second; - int index = 0; - if (BufferSizeLevelBsr[63] < queue) - { - index = 63; - } - else - { - while (BufferSizeLevelBsr[index] < queue) - { - index++; - } - } + int index = BufferSizeLevelBsr::BufferSize2BsrId (queue); bsr.m_macCeValue.m_bufferStatus.push_back (index); } diff --git a/src/lte/model/pf-ff-mac-scheduler.cc b/src/lte/model/pf-ff-mac-scheduler.cc index 2ed93392f..a1f29dc15 100644 --- a/src/lte/model/pf-ff-mac-scheduler.cc +++ b/src/lte/model/pf-ff-mac-scheduler.cc @@ -582,6 +582,7 @@ PfFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched // NS_LOG_DEBUG (this << " LCID " << (uint32_t) newRlcEl.m_logicalChannelIdentity << " size " << rlcPduSize); newRlcEl.m_size = rlcPduSize; newRlcPduLe.push_back (newRlcEl); + UpdateDlRlcBufferInfo (newDci.m_rnti, newRlcEl.m_logicalChannelIdentity, rlcPduSize); } if ((*itBufReq).first.m_rnti > (*itMap).first) { @@ -741,7 +742,7 @@ PfFfMacScheduler::DoSchedUlTriggerReq (const struct FfMacSchedSapProvider::Sched RefreshUlCqiMaps (); - std::map ::iterator it; + std::map ::iterator it; int nflows = 0; for (it = m_ceBsrRxed.begin (); it != m_ceBsrRxed.end (); it++) @@ -858,7 +859,8 @@ PfFfMacScheduler::DoSchedUlTriggerReq (const struct FfMacSchedSapProvider::Sched rbgAllocationMap.push_back ((*it).first); } uldci.m_tbSize = (LteAmc::GetTbSizeFromMcs (uldci.m_mcs, rbPerFlow) / 8); -// NS_LOG_DEBUG (this << " UE " << (*it).first << " startPRB " << (uint32_t)uldci.m_rbStart << " nPRB " << (uint32_t)uldci.m_rbLen << " CQI " << cqi << " MCS " << (uint32_t)uldci.m_mcs << " TBsize " << uldci.m_tbSize << " RbAlloc " << rbAllocated); + NS_LOG_DEBUG (this << " UE " << (*it).first << " startPRB " << (uint32_t)uldci.m_rbStart << " nPRB " << (uint32_t)uldci.m_rbLen << " CQI " << cqi << " MCS " << (uint32_t)uldci.m_mcs << " TBsize " << uldci.m_tbSize << " RbAlloc " << rbAllocated); + UpdateUlRlcBufferInfo (uldci.m_rnti, uldci.m_tbSize); uldci.m_ndi = 1; uldci.m_cceIndex = 0; uldci.m_aggrLevel = 1; @@ -941,29 +943,30 @@ PfFfMacScheduler::DoSchedUlMacCtrlInfoReq (const struct FfMacSchedSapProvider::S { NS_LOG_FUNCTION (this); - std::map ::iterator it; - + std::map ::iterator it; + for (unsigned int i = 0; i < params.m_macCeList.size (); i++) + { + if ( params.m_macCeList.at (i).m_macCeType == MacCeListElement_s::BSR ) { - if ( params.m_macCeList.at (i).m_macCeType == MacCeListElement_s::BSR ) - { - // buffer status report - uint16_t rnti = params.m_macCeList.at (i).m_rnti; - it = m_ceBsrRxed.find (rnti); - if (it == m_ceBsrRxed.end ()) - { - // create the new entry - uint8_t bsr = params.m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (0); - m_ceBsrRxed.insert ( std::pair (rnti, bsr)); // only 1 buffer status is working now - } - else - { - // update the CQI value - (*it).second = params.m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (0); - } - } + // buffer status report + uint16_t rnti = params.m_macCeList.at (i).m_rnti; + it = m_ceBsrRxed.find (rnti); + if (it == m_ceBsrRxed.end ()) + { + // create the new entry + uint8_t bsrId = params.m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (0); + int buffer = BufferSizeLevelBsr::BsrId2BufferSize (bsrId); + m_ceBsrRxed.insert ( std::pair (rnti, buffer)); // only 1 buffer status is working now + } + else + { + // update the CQI value + (*it).second = BufferSizeLevelBsr::BsrId2BufferSize (params.m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (0)); + } } - + } + return; } @@ -1119,5 +1122,73 @@ PfFfMacScheduler::RefreshUlCqiMaps(void) return; } +void +PfFfMacScheduler::UpdateDlRlcBufferInfo (uint16_t rnti, uint8_t lcid, uint16_t size) +{ + std::map::iterator it; + LteFlowId_t flow (rnti, lcid); + it = m_rlcBufferReq.find (flow); + if (it!=m_rlcBufferReq.end ()) + { +// NS_LOG_DEBUG (this << " UE " << rnti << " LC " << (uint16_t)lcid << " txqueue " << (*it).second.m_rlcTransmissionQueueSize << " retxqueue " << (*it).second.m_rlcRetransmissionQueueSize << " status " << (*it).second.m_rlcStatusPduSize << " decrease " << size); + // Update queues: RLC tx order Status, ReTx, Tx + // Update status queue + if ((*it).second.m_rlcStatusPduSize <= size) + { + size -= (*it).second.m_rlcStatusPduSize; + (*it).second.m_rlcStatusPduSize = 0; + } + else + { + (*it).second.m_rlcStatusPduSize -= size; + return; + } + // update retransmission queue + if ((*it).second.m_rlcRetransmissionQueueSize <= size) + { + size -= (*it).second.m_rlcRetransmissionQueueSize; + (*it).second.m_rlcRetransmissionQueueSize = 0; + } + else + { + (*it).second.m_rlcRetransmissionQueueSize -= size; + return; + } + // update transmission queue + if ((*it).second.m_rlcTransmissionQueueSize <= size) + { + size -= (*it).second.m_rlcTransmissionQueueSize; + (*it).second.m_rlcTransmissionQueueSize = 0; + } + else + { + (*it).second.m_rlcTransmissionQueueSize -= size; + return; + } + } + else + { + NS_LOG_ERROR (this << " Does not find DL RLC Buffer Report of UE " << rnti); + } +} + +void +PfFfMacScheduler::UpdateUlRlcBufferInfo (uint16_t rnti, uint16_t size) +{ + + + std::map ::iterator it = m_ceBsrRxed.find (rnti); + if (it!=m_ceBsrRxed.end ()) + { +// NS_LOG_DEBUG (this << " UE " << rnti << " size " << size << " BSR " << (*it).second); + (*it).second -= size; + } + else + { + NS_LOG_ERROR (this << " Does not find BSR report info of UE " << rnti); + } + +} + } diff --git a/src/lte/model/pf-ff-mac-scheduler.h b/src/lte/model/pf-ff-mac-scheduler.h index 34fc9ad14..ed1dfbebc 100644 --- a/src/lte/model/pf-ff-mac-scheduler.h +++ b/src/lte/model/pf-ff-mac-scheduler.h @@ -137,6 +137,9 @@ private: void RefreshDlCqiMaps(void); void RefreshUlCqiMaps(void); + + void UpdateDlRlcBufferInfo (uint16_t rnti, uint8_t lcid, uint16_t size); + void UpdateUlRlcBufferInfo (uint16_t rnti, uint16_t size); /* * Vectors of UE's LC info @@ -191,7 +194,7 @@ private: /* * Map of UE's buffer status reports received */ - std::map m_ceBsrRxed; + std::map m_ceBsrRxed; // MAC SAPs FfMacCschedSapUser* m_cschedSapUser; diff --git a/src/lte/model/rr-ff-mac-scheduler.cc b/src/lte/model/rr-ff-mac-scheduler.cc index ab330ccbb..3d0d01adf 100644 --- a/src/lte/model/rr-ff-mac-scheduler.cc +++ b/src/lte/model/rr-ff-mac-scheduler.cc @@ -36,6 +36,8 @@ int Type0AllocationRbg[4] = { }; // see table 7.1.6.1-1 of 36.213 + + NS_OBJECT_ENSURE_REGISTERED (RrFfMacScheduler); @@ -522,6 +524,7 @@ RrFfMacScheduler::DoSchedDlTriggerReq (const struct FfMacSchedSapProvider::Sched newRlcEl.m_logicalChannelIdentity = (*it).m_logicalChannelIdentity; NS_LOG_DEBUG (this << "LCID " << (uint32_t) newRlcEl.m_logicalChannelIdentity << " size " << rlcPduSize << " ID " << (*it).m_rnti); newRlcEl.m_size = rlcPduSize; + UpdateDlRlcBufferInfo ((*it).m_rnti, newRlcEl.m_logicalChannelIdentity, rlcPduSize); newRlcPduLe.push_back (newRlcEl); it++; if (it == m_rlcBufferReq.end ()) @@ -629,7 +632,7 @@ RrFfMacScheduler::DoSchedUlTriggerReq (const struct FfMacSchedSapProvider::Sched RefreshUlCqiMaps (); - std::map ::iterator it; + std::map ::iterator it; int nflows = 0; for (it = m_ceBsrRxed.begin (); it != m_ceBsrRxed.end (); it++) @@ -737,7 +740,8 @@ RrFfMacScheduler::DoSchedUlTriggerReq (const struct FfMacSchedSapProvider::Sched rbgAllocationMap.push_back ((*it).first); } - uldci.m_tbSize = (LteAmc::GetTbSizeFromMcs (uldci.m_mcs, rbPerFlow) / 8); // MCS 0 -> UL-AMC TBD + uldci.m_tbSize = (LteAmc::GetTbSizeFromMcs (uldci.m_mcs, rbPerFlow) / 8); + UpdateUlRlcBufferInfo (uldci.m_rnti, uldci.m_tbSize); NS_LOG_DEBUG (this << " UE " << (*it).first << " startPRB " << (uint32_t)uldci.m_rbStart << " nPRB " << (uint32_t)uldci.m_rbLen << " CQI " << cqi << " MCS " << (uint32_t)uldci.m_mcs << " TBsize " << uldci.m_tbSize); uldci.m_ndi = 1; uldci.m_cceIndex = 0; @@ -792,7 +796,7 @@ RrFfMacScheduler::DoSchedUlMacCtrlInfoReq (const struct FfMacSchedSapProvider::S { NS_LOG_FUNCTION (this); - std::map ::iterator it; + std::map ::iterator it; for (unsigned int i = 0; i < params.m_macCeList.size (); i++) { @@ -804,13 +808,14 @@ RrFfMacScheduler::DoSchedUlMacCtrlInfoReq (const struct FfMacSchedSapProvider::S if (it == m_ceBsrRxed.end ()) { // create the new entry - uint8_t bsr = params.m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (0); - m_ceBsrRxed.insert ( std::pair (rnti, bsr)); // only 1 buffer status is working now + uint8_t bsrId = params.m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (0); + int buffer = BufferSizeLevelBsr::BsrId2BufferSize (bsrId); + m_ceBsrRxed.insert ( std::pair (rnti, buffer)); // only 1 buffer status is working now } else { // update the CQI value - (*it).second = params.m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (0); + (*it).second = BufferSizeLevelBsr::BsrId2BufferSize (params.m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (0)); } } } @@ -949,4 +954,70 @@ RrFfMacScheduler::RefreshUlCqiMaps(void) return; } +void +RrFfMacScheduler::UpdateDlRlcBufferInfo (uint16_t rnti, uint8_t lcid, uint16_t size) +{ + std::list::iterator it; + for (it = m_rlcBufferReq.begin (); it != m_rlcBufferReq.end (); it++) + { + if (((*it).m_rnti == rnti) && ((*it).m_logicalChannelIdentity)) + { +// NS_LOG_DEBUG (this << " UE " << rnti << " LC " << (uint16_t)lcid << " txqueue " << (*it).m_rlcTransmissionQueueSize << " retxqueue " << (*it).m_rlcRetransmissionQueueSize << " status " << (*it).m_rlcStatusPduSize << " decrease " << size); + // Update queues: RLC tx order Status, ReTx, Tx + // Update status queue + if ((*it).m_rlcStatusPduSize <= size) + { + size -= (*it).m_rlcStatusPduSize; + (*it).m_rlcStatusPduSize = 0; + } + else + { + (*it).m_rlcStatusPduSize -= size; + return; + } + // update retransmission queue + if ((*it).m_rlcRetransmissionQueueSize <= size) + { + size -= (*it).m_rlcRetransmissionQueueSize; + (*it).m_rlcRetransmissionQueueSize = 0; + } + else + { + (*it).m_rlcRetransmissionQueueSize -= size; + return; + } + // update transmission queue + if ((*it).m_rlcTransmissionQueueSize <= size) + { + size -= (*it).m_rlcTransmissionQueueSize; + (*it).m_rlcTransmissionQueueSize = 0; + } + else + { + (*it).m_rlcTransmissionQueueSize -= size; + return; + } + return; + } + } +} + +void +RrFfMacScheduler::UpdateUlRlcBufferInfo (uint16_t rnti, uint16_t size) +{ + + + std::map ::iterator it = m_ceBsrRxed.find (rnti); + if (it!=m_ceBsrRxed.end ()) + { +// NS_LOG_DEBUG (this << " UE " << rnti << " szie " << size << " BSR " << (*it).second); + (*it).second -= size; + } + else + { + NS_LOG_ERROR (this << " Does not find BSR report info of UE " << rnti); + } + +} + } diff --git a/src/lte/model/rr-ff-mac-scheduler.h b/src/lte/model/rr-ff-mac-scheduler.h index ca2d16d05..20def3429 100644 --- a/src/lte/model/rr-ff-mac-scheduler.h +++ b/src/lte/model/rr-ff-mac-scheduler.h @@ -123,6 +123,9 @@ private: void RefreshDlCqiMaps(void); void RefreshUlCqiMaps(void); + + void UpdateDlRlcBufferInfo (uint16_t rnti, uint8_t lcid, uint16_t size); + void UpdateUlRlcBufferInfo (uint16_t rnti, uint16_t size); /* * Vectors of UE's RLC info @@ -158,7 +161,7 @@ private: /* * Map of UE's buffer status reports received */ - std::map m_ceBsrRxed; + std::map m_ceBsrRxed; // MAC SAPs FfMacCschedSapUser* m_cschedSapUser;