merge
authorNicola Baldo <nbaldo@cttc.es>
Tue, 04 Dec 2012 19:52:04 +0100
changeset 9472 e902530872cb
parent 9469 28a7b04a0b11 (current diff)
parent 9471 082640d26eea (diff)
child 9473 8b420bd32318
merge
src/lte/model/lte-enb-rrc.cc
src/lte/model/lte-ue-rrc.cc
--- a/src/lte/model/lte-enb-rrc.cc	Tue Dec 04 19:22:26 2012 +0100
+++ b/src/lte/model/lte-enb-rrc.cc	Tue Dec 04 19:52:04 2012 +0100
@@ -141,7 +141,12 @@
     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 @@
   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 @@
 
   // 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 @@
   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;
 }
--- a/src/lte/model/lte-enb-rrc.h	Tue Dec 04 19:22:26 2012 +0100
+++ b/src/lte/model/lte-enb-rrc.h	Tue Dec 04 19:52:04 2012 +0100
@@ -95,6 +95,7 @@
 
   // inherited from Object
 protected:
+  virtual void DoStart ();
   virtual void DoDispose ();
 public: 
   static TypeId GetTypeId (void);
--- a/src/lte/model/lte-rlc-am.cc	Tue Dec 04 19:22:26 2012 +0100
+++ b/src/lte/model/lte-rlc-am.cc	Tue Dec 04 19:52:04 2012 +0100
@@ -72,8 +72,6 @@
   // SDU reassembling process
   m_reassemblingState = WAITING_S0_FULL;
   m_expectedSeqNumber = 0;
-
-  Simulator::ScheduleNow (&LteRlcAm::Start, this);
 }
 
 LteRlcAm::~LteRlcAm ()
@@ -1017,24 +1015,6 @@
 }
 
 
-void
-LteRlcAm::Start ()
-{
-  NS_LOG_FUNCTION (this);
-
-  LteMacSapProvider::ReportBufferStatusParameters p;
-  p.rnti = m_rnti;
-  p.lcid = m_lcid;
-  p.txQueueSize = 0;
-  p.txQueueHolDelay = 0;
-  p.retxQueueSize = 0;
-  p.retxQueueHolDelay = 0;
-  p.statusPduSize = 0;
-
-  m_macSapProvider->ReportBufferStatus (p);
-}
-
-
 bool
 LteRlcAm::IsInsideReceivingWindow (SequenceNumber10 seqNumber)
 {
--- a/src/lte/model/lte-rlc-am.h	Tue Dec 04 19:22:26 2012 +0100
+++ b/src/lte/model/lte-rlc-am.h	Tue Dec 04 19:52:04 2012 +0100
@@ -53,8 +53,6 @@
   virtual void DoNotifyHarqDeliveryFailure ();
   virtual void DoReceivePdu (Ptr<Packet> p);
 
-  void Start ();
-
 private:
   /**
    * This method will schedule a timeout at WaitReplyTimeout interval
--- a/src/lte/model/lte-rlc-tm.cc	Tue Dec 04 19:22:26 2012 +0100
+++ b/src/lte/model/lte-rlc-tm.cc	Tue Dec 04 19:52:04 2012 +0100
@@ -36,8 +36,6 @@
     m_txBufferSize (0)
 {
   NS_LOG_FUNCTION (this);
-
-  Simulator::ScheduleNow (&LteRlcTm::Start, this);
 }
 
 LteRlcTm::~LteRlcTm ()
@@ -188,15 +186,6 @@
 
 
 void
-LteRlcTm::Start ()
-{
-  NS_LOG_FUNCTION (this);
-
-  DoReportBufferStatus ();
-}
-
-
-void
 LteRlcTm::DoReportBufferStatus (void)
 {
   Time holDelay (0);
--- a/src/lte/model/lte-rlc-tm.h	Tue Dec 04 19:22:26 2012 +0100
+++ b/src/lte/model/lte-rlc-tm.h	Tue Dec 04 19:52:04 2012 +0100
@@ -52,8 +52,6 @@
   virtual void DoNotifyHarqDeliveryFailure ();
   virtual void DoReceivePdu (Ptr<Packet> p);
 
-  void Start ();
-
 private:
   void ExpireRbsTimer (void);
   void DoReportBufferStatus ();
--- a/src/lte/model/lte-rlc-um.cc	Tue Dec 04 19:22:26 2012 +0100
+++ b/src/lte/model/lte-rlc-um.cc	Tue Dec 04 19:52:04 2012 +0100
@@ -44,8 +44,6 @@
 {
   NS_LOG_FUNCTION (this);
   m_reassemblingState = WAITING_S0_FULL;
-
-  Simulator::ScheduleNow (&LteRlcUm::Start, this);
 }
 
 LteRlcUm::~LteRlcUm ()
@@ -559,15 +557,6 @@
 }
 
 
-void
-LteRlcUm::Start ()
-{
-  NS_LOG_FUNCTION (this);
-
-  DoReportBufferStatus ();
-}
-
-
 bool
 LteRlcUm::IsInsideReorderingWindow (SequenceNumber10 seqNumber)
 {
--- a/src/lte/model/lte-rlc-um.h	Tue Dec 04 19:22:26 2012 +0100
+++ b/src/lte/model/lte-rlc-um.h	Tue Dec 04 19:52:04 2012 +0100
@@ -52,8 +52,6 @@
   virtual void DoNotifyHarqDeliveryFailure ();
   virtual void DoReceivePdu (Ptr<Packet> p);
 
-  void Start ();
-
 private:
   void ExpireReorderingTimer (void);
   void ExpireRbsTimer (void);
--- a/src/lte/model/lte-rrc-header.cc	Tue Dec 04 19:22:26 2012 +0100
+++ b/src/lte/model/lte-rrc-header.cc	Tue Dec 04 19:52:04 2012 +0100
@@ -560,6 +560,46 @@
   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 @@
 
   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 @@
 {
   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 @@
 RrcConnectionSetupCompleteHeader::Deserialize (Buffer::Iterator bIterator)
 {
   std::bitset<0> bitset0;
+  
+  bIterator = DeserializeUlDcchMessage(bIterator);
+  
   bIterator = DeserializeSequence (&bitset0,false,bIterator);
 
   int n;
@@ -1789,6 +1928,14 @@
   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 @@
 {
   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 @@
   bIterator = DeserializeSequence (&bitset0,false,bIterator);
 
   int n;
+  
+  bIterator = DeserializeUlDcchMessage(bIterator);
+
   bIterator = DeserializeInteger (&n,0,3,bIterator);
   m_rrcTransactionIdentifier = n;
 
@@ -2855,6 +3008,9 @@
 {
   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 @@
   std::bitset<0> bitset0;
   int n;
 
+  bIterator = DeserializeUlDcchMessage(bIterator);
+
   // Deserialize RrcConnectionReestablishmentComplete sequence
   // 0 optional fields, no extension marker
   bIterator = DeserializeSequence (&bitset0,false,bIterator);
--- a/src/lte/model/lte-rrc-header.h	Tue Dec 04 19:22:26 2012 +0100
+++ b/src/lte/model/lte-rrc-header.h	Tue Dec 04 19:52:04 2012 +0100
@@ -39,7 +39,8 @@
 {
 public:
   RrcAsn1Header ();
-
+  int GetMessageType ();
+  
 protected:
   // Serialization functions
   void SerializeSrbToAddModList (std::list<LteRrcSap::SrbToAddMod> srbToAddModList) const;
@@ -50,6 +51,10 @@
   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 @@
   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 @@
   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;
--- a/src/lte/model/lte-rrc-protocol-real.cc	Tue Dec 04 19:22:26 2012 +0100
+++ b/src/lte/model/lte-rrc-protocol-real.cc	Tue Dec 04 19:52:04 2012 +0100
@@ -57,6 +57,8 @@
 {
   NS_LOG_FUNCTION (this);
   delete m_ueRrcSapUser;
+  delete m_completeSetupParameters.srb0SapUser;
+  delete m_completeSetupParameters.srb1SapUser;
   m_rrc = 0;
 }
 
@@ -97,6 +99,17 @@
   // 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 @@
 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 @@
   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 @@
   // 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 @@
 {
   NS_LOG_FUNCTION (this << rnti);
   m_enbRrcSapProviderMap.erase (rnti);
+  m_setupUeParametersMap.erase (rnti);
 }
 
 void 
@@ -457,6 +503,24 @@
 		       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
--- a/src/lte/model/lte-rrc-protocol-real.h	Tue Dec 04 19:22:26 2012 +0100
+++ b/src/lte/model/lte-rrc-protocol-real.h	Tue Dec 04 19:52:04 2012 +0100
@@ -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 LteUeRrcProtocolReal : public Object
 {
   friend class MemberLteUeRrcSapUser<LteUeRrcProtocolReal>;
-
+  friend class LteRlcSpecificLteRlcSapUser<LteUeRrcProtocolReal>;
+  friend class LtePdcpSpecificLtePdcpSapUser<LteUeRrcProtocolReal>;
+  
 public:
 
   LteUeRrcProtocolReal ();
@@ -75,6 +80,8 @@
   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 @@
   LteUeRrcSapUser* m_ueRrcSapUser;
   LteEnbRrcSapProvider* m_enbRrcSapProvider;
   
+  LteUeRrcSapUser::SetupParameters m_setupParameters;
+  LteUeRrcSapProvider::CompleteSetupParameters m_completeSetupParameters;
+  
 };
 
 
@@ -95,7 +105,9 @@
 class LteEnbRrcProtocolReal : public Object
 {
   friend class MemberLteEnbRrcSapUser<LteEnbRrcProtocolReal>;
-
+  friend class LtePdcpSpecificLtePdcpSapUser<LteEnbRrcProtocolReal>;
+  friend class LteRlcSpecificLteRlcSapUser<LteEnbRrcProtocolReal>;
+  
 public:
 
   LteEnbRrcProtocolReal ();
@@ -132,12 +144,16 @@
   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;
   
 };
 
--- a/src/lte/model/lte-ue-rrc.cc	Tue Dec 04 19:22:26 2012 +0100
+++ b/src/lte/model/lte-ue-rrc.cc	Tue Dec 04 19:52:04 2012 +0100
@@ -739,6 +739,11 @@
       
           ++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
         {
--- a/src/lte/model/pf-ff-mac-scheduler.cc	Tue Dec 04 19:22:26 2012 +0100
+++ b/src/lte/model/pf-ff-mac-scheduler.cc	Tue Dec 04 19:52:04 2012 +0100
@@ -1707,8 +1707,9 @@
               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 ())
             {