diff --git a/src/lte/model/lte-rrc-header.cc b/src/lte/model/lte-rrc-header.cc index b3c3cd576..40eb7724d 100644 --- a/src/lte/model/lte-rrc-header.cc +++ b/src/lte/model/lte-rrc-header.cc @@ -40,6 +40,12 @@ RrcAsn1Header::RrcAsn1Header () { } +int +RrcAsn1Header::GetMessageType () +{ + return m_messageType; +} + void RrcAsn1Header::SerializeDrbToAddModList (std::list drbToAddModList) const { @@ -560,46 +566,6 @@ 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) { @@ -1468,98 +1434,6 @@ 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 @@ -1585,6 +1459,8 @@ RrcConnectionRequestHeader::PreSerialize () const { m_serializationResult = Buffer (); + SerializeUlCcchMessage(1); + // Serialize RRCConnectionRequest sequence: // no default or optional fields. Extension marker not present. SerializeSequence<0> (std::bitset<0> (),false); @@ -1628,6 +1504,8 @@ RrcConnectionRequestHeader::Deserialize (Buffer::Iterator bIterator) std::bitset<0> optionalOrDefaultMask; int selectedOption; + bIterator = DeserializeUlCcchMessage(bIterator); + // Deserialize RCConnectionRequest sequence bIterator = DeserializeSequence (&optionalOrDefaultMask,false,bIterator); @@ -1666,6 +1544,15 @@ RrcConnectionRequestHeader::SetMessage (RrcConnectionRequest msg) m_isDataSerialized = false; } +LteRrcSap::RrcConnectionRequest +RrcConnectionRequestHeader::GetMessage () const +{ + RrcConnectionRequest msg; + msg.ueIdentity = (m_mmec.to_ulong() << 32) | (m_mTmsi.to_ulong()); + + return msg; +} + std::bitset<8> RrcConnectionRequestHeader::getMmec () const { @@ -2010,6 +1897,14 @@ RrcConnectionReconfigurationCompleteHeader::SetMessage (RrcConnectionReconfigura m_isDataSerialized = false; } +LteRrcSap::RrcConnectionReconfigurationCompleted +RrcConnectionReconfigurationCompleteHeader::GetMessage() const +{ + RrcConnectionReconfigurationCompleted msg; + msg.rrcTransactionIdentifier = m_rrcTransactionIdentifier; + return msg; +} + uint8_t RrcConnectionReconfigurationCompleteHeader::GetRrcTransactionIdentifier () const { @@ -2027,6 +1922,8 @@ RrcConnectionReconfigurationHeader::PreSerialize () const { m_serializationResult = Buffer (); + SerializeDlDcchMessage(4); + // Serialize RRCConnectionSetupComplete sequence: // no default or optional fields. Extension marker not present. SerializeSequence<0> (std::bitset<0> (),false); @@ -2149,9 +2046,10 @@ RrcConnectionReconfigurationHeader::PreSerialize () const uint32_t RrcConnectionReconfigurationHeader::Deserialize (Buffer::Iterator bIterator) { - // pag 106 std::bitset<0> bitset0; + bIterator = DeserializeDlDcchMessage(bIterator); + // RRCConnectionReconfiguration sequence bIterator = DeserializeSequence (&bitset0,false,bIterator); @@ -2390,6 +2288,22 @@ RrcConnectionReconfigurationHeader::SetMessage (RrcConnectionReconfiguration msg m_isDataSerialized = false; } +LteRrcSap::RrcConnectionReconfiguration +RrcConnectionReconfigurationHeader::GetMessage () const +{ + RrcConnectionReconfiguration msg; + + msg.rrcTransactionIdentifier = m_rrcTransactionIdentifier; + msg.haveMeasConfig = m_haveMeasConfig; + msg.measConfig = m_measConfig; + msg.haveMobilityControlInfo = m_haveMobilityControlInfo; + msg.mobilityControlInfo = m_mobilityControlInfo; + msg.haveRadioResourceConfigDedicated = m_haveRadioResourceConfigDedicated; + msg.radioResourceConfigDedicated = m_radioResourceConfigDedicated; + + return msg; +} + uint8_t RrcConnectionReconfigurationHeader::GetRrcTransactionIdentifier () const { @@ -2745,6 +2659,8 @@ RrcConnectionReestablishmentRequestHeader::PreSerialize () const { m_serializationResult = Buffer (); + SerializeUlCcchMessage(0); + // Serialize RrcConnectionReestablishmentReques sequence: // no default or optional fields. Extension marker not present. SerializeSequence<0> (std::bitset<0> (),false); @@ -2795,6 +2711,8 @@ RrcConnectionReestablishmentRequestHeader::Deserialize (Buffer::Iterator bIterat std::bitset<0> bitset0; int n; + bIterator = DeserializeUlCcchMessage(bIterator); + // Deserialize RrcConnectionReestablishmentRequest sequence // 0 optional fields, no extension marker bIterator = DeserializeSequence (&bitset0,false,bIterator); @@ -2870,6 +2788,16 @@ RrcConnectionReestablishmentRequestHeader::SetMessage (RrcConnectionReestablishm m_isDataSerialized = false; } +LteRrcSap::RrcConnectionReestablishmentRequest +RrcConnectionReestablishmentRequestHeader::GetMessage () const +{ + RrcConnectionReestablishmentRequest msg; + msg.ueIdentity = m_ueIdentity; + msg.reestablishmentCause = m_reestablishmentCause; + + return msg; +} + LteRrcSap::ReestabUeIdentity RrcConnectionReestablishmentRequestHeader::GetUeIdentity () const { @@ -3081,11 +3009,231 @@ RrcConnectionReestablishmentCompleteHeader::SetMessage (RrcConnectionReestablish m_isDataSerialized = false; } +LteRrcSap::RrcConnectionReestablishmentComplete +RrcConnectionReestablishmentCompleteHeader::GetMessage() const +{ + RrcConnectionReestablishmentComplete msg; + msg.rrcTransactionIdentifier = m_rrcTransactionIdentifier; + return msg; +} + uint8_t RrcConnectionReestablishmentCompleteHeader::GetRrcTransactionIdentifier () const { return m_rrcTransactionIdentifier; } +/////////////////// RrcUlDcchMessage ////////////////////////////////// +uint32_t +RrcUlDcchMessage::Deserialize(Buffer::Iterator bIterator) +{ + DeserializeUlDcchMessage(bIterator); + return 1; +} + +void +RrcUlDcchMessage::Print (std::ostream &os) const +{ + std::cout << "UL DCCH MSG TYPE: " << m_messageType << std::endl; +} + +void +RrcUlDcchMessage::PreSerialize () const +{ + SerializeUlDcchMessage(m_messageType); +} + +Buffer::Iterator +RrcUlDcchMessage::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; +} + +void +RrcUlDcchMessage::SerializeUlDcchMessage(int messageType) const +{ + SerializeSequence(std::bitset<0>(),false); + // Choose c1 + SerializeChoice(2,0); + // Choose message type + SerializeChoice(16,messageType); +} + +/////////////////// RrcDlDcchMessage ////////////////////////////////// +uint32_t +RrcDlDcchMessage::Deserialize(Buffer::Iterator bIterator) +{ + DeserializeDlDcchMessage(bIterator); + return 1; +} + +void +RrcDlDcchMessage::Print (std::ostream &os) const +{ + std::cout << "DL DCCH MSG TYPE: " << m_messageType << std::endl; +} + +void +RrcDlDcchMessage::PreSerialize () const +{ + SerializeDlDcchMessage(m_messageType); +} + +Buffer::Iterator +RrcDlDcchMessage::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; +} + +void +RrcDlDcchMessage::SerializeDlDcchMessage(int messageType) const +{ + SerializeSequence(std::bitset<0>(),false); + // Choose c1 + SerializeChoice(2,0); + // Choose message type + SerializeChoice(16,messageType); +} + +/////////////////// RrcUlCcchMessage ////////////////////////////////// +uint32_t +RrcUlCcchMessage::Deserialize(Buffer::Iterator bIterator) +{ + DeserializeUlCcchMessage(bIterator); + return 1; +} + +void +RrcUlCcchMessage::Print (std::ostream &os) const +{ + std::cout << "UL CCCH MSG TYPE: " << m_messageType << std::endl; +} + +void +RrcUlCcchMessage::PreSerialize () const +{ + SerializeUlCcchMessage(m_messageType); +} + +Buffer::Iterator +RrcUlCcchMessage::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; +} + +void +RrcUlCcchMessage::SerializeUlCcchMessage(int messageType) const +{ + SerializeSequence(std::bitset<0>(),false); + // Choose c1 + SerializeChoice(2,0); + // Choose message type + SerializeChoice(2,messageType); +} + +/////////////////// RrcDlCcchMessage ////////////////////////////////// +uint32_t +RrcDlCcchMessage::Deserialize(Buffer::Iterator bIterator) +{ + DeserializeDlCcchMessage(bIterator); + return 1; +} + +void +RrcDlCcchMessage::Print (std::ostream &os) const +{ + std::cout << "DL CCCH MSG TYPE: " << m_messageType << std::endl; +} + +void +RrcDlCcchMessage::PreSerialize () const +{ + SerializeDlCcchMessage(m_messageType); +} + +Buffer::Iterator +RrcDlCcchMessage::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; +} + +void +RrcDlCcchMessage::SerializeDlCcchMessage(int messageType) const +{ + SerializeSequence(std::bitset<0>(),false); + // Choose c1 + SerializeChoice(2,0); + // Choose message type + SerializeChoice(4,messageType); +} + } // namespace ns3 diff --git a/src/lte/model/lte-rrc-header.h b/src/lte/model/lte-rrc-header.h index 3399cf819..504c44d85 100644 --- a/src/lte/model/lte-rrc-header.h +++ b/src/lte/model/lte-rrc-header.h @@ -51,10 +51,6 @@ 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); @@ -66,20 +62,73 @@ 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; }; + +/** + * This class only serves to discriminate which message type has been received + * in uplink (ue to eNb) for channel DCCH + */ +class RrcUlDcchMessage : public RrcAsn1Header +{ + public: + uint32_t Deserialize (Buffer::Iterator bIterator); + void Print (std::ostream &os) const; + void PreSerialize () const; + void SerializeUlDcchMessage(int msgType) const; + Buffer::Iterator DeserializeUlDcchMessage (Buffer::Iterator bIterator); +}; + +/** + * This class only serves to discriminate which message type has been received + * in downlink (eNb to ue) for channel DCCH + */ +class RrcDlDcchMessage : public RrcAsn1Header +{ + public: + uint32_t Deserialize (Buffer::Iterator bIterator); + void Print (std::ostream &os) const; + void PreSerialize () const; + void SerializeDlDcchMessage(int msgType) const; + Buffer::Iterator DeserializeDlDcchMessage (Buffer::Iterator bIterator); +}; + +/** + * This class only serves to discriminate which message type has been received + * in uplink (ue to eNb) for channel CCCH + */ +class RrcUlCcchMessage : public RrcAsn1Header +{ + public: + uint32_t Deserialize (Buffer::Iterator bIterator); + void Print (std::ostream &os) const; + void PreSerialize () const; + void SerializeUlCcchMessage(int msgType) const; + Buffer::Iterator DeserializeUlCcchMessage (Buffer::Iterator bIterator); +}; + +/** + * This class only serves to discriminate which message type has been received + * in downlink (eNb to ue) for channel CCCH + */ +class RrcDlCcchMessage : public RrcAsn1Header +{ + public: + uint32_t Deserialize (Buffer::Iterator bIterator); + void Print (std::ostream &os) const; + void PreSerialize () const; + void SerializeDlCcchMessage(int msgType) const; + Buffer::Iterator DeserializeDlCcchMessage (Buffer::Iterator bIterator); +}; + /** * This class manages the serialization/deserialization of RrcConnectionRequest IE */ -class RrcConnectionRequestHeader : public RrcAsn1Header, +class RrcConnectionRequestHeader : public RrcUlCcchMessage, LteRrcSap { public: @@ -88,7 +137,7 @@ public: uint32_t Deserialize (Buffer::Iterator bIterator); void Print (std::ostream &os) const; void SetMessage (RrcConnectionRequest msg); - + RrcConnectionRequest GetMessage() const; std::bitset<8> getMmec () const; std::bitset<32> getMtmsi () const; @@ -132,7 +181,7 @@ private: /** * This class manages the serialization/deserialization of RrcConnectionSetupComplete IE */ -class RrcConnectionSetupCompleteHeader : public RrcAsn1Header, +class RrcConnectionSetupCompleteHeader : public RrcUlDcchMessage, LteRrcSap { public: @@ -153,7 +202,7 @@ private: /** * This class manages the serialization/deserialization of RrcConnectionSetupComplete IE */ -class RrcConnectionReconfigurationCompleteHeader : public RrcAsn1Header, +class RrcConnectionReconfigurationCompleteHeader : public RrcUlDcchMessage, LteRrcSap { public: @@ -162,7 +211,7 @@ public: uint32_t Deserialize (Buffer::Iterator bIterator); void Print (std::ostream &os) const; void SetMessage (RrcConnectionReconfigurationCompleted msg); - + RrcConnectionReconfigurationCompleted GetMessage() const; uint8_t GetRrcTransactionIdentifier () const; private: @@ -173,7 +222,7 @@ private: /** * This class manages the serialization/deserialization of RrcConnectionReconfiguration IE */ -class RrcConnectionReconfigurationHeader : public RrcAsn1Header, +class RrcConnectionReconfigurationHeader : public RrcDlDcchMessage, LteRrcSap { public: @@ -183,6 +232,7 @@ public: void Print (std::ostream &os) const; void SetMessage (RrcConnectionReconfiguration msg); + RrcConnectionReconfiguration GetMessage () const; uint8_t GetRrcTransactionIdentifier () const; bool GetHaveMeasConfig (); MeasConfig GetMeasConfig (); @@ -230,7 +280,7 @@ private: /** * This class manages the serialization/deserialization of RRCConnectionReestablishmentRequest IE */ -class RrcConnectionReestablishmentRequestHeader : public RrcAsn1Header, +class RrcConnectionReestablishmentRequestHeader : public RrcUlCcchMessage, LteRrcSap { public: @@ -239,6 +289,7 @@ public: uint32_t Deserialize (Buffer::Iterator bIterator); void Print (std::ostream &os) const; void SetMessage (RrcConnectionReestablishmentRequest msg); + RrcConnectionReestablishmentRequest GetMessage () const; ReestabUeIdentity GetUeIdentity () const; ReestablishmentCause GetReestablishmentCause () const; @@ -272,7 +323,7 @@ private: /** * This class manages the serialization/deserialization of RrcConnectionReestablishmentComplete IE */ -class RrcConnectionReestablishmentCompleteHeader : public RrcAsn1Header, +class RrcConnectionReestablishmentCompleteHeader : public RrcUlDcchMessage, LteRrcSap { public: @@ -281,7 +332,7 @@ public: uint32_t Deserialize (Buffer::Iterator bIterator); void Print (std::ostream &os) const; void SetMessage (RrcConnectionReestablishmentComplete msg); - + RrcConnectionReestablishmentComplete GetMessage() const; uint8_t GetRrcTransactionIdentifier () const; private: diff --git a/src/lte/model/lte-rrc-protocol-real.cc b/src/lte/model/lte-rrc-protocol-real.cc index b77ba16b7..edae9e3b3 100644 --- a/src/lte/model/lte-rrc-protocol-real.cc +++ b/src/lte/model/lte-rrc-protocol-real.cc @@ -15,7 +15,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * Author: Nicola Baldo + * Authors: Nicola Baldo + * Lluis Parcerisa */ #include @@ -139,7 +140,22 @@ LteUeRrcProtocolReal::DoSendRrcConnectionRequest (LteRrcSap::RrcConnectionReques // eNB we are currently attached to m_rnti = m_rrc->GetRnti (); SetEnbRrcSapProvider (); - + + /* + Ptr packet = Create (); + + RrcConnectionRequestHeader rrcConnectionRequestHeader; + rrcConnectionRequestHeader.SetMessage (msg); + + packet->AddHeader (rrcConnectionRequestHeader); + + LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters; + transmitPdcpPduParameters.pdcpPdu = packet; + transmitPdcpPduParameters.rnti = m_rnti; + transmitPdcpPduParameters.lcid = 0; + + m_setupParameters.srb0SapProvider->TransmitPdcpPdu(transmitPdcpPduParameters);*/ + Simulator::Schedule (RRC_REAL_MSG_DELAY, &LteEnbRrcSapProvider::RecvRrcConnectionRequest, m_enbRrcSapProvider, @@ -152,10 +168,10 @@ LteUeRrcProtocolReal::DoSendRrcConnectionSetupCompleted (LteRrcSap::RrcConnectio { Ptr packet = Create (); - RrcConnectionSetupCompleteHeader source; - source.SetMessage (msg); + RrcConnectionSetupCompleteHeader rrcConnectionSetupCompleteHeader; + rrcConnectionSetupCompleteHeader.SetMessage (msg); - packet->AddHeader (source); + packet->AddHeader (rrcConnectionSetupCompleteHeader); LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters; transmitPdcpSduParameters.pdcpSdu = packet; @@ -173,31 +189,55 @@ LteUeRrcProtocolReal::DoSendRrcConnectionReconfigurationCompleted (LteRrcSap::Rr m_rnti = m_rrc->GetRnti (); SetEnbRrcSapProvider (); - Simulator::Schedule (RRC_REAL_MSG_DELAY, - &LteEnbRrcSapProvider::RecvRrcConnectionReconfigurationCompleted, - m_enbRrcSapProvider, - m_rnti, - msg); + Ptr packet = Create (); + + RrcConnectionReconfigurationCompleteHeader rrcConnectionReconfigurationCompleteHeader; + rrcConnectionReconfigurationCompleteHeader.SetMessage (msg); + + packet->AddHeader (rrcConnectionReconfigurationCompleteHeader); + + LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters; + transmitPdcpSduParameters.pdcpSdu = packet; + transmitPdcpSduParameters.rnti = m_rnti; + transmitPdcpSduParameters.lcid = 1; + + m_setupParameters.srb1SapProvider->TransmitPdcpSdu(transmitPdcpSduParameters); } void LteUeRrcProtocolReal::DoSendRrcConnectionReestablishmentRequest (LteRrcSap::RrcConnectionReestablishmentRequest msg) { - Simulator::Schedule (RRC_REAL_MSG_DELAY, - &LteEnbRrcSapProvider::RecvRrcConnectionReestablishmentRequest, - m_enbRrcSapProvider, - m_rnti, - msg); + Ptr packet = Create (); + + RrcConnectionReestablishmentRequestHeader rrcConnectionReestablishmentRequestHeader; + rrcConnectionReestablishmentRequestHeader.SetMessage (msg); + + packet->AddHeader (rrcConnectionReestablishmentRequestHeader); + + LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters; + transmitPdcpPduParameters.pdcpPdu = packet; + transmitPdcpPduParameters.rnti = m_rnti; + transmitPdcpPduParameters.lcid = 0; + + m_setupParameters.srb0SapProvider->TransmitPdcpPdu(transmitPdcpPduParameters); } void LteUeRrcProtocolReal::DoSendRrcConnectionReestablishmentComplete (LteRrcSap::RrcConnectionReestablishmentComplete msg) { - Simulator::Schedule (RRC_REAL_MSG_DELAY, - &LteEnbRrcSapProvider::RecvRrcConnectionReestablishmentComplete, - m_enbRrcSapProvider, - m_rnti, -msg); + Ptr packet = Create (); + + RrcConnectionReestablishmentCompleteHeader rrcConnectionReestablishmentCompleteHeader; + rrcConnectionReestablishmentCompleteHeader.SetMessage (msg); + + packet->AddHeader (rrcConnectionReestablishmentCompleteHeader); + + LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters; + transmitPdcpSduParameters.pdcpSdu = packet; + transmitPdcpSduParameters.rnti = m_rnti; + transmitPdcpSduParameters.lcid = 1; + + m_setupParameters.srb1SapProvider->TransmitPdcpSdu(transmitPdcpSduParameters); } @@ -250,7 +290,24 @@ LteUeRrcProtocolReal::DoReceivePdcpPdu (Ptr p) void LteUeRrcProtocolReal::DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameters params) { - // TODO + // Get type of message received + RrcDlDcchMessage rrcDlDcchMessage; + params.pdcpSdu->PeekHeader(rrcDlDcchMessage); + + // Declare possible headers to receive + RrcConnectionReconfigurationHeader rrcConnectionReconfigurationHeader; + + + // Deserialize packet and call member recv function with appropiate structure + switch( rrcDlDcchMessage.GetMessageType() ) + { + case 4: + params.pdcpSdu->RemoveHeader (rrcConnectionReconfigurationHeader); + LteRrcSap::RrcConnectionReconfiguration rrcConnectionReconfigurationMsg; + rrcConnectionReconfigurationMsg = rrcConnectionReconfigurationHeader.GetMessage (); + m_ueRrcSapProvider->RecvRrcConnectionReconfiguration (rrcConnectionReconfigurationMsg); + break; + } } NS_OBJECT_ENSURE_REGISTERED (LteEnbRrcProtocolReal); @@ -506,19 +563,66 @@ LteEnbRrcProtocolReal::DoSendRrcConnectionRelease (uint16_t rnti, LteRrcSap::Rrc void LteEnbRrcProtocolReal::DoReceivePdcpPdu (Ptr p) { - // TODO + // Get type of message received + RrcUlCcchMessage rrcUlCcchMessage; + p->PeekHeader(rrcUlCcchMessage); + + // Declare possible headers to receive + RrcConnectionReestablishmentRequestHeader rrcConnectionReestablishmentRequestHeader; + RrcConnectionRequestHeader rrcConnectionRequestHeader; + + // Deserialize packet and call member recv function with appropiate structure + switch( rrcUlCcchMessage.GetMessageType() ) + { + case 0: + p->RemoveHeader (rrcConnectionReestablishmentRequestHeader); + LteRrcSap::RrcConnectionReestablishmentRequest rrcConnectionReestablishmentRequestMsg; + rrcConnectionReestablishmentRequestMsg = rrcConnectionReestablishmentRequestHeader.GetMessage (); + m_enbRrcSapProvider->RecvRrcConnectionReestablishmentRequest (m_rnti,rrcConnectionReestablishmentRequestMsg); + break; + case 1: + p->RemoveHeader (rrcConnectionRequestHeader); + LteRrcSap::RrcConnectionRequest rrcConnectionRequestMsg; + rrcConnectionRequestMsg = rrcConnectionRequestHeader.GetMessage (); + m_enbRrcSapProvider->RecvRrcConnectionRequest (m_rnti,rrcConnectionRequestMsg); + break; + } } void LteEnbRrcProtocolReal::DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameters params) { - // TODO + // Get type of message received + RrcUlDcchMessage rrcUlDcchMessage; + params.pdcpSdu->PeekHeader(rrcUlDcchMessage); + + // Declare possible headers to receive + RrcConnectionReconfigurationCompleteHeader rrcConnectionReconfigurationCompleteHeader; + RrcConnectionReestablishmentCompleteHeader rrcConnectionReestablishmentCompleteHeader; RrcConnectionSetupCompleteHeader rrcConnectionSetupCompleteHeader; - params.pdcpSdu->RemoveHeader (rrcConnectionSetupCompleteHeader); - - LteRrcSap::RrcConnectionSetupCompleted msg = rrcConnectionSetupCompleteHeader.GetMessage(); - - m_enbRrcSapProvider->RecvRrcConnectionSetupCompleted(params.rnti, msg); + + // Deserialize packet and call member recv function with appropiate structure + switch( rrcUlDcchMessage.GetMessageType() ) + { + case 2: + params.pdcpSdu->RemoveHeader (rrcConnectionReconfigurationCompleteHeader); + LteRrcSap::RrcConnectionReconfigurationCompleted rrcConnectionReconfigurationCompleteMsg; + rrcConnectionReconfigurationCompleteMsg = rrcConnectionReconfigurationCompleteHeader.GetMessage (); + m_enbRrcSapProvider->RecvRrcConnectionReconfigurationCompleted (params.rnti,rrcConnectionReconfigurationCompleteMsg); + break; + case 3: + params.pdcpSdu->RemoveHeader (rrcConnectionReestablishmentCompleteHeader); + LteRrcSap::RrcConnectionReestablishmentComplete rrcConnectionReestablishmentCompleteMsg; + rrcConnectionReestablishmentCompleteMsg = rrcConnectionReestablishmentCompleteHeader.GetMessage (); + m_enbRrcSapProvider->RecvRrcConnectionReestablishmentComplete (params.rnti,rrcConnectionReestablishmentCompleteMsg); + break; + case 4: + params.pdcpSdu->RemoveHeader (rrcConnectionSetupCompleteHeader); + LteRrcSap::RrcConnectionSetupCompleted rrcConnectionSetupCompletedMsg; + rrcConnectionSetupCompletedMsg = rrcConnectionSetupCompleteHeader.GetMessage (); + m_enbRrcSapProvider->RecvRrcConnectionSetupCompleted (params.rnti, rrcConnectionSetupCompletedMsg); + break; + } }