merge
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ()
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user