From f7a995ac7ed272eed4ba949c95ba5c91cec14e4d Mon Sep 17 00:00:00 2001 From: Nicola Baldo Date: Thu, 20 Dec 2012 12:33:19 +0100 Subject: [PATCH 1/3] enforce at least 3RBs per UE in UL of PF scheduler --- src/lte/model/pf-ff-mac-scheduler.cc | 19 +++++- src/lte/test/lte-test-pf-ff-mac-scheduler.cc | 69 ++++++++++++++++---- 2 files changed, 72 insertions(+), 16 deletions(-) diff --git a/src/lte/model/pf-ff-mac-scheduler.cc b/src/lte/model/pf-ff-mac-scheduler.cc index 5994a8441..eed51ab8b 100644 --- a/src/lte/model/pf-ff-mac-scheduler.cc +++ b/src/lte/model/pf-ff-mac-scheduler.cc @@ -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; diff --git a/src/lte/test/lte-test-pf-ff-mac-scheduler.cc b/src/lte/test/lte-test-pf-ff-mac-scheduler.cc index 26798e0d4..10a2dfd12 100644 --- a/src/lte/test/lte-test-pf-ff-mac-scheduler.cc +++ b/src/lte/test/lte-test-pf-ff-mac-scheduler.cc @@ -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 From 72c7e17ee8eec6c1393eb6a5251cf1ffea39c013 Mon Sep 17 00:00:00 2001 From: Lluis Parcerisa Date: Thu, 20 Dec 2012 12:45:16 +0100 Subject: [PATCH 2/3] Add MeasurementReport to Send/Rcv functions in real and ideal protocol. --- src/lte/model/lte-enb-rrc.cc | 12 ++++ src/lte/model/lte-enb-rrc.h | 2 + src/lte/model/lte-rrc-header.cc | 73 +++++++++++++++++++++++++ src/lte/model/lte-rrc-header.h | 19 +++++++ src/lte/model/lte-rrc-protocol-ideal.cc | 9 +++ src/lte/model/lte-rrc-protocol-ideal.h | 1 + src/lte/model/lte-rrc-protocol-real.cc | 38 ++++++++++++- src/lte/model/lte-rrc-protocol-real.h | 1 + src/lte/model/lte-rrc-sap.h | 8 +++ 9 files changed, 160 insertions(+), 3 deletions(-) diff --git a/src/lte/model/lte-enb-rrc.cc b/src/lte/model/lte-enb-rrc.cc index ebae754b3..cfebf9be6 100644 --- a/src/lte/model/lte-enb-rrc.cc +++ b/src/lte/model/lte-enb-rrc.cc @@ -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) diff --git a/src/lte/model/lte-enb-rrc.h b/src/lte/model/lte-enb-rrc.h index 61b9dce2a..b37bd8629 100644 --- a/src/lte/model/lte-enb-rrc.h +++ b/src/lte/model/lte-enb-rrc.h @@ -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 diff --git a/src/lte/model/lte-rrc-header.cc b/src/lte/model/lte-rrc-header.cc index dfa87902b..85abadf9d 100644 --- a/src/lte/model/lte-rrc-header.cc +++ b/src/lte/model/lte-rrc-header.cc @@ -3486,6 +3486,79 @@ RrcConnectionRejectHeader::GetMessage () const return m_rrcConnectionReject; } +//////////////////// MeasurementReportHeader class //////////////////////// + +MeasurementReportHeader::MeasurementReportHeader () +{ +} + +void +MeasurementReportHeader::PreSerialize () const +{ + m_serializationResult = Buffer (); + + // Serialize DCCH message + SerializeUlDcchMessage (1); + + // Serialize RRCConnectionSetupComplete sequence: + // no default or optional fields. Extension marker not present. + SerializeSequence<0> (std::bitset<0> (),false); + + + + // Finish serialization + FinalizeSerialization (); +} + +uint32_t +MeasurementReportHeader::Deserialize (Buffer::Iterator bIterator) +{ + /*std::bitset<0> bitset0; + bIterator = DeserializeSequence (&bitset0,false,bIterator); + + int n; + + bIterator = DeserializeUlDcchMessage (bIterator); + + bIterator = DeserializeInteger (&n,0,3,bIterator); + m_rrcTransactionIdentifier = n; + + bIterator = DeserializeChoice (2,&n,bIterator); + + if (n == 1) + { + // Deserialize criticalExtensionsFuture + bIterator = DeserializeSequence (&bitset0,false,bIterator); + } + else if (n == 0) + { + // Deserialize rrcConnectionReconfigurationComplete-r8 + // ... + }*/ + + 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 diff --git a/src/lte/model/lte-rrc-header.h b/src/lte/model/lte-rrc-header.h index 5ede7e058..4b65f40f7 100644 --- a/src/lte/model/lte-rrc-header.h +++ b/src/lte/model/lte-rrc-header.h @@ -395,6 +395,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 diff --git a/src/lte/model/lte-rrc-protocol-ideal.cc b/src/lte/model/lte-rrc-protocol-ideal.cc index c0037c0e4..a400b314a 100644 --- a/src/lte/model/lte-rrc-protocol-ideal.cc +++ b/src/lte/model/lte-rrc-protocol-ideal.cc @@ -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 () diff --git a/src/lte/model/lte-rrc-protocol-ideal.h b/src/lte/model/lte-rrc-protocol-ideal.h index 9a2fa6090..ad91b25f1 100644 --- a/src/lte/model/lte-rrc-protocol-ideal.h +++ b/src/lte/model/lte-rrc-protocol-ideal.h @@ -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 (); diff --git a/src/lte/model/lte-rrc-protocol-real.cc b/src/lte/model/lte-rrc-protocol-real.cc index 5fb4ffc33..9b69f1e22 100644 --- a/src/lte/model/lte-rrc-protocol-real.cc +++ b/src/lte/model/lte-rrc-protocol-real.cc @@ -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 = Create (); + + 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; diff --git a/src/lte/model/lte-rrc-protocol-real.h b/src/lte/model/lte-rrc-protocol-real.h index 800656e90..37f617efd 100644 --- a/src/lte/model/lte-rrc-protocol-real.h +++ b/src/lte/model/lte-rrc-protocol-real.h @@ -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 p); diff --git a/src/lte/model/lte-rrc-sap.h b/src/lte/model/lte-rrc-sap.h index a52da2faa..9c8d4422c 100644 --- a/src/lte/model/lte-rrc-sap.h +++ b/src/lte/model/lte-rrc-sap.h @@ -601,6 +601,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 +980,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 +1040,12 @@ MemberLteEnbRrcSapProvider::RecvRrcConnectionReestablishmentComplete (uint16_ Simulator::ScheduleNow (&C::DoRecvRrcConnectionReestablishmentComplete, m_owner, rnti, msg); } +template +void +MemberLteEnbRrcSapProvider::RecvMeasurementReport (uint16_t rnti, MeasurementReport msg) +{ + Simulator::ScheduleNow (&C::DoRecvMeasurementReport, m_owner, rnti, msg); +} From 2aaa84294a434f8009ee2421ef35799e87c0f413 Mon Sep 17 00:00:00 2001 From: Lluis Parcerisa Date: Thu, 20 Dec 2012 16:25:30 +0100 Subject: [PATCH 3/3] Serialize RRC MeasResults IE --- src/lte/model/lte-rrc-header.cc | 243 +++++++++++++++++++++++++------- src/lte/model/lte-rrc-header.h | 4 + src/lte/model/lte-rrc-sap.h | 14 +- 3 files changed, 206 insertions(+), 55 deletions(-) diff --git a/src/lte/model/lte-rrc-header.cc b/src/lte/model/lte-rrc-header.cc index 85abadf9d..11779ed96 100644 --- a/src/lte/model/lte-rrc-header.cc +++ b/src/lte/model/lte-rrc-header.cc @@ -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::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::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; @@ -3500,12 +3611,25 @@ MeasurementReportHeader::PreSerialize () const // Serialize DCCH message SerializeUlDcchMessage (1); - // Serialize RRCConnectionSetupComplete sequence: + // 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 (); } @@ -3513,28 +3637,47 @@ MeasurementReportHeader::PreSerialize () const uint32_t MeasurementReportHeader::Deserialize (Buffer::Iterator bIterator) { - /*std::bitset<0> bitset0; - bIterator = DeserializeSequence (&bitset0,false,bIterator); + std::bitset<0> bitset0; - int n; + bIterator = DeserializeSequence (&bitset0,false,bIterator); bIterator = DeserializeUlDcchMessage (bIterator); - bIterator = DeserializeInteger (&n,0,3,bIterator); - m_rrcTransactionIdentifier = n; + int criticalExtensionsChoice; + bIterator = DeserializeChoice (2,&criticalExtensionsChoice,bIterator); - bIterator = DeserializeChoice (2,&n,bIterator); - - if (n == 1) + if (criticalExtensionsChoice == 1) { // Deserialize criticalExtensionsFuture bIterator = DeserializeSequence (&bitset0,false,bIterator); } - else if (n == 0) + else if (criticalExtensionsChoice == 0) { - // Deserialize rrcConnectionReconfigurationComplete-r8 - // ... - }*/ + // 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 (); } diff --git a/src/lte/model/lte-rrc-header.h b/src/lte/model/lte-rrc-header.h index 4b65f40f7..81360f7bf 100644 --- a/src/lte/model/lte-rrc-header.h +++ b/src/lte/model/lte-rrc-header.h @@ -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 *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; diff --git a/src/lte/model/lte-rrc-sap.h b/src/lte/model/lte-rrc-sap.h index 9c8d4422c..0f1ed3d4c 100644 --- a/src/lte/model/lte-rrc-sap.h +++ b/src/lte/model/lte-rrc-sap.h @@ -383,19 +383,22 @@ public: uint16_t sourceDlCarrierFreq; }; - struct CellGlobalIdEutra + struct CgiInfo { uint32_t plmnIdentity; uint32_t cellIdentity; + uint16_t trackingAreaCode; + std::list plmnIdentityList; }; struct MeasResultEutra { uint16_t physCellId; - CellGlobalIdEutra cellGlobalId; - uint16_t trackingAreaCode; - std::list 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 MeasResultListEutra; + bool haveMeasResultNeighCells; + std::list measResultListEutra; };