From db24c8d062b3a9704813616edf2c133fa778a987 Mon Sep 17 00:00:00 2001 From: Marco Miozzo Date: Thu, 28 Jun 2012 17:30:43 +0200 Subject: [PATCH] Add SRS based UL-CQI and update RR and PF schedulers for managing them --- src/lte/helper/lte-helper.cc | 5 ++- src/lte/model/ff-mac-common.cc | 40 +++++++++++++++++++++++ src/lte/model/ff-mac-common.h | 25 +++++++++++++- src/lte/model/ff-mac-scheduler.cc | 20 +++++++++++- src/lte/model/ff-mac-scheduler.h | 21 ++++++++++++ src/lte/model/lte-enb-mac.cc | 36 ++++++-------------- src/lte/model/lte-enb-mac.h | 5 ++- src/lte/model/lte-enb-phy-sap.h | 3 +- src/lte/model/lte-enb-phy.cc | 49 ++++++++++++++++++++-------- src/lte/model/lte-enb-phy.h | 6 ++-- src/lte/model/pf-ff-mac-scheduler.cc | 40 +++++++++++++++++++---- src/lte/model/rr-ff-mac-scheduler.cc | 25 ++++++++++++++ src/lte/wscript | 5 ++- 13 files changed, 222 insertions(+), 58 deletions(-) create mode 100644 src/lte/model/ff-mac-common.cc diff --git a/src/lte/helper/lte-helper.cc b/src/lte/helper/lte-helper.cc index 0807015d1..435ed8668 100644 --- a/src/lte/helper/lte-helper.cc +++ b/src/lte/helper/lte-helper.cc @@ -318,11 +318,10 @@ LteHelper::InstallSingleEnbDevice (Ptr n) Ptr phy = CreateObject (dlPhy, ulPhy); Ptr pCtrl = Create (phy->GetObject ()); -// CQIs are still evaluated with PUSCH, this will be used for SRS ones -// ulPhy->AddDataSinrChunkProcessor (pCtrl); + ulPhy->AddCtrlSinrChunkProcessor (pCtrl); // for evaluating SRS UL-CQI Ptr pData = Create (ulPhy, phy); - ulPhy->AddDataSinrChunkProcessor (pData); + ulPhy->AddDataSinrChunkProcessor (pData); // for evaluating PUSCH UL-CQI dlPhy->SetChannel (m_downlinkChannel); ulPhy->SetChannel (m_uplinkChannel); diff --git a/src/lte/model/ff-mac-common.cc b/src/lte/model/ff-mac-common.cc new file mode 100644 index 000000000..fb961cf82 --- /dev/null +++ b/src/lte/model/ff-mac-common.cc @@ -0,0 +1,40 @@ +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2011 CTTC + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Marco Miozzo + */ + +#include + +namespace ns3 { + +VendorSpecificValue::VendorSpecificValue () +{ + +} + +VendorSpecificValue::~VendorSpecificValue () +{ + +} + +// VendorSpecificValue::VendorSpecificValue (const VendorSpecificValue& p) +// { +// // remember to copy new parameters??? +// } + +} // namespace ns3 diff --git a/src/lte/model/ff-mac-common.h b/src/lte/model/ff-mac-common.h index 97d79ab11..f70898071 100644 --- a/src/lte/model/ff-mac-common.h +++ b/src/lte/model/ff-mac-common.h @@ -21,6 +21,11 @@ #ifndef FF_MAC_COMMON_H #define FF_MAC_COMMON_H +#include +#include +#include + + /** * Constants. See section 4.4 */ @@ -49,6 +54,7 @@ #define MAX_SR_LIST 30 #define MAX_MAC_CE_LIST 30 +namespace ns3 { enum Result_e { @@ -142,6 +148,22 @@ struct UlDciListElement_s int8_t m_pdcchPowerOffset; }; +/** +* \brief Template class for storing the values of vendor specific parameters +*/ +struct VendorSpecificValue : public SimpleRefCount +{ + VendorSpecificValue (); + + virtual ~VendorSpecificValue (); + + /** + * copy constructor + */ + // do we need it? it seems that it works without it +// VendorSpecificValue (const VendorSpecificValue& p); // do we need it? +}; + /** * \brief See section 4.3.3 vendorSpecifiListElement */ @@ -149,7 +171,7 @@ struct VendorSpecificListElement_s { uint32_t m_type; uint32_t m_length; - void *m_value; + Ptr m_value; }; /** @@ -464,5 +486,6 @@ struct PagingInfoListElement_s uint8_t m_pagingSubframe; }; +} // namespace ns3 #endif /* FF_MAC_COMMON_H */ diff --git a/src/lte/model/ff-mac-scheduler.cc b/src/lte/model/ff-mac-scheduler.cc index b3f4d205c..84829b30a 100644 --- a/src/lte/model/ff-mac-scheduler.cc +++ b/src/lte/model/ff-mac-scheduler.cc @@ -21,6 +21,8 @@ #include "ff-mac-scheduler.h" #include +#include + NS_LOG_COMPONENT_DEFINE ("FfMacScheduler"); @@ -29,6 +31,13 @@ namespace ns3 { NS_OBJECT_ENSURE_REGISTERED (FfMacScheduler); +FfMacScheduler::FfMacScheduler () +: m_ulCqiFilter (ALL) +{ + NS_LOG_FUNCTION (this); +} + + FfMacScheduler::~FfMacScheduler () { NS_LOG_FUNCTION (this); @@ -44,10 +53,19 @@ TypeId FfMacScheduler::GetTypeId (void) { static TypeId tid = TypeId ("ns3::FfMacScheduler") - .SetParent (); + .SetParent () + .AddAttribute ("UlCqiFilter", + "The filter to apply on UL CQIs received", + EnumValue (FfMacScheduler::ALL), + MakeEnumAccessor (&FfMacScheduler::m_ulCqiFilter), + MakeEnumChecker (FfMacScheduler::SRS, "SRS", + FfMacScheduler::PUSCH, "PUSCH", + FfMacScheduler::ALL, "ALL")) + ; return tid; } + } // namespace ns3 diff --git a/src/lte/model/ff-mac-scheduler.h b/src/lte/model/ff-mac-scheduler.h index b808b6af6..62e58c0cb 100644 --- a/src/lte/model/ff-mac-scheduler.h +++ b/src/lte/model/ff-mac-scheduler.h @@ -44,6 +44,22 @@ class FfMacSchedSapProvider; class FfMacScheduler : public Object { public: + /** + * The type of UL CQI to be filtered (ALL means accept all the CQI, + * where a new CQI of any type overwrite the old one, even of another type) + * + */ + enum UlCqiFilter_t + { + SRS, + PUSCH, + ALL + }; + /** + * constructor + * + */ + FfMacScheduler (); /** * destructor * @@ -83,6 +99,11 @@ public: */ virtual FfMacSchedSapProvider* GetFfMacSchedSapProvider () = 0; + +protected: + + UlCqiFilter_t m_ulCqiFilter; + }; } // namespace ns3 diff --git a/src/lte/model/lte-enb-mac.cc b/src/lte/model/lte-enb-mac.cc index bdff14fa6..f7290a7ff 100644 --- a/src/lte/model/lte-enb-mac.cc +++ b/src/lte/model/lte-enb-mac.cc @@ -226,7 +226,7 @@ public: virtual void ReceivePhyPdu (Ptr p); virtual void SubframeIndication (uint32_t frameNo, uint32_t subframeNo); virtual void ReceiveLteControlMessage (Ptr msg); - virtual void UlCqiReport (UlCqi_s ulcqi); + virtual void UlCqiReport (FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi); private: LteEnbMac* m_mac; @@ -256,7 +256,7 @@ EnbMacMemberLteEnbPhySapUser::ReceiveLteControlMessage (Ptr m } void -EnbMacMemberLteEnbPhySapUser::UlCqiReport (UlCqi_s ulcqi) +EnbMacMemberLteEnbPhySapUser::UlCqiReport (FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi) { m_mac->DoUlCqiReport (ulcqi); } @@ -407,8 +407,6 @@ LteEnbMac::DoSubframeIndication (uint32_t frameNo, uint32_t subframeNo) // Get downlink transmission opportunities -// uint32_t dlSchedFrameNo = (0x3FF & (m_frameNo >> 4)); -// uint32_t dlSchedSubframeNo = (0xF & m_subframeNo); uint32_t dlSchedFrameNo = m_frameNo; uint32_t dlSchedSubframeNo = m_subframeNo; // NS_LOG_DEBUG (this << " sfn " << frameNo << " sbfn " << subframeNo); @@ -428,32 +426,20 @@ LteEnbMac::DoSubframeIndication (uint32_t frameNo, uint32_t subframeNo) // --- UPLINK --- // Send UL-CQI info to the scheduler - if (m_ulCqiReceived.size () > 0) + std::vector ::iterator itCqi; + for (uint16_t i = 0; i < m_ulCqiReceived.size (); i++) { - FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqiInfoReq; if (subframeNo>1) { - ulcqiInfoReq.m_sfnSf = ((0x3FF & frameNo) << 4) | (0xF & subframeNo); + m_ulCqiReceived.at (i).m_sfnSf = ((0x3FF & frameNo) << 4) | (0xF & subframeNo); } else { - ulcqiInfoReq.m_sfnSf = ((0x3FF & (frameNo-1)) << 4) | (0xF & 10); - } - int cqiNum = m_ulCqiReceived.size (); - if (cqiNum >= 1) - { - ulcqiInfoReq.m_ulCqi = m_ulCqiReceived.at (cqiNum - 1); - if (cqiNum > 1) - { - // empty old ul cqi - while (m_ulCqiReceived.size () > 0) - { - m_ulCqiReceived.pop_back (); - } - } - m_schedSapProvider->SchedUlCqiInfoReq (ulcqiInfoReq); + m_ulCqiReceived.at (i).m_sfnSf = ((0x3FF & (frameNo-1)) << 4) | (0xF & 10); } + m_schedSapProvider->SchedUlCqiInfoReq (m_ulCqiReceived.at (i)); } + m_ulCqiReceived.clear (); // Send BSR reports to the scheduler if (m_ulCeReceived.size () > 0) @@ -477,7 +463,6 @@ LteEnbMac::DoSubframeIndication (uint32_t frameNo, uint32_t subframeNo) } else { -// ulSchedSubframeNo = (ulSchedSubframeNo + (2*m_macChTtiDelay)) % 11; ulSchedSubframeNo = ulSchedSubframeNo + (m_macChTtiDelay+UL_PUSCH_TTIS_DELAY); } FfMacSchedSapProvider::SchedUlTriggerReqParameters ulparams; @@ -494,7 +479,6 @@ LteEnbMac::DoSubframeIndication (uint32_t frameNo, uint32_t subframeNo) // reset UL info - //std::map ::iterator it; for (it = m_ulInfoListElements.begin (); it != m_ulInfoListElements.end (); it++) { for (uint16_t i = 0; i < (*it).second.m_ulReception.size (); i++) @@ -528,9 +512,9 @@ LteEnbMac::DoReceiveLteControlMessage (Ptr msg) void -LteEnbMac::DoUlCqiReport (UlCqi_s ulcqi) +LteEnbMac::DoUlCqiReport (FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi) { - if (ulcqi.m_type == UlCqi_s::PUSCH) + if (ulcqi.m_ulCqi.m_type == UlCqi_s::PUSCH) { NS_LOG_DEBUG (this << " eNB rxed an PUSCH UL-CQI"); } diff --git a/src/lte/model/lte-enb-mac.h b/src/lte/model/lte-enb-mac.h index 31ec14cba..e7f897ce4 100644 --- a/src/lte/model/lte-enb-mac.h +++ b/src/lte/model/lte-enb-mac.h @@ -133,7 +133,7 @@ public: */ void ReceiveBsrMessage (MacCeListElement_s bsr); - void DoUlCqiReport (UlCqi_s ulcqi); + void DoUlCqiReport (FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi); @@ -184,11 +184,10 @@ public: private: private: - // std::map > > m_rlcAttached; std::map m_rlcAttached; std::vector m_dlCqiReceived; // DL-CQI received - std::vector m_ulCqiReceived; // UL-CQI received + std::vector m_ulCqiReceived; // UL-CQI received std::vector m_ulCeReceived; // CE received (BSR up to now) diff --git a/src/lte/model/lte-enb-phy-sap.h b/src/lte/model/lte-enb-phy-sap.h index e84ebcd52..b06897c71 100644 --- a/src/lte/model/lte-enb-phy-sap.h +++ b/src/lte/model/lte-enb-phy-sap.h @@ -25,6 +25,7 @@ #include #include +#include namespace ns3 { @@ -125,7 +126,7 @@ public: * \brief Returns to MAC level the UL-CQI evaluated * \param ulcqi the UL-CQI (see FF MAC API 4.3.29) */ - virtual void UlCqiReport (UlCqi_s ulcqi) = 0; + virtual void UlCqiReport (FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi) = 0; }; diff --git a/src/lte/model/lte-enb-phy.cc b/src/lte/model/lte-enb-phy.cc index 212c14461..14c59b01d 100644 --- a/src/lte/model/lte-enb-phy.cc +++ b/src/lte/model/lte-enb-phy.cc @@ -34,6 +34,7 @@ #include "lte-enb-net-device.h" #include "lte-enb-mac.h" #include +#include NS_LOG_COMPONENT_DEFINE ("LteEnbPhy"); @@ -133,7 +134,8 @@ LteEnbPhy::LteEnbPhy (Ptr dlPhy, Ptr ulPhy) : LtePhy (dlPhy, ulPhy), m_nrFrames (0), m_nrSubFrames (0), - m_srsPeriodicity (0) + m_srsPeriodicity (0), + m_currentSrsOffset (0) { m_enbPhySapProvider = new EnbMemberLteEnbPhySapProvider (this); Simulator::ScheduleNow (&LteEnbPhy::StartFrame, this); @@ -183,6 +185,7 @@ LteEnbPhy::DoDispose () { NS_LOG_FUNCTION (this); m_ueAttached.clear (); + m_srsUeOffset.clear (); delete m_enbPhySapProvider; LtePhy::DoDispose (); } @@ -397,6 +400,7 @@ LteEnbPhy::StartSubFrame (void) NS_LOG_FUNCTION (this); ++m_nrSubFrames; + m_currentSrsOffset = (m_currentSrsOffset + 1) % m_srsPeriodicity; NS_LOG_INFO ("-----sub frame " << m_nrSubFrames << "-----"); @@ -558,7 +562,7 @@ void LteEnbPhy::GenerateCtrlCqiReport (const SpectrumValue& sinr) { NS_LOG_FUNCTION (this << sinr); - UlCqi_s ulcqi = CreateSrsCqiReport (sinr); + FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi = CreateSrsCqiReport (sinr); m_enbPhySapUser->UlCqiReport (ulcqi); } @@ -566,19 +570,19 @@ void LteEnbPhy::GenerateDataCqiReport (const SpectrumValue& sinr) { NS_LOG_FUNCTION (this << sinr); - UlCqi_s ulcqi = CreatePuschCqiReport (sinr); + FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi = CreatePuschCqiReport (sinr); m_enbPhySapUser->UlCqiReport (ulcqi); } -UlCqi_s +FfMacSchedSapProvider::SchedUlCqiInfoReqParameters LteEnbPhy::CreatePuschCqiReport (const SpectrumValue& sinr) { NS_LOG_FUNCTION (this << sinr); Values::const_iterator it; - UlCqi_s ulcqi; - ulcqi.m_type = UlCqi_s::PUSCH; + FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi; + ulcqi.m_ulCqi.m_type = UlCqi_s::PUSCH; int i = 0; for (it = sinr.ConstValuesBegin (); it != sinr.ConstValuesEnd (); it++) { @@ -586,7 +590,7 @@ LteEnbPhy::CreatePuschCqiReport (const SpectrumValue& sinr) // NS_LOG_DEBUG ("ULCQI RB " << i << " value " << sinrdb); // convert from double to fixed point notation Sxxxxxxxxxxx.xxx int16_t sinrFp = LteFfConverter::double2fpS11dot3 (sinrdb); - ulcqi.m_sinr.push_back (sinrFp); + ulcqi.m_ulCqi.m_sinr.push_back (sinrFp); i++; } return (ulcqi); @@ -594,13 +598,13 @@ LteEnbPhy::CreatePuschCqiReport (const SpectrumValue& sinr) } -UlCqi_s +FfMacSchedSapProvider::SchedUlCqiInfoReqParameters LteEnbPhy::CreateSrsCqiReport (const SpectrumValue& sinr) { NS_LOG_FUNCTION (this << sinr); Values::const_iterator it; - UlCqi_s ulcqi; - ulcqi.m_type = UlCqi_s::PUSCH; + FfMacSchedSapProvider::SchedUlCqiInfoReqParameters ulcqi; + ulcqi.m_ulCqi.m_type = UlCqi_s::SRS; int i = 0; for (it = sinr.ConstValuesBegin (); it != sinr.ConstValuesEnd (); it++) { @@ -608,9 +612,17 @@ LteEnbPhy::CreateSrsCqiReport (const SpectrumValue& sinr) // NS_LOG_DEBUG ("ULCQI RB " << i << " value " << sinrdb); // convert from double to fixed point notation Sxxxxxxxxxxx.xxx int16_t sinrFp = LteFfConverter::double2fpS11dot3 (sinrdb); - ulcqi.m_sinr.push_back (sinrFp); + ulcqi.m_ulCqi.m_sinr.push_back (sinrFp); i++; } + // Insert the user generated the srs as a vendor specific parameter + NS_LOG_DEBUG (this << " ENB RX UL-CQI of " << m_srsUeOffset.at (m_currentSrsOffset)); + VendorSpecificListElement_s vsp; + vsp.m_type = SRS_CQI_RNTI_VSP; + vsp.m_length = sizeof(SrsCqiRntiVsp); + Ptr rnti = Create (m_srsUeOffset.at (m_currentSrsOffset)); + vsp.m_value = rnti; + ulcqi.m_vendorSpecificList.push_back (vsp); return (ulcqi); } @@ -655,17 +667,28 @@ void LteEnbPhy::DoSetSrsConfigurationIndex (uint16_t rnti, uint16_t srcCi) { NS_LOG_FUNCTION (this); - m_srsPeriodicity = GetSrsPeriodicity (srcCi); + uint16_t p = GetSrsPeriodicity (srcCi); + if (p!=m_srsPeriodicity) + { + // resize the array of offset -> re-initialize variables + m_srsUeOffset.clear (); + m_srsUeOffset.resize (p, 0); + m_srsPeriodicity = p; + m_currentSrsOffset = p - 1; // for starting from 0 next subframe + } + NS_LOG_DEBUG (this << " ENB SRS P " << m_srsPeriodicity << " RNTI " << rnti << " offset " << GetSrsSubframeOffset (srcCi) << " CI " << srcCi); std::map ::iterator it = m_srsCounter.find (rnti); if (it != m_srsCounter.end ()) { (*it).second = GetSrsSubframeOffset (srcCi) + 1; } - else + else { m_srsCounter.insert (std::pair (rnti, GetSrsSubframeOffset (srcCi) + 1)); } + m_srsUeOffset.at (GetSrsSubframeOffset (srcCi)) = rnti; + } diff --git a/src/lte/model/lte-enb-phy.h b/src/lte/model/lte-enb-phy.h index 5c0396351..f029b556e 100644 --- a/src/lte/model/lte-enb-phy.h +++ b/src/lte/model/lte-enb-phy.h @@ -144,14 +144,14 @@ public: * the physical layer with the PUSCH signal received from eNB * \param sinr SINR values vector */ - UlCqi_s CreatePuschCqiReport (const SpectrumValue& sinr); + FfMacSchedSapProvider::SchedUlCqiInfoReqParameters CreatePuschCqiReport (const SpectrumValue& sinr); /** * \brief Create the UL CQI feedback from SINR values perceived at * the physical layer with the SRS signal received from eNB * \param sinr SINR values vector */ - UlCqi_s CreateSrsCqiReport (const SpectrumValue& sinr); + FfMacSchedSapProvider::SchedUlCqiInfoReqParameters CreateSrsCqiReport (const SpectrumValue& sinr); void DoSendLteControlMessage (Ptr msg); @@ -232,6 +232,8 @@ private: uint16_t m_srsPeriodicity; std::map m_srsCounter; + std::vector m_srsUeOffset; + uint16_t m_currentSrsOffset; }; diff --git a/src/lte/model/pf-ff-mac-scheduler.cc b/src/lte/model/pf-ff-mac-scheduler.cc index a68691069..113709818 100644 --- a/src/lte/model/pf-ff-mac-scheduler.cc +++ b/src/lte/model/pf-ff-mac-scheduler.cc @@ -24,6 +24,7 @@ #include #include #include +#include NS_LOG_COMPONENT_DEFINE ("PfFfMacScheduler"); @@ -290,14 +291,13 @@ PfFfMacScheduler::DoCschedUeConfigReq (const struct FfMacCschedSapProvider::Csch NS_LOG_FUNCTION (this << " RNTI " << params.m_rnti << " txMode " << (uint16_t)params.m_transmissionMode); std::map ::iterator it = m_uesTxMode.find (params.m_rnti); if (it==m_uesTxMode.end ()) - { - m_uesTxMode.insert (std::pair (params.m_rnti, params.m_transmissionMode)); - } + { + m_uesTxMode.insert (std::pair (params.m_rnti, params.m_transmissionMode)); + } else - { - (*it).second = params.m_transmissionMode; - } - return; + { + (*it).second = params.m_transmissionMode; + } return; } @@ -1047,6 +1047,32 @@ PfFfMacScheduler::DoSchedUlCqiInfoReq (const struct FfMacSchedSapProvider::Sched NS_LOG_FUNCTION (this); // NS_LOG_DEBUG (this << " RX SFNID " << params.m_sfnSf); // retrieve the allocation for this subframe + switch (m_ulCqiFilter) + { + case FfMacScheduler::SRS: + { + // filter all the CQIs that are not SRS based + if (params.m_ulCqi.m_type!=UlCqi_s::SRS) + { + return; + } + } + break; + case FfMacScheduler::PUSCH: + { + // filter all the CQIs that are not SRS based + if (params.m_ulCqi.m_type!=UlCqi_s::PUSCH) + { + return; + } + } + case FfMacScheduler::ALL: + break; + + default: + NS_FATAL_ERROR ("Unknown UL CQI type"); + } + std::map >::iterator itMap; std::map >::iterator itCqi; itMap = m_allocationMaps.find (params.m_sfnSf); diff --git a/src/lte/model/rr-ff-mac-scheduler.cc b/src/lte/model/rr-ff-mac-scheduler.cc index 23e3f9b62..b7b8a2d2e 100644 --- a/src/lte/model/rr-ff-mac-scheduler.cc +++ b/src/lte/model/rr-ff-mac-scheduler.cc @@ -850,6 +850,31 @@ RrFfMacScheduler::DoSchedUlCqiInfoReq (const struct FfMacSchedSapProvider::Sched NS_LOG_FUNCTION (this); NS_LOG_DEBUG (this << " RX SFNID " << params.m_sfnSf); // NS_LOG_DEBUG (this << " Actual sfn " << frameNo << " sbfn " << subframeNo << " sfnSf " << sfnSf); + switch (m_ulCqiFilter) + { + case FfMacScheduler::SRS: + { + // filter all the CQIs that are not SRS based + if (params.m_ulCqi.m_type!=UlCqi_s::SRS) + { + return; + } + } + break; + case FfMacScheduler::PUSCH: + { + // filter all the CQIs that are not SRS based + if (params.m_ulCqi.m_type!=UlCqi_s::PUSCH) + { + return; + } + } + case FfMacScheduler::ALL: + break; + + default: + NS_FATAL_ERROR ("Unknown UL CQI type"); + } // retrieve the allocation for this subframe std::map >::iterator itMap; std::map >::iterator itCqi; diff --git a/src/lte/wscript b/src/lte/wscript index 6a91c615e..30d15b0cb 100644 --- a/src/lte/wscript +++ b/src/lte/wscript @@ -41,6 +41,7 @@ def build(bld): 'helper/radio-environment-map-helper.cc', 'helper/lte-hex-grid-enb-topology-helper.cc', 'model/rem-spectrum-phy.cc', + 'model/ff-mac-common.cc', 'model/ff-mac-csched-sap.cc', 'model/ff-mac-sched-sap.cc', 'model/lte-mac-sap.cc', @@ -63,7 +64,8 @@ def build(bld): 'model/epc-sgw-pgw-application.cc', 'model/epc-tft.cc', 'model/epc-tft-classifier.cc', - 'model/lte-mi-error-model.cc' + 'model/lte-mi-error-model.cc', + 'model/lte-vendor-specific-parameters.cc' ] module_test = bld.create_ns3_module_test_library('lte') @@ -157,6 +159,7 @@ def build(bld): 'model/epc-gtpu-header.h', 'model/epc-enb-application.h', 'model/epc-sgw-pgw-application.h', + 'model/lte-vendor-specific-parameters.h', 'test/lte-test-downlink-sinr.h', 'test/lte-test-uplink-sinr.h', 'test/lte-test-link-adaptation.h',