From 56b94c41a1b689057fbf1b67586e8808f97e63d8 Mon Sep 17 00:00:00 2001 From: Lluis Parcerisa Date: Tue, 18 Dec 2012 18:31:13 +0100 Subject: [PATCH] upon rx of RRC CONN REJECT, the LteUeRrc notifies the NAS, resets the MAC, SwitchToState (IDLE_CAMPED_NORMALLY) --- .../doc/source/figures/lte-ue-rrc-states.dot | 1 + src/lte/model/lte-rrc-protocol-real.cc | 2 - src/lte/model/lte-ue-rrc.cc | 2 + src/lte/test/test-lte-rrc.cc | 174 ++++++++++-------- 4 files changed, 105 insertions(+), 74 deletions(-) diff --git a/src/lte/doc/source/figures/lte-ue-rrc-states.dot b/src/lte/doc/source/figures/lte-ue-rrc-states.dot index 68b940a66..f57f399f3 100644 --- a/src/lte/doc/source/figures/lte-ue-rrc-states.dot +++ b/src/lte/doc/source/figures/lte-ue-rrc-states.dot @@ -16,6 +16,7 @@ IDLE_CAMPED_NORMALLY -> IDLE_RANDOM_ACCESS [label="connection request by upper l IDLE_RANDOM_ACCESS -> IDLE_CONNECTING [label="random access successful"] IDLE_RANDOM_ACCESS -> IDLE_CAMPED_NORMALLY [label="random access failure"] IDLE_CONNECTING -> CONNECTED_NORMALLY [label="rx RRC CONN SETUP"] +IDLE_CONNECTING -> IDLE_CAMPED_NORMALLY [label="rx RRC CONN REJECT"] CONNECTED_NORMALLY -> CONNECTED_HANDOVER [label="rx RRC CONN RECONF with MobilityCltrInfo"] CONNECTED_HANDOVER -> CONNECTED_NORMALLY [label="random access successful"] diff --git a/src/lte/model/lte-rrc-protocol-real.cc b/src/lte/model/lte-rrc-protocol-real.cc index ad1b9acba..5fb4ffc33 100644 --- a/src/lte/model/lte-rrc-protocol-real.cc +++ b/src/lte/model/lte-rrc-protocol-real.cc @@ -577,7 +577,6 @@ LteEnbRrcProtocolReal::DoSendRrcConnectionSetup (uint16_t rnti, LteRrcSap::RrcCo transmitPdcpPduParameters.rnti = rnti; transmitPdcpPduParameters.lcid = 0; - std::map::iterator it; if (m_setupUeParametersMap.find (rnti) == m_setupUeParametersMap.end () ) { std::cout << "RNTI not found in Enb setup parameters Map!" << std::endl; @@ -603,7 +602,6 @@ LteEnbRrcProtocolReal::DoSendRrcConnectionReject (uint16_t rnti, LteRrcSap::RrcC transmitPdcpPduParameters.rnti = rnti; transmitPdcpPduParameters.lcid = 0; - std::map::iterator it; m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters); } diff --git a/src/lte/model/lte-ue-rrc.cc b/src/lte/model/lte-ue-rrc.cc index 5a7d0ae7e..fb84a2a22 100644 --- a/src/lte/model/lte-ue-rrc.cc +++ b/src/lte/model/lte-ue-rrc.cc @@ -708,6 +708,8 @@ void LteUeRrc::DoRecvRrcConnectionReject (LteRrcSap::RrcConnectionReject msg) { NS_LOG_FUNCTION (this); + m_cmacSapProvider->Reset (); + SwitchToState (IDLE_CAMPED_NORMALLY); } diff --git a/src/lte/test/test-lte-rrc.cc b/src/lte/test/test-lte-rrc.cc index d73403810..e1bf5d467 100644 --- a/src/lte/test/test-lte-rrc.cc +++ b/src/lte/test/test-lte-rrc.cc @@ -32,20 +32,19 @@ namespace ns3 { class LteRrcConnectionEstablishmentTestCase : public TestCase { public: - - /** - * + /** + * * * \param nUes number of UEs in the test * \param tc connection time base value for all UEs in ms * \param tConnIncrPerUe additional connection time increment for each UE index (0...nUes-1) in ms * \param delayDiscStart expected duration to perform connection establishment in ms - * + * */ - LteRrcConnectionEstablishmentTestCase (uint32_t nUes, uint32_t nBearers, uint32_t tc, uint32_t tConnIncrPerUe, uint32_t delayDiscStart, bool useIdealRrc); - + LteRrcConnectionEstablishmentTestCase (uint32_t nUes, uint32_t nBearers, uint32_t tc, uint32_t tConnIncrPerUe, uint32_t delayDiscStart, bool useIdealRrc, bool admitRrcConnectionRequest); + private: - static std::string BuildNameString (uint32_t nUes, uint32_t nBearers, uint32_t tc, uint32_t tConnIncrPerUe, uint32_t delayDiscStart, bool useIdealRrc); + static std::string BuildNameString (uint32_t nUes, uint32_t nBearers, uint32_t tc, uint32_t tConnIncrPerUe, uint32_t delayDiscStart, bool useIdealRrc, bool admitRrcConnectionRequest); virtual void DoRun (void); void Connect (Ptr ueDevice, Ptr enbDevice); void CheckConnected (Ptr ueDevice, Ptr enbDevice); @@ -59,16 +58,17 @@ private: uint32_t m_delayDiscStart; // delay between connection completed and disconnection request in ms uint32_t m_delayDiscEnd; // expected duration to complete disconnection in ms bool m_useIdealRrc; + bool m_admitRrcConnectionRequest; // If set to false, eNb will not allow ue connections Ptr m_lteHelper; }; -std::string LteRrcConnectionEstablishmentTestCase::BuildNameString (uint32_t nUes, uint32_t nBearers, uint32_t tConnBase, uint32_t tConnIncrPerUe, uint32_t delayDiscStart, bool useIdealRrc) +std::string LteRrcConnectionEstablishmentTestCase::BuildNameString (uint32_t nUes, uint32_t nBearers, uint32_t tConnBase, uint32_t tConnIncrPerUe, uint32_t delayDiscStart, bool useIdealRrc, bool admitRrcConnectionRequest) { std::ostringstream oss; - oss << "nUes=" << nUes - << ", nBearers=" << nBearers + oss << "nUes=" << nUes + << ", nBearers=" << nBearers << ", tConnBase=" << tConnBase << ", tConnIncrPerUe=" << tConnIncrPerUe << ", delayDiscStart=" << delayDiscStart; @@ -79,22 +79,31 @@ std::string LteRrcConnectionEstablishmentTestCase::BuildNameString (uint32_t nUe else { oss << ", real RRC"; - } + } + if (admitRrcConnectionRequest) + { + oss << ", admitRrcConnectionRequest = true"; + } + else + { + oss << ", admitRrcConnectionRequest = false"; + } return oss.str (); } -LteRrcConnectionEstablishmentTestCase::LteRrcConnectionEstablishmentTestCase (uint32_t nUes, uint32_t nBearers, uint32_t tConnBase, uint32_t tConnIncrPerUe, uint32_t delayDiscStart, bool useIdealRrc) - : TestCase (BuildNameString (nUes, nBearers, tConnBase, tConnIncrPerUe, delayDiscStart, useIdealRrc)), +LteRrcConnectionEstablishmentTestCase::LteRrcConnectionEstablishmentTestCase (uint32_t nUes, uint32_t nBearers, uint32_t tConnBase, uint32_t tConnIncrPerUe, uint32_t delayDiscStart, bool useIdealRrc, bool admitRrcConnectionRequest) + : TestCase (BuildNameString (nUes, nBearers, tConnBase, tConnIncrPerUe, delayDiscStart, useIdealRrc, admitRrcConnectionRequest)), m_nUes (nUes), m_nBearers (nBearers), m_tConnBase (tConnBase), m_tConnIncrPerUe (tConnIncrPerUe), - + m_delayDiscStart (delayDiscStart), m_delayDiscEnd (10), - m_useIdealRrc (useIdealRrc) + m_useIdealRrc (useIdealRrc), + m_admitRrcConnectionRequest (admitRrcConnectionRequest) { - // see the description of d^e in the LTE testing docs + // see the description of d^e in the LTE testing docs double dsi = 90; double nRaAttempts = 0; if (nUes <= 20) @@ -105,35 +114,35 @@ LteRrcConnectionEstablishmentTestCase::LteRrcConnectionEstablishmentTestCase (ui { NS_ASSERT (nUes <= 50); nRaAttempts += 10; - } - nRaAttempts += std::ceil (nUes/4.0); + } + nRaAttempts += std::ceil (nUes / 4.0); double dra = nRaAttempts * 7; - double dce = 10.0 + (2.0*nUes)/4.0; + double dce = 10.0 + (2.0 * nUes) / 4.0; double nCrs; if (nUes <= 2) { - nCrs = 0; + nCrs = 0; } else if (nUes <= 5) { - nCrs = 1; + nCrs = 1; } else if (nUes <= 10) { - nCrs = 2; + nCrs = 2; } else if (nUes <= 20) { - nCrs = 3; + nCrs = 3; } - else + else { - nCrs = 4; + nCrs = 4; } - double dcr = (10.0 + (2.0*nUes)/4.0)*(m_nBearers + nCrs); - + double dcr = (10.0 + (2.0 * nUes) / 4.0) * (m_nBearers + nCrs); + m_delayConnEnd = round (dsi + dra + dce + dcr); - NS_LOG_LOGIC (this << GetName () << " dsi=" << dsi << " dra=" << dra << " dce=" << dce << " dcr=" < ueDevice = *it; - Ptr enbDevice = enbDevs.Get (0); + Ptr enbDevice = enbDevs.Get (0); Ptr ueLteDevice = ueDevice->GetObject (); - Ptr ueNas = ueLteDevice->GetNas (); - + uint32_t tc = m_tConnBase + m_tConnIncrPerUe * i; // time connection start uint32_t tcc = tc + m_delayConnEnd; // time check connection completed; uint32_t td = tcc + m_delayDiscStart; // time disconnect start uint32_t tcd = td + m_delayDiscEnd; // time check disconnection completed tmax = std::max (tmax, tcd); - + // trick to resolve overloading - //void (LteHelper::* overloadedAttachFunctionPointer) (Ptr, Ptr) = &LteHelper::Attach; + //void (LteHelper::* overloadedAttachFunctionPointer) (Ptr, Ptr) = &LteHelper::Attach; //Simulator::Schedule (MilliSeconds (tc), overloadedAttachFunctionPointer, lteHelper, *it, enbDevice); Simulator::Schedule (MilliSeconds (tc), &LteRrcConnectionEstablishmentTestCase::Connect, this, ueDevice, enbDevice); @@ -195,7 +213,7 @@ LteRrcConnectionEstablishmentTestCase::DoRun () } - Simulator::Stop (MilliSeconds (tmax+1)); + Simulator::Stop (MilliSeconds (tmax + 1)); Simulator::Run (); @@ -203,7 +221,7 @@ LteRrcConnectionEstablishmentTestCase::DoRun () } -void +void LteRrcConnectionEstablishmentTestCase::Connect (Ptr ueDevice, Ptr enbDevice) { m_lteHelper->Attach (ueDevice, enbDevice); @@ -215,18 +233,24 @@ LteRrcConnectionEstablishmentTestCase::Connect (Ptr ueDevice, PtrActivateDataRadioBearer (ueDevice, bearer); } } -void +void LteRrcConnectionEstablishmentTestCase::CheckConnected (Ptr ueDevice, Ptr enbDevice) { Ptr ueLteDevice = ueDevice->GetObject (); Ptr ueRrc = ueLteDevice->GetRrc (); - NS_TEST_ASSERT_MSG_EQ (ueRrc->GetState (), LteUeRrc::CONNECTED_NORMALLY, "Wrong LteUeRrc state!"); + if (!m_admitRrcConnectionRequest) + { + NS_TEST_ASSERT_MSG_EQ (ueRrc->GetState (), LteUeRrc::IDLE_CAMPED_NORMALLY, "Wrong LteUeRrc state!"); + return; + } + + NS_TEST_ASSERT_MSG_EQ (ueRrc->GetState (), LteUeRrc::CONNECTED_NORMALLY, "Wrong LteUeRrc state!"); Ptr enbLteDevice = enbDevice->GetObject (); Ptr enbRrc = enbLteDevice->GetRrc (); uint16_t rnti = ueRrc->GetRnti (); - Ptr ueManager = enbRrc->GetUeManager (rnti); + Ptr ueManager = enbRrc->GetUeManager (rnti); NS_TEST_ASSERT_MSG_NE (ueManager, 0, "RNTI " << rnti << " not found in eNB"); NS_TEST_ASSERT_MSG_EQ (ueManager->GetState (), UeManager::CONNECTED_NORMALLY, "Wrong UeManager state!"); @@ -254,16 +278,16 @@ LteRrcConnectionEstablishmentTestCase::CheckConnected (Ptr ueDevice, ObjectMapValue enbDataRadioBearerMapValue; ueManager->GetAttribute ("DataRadioBearerMap", enbDataRadioBearerMapValue); - NS_TEST_ASSERT_MSG_EQ (enbDataRadioBearerMapValue.GetN (), m_nBearers, "wrong num bearers at eNB"); + NS_TEST_ASSERT_MSG_EQ (enbDataRadioBearerMapValue.GetN (), m_nBearers, "wrong num bearers at eNB"); ObjectMapValue ueDataRadioBearerMapValue; ueRrc->GetAttribute ("DataRadioBearerMap", ueDataRadioBearerMapValue); - NS_TEST_ASSERT_MSG_EQ (ueDataRadioBearerMapValue.GetN (), m_nBearers, "wrong num bearers at UE"); + NS_TEST_ASSERT_MSG_EQ (ueDataRadioBearerMapValue.GetN (), m_nBearers, "wrong num bearers at UE"); ObjectMapValue::Iterator enbBearerIt = enbDataRadioBearerMapValue.Begin (); ObjectMapValue::Iterator ueBearerIt = ueDataRadioBearerMapValue.Begin (); - while (enbBearerIt != enbDataRadioBearerMapValue.End () && - ueBearerIt != ueDataRadioBearerMapValue.End ()) + while (enbBearerIt != enbDataRadioBearerMapValue.End () + && ueBearerIt != ueDataRadioBearerMapValue.End ()) { Ptr enbDrbInfo = enbBearerIt->second->GetObject (); Ptr ueDrbInfo = ueBearerIt->second->GetObject (); @@ -273,13 +297,13 @@ LteRrcConnectionEstablishmentTestCase::CheckConnected (Ptr ueDevice, //NS_TEST_ASSERT_MSG_EQ (enbDrbInfo->m_rlcConfig, ueDrbInfo->m_rlcConfig, "rlcConfig differs"); NS_TEST_ASSERT_MSG_EQ ((uint32_t) enbDrbInfo->m_logicalChannelIdentity, (uint32_t) ueDrbInfo->m_logicalChannelIdentity, "logicalChannelIdentity differs"); //NS_TEST_ASSERT_MSG_EQ (enbDrbInfo->m_logicalChannelConfig, ueDrbInfo->m_logicalChannelConfig, "logicalChannelConfig differs"); - + ++enbBearerIt; ++ueBearerIt; } NS_ASSERT_MSG (enbBearerIt == enbDataRadioBearerMapValue.End (), "too many bearers at eNB"); NS_ASSERT_MSG (ueBearerIt == ueDataRadioBearerMapValue.End (), "too many bearers at UE"); - + } @@ -296,40 +320,46 @@ LteRrcTestSuite::LteRrcTestSuite () { NS_LOG_FUNCTION (this); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 50, 0, 0, 0, 1, 0)); + //AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 50, 0, 0, 0, 1, 0, true)); for (uint32_t useIdealRrc = 0; useIdealRrc <= 1; ++useIdealRrc) { - // <----- all times in ms -----------------> - // nUes, nBearers, tConnBase, tConnIncrPerUe, delayDiscStart, useIdealRrc - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 0, 0, 0, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 0, 100, 0, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 1, 0, 0, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 1, 100, 0, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 2, 0, 0, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 2, 100, 0, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 0, 20, 0, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 0, 20, 10, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 0, 20, 100, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 1, 20, 0, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 1, 20, 10, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 1, 20, 100, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 2, 20, 0, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 2, 20, 10, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 2, 20, 100, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 3, 0, 20, 0, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 4, 0, 20, 0, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 4, 0, 20, 300, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 20, 0, 10, 1, 1, useIdealRrc)); - AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 50, 0, 0, 0, 1, useIdealRrc)); + // <----- all times in ms -----------------> + // nUes, nBearers, tConnBase, tConnIncrPerUe, delayDiscStart, useIdealRrc, admitRrcConnectionRequest + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 0, 0, 0, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 0, 100, 0, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 1, 0, 0, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 1, 100, 0, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 2, 0, 0, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 2, 100, 0, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 0, 20, 0, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 0, 20, 10, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 0, 20, 100, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 1, 20, 0, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 1, 20, 10, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 1, 20, 100, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 2, 20, 0, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 2, 20, 10, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 2, 20, 100, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 3, 0, 20, 0, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 4, 0, 20, 0, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 4, 0, 20, 300, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 20, 0, 10, 1, 1, useIdealRrc, true)); + AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 50, 0, 0, 0, 1, useIdealRrc, true)); + + // Test cases to check admitRrcConnectionRequest=false + //AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 0, 0, 0, 1, useIdealRrc, false)); + //AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 2, 100, 0, 1, useIdealRrc, false)); + //AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 0, 20, 0, 1, useIdealRrc, false)); + //AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 1, 20, 0, 1, useIdealRrc, false)); + //AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 3, 0, 20, 0, 1, useIdealRrc, false)); // // time consuming tests with a lot of UEs - // AddTestCase (new LteRrcConnectionEstablishmentTestCase (100, 0, 10, 0, 1, useIdealRrc)); - // AddTestCase (new LteRrcConnectionEstablishmentTestCase (100, 0, 10, 1, 1, useIdealRrc)); - // AddTestCase (new LteRrcConnectionEstablishmentTestCase (200, 0, 10, 0, 1, useIdealRrc)); - // AddTestCase (new LteRrcConnectionEstablishmentTestCase (200, 0, 10, 1, 1, useIdealRrc)); + // AddTestCase (new LteRrcConnectionEstablishmentTestCase (100, 0, 10, 0, 1, useIdealRrc, true)); + // AddTestCase (new LteRrcConnectionEstablishmentTestCase (100, 0, 10, 1, 1, useIdealRrc, true)); + // AddTestCase (new LteRrcConnectionEstablishmentTestCase (200, 0, 10, 0, 1, useIdealRrc, true)); + // AddTestCase (new LteRrcConnectionEstablishmentTestCase (200, 0, 10, 1, 1, useIdealRrc, true)); } - } static LteRrcTestSuite g_lteRrcTestSuiteInstance;