Implement real DoSendRrcConnectionSetupCompleted

This commit is contained in:
Lluis Parcerisa
2012-12-04 19:37:58 +01:00
parent 52bca77b0c
commit 0b1f06e91a
8 changed files with 279 additions and 16 deletions

View File

@@ -141,7 +141,12 @@ UeManager::UeManager (Ptr<LteEnbRrc> rrc, uint16_t rnti, State s)
m_sourceCellId (0)
{
NS_LOG_FUNCTION (this);
}
void
UeManager::DoStart ()
{
NS_LOG_FUNCTION (this);
m_drbPdcpSapUser = new LtePdcpSpecificLtePdcpSapUser<UeManager> (this);
m_physicalConfigDedicated.haveAntennaInfoDedicated = true;
@@ -149,8 +154,8 @@ UeManager::UeManager (Ptr<LteEnbRrc> 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<LteEnbRrc> 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> ueManager = CreateObject<UeManager> (this, rnti, state);
m_ueMap.insert (std::pair<uint16_t, Ptr<UeManager> > (rnti, ueManager));
ueManager->Start ();
NS_LOG_DEBUG (this << " New UE RNTI " << rnti << " cellId " << m_cellId << " srs CI " << ueManager->GetSrsConfigurationIndex ());
return rnti;
}

View File

@@ -95,6 +95,7 @@ public:
// inherited from Object
protected:
virtual void DoStart ();
virtual void DoDispose ();
public:
static TypeId GetTypeId (void);

View File

@@ -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<LteRrcSap::SrbToAddMod> *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);

View File

@@ -39,7 +39,8 @@ class RrcAsn1Header : public Asn1Header
{
public:
RrcAsn1Header ();
int GetMessageType ();
protected:
// Serialization functions
void SerializeSrbToAddModList (std::list<LteRrcSap::SrbToAddMod> 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<LteRrcSap::DrbToAddMod> *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;

View File

@@ -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<LteUeRrcProtocolReal> (this);
LtePdcpSapUser* srb1SapUser = new LtePdcpSpecificLtePdcpSapUser<LteUeRrcProtocolReal> (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> packet = Create<Packet> ();
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<Packet> 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<LteEnbRrcProtocolReal> (this);
LtePdcpSapUser* srb1SapUser = new LtePdcpSpecificLtePdcpSapUser<LteEnbRrcProtocolReal> (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<Packet> 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

View File

@@ -28,6 +28,9 @@
#include <ns3/ptr.h>
#include <ns3/object.h>
#include <ns3/lte-rrc-sap.h>
#include <ns3/lte-pdcp-sap.h>
#include <ns3/lte-rlc-sap.h>
#include <ns3/lte-rrc-header.h>
namespace ns3 {
@@ -47,7 +50,9 @@ class LteUeRrc;
class LteUeRrcProtocolReal : public Object
{
friend class MemberLteUeRrcSapUser<LteUeRrcProtocolReal>;
friend class LteRlcSpecificLteRlcSapUser<LteUeRrcProtocolReal>;
friend class LtePdcpSpecificLtePdcpSapUser<LteUeRrcProtocolReal>;
public:
LteUeRrcProtocolReal ();
@@ -75,6 +80,8 @@ private:
void DoSendRrcConnectionReestablishmentComplete (LteRrcSap::RrcConnectionReestablishmentComplete msg);
void SetEnbRrcSapProvider ();
void DoReceivePdcpPdu (Ptr<Packet> p);
void DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameters params);
Ptr<LteUeRrc> 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<LteEnbRrcProtocolReal>;
friend class LtePdcpSpecificLtePdcpSapUser<LteEnbRrcProtocolReal>;
friend class LteRlcSpecificLteRlcSapUser<LteEnbRrcProtocolReal>;
public:
LteEnbRrcProtocolReal ();
@@ -132,12 +144,16 @@ private:
Ptr<Packet> DoEncodeHandoverCommand (LteRrcSap::RrcConnectionReconfiguration msg);
LteRrcSap::RrcConnectionReconfiguration DoDecodeHandoverCommand (Ptr<Packet> p);
void DoReceivePdcpPdu (Ptr<Packet> p);
void DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameters params);
uint16_t m_rnti;
uint16_t m_cellId;
LteEnbRrcSapProvider* m_enbRrcSapProvider;
LteEnbRrcSapUser* m_enbRrcSapUser;
std::map<uint16_t, LteUeRrcSapProvider*> m_enbRrcSapProviderMap;
std::map<uint16_t, LteEnbRrcSapUser::SetupUeParameters> m_setupUeParametersMap;
std::map<uint16_t, LteEnbRrcSapProvider::CompleteSetupUeParameters> m_completeSetupUeParametersMap;
};

View File

@@ -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
{

View File

@@ -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 ())
{