diff --git a/src/lte/model/lte-asn1-header.cc b/src/lte/model/lte-asn1-header.cc index 6e2a6fbb9..68e202057 100644 --- a/src/lte/model/lte-asn1-header.cc +++ b/src/lte/model/lte-asn1-header.cc @@ -182,6 +182,11 @@ void Asn1Header::SerializeBitstring (std::bitset<1> data) const SerializeBitstring<1> (data); } +void Asn1Header::SerializeBitstring (std::bitset<2> data) const +{ + SerializeBitstring<2> (data); +} + void Asn1Header::SerializeBitstring (std::bitset<8> data) const { SerializeBitstring<8> (data); @@ -478,6 +483,11 @@ Buffer::Iterator Asn1Header::DeserializeBitstring (std::bitset<1> *data, Buffer: return DeserializeBitstring<1> (data,bIterator); } +Buffer::Iterator Asn1Header::DeserializeBitstring (std::bitset<2> *data, Buffer::Iterator bIterator) +{ + return DeserializeBitstring<2> (data,bIterator); +} + Buffer::Iterator Asn1Header::DeserializeBitstring (std::bitset<8> *data, Buffer::Iterator bIterator) { return DeserializeBitstring<8> (data,bIterator); diff --git a/src/lte/model/lte-asn1-header.h b/src/lte/model/lte-asn1-header.h index 3efa11f49..3d7e8f46b 100644 --- a/src/lte/model/lte-asn1-header.h +++ b/src/lte/model/lte-asn1-header.h @@ -89,6 +89,7 @@ protected: template void SerializeBitstring (std::bitset bitstring) const; void SerializeBitstring (std::bitset<1> bitstring) const; + void SerializeBitstring (std::bitset<2> bitstring) const; void SerializeBitstring (std::bitset<8> bitstring) const; void SerializeBitstring (std::bitset<10> bitstring) const; void SerializeBitstring (std::bitset<16> bitstring) const; @@ -122,6 +123,7 @@ protected: template Buffer::Iterator DeserializeBitstring (std::bitset *bitstring, Buffer::Iterator bIterator); Buffer::Iterator DeserializeBitstring (std::bitset<1> *bitstring, Buffer::Iterator bIterator); + Buffer::Iterator DeserializeBitstring (std::bitset<2> *bitstring, Buffer::Iterator bIterator); Buffer::Iterator DeserializeBitstring (std::bitset<8> *bitstring, Buffer::Iterator bIterator); Buffer::Iterator DeserializeBitstring (std::bitset<10> *bitstring, Buffer::Iterator bIterator); Buffer::Iterator DeserializeBitstring (std::bitset<16> *bitstring, Buffer::Iterator bIterator); diff --git a/src/lte/model/lte-rrc-header.cc b/src/lte/model/lte-rrc-header.cc index 8e3927392..6b265a577 100644 --- a/src/lte/model/lte-rrc-header.cc +++ b/src/lte/model/lte-rrc-header.cc @@ -2581,6 +2581,353 @@ HandoverPreparationInfoHeader::GetAsConfig () const return m_asConfig; } +//////////////////// RrcConnectionReestablishmentRequestHeader class //////////////////////// + +RrcConnectionReestablishmentRequestHeader::RrcConnectionReestablishmentRequestHeader () +{ +} + +void +RrcConnectionReestablishmentRequestHeader::PreSerialize () const +{ + m_serializationResult = Buffer (); + + // Serialize RrcConnectionReestablishmentReques sequence: + // no default or optional fields. Extension marker not present. + SerializeSequence<0> (std::bitset<0> (),false); + + // Serialize criticalExtensions choice + // chosen: rrcConnectionReestablishmentRequest-r8 + SerializeChoice (2,0); + + // Serialize RRCConnectionReestablishmentRequest-r8-IEs sequence + // no default or optional fields. Extension marker not present. + SerializeSequence<0> (std::bitset<0> (),false); + + // Serialize ue-Identity + SerializeSequence<0> (std::bitset<0> (),false); + // Serialize c-RNTI + SerializeBitstring (std::bitset<16> (m_ueIdentity.cRnti)); + // Serialize physCellId + SerializeInteger (m_ueIdentity.physCellId,0,503); + // Serialize shortMAC-I + SerializeBitstring (std::bitset<16> (0)); + + // Serialize ReestablishmentCause + switch (m_reestablishmentCause) + { + case RECONFIGURATION_FAILURE: + SerializeEnum (4,0); + break; + case HANDOVER_FAILURE: + SerializeEnum (4,1); + break; + case OTHER_FAILURE: + SerializeEnum (4,2); + break; + default: + SerializeEnum (4,3); + } + + // Serialize spare + SerializeBitstring<2> (std::bitset<2> (0)); + + // Finish serialization + FinalizeSerialization (); +} + +uint32_t +RrcConnectionReestablishmentRequestHeader::Deserialize (Buffer::Iterator bIterator) +{ + std::bitset<0> bitset0; + int n; + + // Deserialize RrcConnectionReestablishmentRequest sequence + // 0 optional fields, no extension marker + bIterator = DeserializeSequence (&bitset0,false,bIterator); + + // Deserialize criticalExtensions choice + bIterator = DeserializeChoice (2,&n,bIterator); + if ( n == 1) + { + // Deserialize criticalExtensionsFuture + bIterator = DeserializeSequence (&bitset0,false,bIterator); + } + else if ( n == 0) + { + // Deserialize RRCConnectionReestablishmentRequest-r8-IEs + bIterator = DeserializeSequence (&bitset0,false,bIterator); + + // Deserialize ReestabUE-Identity sequence + bIterator = DeserializeSequence (&bitset0,false,bIterator); + + // Deserialize c-RNTI + std::bitset<16> cRnti; + bIterator = DeserializeBitstring (&cRnti,bIterator); + m_ueIdentity.cRnti = cRnti.to_ulong (); + + // Deserialize physCellId + int physCellId; + bIterator = DeserializeInteger (&physCellId,0,503,bIterator); + m_ueIdentity.physCellId = physCellId; + + // Deserialize shortMAC-I + std::bitset<16> shortMacI; + bIterator = DeserializeBitstring (&shortMacI,bIterator); + + // Deserialize ReestablishmentCause + int reestCs; + bIterator = DeserializeEnum (4,&reestCs,bIterator); + switch (reestCs) + { + case 0: + m_reestablishmentCause = RECONFIGURATION_FAILURE; + break; + case 1: + m_reestablishmentCause = HANDOVER_FAILURE; + break; + case 2: + m_reestablishmentCause = OTHER_FAILURE; + break; + case 3: + break; + } + + // Deserialize spare + std::bitset<2> spare; + bIterator = DeserializeBitstring (&spare,bIterator); + } + + return GetSerializedSize (); +} + +void +RrcConnectionReestablishmentRequestHeader::Print (std::ostream &os) const +{ + os << "ueIdentity.cRnti: " << (int)m_ueIdentity.cRnti << std::endl; + os << "ueIdentity.physCellId: " << (int)m_ueIdentity.physCellId << std::endl; + os << "m_reestablishmentCause: " << m_reestablishmentCause << std::endl; +} + +void +RrcConnectionReestablishmentRequestHeader::SetMessage (RrcConnectionReestablishmentRequest msg) +{ + m_ueIdentity = msg.ueIdentity; + m_reestablishmentCause = msg.reestablishmentCause; + m_isDataSerialized = false; +} + +LteRrcSap::ReestabUeIdentity +RrcConnectionReestablishmentRequestHeader::GetUeIdentity () const +{ + return m_ueIdentity; +} + +LteRrcSap::ReestablishmentCause +RrcConnectionReestablishmentRequestHeader::GetReestablishmentCause () const +{ + return m_reestablishmentCause; +} + +//////////////////// RrcConnectionReestablishmentRequestHeader class //////////////////////// + +RrcConnectionReestablishmentHeader::RrcConnectionReestablishmentHeader () +{ +} + +void +RrcConnectionReestablishmentHeader::PreSerialize () const +{ + m_serializationResult = Buffer (); + + // Serialize RrcConnectionReestablishment sequence: + // no default or optional fields. Extension marker not present. + SerializeSequence (std::bitset<0> (),false); + + // Serialize rrc-TransactionIdentifier + SerializeInteger (m_rrcTransactionIdentifier,0,3); + + // Serialize criticalExtensions choice + SerializeChoice (2,0); + + // Serialize c1 choice + SerializeChoice (8,0); + + // Serialize RRCConnectionReestablishment-r8-IEs sequence + // 1 optional field, no extension marker + SerializeSequence (std::bitset<1> (0),false); + + // Serialize radioResourceConfigDedicated + SerializeRadioResourceConfigDedicated (m_radioResourceConfigDedicated); + + // Serialize nextHopChainingCount + SerializeInteger (0,0,7); + + // Finish serialization + FinalizeSerialization (); +} + +uint32_t +RrcConnectionReestablishmentHeader::Deserialize (Buffer::Iterator bIterator) +{ + std::bitset<0> bitset0; + int n; + + // Deserialize RrcConnectionReestablishment sequence + // 0 optional fields, no extension marker + bIterator = DeserializeSequence (&bitset0,false,bIterator); + + // Deserialize rrc-TransactionIdentifier + bIterator = DeserializeInteger (&n,0,3,bIterator); + m_rrcTransactionIdentifier = n; + + // Deserialize criticalExtensions choice + int criticalExtensionsChoice; + bIterator = DeserializeChoice (2,&criticalExtensionsChoice,bIterator); + if (criticalExtensionsChoice == 1) + { + // Deserialize criticalExtensionsFuture + bIterator = DeserializeSequence (&bitset0,false,bIterator); + } + else if (criticalExtensionsChoice == 0) + { + // Deserialize c1 + int c1; + bIterator = DeserializeChoice (8,&c1,bIterator); + if (c1 > 0) + { + bIterator = DeserializeNull (bIterator); + } + else if (c1 == 0) + { + // Deserialize rrcConnectionReestablishment-r8 + // 1 optional field + std::bitset<1> nonCriticalExtensionPresent; + bIterator = DeserializeSequence (&nonCriticalExtensionPresent,false,bIterator); + + // Deserialize RadioResourceConfigDedicated + bIterator = DeserializeRadioResourceConfigDedicated (&m_radioResourceConfigDedicated,bIterator); + + // Deserialize nextHopChainingCount + bIterator = DeserializeInteger (&n,0,7,bIterator); + } + } + + return GetSerializedSize (); +} + +void +RrcConnectionReestablishmentHeader::Print (std::ostream &os) const +{ + os << "rrcTransactionIdentifier: " << (int)m_rrcTransactionIdentifier << std::endl; + os << "RadioResourceConfigDedicated: " << std::endl; + RrcAsn1Header::Print (os,m_radioResourceConfigDedicated); +} + +void +RrcConnectionReestablishmentHeader::SetMessage (RrcConnectionReestablishment msg) +{ + m_rrcTransactionIdentifier = msg.rrcTransactionIdentifier; + m_radioResourceConfigDedicated = msg.radioResourceConfigDedicated; + m_isDataSerialized = false; +} + +uint8_t +RrcConnectionReestablishmentHeader::GetRrcTransactionIdentifier () const +{ + return m_rrcTransactionIdentifier; +} + +LteRrcSap::RadioResourceConfigDedicated +RrcConnectionReestablishmentHeader::GetRadioResourceConfigDedicated () const +{ + return m_radioResourceConfigDedicated; +} + +//////////////////// RrcConnectionReestablishmentCompleteHeader class //////////////////////// + +RrcConnectionReestablishmentCompleteHeader::RrcConnectionReestablishmentCompleteHeader () +{ +} + +void +RrcConnectionReestablishmentCompleteHeader::PreSerialize () const +{ + m_serializationResult = Buffer (); + + // Serialize RrcConnectionReestablishmentComplete sequence: + // no default or optional fields. Extension marker not present. + SerializeSequence (std::bitset<0> (),false); + + // Serialize rrc-TransactionIdentifier + SerializeInteger (m_rrcTransactionIdentifier,0,3); + + // Serialize criticalExtensions choice + SerializeChoice (2,0); + + // Serialize rrcConnectionReestablishmentComplete-r8 sequence + // 1 optional field (not present), no extension marker. + SerializeSequence (std::bitset<1> (0),false); + + // Finish serialization + FinalizeSerialization (); +} + +uint32_t +RrcConnectionReestablishmentCompleteHeader::Deserialize (Buffer::Iterator bIterator) +{ + std::bitset<0> bitset0; + int n; + + // Deserialize RrcConnectionReestablishmentComplete sequence + // 0 optional fields, no extension marker + bIterator = DeserializeSequence (&bitset0,false,bIterator); + + // Deserialize rrc-TransactionIdentifier + bIterator = DeserializeInteger (&n,0,3,bIterator); + m_rrcTransactionIdentifier = n; + + // Deserialize criticalExtensions choice + int criticalExtensionsChoice; + bIterator = DeserializeChoice (2,&criticalExtensionsChoice,bIterator); + if (criticalExtensionsChoice == 1) + { + // Deserialize criticalExtensionsFuture + bIterator = DeserializeSequence (&bitset0,false,bIterator); + } + else if (criticalExtensionsChoice == 0) + { + // Deserialize rrcConnectionReestablishmentComplete-r8 + std::bitset<1> opts; + bIterator = DeserializeSequence (&opts,false,bIterator); + if (opts[0]) + { + // Deserialize RRCConnectionReestablishmentComplete-v920-IEs + // ... + } + } + + return GetSerializedSize (); +} + +void +RrcConnectionReestablishmentCompleteHeader::Print (std::ostream &os) const +{ + os << "rrcTransactionIdentifier: " << (int)m_rrcTransactionIdentifier << std::endl; +} + +void +RrcConnectionReestablishmentCompleteHeader::SetMessage (RrcConnectionReestablishmentComplete msg) +{ + m_rrcTransactionIdentifier = msg.rrcTransactionIdentifier; + m_isDataSerialized = false; +} + +uint8_t +RrcConnectionReestablishmentCompleteHeader::GetRrcTransactionIdentifier () const +{ + return m_rrcTransactionIdentifier; +} } // namespace ns3 diff --git a/src/lte/model/lte-rrc-header.h b/src/lte/model/lte-rrc-header.h index 5cb122778..c34244276 100644 --- a/src/lte/model/lte-rrc-header.h +++ b/src/lte/model/lte-rrc-header.h @@ -215,6 +215,68 @@ private: AsConfig m_asConfig; }; +/** +* This class manages the serialization/deserialization of RRCConnectionReestablishmentRequest IE +*/ +class RrcConnectionReestablishmentRequestHeader : public RrcAsn1Header, + LteRrcSap +{ +public: + RrcConnectionReestablishmentRequestHeader (); + void PreSerialize () const; + uint32_t Deserialize (Buffer::Iterator bIterator); + void Print (std::ostream &os) const; + void SetMessage (RrcConnectionReestablishmentRequest msg); + + ReestabUeIdentity GetUeIdentity () const; + ReestablishmentCause GetReestablishmentCause () const; + +private: + ReestabUeIdentity m_ueIdentity; + ReestablishmentCause m_reestablishmentCause; +}; + +/** +* This class manages the serialization/deserialization of RrcConnectionReestablishment IE +*/ +class RrcConnectionReestablishmentHeader : public RrcAsn1Header, + LteRrcSap +{ +public: + RrcConnectionReestablishmentHeader (); + void PreSerialize () const; + uint32_t Deserialize (Buffer::Iterator bIterator); + void Print (std::ostream &os) const; + void SetMessage (RrcConnectionReestablishment msg); + + uint8_t GetRrcTransactionIdentifier () const; + RadioResourceConfigDedicated GetRadioResourceConfigDedicated () const; + +private: + uint8_t m_rrcTransactionIdentifier; + RadioResourceConfigDedicated m_radioResourceConfigDedicated; +}; + +/** +* This class manages the serialization/deserialization of RrcConnectionReestablishmentComplete IE +*/ +class RrcConnectionReestablishmentCompleteHeader : public RrcAsn1Header, + LteRrcSap +{ +public: + RrcConnectionReestablishmentCompleteHeader (); + void PreSerialize () const; + uint32_t Deserialize (Buffer::Iterator bIterator); + void Print (std::ostream &os) const; + void SetMessage (RrcConnectionReestablishmentComplete msg); + + uint8_t GetRrcTransactionIdentifier () const; + +private: + uint8_t m_rrcTransactionIdentifier; +}; + + } // namespace ns3 #endif // EPC_ASN1_HEADER_H diff --git a/src/lte/test/test-asn1-encoding.cc b/src/lte/test/test-asn1-encoding.cc index a289063ed..6f029727c 100644 --- a/src/lte/test/test-asn1-encoding.cc +++ b/src/lte/test/test-asn1-encoding.cc @@ -598,6 +598,159 @@ HandoverPreparationInfoTestCase::DoRun (void) NS_TEST_ASSERT_MSG_EQ (source.GetAsConfig ().sourceDlCarrierFreq, destination.GetAsConfig ().sourceDlCarrierFreq, "sourceDlCarrierFreq"); } +// --------------------------- CLASS RrcConnectionReestablishmentRequestTestCase ----------------------------- +class RrcConnectionReestablishmentRequestTestCase : public RrcHeaderTestCase +{ +public: + RrcConnectionReestablishmentRequestTestCase (); + virtual void DoRun (void); +}; + +RrcConnectionReestablishmentRequestTestCase::RrcConnectionReestablishmentRequestTestCase () : RrcHeaderTestCase ("Testing RrcConnectionReestablishmentRequestTestCase") +{ +} + +void +RrcConnectionReestablishmentRequestTestCase::DoRun (void) +{ + std::cout << "============= RrcConnectionReestablishmentRequestTestCase ===========" << std::endl; + // add header + Ptr packet = Create (); + packet->Print (std::cout); + std::cout << std::endl; + + LteRrcSap::RrcConnectionReestablishmentRequest msg; + msg.ueIdentity.cRnti = 12; + msg.ueIdentity.physCellId = 21; + msg.reestablishmentCause = LteRrcSap::HANDOVER_FAILURE; + + RrcConnectionReestablishmentRequestHeader source; + source.SetMessage (msg); + + std::cout << "--------- SOURCE INFO: -------" << std::endl; + source.Print (std::cout); + packet->AddHeader (source); + std::cout << std::endl; + + // print serialized packet contents + std::cout << "---- SERIALIZED PACKET CONTENTS: -------" << std::endl; + std::cout << "Hex: "; + TestUtils::printPacketContentsHex (GetPointer (packet)); + std::cout << "Bin: "; + TestUtils::printPacketContentsBin (GetPointer (packet)); + + // remove header + RrcConnectionReestablishmentRequestHeader destination; + packet->RemoveHeader (destination); + std::cout << "--------- DESTINATION INFO: -------" << std::endl; + destination.Print (std::cout); + + // Check that the destination and source headers contain the same values + NS_TEST_ASSERT_MSG_EQ (source.GetUeIdentity ().cRnti, destination.GetUeIdentity ().cRnti, "cRnti"); + NS_TEST_ASSERT_MSG_EQ (source.GetUeIdentity ().physCellId, destination.GetUeIdentity ().physCellId, "physCellId"); + NS_TEST_ASSERT_MSG_EQ (source.GetReestablishmentCause (),destination.GetReestablishmentCause (), "ReestablishmentCause"); +} + +// --------------------------- CLASS RrcConnectionReestablishmentTestCase ----------------------------- +class RrcConnectionReestablishmentTestCase : public RrcHeaderTestCase +{ +public: + RrcConnectionReestablishmentTestCase (); + virtual void DoRun (void); +}; + +RrcConnectionReestablishmentTestCase::RrcConnectionReestablishmentTestCase () : RrcHeaderTestCase ("Testing RrcConnectionReestablishmentTestCase") +{ +} + +void +RrcConnectionReestablishmentTestCase::DoRun (void) +{ + std::cout << "============= RrcConnectionReestablishmentTestCase ===========" << std::endl; + // add header + Ptr packet = Create (); + packet->Print (std::cout); + std::cout << std::endl; + + LteRrcSap::RrcConnectionReestablishment msg; + msg.rrcTransactionIdentifier = 2; + msg.radioResourceConfigDedicated = CreateRadioResourceConfigDedicated (); + + RrcConnectionReestablishmentHeader source; + source.SetMessage (msg); + + std::cout << "--------- SOURCE INFO: -------" << std::endl; + source.Print (std::cout); + packet->AddHeader (source); + std::cout << std::endl; + + // print serialized packet contents + std::cout << "---- SERIALIZED PACKET CONTENTS: -------" << std::endl; + std::cout << "Hex: "; + TestUtils::printPacketContentsHex (GetPointer (packet)); + std::cout << "Bin: "; + TestUtils::printPacketContentsBin (GetPointer (packet)); + + // remove header + RrcConnectionReestablishmentHeader destination; + packet->RemoveHeader (destination); + std::cout << "--------- DESTINATION INFO: -------" << std::endl; + destination.Print (std::cout); + + // Check that the destination and source headers contain the same values + NS_TEST_ASSERT_MSG_EQ (source.GetRrcTransactionIdentifier (), destination.GetRrcTransactionIdentifier (), "rrcTransactionIdentifier"); + AssertEqualRadioResourceConfigDedicated (source.GetRadioResourceConfigDedicated (),destination.GetRadioResourceConfigDedicated ()); +} + +// --------------------------- CLASS RrcConnectionReestablishmentCompleteTestCase ----------------------------- +class RrcConnectionReestablishmentCompleteTestCase : public RrcHeaderTestCase +{ +public: + RrcConnectionReestablishmentCompleteTestCase (); + virtual void DoRun (void); +}; + +RrcConnectionReestablishmentCompleteTestCase::RrcConnectionReestablishmentCompleteTestCase () : RrcHeaderTestCase ("Testing RrcConnectionReestablishmentCompleteTestCase") +{ +} + +void +RrcConnectionReestablishmentCompleteTestCase::DoRun (void) +{ + std::cout << "============= RrcConnectionReestablishmentCompleteTestCase ===========" << std::endl; + // add header + Ptr packet = Create (); + packet->Print (std::cout); + std::cout << std::endl; + + LteRrcSap::RrcConnectionReestablishmentComplete msg; + msg.rrcTransactionIdentifier = 3; + + RrcConnectionReestablishmentCompleteHeader source; + source.SetMessage (msg); + + std::cout << "--------- SOURCE INFO: -------" << std::endl; + source.Print (std::cout); + packet->AddHeader (source); + std::cout << std::endl; + + // print serialized packet contents + std::cout << "---- SERIALIZED PACKET CONTENTS: -------" << std::endl; + std::cout << "Hex: "; + TestUtils::printPacketContentsHex (GetPointer (packet)); + std::cout << "Bin: "; + TestUtils::printPacketContentsBin (GetPointer (packet)); + + // remove header + RrcConnectionReestablishmentCompleteHeader destination; + packet->RemoveHeader (destination); + std::cout << "--------- DESTINATION INFO: -------" << std::endl; + destination.Print (std::cout); + + // Check that the destination and source headers contain the same values + NS_TEST_ASSERT_MSG_EQ (source.GetRrcTransactionIdentifier (), destination.GetRrcTransactionIdentifier (), "rrcTransactionIdentifier"); +} + // --------------------------- CLASS Asn1EncodingSuite ----------------------------- class Asn1EncodingSuite : public TestSuite { @@ -616,6 +769,9 @@ Asn1EncodingSuite::Asn1EncodingSuite () AddTestCase (new RrcConnectionReconfigurationCompleteTestCase); AddTestCase (new RrcConnectionReconfigurationTestCase); AddTestCase (new HandoverPreparationInfoTestCase); + AddTestCase (new RrcConnectionReestablishmentRequestTestCase); + AddTestCase (new RrcConnectionReestablishmentTestCase); + AddTestCase (new RrcConnectionReestablishmentCompleteTestCase); } Asn1EncodingSuite asn1EncodingSuite;