This commit is contained in:
Manuel Requena
2012-12-20 18:09:40 +01:00
11 changed files with 425 additions and 61 deletions

View File

@@ -873,6 +873,12 @@ UeManager::RecvRrcConnectionReestablishmentComplete (LteRrcSap::RrcConnectionRee
SwitchToState (CONNECTED_NORMALLY);
}
void
UeManager::RecvMeasurementReport (LteRrcSap::MeasurementReport msg)
{
NS_LOG_FUNCTION (this);
}
// methods forwarded from CMAC SAP
@@ -1435,6 +1441,12 @@ LteEnbRrc::DoRecvRrcConnectionReestablishmentComplete (uint16_t rnti, LteRrcSap:
GetUeManager (rnti)->RecvRrcConnectionReestablishmentComplete (msg);
}
void
LteEnbRrc::DoRecvMeasurementReport (uint16_t rnti, LteRrcSap::MeasurementReport msg)
{
NS_LOG_FUNCTION (this << rnti);
GetUeManager (rnti)->RecvMeasurementReport (msg);
}
void
LteEnbRrc::DoDataRadioBearerSetupRequest (EpcEnbS1SapUser::DataRadioBearerSetupRequestParameters request)

View File

@@ -233,6 +233,7 @@ public:
void RecvRrcConnectionReconfigurationCompleted (LteRrcSap::RrcConnectionReconfigurationCompleted msg);
void RecvRrcConnectionReestablishmentRequest (LteRrcSap::RrcConnectionReestablishmentRequest msg);
void RecvRrcConnectionReestablishmentComplete (LteRrcSap::RrcConnectionReestablishmentComplete msg);
void RecvMeasurementReport (LteRrcSap::MeasurementReport msg);
// methods forwarded from CMAC SAP
@@ -597,6 +598,7 @@ private:
void DoRecvRrcConnectionReconfigurationCompleted (uint16_t rnti, LteRrcSap::RrcConnectionReconfigurationCompleted msg);
void DoRecvRrcConnectionReestablishmentRequest (uint16_t rnti, LteRrcSap::RrcConnectionReestablishmentRequest msg);
void DoRecvRrcConnectionReestablishmentComplete (uint16_t rnti, LteRrcSap::RrcConnectionReestablishmentComplete msg);
void DoRecvMeasurementReport (uint16_t rnti, LteRrcSap::MeasurementReport msg);
// S1 SAP methods

View File

@@ -389,23 +389,11 @@ RrcAsn1Header::SerializeSystemInformationBlockType1 (LteRrcSap::SystemInformatio
// Serialize plmn-IdentityList
SerializeSequenceOf (1,6,1);
// PLMN-IdentityInfo
SerializeSequence (std::bitset<0> (),false);
// plmn-Identity sequence, mcc is optional, no extension marker
SerializeSequence (std::bitset<1> (0), false);
// Serialize mnc
int x = systemInformationBlockType1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity;
int nDig = (x > 99) ? 3 : 2;
SerializeSequenceOf (nDig,3,2);
for (int i = nDig - 1; i >= 0; i--)
{
int n = floor (x / pow (10,i));
SerializeInteger (n,0,9);
x -= n * pow (10,i);
}
// cellReservedForOperatorUse
SerializeEnum (2,0);
SerializePlmnIdentity (systemInformationBlockType1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity);
// Serialize trackingAreaCode
SerializeBitstring (std::bitset<16> (0));
@@ -534,6 +522,112 @@ RrcAsn1Header::SerializeSystemInformationBlockType2 () const
SerializeEnum (8,0);
}
void
RrcAsn1Header::SerializeMeasResults (LteRrcSap::MeasResults measResults) const
{
// Watchdog: if list has 0 elements, set boolean to false
if(measResults.measResultListEutra.empty())
{
measResults.haveMeasResultNeighCells = false;
}
// Serialize MeasResults sequence, 1 optional value, extension marker present
SerializeSequence(std::bitset<1>(measResults.haveMeasResultNeighCells),true);
// Serialize measId
SerializeInteger(measResults.measId,1,MAX_MEAS_ID);
// Serialize measResultServCell sequence
SerializeSequence(std::bitset<0>(0),false);
// Serialize rsrpResult
SerializeInteger(measResults.rsrpResult,0,97);
// Serialize rsrqResult
SerializeInteger(measResults.rsrqResult,0,34);
if(measResults.haveMeasResultNeighCells)
{
// Serialize Choice = 0 (MeasResultListEUTRA)
SerializeChoice (4,0);
// Serialize measResultNeighCells
SerializeSequenceOf(measResults.measResultListEutra.size(),MAX_CELL_REPORT,1);
// serialize MeasResultEutra elements in the list
std::list<LteRrcSap::MeasResultEutra>::iterator it;
for (it = measResults.measResultListEutra.begin(); it != measResults.measResultListEutra.end(); it++)
{
SerializeSequence (std::bitset<1> (it->haveCgiInfo),false);
// Serialize PhysCellId
SerializeInteger (it->physCellId, 0, 503);
// Serialize CgiInfo
if(it->haveCgiInfo)
{
SerializeSequence (std::bitset<1>(it->cgiInfo.plmnIdentityList.size()),false);
// Serialize cellGlobalId
SerializeSequence (std::bitset<0>(0),false);
SerializePlmnIdentity(it->cgiInfo.plmnIdentity);
SerializeBitstring (std::bitset<28>(it->cgiInfo.cellIdentity));
// Serialize trackingAreaCode
SerializeBitstring (std::bitset<16>(it->cgiInfo.trackingAreaCode));
// Serialize plmn-IdentityList
if(!it->cgiInfo.plmnIdentityList.empty())
{
SerializeSequenceOf(it->cgiInfo.plmnIdentityList.size(),5,1);
std::list<uint32_t>::iterator it2;
for (it2 = it->cgiInfo.plmnIdentityList.begin(); it2 != it->cgiInfo.plmnIdentityList.end(); it2++)
{
SerializePlmnIdentity(*it2);
}
}
}
// Serialize measResult
std::bitset<2> measResultFieldsPresent;
measResultFieldsPresent[1] = it->haveRsrpResult;
measResultFieldsPresent[0] = it->haveRsrqResult;
SerializeSequence(measResultFieldsPresent,true);
if(it->haveRsrpResult)
{
SerializeInteger (it->rsrpResult,0,97);
}
if(it->haveRsrqResult)
{
SerializeInteger (it->rsrqResult,0,34);
}
}
}
}
void
RrcAsn1Header::SerializePlmnIdentity (uint32_t plmnId) const
{
// plmn-Identity sequence, mcc is optional, no extension marker
SerializeSequence (std::bitset<1> (0), false);
// Serialize mnc
int nDig = (plmnId > 99) ? 3 : 2;
SerializeSequenceOf (nDig,3,2);
for (int i = nDig - 1; i >= 0; i--)
{
int n = floor (plmnId / pow (10,i));
SerializeInteger (n,0,9);
plmnId -= n * pow (10,i);
}
// cellReservedForOperatorUse
SerializeEnum (2,0);
}
Buffer::Iterator
RrcAsn1Header::DeserializeRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedicated *radioResourceConfigDedicated, Buffer::Iterator bIterator)
{
@@ -1053,27 +1147,7 @@ RrcAsn1Header::DeserializeSystemInformationBlockType1 (LteRrcSap::SystemInformat
bIterator = DeserializeSequence (&bitset0,false,bIterator);
// plmn-Identity
std::bitset<1> isMccPresent;
bIterator = DeserializeSequence (&isMccPresent,false,bIterator);
if (isMccPresent[0])
{
// Deserialize mcc
// ...
}
// Deserialize mnc
int mncDigits;
int mnc = 0;
bIterator = DeserializeSequenceOf (&mncDigits,3,2,bIterator);
for (int j = mncDigits - 1; j >= 0; j--)
{
bIterator = DeserializeInteger (&n,0,9,bIterator);
mnc += n * pow (10,j);
}
systemInformationBlockType1->cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity = mnc;
// cellReservedForOperatorUse
bIterator = DeserializeEnum (2,&n,bIterator);
bIterator = DeserializePlmnIdentity(&systemInformationBlockType1->cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity,bIterator);
}
// Deserialize trackingAreaCode
@@ -1456,6 +1530,44 @@ RrcAsn1Header::DeserializeRadioResourceConfigCommonSib (Buffer::Iterator bIterat
return bIterator;
}
Buffer::Iterator
RrcAsn1Header::DeserializeMeasResults (LteRrcSap::MeasResults *measResults, Buffer::Iterator bIterator)
{
// TODO
return bIterator;
}
Buffer::Iterator
RrcAsn1Header::DeserializePlmnIdentity (uint32_t *plmnId, Buffer::Iterator bIterator)
{
int n;
std::bitset<1> isMccPresent;
bIterator = DeserializeSequence (&isMccPresent,false,bIterator);
if (isMccPresent[0])
{
// Deserialize mcc
// ...
}
// Deserialize mnc
int mncDigits;
int mnc = 0;
bIterator = DeserializeSequenceOf (&mncDigits,3,2,bIterator);
for (int j = mncDigits - 1; j >= 0; j--)
{
bIterator = DeserializeInteger (&n,0,9,bIterator);
mnc += n * pow (10,j);
}
*plmnId = mnc;
// cellReservedForOperatorUse
bIterator = DeserializeEnum (2,&n,bIterator);
return bIterator;
}
//////////////////// RrcConnectionRequest class ////////////////////////
// Constructor
@@ -1900,11 +2012,10 @@ uint32_t
RrcConnectionReconfigurationCompleteHeader::Deserialize (Buffer::Iterator bIterator)
{
std::bitset<0> bitset0;
bIterator = DeserializeSequence (&bitset0,false,bIterator);
int n;
bIterator = DeserializeUlDcchMessage (bIterator);
bIterator = DeserializeSequence (&bitset0,false,bIterator);
bIterator = DeserializeInteger (&n,0,3,bIterator);
m_rrcTransactionIdentifier = n;
@@ -3486,6 +3597,111 @@ RrcConnectionRejectHeader::GetMessage () const
return m_rrcConnectionReject;
}
//////////////////// MeasurementReportHeader class ////////////////////////
MeasurementReportHeader::MeasurementReportHeader ()
{
}
void
MeasurementReportHeader::PreSerialize () const
{
m_serializationResult = Buffer ();
// Serialize DCCH message
SerializeUlDcchMessage (1);
// Serialize MeasurementReport sequence:
// no default or optional fields. Extension marker not present.
SerializeSequence<0> (std::bitset<0> (),false);
// Serialize criticalExtensions choice:
// c1 chosen
SerializeChoice (2,0);
// Serialize c1 choice
// measurementReport-r8 chosen
SerializeChoice (8,0);
// Serialize MeasurementReport-r8-IEs sequence:
// 1 optional fields, not present. Extension marker not present.
SerializeSequence<1> (std::bitset<1> (0),false);
// Serialize measResults
SerializeMeasResults (m_measurementReport.measResults);
// Finish serialization
FinalizeSerialization ();
}
uint32_t
MeasurementReportHeader::Deserialize (Buffer::Iterator bIterator)
{
std::bitset<0> bitset0;
bIterator = DeserializeSequence (&bitset0,false,bIterator);
bIterator = DeserializeUlDcchMessage (bIterator);
int criticalExtensionsChoice;
bIterator = DeserializeChoice (2,&criticalExtensionsChoice,bIterator);
if (criticalExtensionsChoice == 1)
{
// Deserialize criticalExtensionsFuture
bIterator = DeserializeSequence (&bitset0,false,bIterator);
}
else if (criticalExtensionsChoice == 0)
{
// Deserialize c1
int c1Choice;
bIterator = DeserializeChoice (8,&c1Choice,bIterator);
if(c1Choice>0)
{
bIterator = DeserializeNull(bIterator);
}
else
{
// Deserialize measurementReport-r8
std::bitset<1> isNonCriticalExtensionPresent;
bIterator = DeserializeSequence(&isNonCriticalExtensionPresent,false,bIterator);
// Deserialize measResults
bIterator = DeserializeMeasResults (&m_measurementReport.measResults, bIterator);
if(isNonCriticalExtensionPresent[0])
{
// Deserialize nonCriticalExtension MeasurementReport-v8a0-IEs
// ...
}
}
}
return GetSerializedSize ();
}
void
MeasurementReportHeader::Print (std::ostream &os) const
{
// TODO
}
void
MeasurementReportHeader::SetMessage (MeasurementReport msg)
{
m_measurementReport = msg;
m_isDataSerialized = false;
}
LteRrcSap::MeasurementReport
MeasurementReportHeader::GetMessage () const
{
MeasurementReport msg;
msg = m_measurementReport;
return msg;
}
/////////////////// RrcUlDcchMessage //////////////////////////////////
uint32_t

View File

@@ -51,6 +51,8 @@ protected:
void SerializeSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 systemInformationBlockType1) const;
void SerializeSystemInformationBlockType2 () const;
void SerializeRadioResourceConfigCommonSIB () const;
void SerializeMeasResults (LteRrcSap::MeasResults measResults) const;
void SerializePlmnIdentity (uint32_t plmnId) const;
// Deserialization functions
Buffer::Iterator DeserializeDrbToAddModList (std::list<LteRrcSap::DrbToAddMod> *drbToAddModLis, Buffer::Iterator bIterator);
@@ -62,6 +64,8 @@ protected:
Buffer::Iterator DeserializeSystemInformationBlockType2 (Buffer::Iterator bIterator);
Buffer::Iterator DeserializeRadioResourceConfigCommon (Buffer::Iterator bIterator);
Buffer::Iterator DeserializeRadioResourceConfigCommonSib (Buffer::Iterator bIterator);
Buffer::Iterator DeserializeMeasResults (LteRrcSap::MeasResults *measResults, Buffer::Iterator bIterator);
Buffer::Iterator DeserializePlmnIdentity (uint32_t *plmnId, Buffer::Iterator bIterator);
void Print (std::ostream &os, LteRrcSap::RadioResourceConfigDedicated radioResourceConfigDedicated) const;
@@ -395,6 +399,25 @@ private:
RrcConnectionReject m_rrcConnectionReject;
};
/**
* This class manages the serialization/deserialization of MeasurementReport IE
*/
class MeasurementReportHeader : public RrcUlDcchMessage,
LteRrcSap
{
public:
MeasurementReportHeader ();
void PreSerialize () const;
uint32_t Deserialize (Buffer::Iterator bIterator);
void Print (std::ostream &os) const;
void SetMessage (MeasurementReport msg);
MeasurementReport GetMessage () const;
private:
MeasurementReport m_measurementReport;
};
} // namespace ns3
#endif // EPC_ASN1_HEADER_H

View File

@@ -179,6 +179,15 @@ LteUeRrcProtocolIdeal::DoSendRrcConnectionReestablishmentComplete (LteRrcSap::Rr
msg);
}
void
LteUeRrcProtocolIdeal::DoSendMeasurementReport (LteRrcSap::MeasurementReport msg)
{
Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
&LteEnbRrcSapProvider::RecvMeasurementReport,
m_enbRrcSapProvider,
m_rnti,
msg);
}
void
LteUeRrcProtocolIdeal::SetEnbRrcSapProvider ()

View File

@@ -72,6 +72,7 @@ private:
void DoSendRrcConnectionReconfigurationCompleted (LteRrcSap::RrcConnectionReconfigurationCompleted msg);
void DoSendRrcConnectionReestablishmentRequest (LteRrcSap::RrcConnectionReestablishmentRequest msg);
void DoSendRrcConnectionReestablishmentComplete (LteRrcSap::RrcConnectionReestablishmentComplete msg);
void DoSendMeasurementReport (LteRrcSap::MeasurementReport msg);
void SetEnbRrcSapProvider ();

View File

@@ -200,6 +200,29 @@ LteUeRrcProtocolReal::DoSendRrcConnectionReconfigurationCompleted (LteRrcSap::Rr
m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
}
void
LteUeRrcProtocolReal::DoSendMeasurementReport (LteRrcSap::MeasurementReport msg)
{
// re-initialize the RNTI and get the EnbLteRrcSapProvider for the
// eNB we are currently attached to
m_rnti = m_rrc->GetRnti ();
SetEnbRrcSapProvider ();
Ptr<Packet> packet = Create<Packet> ();
MeasurementReportHeader measurementReportHeader;
measurementReportHeader.SetMessage (msg);
packet->AddHeader (measurementReportHeader);
LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
transmitPdcpSduParameters.pdcpSdu = packet;
transmitPdcpSduParameters.rnti = m_rnti;
transmitPdcpSduParameters.lcid = 1;
m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
}
void
LteUeRrcProtocolReal::DoSendRrcConnectionReestablishmentRequest (LteRrcSap::RrcConnectionReestablishmentRequest msg)
{
@@ -714,28 +737,37 @@ LteEnbRrcProtocolReal::DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameter
params.pdcpSdu->PeekHeader (rrcUlDcchMessage);
// Declare possible headers to receive
MeasurementReportHeader measurementReportHeader;
RrcConnectionReconfigurationCompleteHeader rrcConnectionReconfigurationCompleteHeader;
RrcConnectionReestablishmentCompleteHeader rrcConnectionReestablishmentCompleteHeader;
RrcConnectionSetupCompleteHeader rrcConnectionSetupCompleteHeader;
// Declare possible messages to receive
LteRrcSap::MeasurementReport measurementReportMsg;
LteRrcSap::RrcConnectionReconfigurationCompleted rrcConnectionReconfigurationCompleteMsg;
LteRrcSap::RrcConnectionReestablishmentComplete rrcConnectionReestablishmentCompleteMsg;
LteRrcSap::RrcConnectionSetupCompleted rrcConnectionSetupCompletedMsg;
// Deserialize packet and call member recv function with appropiate structure
switch ( rrcUlDcchMessage.GetMessageType () )
{
case 1:
params.pdcpSdu->RemoveHeader (measurementReportHeader);
measurementReportMsg = measurementReportHeader.GetMessage ();
m_enbRrcSapProvider->RecvMeasurementReport (params.rnti,measurementReportMsg);
break;
case 2:
params.pdcpSdu->RemoveHeader (rrcConnectionReconfigurationCompleteHeader);
LteRrcSap::RrcConnectionReconfigurationCompleted rrcConnectionReconfigurationCompleteMsg;
rrcConnectionReconfigurationCompleteMsg = rrcConnectionReconfigurationCompleteHeader.GetMessage ();
m_enbRrcSapProvider->RecvRrcConnectionReconfigurationCompleted (params.rnti,rrcConnectionReconfigurationCompleteMsg);
break;
case 3:
params.pdcpSdu->RemoveHeader (rrcConnectionReestablishmentCompleteHeader);
LteRrcSap::RrcConnectionReestablishmentComplete rrcConnectionReestablishmentCompleteMsg;
rrcConnectionReestablishmentCompleteMsg = rrcConnectionReestablishmentCompleteHeader.GetMessage ();
m_enbRrcSapProvider->RecvRrcConnectionReestablishmentComplete (params.rnti,rrcConnectionReestablishmentCompleteMsg);
break;
case 4:
params.pdcpSdu->RemoveHeader (rrcConnectionSetupCompleteHeader);
LteRrcSap::RrcConnectionSetupCompleted rrcConnectionSetupCompletedMsg;
rrcConnectionSetupCompletedMsg = rrcConnectionSetupCompleteHeader.GetMessage ();
m_enbRrcSapProvider->RecvRrcConnectionSetupCompleted (params.rnti, rrcConnectionSetupCompletedMsg);
break;

View File

@@ -76,6 +76,7 @@ private:
void DoSendRrcConnectionReconfigurationCompleted (LteRrcSap::RrcConnectionReconfigurationCompleted msg);
void DoSendRrcConnectionReestablishmentRequest (LteRrcSap::RrcConnectionReestablishmentRequest msg);
void DoSendRrcConnectionReestablishmentComplete (LteRrcSap::RrcConnectionReestablishmentComplete msg);
void DoSendMeasurementReport (LteRrcSap::MeasurementReport msg);
void SetEnbRrcSapProvider ();
void DoReceivePdcpPdu (Ptr<Packet> p);

View File

@@ -383,19 +383,22 @@ public:
uint16_t sourceDlCarrierFreq;
};
struct CellGlobalIdEutra
struct CgiInfo
{
uint32_t plmnIdentity;
uint32_t cellIdentity;
uint16_t trackingAreaCode;
std::list<uint32_t> plmnIdentityList;
};
struct MeasResultEutra
{
uint16_t physCellId;
CellGlobalIdEutra cellGlobalId;
uint16_t trackingAreaCode;
std::list<uint32_t> plmnIdentityList;
bool haveCgiInfo;
CgiInfo cgiInfo;
bool haveRsrpResult;
uint8_t rsrpResult;
bool haveRsrqResult;
uint8_t rsrqResult;
};
@@ -404,7 +407,8 @@ public:
uint8_t measId;
uint8_t rsrpResult;
uint8_t rsrqResult;
std::list<MeasResultEutra> MeasResultListEutra;
bool haveMeasResultNeighCells;
std::list<MeasResultEutra> measResultListEutra;
};
@@ -601,6 +605,7 @@ public:
virtual void RecvRrcConnectionReconfigurationCompleted (uint16_t rnti, RrcConnectionReconfigurationCompleted msg) = 0;
virtual void RecvRrcConnectionReestablishmentRequest (uint16_t rnti, RrcConnectionReestablishmentRequest msg) = 0;
virtual void RecvRrcConnectionReestablishmentComplete (uint16_t rnti, RrcConnectionReestablishmentComplete msg) = 0;
virtual void RecvMeasurementReport (uint16_t rnti, MeasurementReport msg) = 0;
};
@@ -979,6 +984,7 @@ public:
virtual void RecvRrcConnectionReconfigurationCompleted (uint16_t rnti, RrcConnectionReconfigurationCompleted msg);
virtual void RecvRrcConnectionReestablishmentRequest (uint16_t rnti, RrcConnectionReestablishmentRequest msg);
virtual void RecvRrcConnectionReestablishmentComplete (uint16_t rnti, RrcConnectionReestablishmentComplete msg);
virtual void RecvMeasurementReport (uint16_t rnti, MeasurementReport msg);
private:
MemberLteEnbRrcSapProvider ();
@@ -1038,6 +1044,12 @@ MemberLteEnbRrcSapProvider<C>::RecvRrcConnectionReestablishmentComplete (uint16_
Simulator::ScheduleNow (&C::DoRecvRrcConnectionReestablishmentComplete, m_owner, rnti, msg);
}
template <class C>
void
MemberLteEnbRrcSapProvider<C>::RecvMeasurementReport (uint16_t rnti, MeasurementReport msg)
{
Simulator::ScheduleNow (&C::DoRecvMeasurementReport, m_owner, rnti, msg);
}

View File

@@ -1508,9 +1508,9 @@ PfFfMacScheduler::DoSchedUlTriggerReq (const struct FfMacSchedSapProvider::Sched
// Divide the remaining resources equally among the active users starting from the subsequent one served last scheduling trigger
uint16_t rbPerFlow = (m_cschedCellConfig.m_ulBandwidth) / (nflows + rntiAllocated.size ());
if (rbPerFlow == 0)
if (rbPerFlow < 3)
{
rbPerFlow = 1; // at least 1 rbg per flow (till available resource)
rbPerFlow = 3; // at least 3 rbg per flow (till available resource) to ensure TxOpportunity >= 7 bytes
}
int rbAllocated = 0;
@@ -1552,6 +1552,12 @@ PfFfMacScheduler::DoSchedUlTriggerReq (const struct FfMacSchedSapProvider::Sched
{
// limit to physical resources last resource assignment
rbPerFlow = m_cschedCellConfig.m_ulBandwidth - rbAllocated;
// at least 3 rbg per flow to ensure TxOpportunity >= 7 bytes
if (rbPerFlow < 3)
{
// terminate allocation
rbPerFlow = 0;
}
}
UlDciListElement_s uldci;
@@ -1590,11 +1596,18 @@ PfFfMacScheduler::DoSchedUlTriggerReq (const struct FfMacSchedSapProvider::Sched
{
// limit to physical resources last resource assignment
rbPerFlow = m_cschedCellConfig.m_ulBandwidth - rbAllocated;
// at least 3 rbg per flow to ensure TxOpportunity >= 7 bytes
if (rbPerFlow < 3)
{
// terminate allocation
rbPerFlow = 0;
}
}
}
if (!allocated)
{
// unable to allocate new resource: finish scheduling
m_nextRntiUl = (*it).first;
if (ret.m_dciList.size () > 0)
{
m_schedSapUser->SchedUlConfigInd (ret);
@@ -1705,7 +1718,7 @@ PfFfMacScheduler::DoSchedUlTriggerReq (const struct FfMacSchedSapProvider::Sched
// restart from the first
it = m_ceBsrRxed.begin ();
}
if (rbAllocated == m_cschedCellConfig.m_ulBandwidth)
if ((rbAllocated == m_cschedCellConfig.m_ulBandwidth) || (rbPerFlow == 0))
{
// Stop allocation: no more PRBs
m_nextRntiUl = (*it).first;

View File

@@ -71,13 +71,22 @@ LenaTestPfFfMacSchedulerSuite::LenaTestPfFfMacSchedulerSuite ()
// 1 user -> 25 PRB at Itbs 26 -> 2292 -> 2292000 bytes/sec
// 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 bytes/sec
// 6 users -> 4 PRB at Itbs 26 -> 373 -> 373000 bytes/sec
// before the patch enforcing min 3 PRBs per UE:
// 12 users -> 2 PRB at Itbs 26 -> 185 -> 185000 bytes/sec
// 15 users -> 1 PRB at Itbs 26 -> 89 -> 89000 bytes/sec
// after the patch enforcing min 3 PRBs per UE:
// 12 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/12 UE/TTI -> 184670 bytes/sec
// 15 users -> 3 PRB at Itbs 26 -> 277 bytes * 8/15 UE/TTI -> 147730 bytes/sec
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (1,0,0,2196000,2292000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (3,0,0,732000,749000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (6,0,0,366000,373000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,0,183000,185000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,0,146400,89000));
// before the patch enforcing min 3 PRBs per UE:
//AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,0,183000,185000));
//AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,0,146400,89000));
// after the patch enforcing min 3 PRBs per UE:
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,0,183000,184670));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,0,146400,147730));
// DOWNLINK - DISTANCE 3000 -> MCS 24 -> Itbs 30 (from table 7.1.7.2.1-1 of 36.213)
// 1 user -> 24 PRB at Itbs 20 -> 1383 -> 1383000 bytes/sec
@@ -89,14 +98,22 @@ LenaTestPfFfMacSchedulerSuite::LenaTestPfFfMacSchedulerSuite ()
// 1 user -> 25 PRB at Itbs 18 -> 1239 -> 1239000 bytes/sec
// 3 users -> 8 PRB at Itbs 18 -> 389 -> 389000 bytes/sec
// 6 users -> 4 PRB at Itbs 18 -> 193 -> 193000 bytes/sec
// before the patch enforcing min 3 PRBs per UE:
// 12 users -> 2 PRB at Itbs 18 -> 97 -> 97000 bytes/sec
// 15 users -> 1 PRB at Itbs 18 -> 47 -> 47000 bytes/sec
// after the patch enforcing min 3 PRBs per UE:
// 12 users -> 3 PRB at Itbs 18 -> 145 bytes * 8/12 UE/TTI -> 96667 bytes/sec
// 15 users -> 3 PRB at Itbs 18 -> 145 bytes * 8/15 UE/TTI -> 77333 bytes/sec
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (1,0,3000,1383000,1239000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (3,0,3000,461000,389000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (6,0,3000,230500,193000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,3000,115250,97000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,3000,92200,47000));
// before the patch enforcing min 3 PRBs per UE:
//AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,3000,115250,97000));
//AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,3000,92200,47000));
// after the patch enforcing min 3 PRBs per UE:
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,3000,115250,96667));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,3000,92200,77333));
// DOWNLINK - DISTANCE 6000 -> MCS 16 -> Itbs 15 (from table 7.1.7.2.1-1 of 36.213)
// 1 user -> 24 PRB at Itbs 15 -> 903 -> 903000 bytes/sec
// 3 users -> 903000 among 3 users -> 301000 bytes/sec
@@ -107,14 +124,22 @@ LenaTestPfFfMacSchedulerSuite::LenaTestPfFfMacSchedulerSuite ()
// 1 user -> 25 PRB at Itbs 11 -> 621 -> 621000 bytes/sec
// 3 users -> 8 PRB at Itbs 11 -> 201 -> 201000 bytes/sec
// 6 users -> 4 PRB at Itbs 11 -> 97 -> 97000 bytes/sec
// before the patch enforcing min 3 PRBs per UE:
// 12 users -> 2 PRB at Itbs 11 -> 47 -> 47000 bytes/sec
// 15 users -> 1 PRB at Itbs 11 -> 22 -> 22000 bytes/sec
// after the patch enforcing min 3 PRBs per UE:
// 12 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/12 UE/TTI -> 48667 bytes/sec
// 15 users -> 3 PRB at Itbs 11 -> 73 bytes * 8/15 UE/TTI -> 38993 bytes/sec
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (1,0,6000,903000,621000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (3,0,6000,301000,201000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (6,0,6000,150500,97000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,6000,75250,47000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,6000,60200,22000));
// before the patch enforcing min 3 PRBs per UE:
//AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,6000,75250,47000));
//AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,6000,60200,22000));
// after the patch enforcing min 3 PRBs per UE:
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,6000,75250,48667));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,6000,60200,38993));
// DOWNLINK - DISTANCE 9000 -> MCS 12 -> Itbs 11 (from table 7.1.7.2.1-1 of 36.213)
// 1 user -> 24 PRB at Itbs 11 -> 597 -> 597000 bytes/sec
// 3 users -> 597000 among 3 users -> 199000 bytes/sec
@@ -125,13 +150,21 @@ LenaTestPfFfMacSchedulerSuite::LenaTestPfFfMacSchedulerSuite ()
// 1 user -> 24 PRB at Itbs 8 -> 437 -> 437000 bytes/sec
// 3 users -> 8 PRB at Itbs 8 -> 137 -> 137000 bytes/sec
// 6 users -> 4 PRB at Itbs 8 -> 67 -> 67000 bytes/sec
// before the patch enforcing min 3 PRBs per UE:
// 12 users -> 2 PRB at Itbs 8 -> 32 -> 32000 bytes/sec
// 15 users -> 1 PRB at Itbs 8 -> 15 -> 15000 bytes/sec
// after the patch enforcing min 3 PRBs per UE:
// 12 users -> 3 PRB at Itbs 8 -> 49 bytes * 8/12 UE/TTI -> 32667 bytes/sec
// 15 users -> 3 PRB at Itbs 8 -> 49 bytes * 8/15 UE/TTI -> 26133 bytes/sec
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (1,0,9000,597000,437000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (3,0,9000,199000,137000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (6,0,9000,99500,67000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,9000,49750,32000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,9000,39800,15000));
// before the patch enforcing min 3 PRBs per UE:
//AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,9000,49750,32000));
//AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,9000,39800,15000));
// after the patch enforcing min 3 PRBs per UE:
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,9000,49750,32667));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,9000,39800,26133));
// DONWLINK - DISTANCE 15000 -> MCS 6 -> Itbs 6 (from table 7.1.7.2.1-1 of 36.213)
// 1 user -> 24 PRB at Itbs 6 -> 309 -> 309000 bytes/sec
@@ -143,13 +176,23 @@ LenaTestPfFfMacSchedulerSuite::LenaTestPfFfMacSchedulerSuite ()
// 1 user -> 25 PRB at Itbs 6 -> 233 -> 233000 bytes/sec
// 3 users -> 8 PRB at Itbs 6 -> 69 -> 69000 bytes/sec
// 6 users -> 4 PRB at Itbs 6 -> 32 -> 32000 bytes/sec
// before the patch enforcing min 3 PRBs per UE:
// 12 users -> 2 PRB at Itbs 6 -> 15 -> 15000 bytes/sec
// 15 users -> 1 PRB at Itbs 6 -> 7 -> 7000 bytes/sec
// after the patch enforcing min 3 PRBs per UE:
// NOTE: MCS 4 was actually found to be used
// 12 users -> 3 PRB at Itbs 4 -> 26 bytes * 8/12 UE/TTI -> 17333 bytes/sec
// 15 users -> 3 PRB at Itbs 4 -> 26 bytes * 8/15 UE/TTI -> 13867 bytes/sec
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (1,0,15000,309000,233000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (3,0,15000,103000,69000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (6,0,15000,51500,32000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,15000,25750,15000));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,15000,20600,7000));
// before the patch enforcing min 3 PRBs per UE:
//AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,15000,25750,15000));
//AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,15000,20600,7000));
// after the patch enforcing min 3 PRBs per UE:
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (12,0,15000,25750,17333));
AddTestCase (new LenaPfFfMacSchedulerTestCase1 (15,0,15000,20600,13867));
// Test Case 2: fairness check
@@ -212,7 +255,7 @@ LenaPfFfMacSchedulerTestCase1::DoRun (void)
Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
Config::SetDefault ("ns3::LteAmc::AmcModel", EnumValue (LteAmc::PiroEW2010));
Config::SetDefault ("ns3::LteAmc::Ber", DoubleValue (0.00005));
Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (false));
Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
/**
* Initialize Simulation Scenario: 1 eNB and m_nUser UEs