From 0b1f06e91a2ff1ddd08db0cb69c44ff34d4057d2 Mon Sep 17 00:00:00 2001 From: Lluis Parcerisa Date: Tue, 4 Dec 2012 19:37:58 +0100 Subject: [PATCH] Implement real DoSendRrcConnectionSetupCompleted --- src/lte/model/lte-enb-rrc.cc | 16 ++- src/lte/model/lte-enb-rrc.h | 1 + src/lte/model/lte-rrc-header.cc | 158 +++++++++++++++++++++++++ src/lte/model/lte-rrc-header.h | 16 ++- src/lte/model/lte-rrc-protocol-real.cc | 76 +++++++++++- src/lte/model/lte-rrc-protocol-real.h | 20 +++- src/lte/model/lte-ue-rrc.cc | 5 + src/lte/model/pf-ff-mac-scheduler.cc | 3 +- 8 files changed, 279 insertions(+), 16 deletions(-) diff --git a/src/lte/model/lte-enb-rrc.cc b/src/lte/model/lte-enb-rrc.cc index bc7913208..6f2300c26 100644 --- a/src/lte/model/lte-enb-rrc.cc +++ b/src/lte/model/lte-enb-rrc.cc @@ -141,7 +141,12 @@ UeManager::UeManager (Ptr rrc, uint16_t rnti, State s) m_sourceCellId (0) { NS_LOG_FUNCTION (this); +} +void +UeManager::DoStart () +{ + NS_LOG_FUNCTION (this); m_drbPdcpSapUser = new LtePdcpSpecificLtePdcpSapUser (this); m_physicalConfigDedicated.haveAntennaInfoDedicated = true; @@ -149,8 +154,8 @@ UeManager::UeManager (Ptr rrc, uint16_t rnti, State s) m_physicalConfigDedicated.haveSoundingRsUlConfigDedicated = true; m_physicalConfigDedicated.soundingRsUlConfigDedicated.srsConfigIndex = m_rrc->GetNewSrsConfigurationIndex (); - m_rrc->m_cmacSapProvider->AddUe (rnti); - m_rrc->m_cphySapProvider->AddUe (rnti); + m_rrc->m_cmacSapProvider->AddUe (m_rnti); + m_rrc->m_cphySapProvider->AddUe (m_rnti); // setup the eNB side of SRB0 { @@ -219,13 +224,13 @@ UeManager::UeManager (Ptr rrc, uint16_t rnti, State s) // configure MAC (and scheduler) LteEnbCmacSapProvider::UeConfig req; - req.m_rnti = rnti; + req.m_rnti = m_rnti; req.m_transmissionMode = m_physicalConfigDedicated.antennaInfo.transmissionMode; m_rrc->m_cmacSapProvider->UeUpdateConfigurationReq (req); // configure PHY - m_rrc->m_cphySapProvider->SetTransmissionMode (rnti, m_physicalConfigDedicated.antennaInfo.transmissionMode); - m_rrc->m_cphySapProvider->SetSrsConfigurationIndex (rnti, m_physicalConfigDedicated.soundingRsUlConfigDedicated.srsConfigIndex); + m_rrc->m_cphySapProvider->SetTransmissionMode (m_rnti, m_physicalConfigDedicated.antennaInfo.transmissionMode); + m_rrc->m_cphySapProvider->SetSrsConfigurationIndex (m_rnti, m_physicalConfigDedicated.soundingRsUlConfigDedicated.srsConfigIndex); } @@ -1436,6 +1441,7 @@ LteEnbRrc::AddUe (UeManager::State state) m_lastAllocatedRnti = rnti; Ptr ueManager = CreateObject (this, rnti, state); m_ueMap.insert (std::pair > (rnti, ueManager)); + ueManager->Start (); NS_LOG_DEBUG (this << " New UE RNTI " << rnti << " cellId " << m_cellId << " srs CI " << ueManager->GetSrsConfigurationIndex ()); return rnti; } diff --git a/src/lte/model/lte-enb-rrc.h b/src/lte/model/lte-enb-rrc.h index 049c324de..2a2677cc6 100644 --- a/src/lte/model/lte-enb-rrc.h +++ b/src/lte/model/lte-enb-rrc.h @@ -95,6 +95,7 @@ public: // inherited from Object protected: + virtual void DoStart (); virtual void DoDispose (); public: static TypeId GetTypeId (void); diff --git a/src/lte/model/lte-rrc-header.cc b/src/lte/model/lte-rrc-header.cc index 6b265a577..b3c3cd576 100644 --- a/src/lte/model/lte-rrc-header.cc +++ b/src/lte/model/lte-rrc-header.cc @@ -560,6 +560,46 @@ RrcAsn1Header::DeserializeRadioResourceConfigDedicated (LteRrcSap::RadioResource return bIterator; } +void +RrcAsn1Header::SerializeUlDcchMessage(int messageType) const +{ + SerializeSequence(std::bitset<0>(),false); + // Choose c1 + SerializeChoice(2,0); + // Choose message type + SerializeChoice(16,messageType); +} + +void +RrcAsn1Header::SerializeUlCcchMessage(int messageType) const +{ + SerializeSequence(std::bitset<0>(),false); + // Choose c1 + SerializeChoice(2,0); + // Choose message type + SerializeChoice(2,messageType); +} + +void +RrcAsn1Header::SerializeDlDcchMessage(int messageType) const +{ + SerializeSequence(std::bitset<0>(),false); + // Choose c1 + SerializeChoice(2,0); + // Choose message type + SerializeChoice(16,messageType); +} + +void +RrcAsn1Header::SerializeDlCcchMessage(int messageType) const +{ + SerializeSequence(std::bitset<0>(),false); + // Choose c1 + SerializeChoice(2,0); + // Choose message type + SerializeChoice(4,messageType); +} + Buffer::Iterator RrcAsn1Header::DeserializeSrbToAddModList (std::list *srbToAddModList, Buffer::Iterator bIterator) { @@ -1427,6 +1467,99 @@ RrcAsn1Header::DeserializeRadioResourceConfigCommonSib (Buffer::Iterator bIterat return bIterator; } + +Buffer::Iterator +RrcAsn1Header::DeserializeUlDcchMessage (Buffer::Iterator bIterator) +{ + std::bitset<0> bitset0; + int n; + + bIterator = DeserializeSequence(&bitset0,false,bIterator); + bIterator = DeserializeChoice(2,&n,bIterator); + if(n==1) + { + // Deserialize messageClassExtension + bIterator = DeserializeSequence(&bitset0,false,bIterator); + m_messageType = -1; + } + else if(n == 0) + { + // Deserialize c1 + bIterator = DeserializeChoice(16,&m_messageType,bIterator); + } + + return bIterator; +} + +Buffer::Iterator +RrcAsn1Header::DeserializeUlCcchMessage (Buffer::Iterator bIterator) +{ + std::bitset<0> bitset0; + int n; + + bIterator = DeserializeSequence(&bitset0,false,bIterator); + bIterator = DeserializeChoice(2,&n,bIterator); + if(n==1) + { + // Deserialize messageClassExtension + bIterator = DeserializeSequence(&bitset0,false,bIterator); + m_messageType = -1; + } + else if(n == 0) + { + // Deserialize c1 + bIterator = DeserializeChoice(2,&m_messageType,bIterator); + } + + return bIterator; +} + +Buffer::Iterator +RrcAsn1Header::DeserializeDlCcchMessage (Buffer::Iterator bIterator) +{ + std::bitset<0> bitset0; + int n; + + bIterator = DeserializeSequence(&bitset0,false,bIterator); + bIterator = DeserializeChoice(2,&n,bIterator); + if(n==1) + { + // Deserialize messageClassExtension + bIterator = DeserializeSequence(&bitset0,false,bIterator); + m_messageType = -1; + } + else if(n == 0) + { + // Deserialize c1 + bIterator = DeserializeChoice(4,&m_messageType,bIterator); + } + + return bIterator; +} + +Buffer::Iterator +RrcAsn1Header::DeserializeDlDcchMessage (Buffer::Iterator bIterator) +{ + std::bitset<0> bitset0; + int n; + + bIterator = DeserializeSequence(&bitset0,false,bIterator); + bIterator = DeserializeChoice(2,&n,bIterator); + if(n==1) + { + // Deserialize messageClassExtension + bIterator = DeserializeSequence(&bitset0,false,bIterator); + m_messageType = -1; + } + else if(n == 0) + { + // Deserialize c1 + bIterator = DeserializeChoice(16,&m_messageType,bIterator); + } + + return bIterator; +} + //////////////////// RrcConnectionRequest class //////////////////////// // Constructor @@ -1712,6 +1845,9 @@ RrcConnectionSetupCompleteHeader::PreSerialize () const { m_serializationResult = Buffer (); + // Serialize DCCH message + SerializeUlDcchMessage(4); + // Serialize RRCConnectionSetupComplete sequence: // no default or optional fields. Extension marker not present. SerializeSequence<0> (std::bitset<0> (),false); @@ -1737,6 +1873,9 @@ uint32_t RrcConnectionSetupCompleteHeader::Deserialize (Buffer::Iterator bIterator) { std::bitset<0> bitset0; + + bIterator = DeserializeUlDcchMessage(bIterator); + bIterator = DeserializeSequence (&bitset0,false,bIterator); int n; @@ -1789,6 +1928,14 @@ RrcConnectionSetupCompleteHeader::GetRrcTransactionIdentifier () const return m_rrcTransactionIdentifier; } +LteRrcSap::RrcConnectionSetupCompleted +RrcConnectionSetupCompleteHeader::GetMessage() const +{ + LteRrcSap::RrcConnectionSetupCompleted msg; + msg.rrcTransactionIdentifier = m_rrcTransactionIdentifier; + return msg; +} + //////////////////// RrcConnectionReconfigurationCompleteHeader class //////////////////////// RrcConnectionReconfigurationCompleteHeader::RrcConnectionReconfigurationCompleteHeader () @@ -1800,6 +1947,9 @@ RrcConnectionReconfigurationCompleteHeader::PreSerialize () const { m_serializationResult = Buffer (); + // Serialize DCCH message + SerializeUlDcchMessage(2); + // Serialize RRCConnectionSetupComplete sequence: // no default or optional fields. Extension marker not present. SerializeSequence<0> (std::bitset<0> (),false); @@ -1825,6 +1975,9 @@ RrcConnectionReconfigurationCompleteHeader::Deserialize (Buffer::Iterator bItera bIterator = DeserializeSequence (&bitset0,false,bIterator); int n; + + bIterator = DeserializeUlDcchMessage(bIterator); + bIterator = DeserializeInteger (&n,0,3,bIterator); m_rrcTransactionIdentifier = n; @@ -2855,6 +3008,9 @@ RrcConnectionReestablishmentCompleteHeader::PreSerialize () const { m_serializationResult = Buffer (); + // Serialize DCCH message + SerializeUlDcchMessage(3); + // Serialize RrcConnectionReestablishmentComplete sequence: // no default or optional fields. Extension marker not present. SerializeSequence (std::bitset<0> (),false); @@ -2879,6 +3035,8 @@ RrcConnectionReestablishmentCompleteHeader::Deserialize (Buffer::Iterator bItera std::bitset<0> bitset0; int n; + bIterator = DeserializeUlDcchMessage(bIterator); + // Deserialize RrcConnectionReestablishmentComplete sequence // 0 optional fields, no extension marker bIterator = DeserializeSequence (&bitset0,false,bIterator); diff --git a/src/lte/model/lte-rrc-header.h b/src/lte/model/lte-rrc-header.h index c34244276..3399cf819 100644 --- a/src/lte/model/lte-rrc-header.h +++ b/src/lte/model/lte-rrc-header.h @@ -39,7 +39,8 @@ class RrcAsn1Header : public Asn1Header { public: RrcAsn1Header (); - + int GetMessageType (); + protected: // Serialization functions void SerializeSrbToAddModList (std::list srbToAddModList) const; @@ -50,6 +51,10 @@ protected: void SerializeSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 systemInformationBlockType1) const; void SerializeSystemInformationBlockType2 () const; void SerializeRadioResourceConfigCommonSIB () const; + void SerializeUlDcchMessage(int msgType) const; + void SerializeUlCcchMessage(int msgType) const; + void SerializeDlDcchMessage(int msgType) const; + void SerializeDlCcchMessage(int msgType) const; // Deserialization functions Buffer::Iterator DeserializeDrbToAddModList (std::list *drbToAddModLis, Buffer::Iterator bIterator); @@ -61,8 +66,14 @@ protected: Buffer::Iterator DeserializeSystemInformationBlockType2 (Buffer::Iterator bIterator); Buffer::Iterator DeserializeRadioResourceConfigCommon (Buffer::Iterator bIterator); Buffer::Iterator DeserializeRadioResourceConfigCommonSib (Buffer::Iterator bIterator); + Buffer::Iterator DeserializeUlDcchMessage (Buffer::Iterator bIterator); + Buffer::Iterator DeserializeUlCcchMessage (Buffer::Iterator bIterator); + Buffer::Iterator DeserializeDlDcchMessage (Buffer::Iterator bIterator); + Buffer::Iterator DeserializeDlCcchMessage (Buffer::Iterator bIterator); void Print (std::ostream &os, LteRrcSap::RadioResourceConfigDedicated radioResourceConfigDedicated) const; + + int m_messageType; }; /** @@ -130,8 +141,9 @@ public: uint32_t Deserialize (Buffer::Iterator bIterator); void Print (std::ostream &os) const; void SetMessage (RrcConnectionSetupCompleted msg); - + uint8_t GetRrcTransactionIdentifier () const; + RrcConnectionSetupCompleted GetMessage() const; private: uint8_t m_rrcTransactionIdentifier; diff --git a/src/lte/model/lte-rrc-protocol-real.cc b/src/lte/model/lte-rrc-protocol-real.cc index fc754ed5c..b77ba16b7 100644 --- a/src/lte/model/lte-rrc-protocol-real.cc +++ b/src/lte/model/lte-rrc-protocol-real.cc @@ -57,6 +57,8 @@ LteUeRrcProtocolReal::DoDispose () { NS_LOG_FUNCTION (this); delete m_ueRrcSapUser; + delete m_completeSetupParameters.srb0SapUser; + delete m_completeSetupParameters.srb1SapUser; m_rrc = 0; } @@ -97,6 +99,17 @@ LteUeRrcProtocolReal::DoSetup (LteUeRrcSapUser::SetupParameters params) // after handover). We don't care about SRB0/SRB1 since we use real // RRC messages. DoReestablish (); + + m_setupParameters.srb0SapProvider = params.srb0SapProvider; + m_setupParameters.srb1SapProvider = params.srb1SapProvider; + + LteRlcSapUser* srb0SapUser = new LteRlcSpecificLteRlcSapUser (this); + LtePdcpSapUser* srb1SapUser = new LtePdcpSpecificLtePdcpSapUser (this); + + m_completeSetupParameters.srb0SapUser=srb0SapUser; + m_completeSetupParameters.srb1SapUser=srb1SapUser; + + m_ueRrcSapProvider->CompleteSetup(m_completeSetupParameters); } void @@ -137,11 +150,19 @@ LteUeRrcProtocolReal::DoSendRrcConnectionRequest (LteRrcSap::RrcConnectionReques void LteUeRrcProtocolReal::DoSendRrcConnectionSetupCompleted (LteRrcSap::RrcConnectionSetupCompleted msg) { - Simulator::Schedule (RRC_REAL_MSG_DELAY, - &LteEnbRrcSapProvider::RecvRrcConnectionSetupCompleted, - m_enbRrcSapProvider, - m_rnti, - msg); + Ptr packet = Create (); + + RrcConnectionSetupCompleteHeader source; + source.SetMessage (msg); + + packet->AddHeader (source); + + LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters; + transmitPdcpSduParameters.pdcpSdu = packet; + transmitPdcpSduParameters.rnti = m_rnti; + transmitPdcpSduParameters.lcid = 1; + + m_setupParameters.srb1SapProvider->TransmitPdcpSdu(transmitPdcpSduParameters); } void @@ -220,6 +241,17 @@ LteUeRrcProtocolReal::SetEnbRrcSapProvider () enbRrcProtocolReal->SetUeRrcSapProvider (m_rnti, m_ueRrcSapProvider); } +void +LteUeRrcProtocolReal::DoReceivePdcpPdu (Ptr p) +{ + // TODO +} + +void +LteUeRrcProtocolReal::DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameters params) +{ + // TODO +} NS_OBJECT_ENSURE_REGISTERED (LteEnbRrcProtocolReal); @@ -322,12 +354,25 @@ LteEnbRrcProtocolReal::DoSetupUe (uint16_t rnti, LteEnbRrcSapUser::SetupUeParame // NS_ASSERT_MSG (found , " Unable to find UE with RNTI=" << rnti << " cellId=" << m_cellId); // m_enbRrcSapProviderMap[rnti] = ueRrc->GetLteUeRrcSapProvider (); - // just create empty entry, the UeRrcSapProvider will be set by the // ue upon connection request or connection reconfiguration // completed m_enbRrcSapProviderMap[rnti] = 0; + // Store SetupUeParameters + m_setupUeParametersMap[rnti] = params; + + // Create LteRlcSapUser, LtePdcpSapUser + LteRlcSapUser* srb0SapUser = new LteRlcSpecificLteRlcSapUser (this); + LtePdcpSapUser* srb1SapUser = new LtePdcpSpecificLtePdcpSapUser (this); + LteEnbRrcSapProvider::CompleteSetupUeParameters completeSetupUeParameters; + completeSetupUeParameters.srb0SapUser = srb0SapUser; + completeSetupUeParameters.srb1SapUser = srb1SapUser; + + // Store LteRlcSapUser, LtePdcpSapUser + m_completeSetupUeParametersMap[rnti] = completeSetupUeParameters; + + m_enbRrcSapProvider->CompleteSetupUe(rnti,completeSetupUeParameters); } void @@ -335,6 +380,7 @@ LteEnbRrcProtocolReal::DoRemoveUe (uint16_t rnti) { NS_LOG_FUNCTION (this << rnti); m_enbRrcSapProviderMap.erase (rnti); + m_setupUeParametersMap.erase (rnti); } void @@ -457,6 +503,24 @@ LteEnbRrcProtocolReal::DoSendRrcConnectionRelease (uint16_t rnti, LteRrcSap::Rrc msg); } +void +LteEnbRrcProtocolReal::DoReceivePdcpPdu (Ptr p) +{ + // TODO +} + +void +LteEnbRrcProtocolReal::DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameters params) +{ + // TODO + RrcConnectionSetupCompleteHeader rrcConnectionSetupCompleteHeader; + params.pdcpSdu->RemoveHeader (rrcConnectionSetupCompleteHeader); + + LteRrcSap::RrcConnectionSetupCompleted msg = rrcConnectionSetupCompleteHeader.GetMessage(); + + m_enbRrcSapProvider->RecvRrcConnectionSetupCompleted(params.rnti, msg); + +} /* * The purpose of LteEnbRrcProtocolReal is to avoid encoding diff --git a/src/lte/model/lte-rrc-protocol-real.h b/src/lte/model/lte-rrc-protocol-real.h index 32a3297f6..6c32361df 100644 --- a/src/lte/model/lte-rrc-protocol-real.h +++ b/src/lte/model/lte-rrc-protocol-real.h @@ -28,6 +28,9 @@ #include #include #include +#include +#include +#include namespace ns3 { @@ -47,7 +50,9 @@ class LteUeRrc; class LteUeRrcProtocolReal : public Object { friend class MemberLteUeRrcSapUser; - + friend class LteRlcSpecificLteRlcSapUser; + friend class LtePdcpSpecificLtePdcpSapUser; + public: LteUeRrcProtocolReal (); @@ -75,6 +80,8 @@ private: void DoSendRrcConnectionReestablishmentComplete (LteRrcSap::RrcConnectionReestablishmentComplete msg); void SetEnbRrcSapProvider (); + void DoReceivePdcpPdu (Ptr p); + void DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameters params); Ptr m_rrc; uint16_t m_rnti; @@ -82,6 +89,9 @@ private: LteUeRrcSapUser* m_ueRrcSapUser; LteEnbRrcSapProvider* m_enbRrcSapProvider; + LteUeRrcSapUser::SetupParameters m_setupParameters; + LteUeRrcSapProvider::CompleteSetupParameters m_completeSetupParameters; + }; @@ -95,7 +105,9 @@ private: class LteEnbRrcProtocolReal : public Object { friend class MemberLteEnbRrcSapUser; - + friend class LtePdcpSpecificLtePdcpSapUser; + friend class LteRlcSpecificLteRlcSapUser; + public: LteEnbRrcProtocolReal (); @@ -132,12 +144,16 @@ private: Ptr DoEncodeHandoverCommand (LteRrcSap::RrcConnectionReconfiguration msg); LteRrcSap::RrcConnectionReconfiguration DoDecodeHandoverCommand (Ptr p); + void DoReceivePdcpPdu (Ptr p); + void DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameters params); uint16_t m_rnti; uint16_t m_cellId; LteEnbRrcSapProvider* m_enbRrcSapProvider; LteEnbRrcSapUser* m_enbRrcSapUser; std::map m_enbRrcSapProviderMap; + std::map m_setupUeParametersMap; + std::map m_completeSetupUeParametersMap; }; diff --git a/src/lte/model/lte-ue-rrc.cc b/src/lte/model/lte-ue-rrc.cc index 7c45d12ab..5d2407a35 100644 --- a/src/lte/model/lte-ue-rrc.cc +++ b/src/lte/model/lte-ue-rrc.cc @@ -735,6 +735,11 @@ LteUeRrc::ApplyRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedic ++stamIt; NS_ASSERT_MSG (stamIt == rrcd.srbToAddModList.end (), "at most one SrbToAdd supported"); + + LteUeRrcSapUser::SetupParameters ueParams; + ueParams.srb0SapProvider = m_srb0->m_rlc->GetLteRlcSapProvider (); + ueParams.srb1SapProvider = m_srb1->m_pdcp->GetLtePdcpSapProvider (); + m_rrcSapUser->Setup (ueParams); } else { diff --git a/src/lte/model/pf-ff-mac-scheduler.cc b/src/lte/model/pf-ff-mac-scheduler.cc index f65f7fcba..a9f145cd5 100644 --- a/src/lte/model/pf-ff-mac-scheduler.cc +++ b/src/lte/model/pf-ff-mac-scheduler.cc @@ -1707,8 +1707,9 @@ PfFfMacScheduler::DoSchedUlMacCtrlInfoReq (const struct FfMacSchedSapProvider::S uint8_t bsrId = params.m_macCeList.at (i).m_macCeValue.m_bufferStatus.at (lcg); buffer += BufferSizeLevelBsr::BsrId2BufferSize (bsrId); } - + uint16_t rnti = params.m_macCeList.at (i).m_rnti; + NS_LOG_LOGIC (this << "RNTI=" << rnti << " buffer=" << buffer); it = m_ceBsrRxed.find (rnti); if (it == m_ceBsrRxed.end ()) {