From ac1081f276b10b31bdb4468a5f25b02474f8b034 Mon Sep 17 00:00:00 2001 From: Lluis Parcerisa Date: Thu, 13 Dec 2012 16:52:15 +0100 Subject: [PATCH 1/6] Add implementation of RRC Connection Reject in Ue Recv. --- src/lte/model/lte-enb-rrc.cc | 18 +++++++++++++++++- src/lte/model/lte-enb-rrc.h | 2 ++ src/lte/model/lte-rrc-protocol-real.cc | 6 +++++- src/lte/model/lte-ue-rrc.cc | 1 + 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/lte/model/lte-enb-rrc.cc b/src/lte/model/lte-enb-rrc.cc index 0f3a29584..66e828629 100644 --- a/src/lte/model/lte-enb-rrc.cc +++ b/src/lte/model/lte-enb-rrc.cc @@ -1097,6 +1097,11 @@ LteEnbRrc::GetTypeId (void) BooleanValue (true), MakeBooleanAccessor (&LteEnbRrc::m_admitHandoverRequest), MakeBooleanChecker ()) + .AddAttribute ("AdmitRrcConnectionRequest", + "Whether to admit a connection request from a Ue", + BooleanValue (true), + MakeBooleanAccessor (&LteEnbRrc::m_admitRrcConnectionRequest), + MakeBooleanChecker ()) .AddTraceSource ("ConnectionEstablished", "trace fired upon successful RRC connection establishment", MakeTraceSourceAccessor (&LteEnbRrc::m_connectionEstablishedTrace)) @@ -1273,7 +1278,18 @@ void LteEnbRrc::DoRecvRrcConnectionRequest (uint16_t rnti, LteRrcSap::RrcConnectionRequest msg) { NS_LOG_FUNCTION (this << rnti); - GetUeManager (rnti)->RecvRrcConnectionRequest (msg); + + if (m_admitRrcConnectionRequest == true) + { + GetUeManager (rnti)->RecvRrcConnectionRequest (msg); + } + else + { + NS_LOG_INFO ("rejecting connection request to rnti " << rnti); + LteRrcSap::RrcConnectionReject rejectMsg; + rejectMsg.waitTime = 3; + m_rrcSapUser->SendRrcConnectionReject (rnti, rejectMsg); + } } void diff --git a/src/lte/model/lte-enb-rrc.h b/src/lte/model/lte-enb-rrc.h index 42f933d42..48b8597f5 100644 --- a/src/lte/model/lte-enb-rrc.h +++ b/src/lte/model/lte-enb-rrc.h @@ -574,6 +574,7 @@ public: RLC_UM_ALWAYS = 2, RLC_AM_ALWAYS = 3, PER_BASED = 4}; + private: @@ -725,6 +726,7 @@ private: bool m_reconfigureUes; bool m_admitHandoverRequest; + bool m_admitRrcConnectionRequest; // imsi cellid rnti TracedCallback m_connectionEstablishedTrace; diff --git a/src/lte/model/lte-rrc-protocol-real.cc b/src/lte/model/lte-rrc-protocol-real.cc index 5284d76f8..ad1b9acba 100644 --- a/src/lte/model/lte-rrc-protocol-real.cc +++ b/src/lte/model/lte-rrc-protocol-real.cc @@ -288,11 +288,13 @@ LteUeRrcProtocolReal::DoReceivePdcpPdu (Ptr p) RrcConnectionReestablishmentHeader rrcConnectionReestablishmentHeader; RrcConnectionReestablishmentRejectHeader rrcConnectionReestablishmentRejectHeader; RrcConnectionSetupHeader rrcConnectionSetupHeader; + RrcConnectionRejectHeader rrcConnectionRejectHeader; // Declare possible messages LteRrcSap::RrcConnectionReestablishment rrcConnectionReestablishmentMsg; LteRrcSap::RrcConnectionReestablishmentReject rrcConnectionReestablishmentRejectMsg; LteRrcSap::RrcConnectionSetup rrcConnectionSetupMsg; + LteRrcSap::RrcConnectionReject rrcConnectionRejectMsg; // Deserialize packet and call member recv function with appropiate structure switch ( rrcDlCcchMessage.GetMessageType () ) @@ -311,7 +313,9 @@ LteUeRrcProtocolReal::DoReceivePdcpPdu (Ptr p) break; case 2: // RrcConnectionReject - // ... + p->RemoveHeader (rrcConnectionReestablishmentRejectHeader); + rrcConnectionReestablishmentRejectMsg = rrcConnectionReestablishmentRejectHeader.GetMessage (); + m_ueRrcSapProvider->RecvRrcConnectionReject (rrcConnectionRejectMsg); break; case 3: // RrcConnectionSetup diff --git a/src/lte/model/lte-ue-rrc.cc b/src/lte/model/lte-ue-rrc.cc index 9b7b5531a..12cba45dc 100644 --- a/src/lte/model/lte-ue-rrc.cc +++ b/src/lte/model/lte-ue-rrc.cc @@ -693,6 +693,7 @@ void LteUeRrc::DoRecvRrcConnectionReject (LteRrcSap::RrcConnectionReject msg) { NS_LOG_FUNCTION (this); + LeaveConnectedMode(); } From a059f89a8ba310d187882eeaa5808c874fd8893e Mon Sep 17 00:00:00 2001 From: Lluis Parcerisa Date: Thu, 13 Dec 2012 18:27:24 +0100 Subject: [PATCH 2/6] Add OFF state for Ue (switched to this state upon connection reject). Remove assert against connection failed. --- src/lte/model/epc-ue-nas.cc | 2 +- src/lte/model/lte-ue-rrc.cc | 5 +++-- src/lte/model/lte-ue-rrc.h | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/lte/model/epc-ue-nas.cc b/src/lte/model/epc-ue-nas.cc index 08422446a..b603d4335 100644 --- a/src/lte/model/epc-ue-nas.cc +++ b/src/lte/model/epc-ue-nas.cc @@ -216,7 +216,7 @@ EpcUeNas::DoRecvData (Ptr packet) void EpcUeNas::DoNotifyConnectionReleased () { - NS_FATAL_ERROR ("connection failed, it should not happen with the current model"); + NS_LOG_FUNCTION (this); } void diff --git a/src/lte/model/lte-ue-rrc.cc b/src/lte/model/lte-ue-rrc.cc index 12cba45dc..3411f7d80 100644 --- a/src/lte/model/lte-ue-rrc.cc +++ b/src/lte/model/lte-ue-rrc.cc @@ -99,7 +99,8 @@ const char* g_ueRrcStateName[LteUeRrc::NUM_STATES] = "IDLE_CONNECTING", "CONNECTED_NORMALLY", "CONNECTED_REESTABLISHING", - "CONNECTED_HANDOVER" + "CONNECTED_HANDOVER", + "OFF" }; std::string ToString (LteUeRrc::State s) @@ -693,7 +694,7 @@ void LteUeRrc::DoRecvRrcConnectionReject (LteRrcSap::RrcConnectionReject msg) { NS_LOG_FUNCTION (this); - LeaveConnectedMode(); + SwitchToState (OFF); } diff --git a/src/lte/model/lte-ue-rrc.h b/src/lte/model/lte-ue-rrc.h index 46d04163d..0b7ff0a22 100644 --- a/src/lte/model/lte-ue-rrc.h +++ b/src/lte/model/lte-ue-rrc.h @@ -72,6 +72,7 @@ public: CONNECTED_NORMALLY, CONNECTED_REESTABLISHING, CONNECTED_HANDOVER, + OFF, NUM_STATES }; From 5d1c0bf64f34dc4e4fc29e1f5c1664dd9f08abfd Mon Sep 17 00:00:00 2001 From: mmiozzo Date: Thu, 13 Dec 2012 18:44:34 +0100 Subject: [PATCH 3/6] Bug-fix LteUeMac:DoReceiveLteControlMessage erroneous NotifyTxOpportunity --- src/lte/model/lte-ue-mac.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/lte/model/lte-ue-mac.cc b/src/lte/model/lte-ue-mac.cc index e97df2528..5a8686bb1 100644 --- a/src/lte/model/lte-ue-mac.cc +++ b/src/lte/model/lte-ue-mac.cc @@ -580,11 +580,10 @@ LteUeMac::DoReceiveLteControlMessage (Ptr msg) } else if ((*itBsr).second.txQueueSize > 0) { - bytesForThisLc -= 2; // remove RLC header (*it).second.macSapUser->NotifyTxOpportunity (bytesForThisLc, 0, 0); - if ((*itBsr).second.txQueueSize >= bytesForThisLc) + if ((*itBsr).second.txQueueSize >= bytesForThisLc - 2) { - (*itBsr).second.txQueueSize -= bytesForThisLc; + (*itBsr).second.txQueueSize -= bytesForThisLc - 2; } else { From db39e9df6faed55ef42ea7473642102f8274a4c6 Mon Sep 17 00:00:00 2001 From: mmiozzo Date: Thu, 13 Dec 2012 18:45:27 +0100 Subject: [PATCH 4/6] Update PF and RR schedulers for working with RRC attachment procedures --- src/lte/test/lte-test-pf-ff-mac-scheduler.cc | 6 +++--- src/lte/test/lte-test-rr-ff-mac-scheduler.cc | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) 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 ff76b77df..e36d3e851 100644 --- a/src/lte/test/lte-test-pf-ff-mac-scheduler.cc +++ b/src/lte/test/lte-test-pf-ff-mac-scheduler.cc @@ -268,7 +268,7 @@ LenaPfFfMacSchedulerTestCase1::DoRun (void) } - double statsStartTime = 0.100; // need to allow for RRC connection establishment + SRS + double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS double statsDuration = 0.6; double tolerance = 0.1; Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.000001)); @@ -428,10 +428,10 @@ LenaPfFfMacSchedulerTestCase2::DoRun (void) uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0)); } - double statsStartTime = 0.100; // need to allow for RRC connection establishment + SRS + double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS double statsDuration = 0.4; double tolerance = 0.1; - Simulator::Stop (Seconds (statsStartTime + statsDuration + 0.000001)); + Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.000001)); lteHelper->EnableRlcTraces (); Ptr rlcStats = lteHelper->GetRlcStats (); diff --git a/src/lte/test/lte-test-rr-ff-mac-scheduler.cc b/src/lte/test/lte-test-rr-ff-mac-scheduler.cc index 80ab9d693..9449f8378 100644 --- a/src/lte/test/lte-test-rr-ff-mac-scheduler.cc +++ b/src/lte/test/lte-test-rr-ff-mac-scheduler.cc @@ -203,7 +203,7 @@ LenaRrFfMacSchedulerTestCase::DoRun (void) * Initialize Simulation Scenario: 1 eNB and m_nUser UEs */ - +LogComponentEnable ("PfFfMacScheduler", LOG_LEVEL_ALL); Ptr lteHelper = CreateObject (); lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel")); @@ -254,7 +254,7 @@ LenaRrFfMacSchedulerTestCase::DoRun (void) } - double statsStartTime = 0.100; // need to allow for RRC connection establishment + SRS + double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS double statsDuration = 0.4; double tolerance = 0.1; Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.0001)); From 2fa9d9a22cea52d76e2c592deaac78d72c70b9d6 Mon Sep 17 00:00:00 2001 From: Manuel Requena Date: Thu, 13 Dec 2012 19:44:33 +0100 Subject: [PATCH 5/6] Process txedBuffer as the retxBuffer if retxBuffer is empty --- src/lte/model/lte-rlc-am.cc | 63 +++++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/src/lte/model/lte-rlc-am.cc b/src/lte/model/lte-rlc-am.cc index e184c40d0..b2ff53336 100644 --- a/src/lte/model/lte-rlc-am.cc +++ b/src/lte/model/lte-rlc-am.cc @@ -205,6 +205,48 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId) { NS_LOG_LOGIC ("Sending data from Transmission Buffer"); } + else if ( m_txedBufferSize > 0 ) + { + NS_LOG_LOGIC ("Sending data from Transmitted Buffer"); + + NS_LOG_INFO ("VT(A) = " << m_vtA); + NS_LOG_INFO ("VT(S) = " << m_vtS); + + uint16_t vta = m_vtA.GetValue (); + Ptr packet = m_txedBuffer.at (vta)->Copy (); + + if ( packet->GetSize () <= bytes ) + { + NS_LOG_INFO ("Move SN = " << vta << " to retxBuffer"); + m_retxBuffer.at (vta).m_pdu = m_txedBuffer.at (vta)->Copy (); + m_retxBuffer.at (vta).m_retxCount = 1; + m_retxBufferSize += m_retxBuffer.at (vta).m_pdu->GetSize (); + + m_txedBufferSize -= m_txedBuffer.at (vta)->GetSize (); + m_txedBuffer.at (vta) = 0; + + LteRlcAmHeader rlcAmHeader; + packet->PeekHeader (rlcAmHeader); + NS_LOG_LOGIC ("RLC header: " << rlcAmHeader); + + // Send RLC PDU to MAC layer + LteMacSapProvider::TransmitPduParameters params; + params.pdu = packet; + params.rnti = m_rnti; + params.lcid = m_lcid; + params.layer = layer; + params.harqProcessId = harqId; + + m_macSapProvider->TransmitPdu (params); + return; + } + else + { + NS_LOG_LOGIC ("Tx opportunity too small for retransmission of the packet (" << packet->GetSize () << " bytes)"); + NS_LOG_LOGIC ("Waiting for bigger tx opportunity"); + return; + } + } else { NS_LOG_LOGIC ("No data pending"); @@ -262,7 +304,7 @@ LteRlcAm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId) NS_LOG_LOGIC (" IF ( firstSegment > nextSegmentSize ||"); NS_LOG_LOGIC (" firstSegment > 2047 )"); - + // Segment txBuffer.FirstBuffer and // Give back the remaining segment to the transmission buffer Ptr newSegment = firstSegment->CreateFragment (0, currSegmentSize); @@ -1445,6 +1487,12 @@ LteRlcAm::DoReportBufferStatus (void) Time now = Simulator::Now (); + NS_LOG_LOGIC ("txonBufferSize = " << m_txonBufferSize); + NS_LOG_LOGIC ("retxBufferSize = " << m_retxBufferSize); + NS_LOG_LOGIC ("txedBufferSize = " << m_txedBufferSize); + NS_LOG_LOGIC ("VT(A) = " << m_vtA); + NS_LOG_LOGIC ("VT(S) = " << m_vtS); + // Transmission Queue HOL time Time txonQueueHolDelay (0); if ( m_txonBufferSize > 0 ) @@ -1456,10 +1504,15 @@ LteRlcAm::DoReportBufferStatus (void) // Retransmission Queue HOL time Time retxQueueHolDelay (0); + RlcTag retxQueueHolTimeTag; if ( m_retxBufferSize > 0 ) { - RlcTag retxQueueHolTimeTag; -// m_retxBuffer.front ().m_pdu->PeekPacketTag (retxQueueHolTimeTag); + m_retxBuffer.at (m_vtA.GetValue ()).m_pdu->PeekPacketTag (retxQueueHolTimeTag); + retxQueueHolDelay = now - retxQueueHolTimeTag.GetSenderTimestamp (); + } + else if ( m_txedBufferSize > 0 ) + { + m_txedBuffer.at (m_vtA.GetValue ())->PeekPacketTag (retxQueueHolTimeTag); retxQueueHolDelay = now - retxQueueHolTimeTag.GetSenderTimestamp (); } @@ -1468,7 +1521,7 @@ LteRlcAm::DoReportBufferStatus (void) r.lcid = m_lcid; r.txQueueSize = m_txonBufferSize; r.txQueueHolDelay = txonQueueHolDelay.GetMilliSeconds (); - r.retxQueueSize = m_retxBufferSize; + r.retxQueueSize = m_retxBufferSize + m_txedBufferSize; r.retxQueueHolDelay = retxQueueHolDelay.GetMilliSeconds (); if ( m_statusPduRequested && ! m_statusProhibitTimer.IsRunning () ) @@ -1536,9 +1589,7 @@ LteRlcAm::ExpirePollRetransmitTimer (void) NS_LOG_LOGIC ("txonBufferSize = " << m_txonBufferSize); NS_LOG_LOGIC ("retxBufferSize = " << m_retxBufferSize); NS_LOG_LOGIC ("txedBufferSize = " << m_txedBufferSize); - NS_LOG_LOGIC ("statusPduRequested = " << m_statusPduRequested); - NS_LOG_LOGIC ("VT(S) = " << m_vtS); DoReportBufferStatus (); } From 6f55741bf7cc0371e5087e2c2b75b0802134d674 Mon Sep 17 00:00:00 2001 From: Manuel Requena Date: Thu, 13 Dec 2012 19:44:50 +0100 Subject: [PATCH 6/6] Fix name of the testcase --- src/lte/test/lte-test-rlc-am-e2e.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lte/test/lte-test-rlc-am-e2e.cc b/src/lte/test/lte-test-rlc-am-e2e.cc index bb63e3186..9be0aefa0 100644 --- a/src/lte/test/lte-test-rlc-am-e2e.cc +++ b/src/lte/test/lte-test-rlc-am-e2e.cc @@ -63,7 +63,7 @@ LteRlcAmE2eTestSuite::LteRlcAmE2eTestSuite () for ( uint32_t s = 0 ; s < (sizeof (seeds) / sizeof (uint32_t)) ; s++ ) { std::ostringstream name; - name << " Losses = " << losses[l] << "%. Seed = " << seeds[s]; + name << " Losses = " << losses[l] * 100 << "%. Seed = " << seeds[s]; AddTestCase (new LteRlcAmE2eTestCase (name.str (), seeds[s], losses[l])); } }