--- a/src/lte/doc/source/lte-design.rst Fri Nov 30 17:07:46 2012 +0100
+++ b/src/lte/doc/source/lte-design.rst Fri Nov 30 17:08:35 2012 +0100
@@ -1944,3 +1944,91 @@
* the ``S1SapProvider`` part is provided by the S1 entity and used by the X2 entity and
* the ``S1SapUser`` part is provided by the X2 entity and used by the S1 entity.
+
+--------------------------
+ASN.1 encoding of RRC IE's
+--------------------------
+
+The messages defined in RRC SAP, common to all Ue/Enb SAP Users/Providers, are transported in a transparent container to/from a Ue/Enb. The encoding format for the different Information Elements are specified in 3GPP TS 36.331, using ASN.1 rules in the unaligned variant. The implementation in Ns3/Lte has been divided in the following classes:
+
+ * Asn1Header : Contains the encoding / decoding of basic ASN types
+
+ * RrcAsn1Header : Inherits Asn1Header and contains the encoding / decoding of common IE's defined in 3GPP TS 36.331
+
+ * Rrc specific messages/IEs classes : A class for each of the messages defined in RRC SAP header
+
+Asn1Header class - Implementation of base ASN.1 types
++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+This class implements the methods to Serialize / Deserialize the ASN.1 types being used in 3GPP TS 36.331, according to the packed encoding rules in ITU-T X.691. The types considered are:
+
+ * Boolean : a boolean value uses a single bit (1=true, 0=false).
+
+ * Integer : a constrained integer (with min and max values defined) uses the minimum amount of bits to encode its range (max-min+1).
+
+ * Bitstring : a bistring will be copied bit by bit to the serialization buffer.
+
+ * Octetstring : not being currently used.
+
+ * Sequence : the sequence generates a preamble indicating the presence of optional and default fields. It also adds a bit indicating the presence of extension marker.
+
+ * Sequence...Of : the sequence...of type encodes the number of elements of the sequence as an integer (the subsequent elements will need to be encoded afterwards).
+
+ * Choice : indicates which element among the ones in the choice set is being encoded.
+
+ * Enumeration : is serialized as an integer indicating which value is used, among the ones in the enumeration, with the number of elements in the enumeration as upper bound.
+
+ * Null : the null value is not encoded, although its serialization function is defined to provide a clearer map between specification and implementation.
+
+The class inherits from ns-3 Header, but Deserialize() function is declared pure virtual, thus inherited classes having to implement it. The reason is that deserialization will retrieve the elements in RRC messages, each of them containing different information elements.
+
+Additionally, it has to be noted that the resulting byte length of a specific type/message can vary, according to the presence of optional fields, and due to the optimized encoding. Hence, the serialized bits will be processed using PreSerialize() function, saving the result in m_serializationResult Buffer. As the methods to read/write in a ns3 buffer are defined in a byte basis, the serialization bits are stored into m_serializationPendingBits attribute, until the 8 bits are set and can be written to buffer iterator. Finally, when invoking Serialize(), the contents of the m_serializationResult attribute will be copied to Buffer::Iterator parameter
+
+RrcAsn1Header : Common 3GPP TS 36.331 IE's
+++++++++++++++++++++++++++++++++++++++++++
+
+As some Information Elements are being used for several RRC messages, this class implements the following common IE's:
+
+ * SrbToAddModList
+
+ * DrbToAddModList
+
+ * LogicalChannelConfig
+
+ * RadioResourceConfigDedicated
+
+ * PhysicalConfigDedicated
+
+ * SystemInformationBlockType1
+
+ * SystemInformationBlockType2
+
+ * RadioResourceConfigCommonSIB
+
+
+Rrc specific messages/IEs classes
++++++++++++++++++++++++++++++++++
+
+The following RRC SAP have been implemented:
+
+ * RrcConnectionRequest
+
+ * RrcConnectionSetup
+
+ * RrcConnectionSetupCompleted
+
+ * RrcConnectionReconfiguration
+
+ * RrcConnectionReconfigurationCompleted
+
+ * HandoverPreparationInfo
+
+ * RrcConnectionReestablishmentRequest
+
+ * RrcConnectionReestablishment
+
+ * RrcConnectionReestablishmentComplete
+
+ * RrcConnectionReestablishmentReject
+
+ * RrcConnectionRelease
--- a/src/lte/model/lte-asn1-header.cc Fri Nov 30 17:07:46 2012 +0100
+++ b/src/lte/model/lte-asn1-header.cc Fri Nov 30 17:08:35 2012 +0100
@@ -182,6 +182,11 @@
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 @@
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);
--- a/src/lte/model/lte-asn1-header.h Fri Nov 30 17:07:46 2012 +0100
+++ b/src/lte/model/lte-asn1-header.h Fri Nov 30 17:08:35 2012 +0100
@@ -89,6 +89,7 @@
template <int N>
void SerializeBitstring (std::bitset<N> 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 @@
template <int N>
Buffer::Iterator DeserializeBitstring (std::bitset<N> *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);
--- a/src/lte/model/lte-rrc-header.cc Fri Nov 30 17:07:46 2012 +0100
+++ b/src/lte/model/lte-rrc-header.cc Fri Nov 30 17:08:35 2012 +0100
@@ -2581,6 +2581,353 @@
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
--- a/src/lte/model/lte-rrc-header.h Fri Nov 30 17:07:46 2012 +0100
+++ b/src/lte/model/lte-rrc-header.h Fri Nov 30 17:08:35 2012 +0100
@@ -215,6 +215,68 @@
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
--- a/src/lte/test/test-asn1-encoding.cc Fri Nov 30 17:07:46 2012 +0100
+++ b/src/lte/test/test-asn1-encoding.cc Fri Nov 30 17:08:35 2012 +0100
@@ -598,6 +598,159 @@
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> packet = Create<Packet> ();
+ 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> packet = Create<Packet> ();
+ 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> packet = Create<Packet> ();
+ 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 @@
AddTestCase (new RrcConnectionReconfigurationCompleteTestCase);
AddTestCase (new RrcConnectionReconfigurationTestCase);
AddTestCase (new HandoverPreparationInfoTestCase);
+ AddTestCase (new RrcConnectionReestablishmentRequestTestCase);
+ AddTestCase (new RrcConnectionReestablishmentTestCase);
+ AddTestCase (new RrcConnectionReestablishmentCompleteTestCase);
}
Asn1EncodingSuite asn1EncodingSuite;