Rrc header: implementation of RrcConnectionReestablishment, RrcConnectionReestablishmentRequest, RrcConnectionReestablishmentComplete.

This commit is contained in:
Lluis Parcerisa
2012-11-30 16:14:07 +01:00
parent 172ba04824
commit d830fc0dc3
5 changed files with 577 additions and 0 deletions

View File

@@ -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);

View File

@@ -89,6 +89,7 @@ protected:
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 @@ protected:
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);

View File

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

View File

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

View File

@@ -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> 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 @@ Asn1EncodingSuite::Asn1EncodingSuite ()
AddTestCase (new RrcConnectionReconfigurationCompleteTestCase);
AddTestCase (new RrcConnectionReconfigurationTestCase);
AddTestCase (new HandoverPreparationInfoTestCase);
AddTestCase (new RrcConnectionReestablishmentRequestTestCase);
AddTestCase (new RrcConnectionReestablishmentTestCase);
AddTestCase (new RrcConnectionReestablishmentCompleteTestCase);
}
Asn1EncodingSuite asn1EncodingSuite;