Add SnStatusTransfer X2 message header

This commit is contained in:
Manuel Requena
2012-12-05 13:50:22 +01:00
parent 4fbbbb2750
commit 55699e9154
2 changed files with 233 additions and 4 deletions

View File

@@ -766,6 +766,198 @@ EpcX2HandoverPreparationFailureHeader::GetNumberOfIes () const
/////////////////////////////////////////////////////////////////////
NS_OBJECT_ENSURE_REGISTERED (EpcX2SnStatusTransferHeader);
EpcX2SnStatusTransferHeader::EpcX2SnStatusTransferHeader ()
: m_numberOfIes (3),
m_headerLength (6),
m_oldEnbUeX2apId (0xfffa),
m_newEnbUeX2apId (0xfffa)
{
m_erabsSubjectToStatusTransferList.clear ();
}
EpcX2SnStatusTransferHeader::~EpcX2SnStatusTransferHeader ()
{
m_numberOfIes = 0;
m_headerLength = 0;
m_oldEnbUeX2apId = 0xfffb;
m_newEnbUeX2apId = 0xfffb;
m_erabsSubjectToStatusTransferList.clear ();
}
TypeId
EpcX2SnStatusTransferHeader::GetTypeId (void)
{
static TypeId tid = TypeId ("ns3::EpcX2SnStatusTransferHeader")
.SetParent<Header> ()
.AddConstructor<EpcX2SnStatusTransferHeader> ()
;
return tid;
}
TypeId
EpcX2SnStatusTransferHeader::GetInstanceTypeId (void) const
{
return GetTypeId ();
}
uint32_t
EpcX2SnStatusTransferHeader::GetSerializedSize (void) const
{
return m_headerLength;
}
void
EpcX2SnStatusTransferHeader::Serialize (Buffer::Iterator start) const
{
Buffer::Iterator i = start;
i.WriteHtonU16 (m_oldEnbUeX2apId);
i.WriteHtonU16 (m_newEnbUeX2apId);
std::vector <EpcX2Sap::ErabsSubjectToStatusTransferItem>::size_type sz = m_erabsSubjectToStatusTransferList.size ();
i.WriteHtonU16 (sz); // number of ErabsSubjectToStatusTransferItems
for (int j = 0; j < (int) sz; j++)
{
EpcX2Sap::ErabsSubjectToStatusTransferItem item = m_erabsSubjectToStatusTransferList [j];
i.WriteHtonU16 (item.erabId);
uint16_t bitsetSize = EpcX2Sap::m_maxPdcpSn / 64;
for (int k = 0; k < bitsetSize; k++)
{
uint64_t statusValue = 0;
for (int m = 0; m < 64; m++)
{
statusValue |= item.receiveStatusOfUlPdcpSdus[64 * k + m] << m;
}
i.WriteHtonU64 (statusValue);
}
i.WriteHtonU16 (item.ulPdcpSn);
i.WriteHtonU32 (item.ulHfn);
i.WriteHtonU16 (item.dlPdcpSn);
i.WriteHtonU32 (item.dlHfn);
}
}
uint32_t
EpcX2SnStatusTransferHeader::Deserialize (Buffer::Iterator start)
{
Buffer::Iterator i = start;
m_oldEnbUeX2apId = i.ReadNtohU16 ();
m_newEnbUeX2apId = i.ReadNtohU16 ();
int sz = i.ReadNtohU16 ();
m_numberOfIes = 3;
m_headerLength = 6 + sz * (14 + (EpcX2Sap::m_maxPdcpSn / 64));
for (int j = 0; j < sz; j++)
{
EpcX2Sap::ErabsSubjectToStatusTransferItem ErabItem;
ErabItem.erabId = i.ReadNtohU16 ();
uint16_t bitsetSize = EpcX2Sap::m_maxPdcpSn / 64;
for (int k = 0; k < bitsetSize; k++)
{
uint64_t statusValue = i.ReadNtohU64 ();
for (int m = 0; m < 64; m++)
{
ErabItem.receiveStatusOfUlPdcpSdus[64 * k + m] = (statusValue >> m) & 1;
}
}
ErabItem.ulPdcpSn = i.ReadNtohU16 ();
ErabItem.ulHfn = i.ReadNtohU32 ();
ErabItem.dlPdcpSn = i.ReadNtohU16 ();
ErabItem.dlHfn = i.ReadNtohU32 ();
m_erabsSubjectToStatusTransferList.push_back (ErabItem);
}
return GetSerializedSize ();
}
void
EpcX2SnStatusTransferHeader::Print (std::ostream &os) const
{
os << "OldEnbUeX2apId = " << m_oldEnbUeX2apId;
os << " NewEnbUeX2apId = " << m_newEnbUeX2apId;
os << " ErabsSubjectToStatusTransferList size = " << m_erabsSubjectToStatusTransferList.size ();
std::vector <EpcX2Sap::ErabsSubjectToStatusTransferItem>::size_type sz = m_erabsSubjectToStatusTransferList.size ();
if (sz > 0)
{
os << " [";
}
for (int j = 0; j < (int) sz; j++)
{
os << m_erabsSubjectToStatusTransferList[j].erabId;
if (j < (int) sz - 1)
{
os << ", ";
}
else
{
os << "]";
}
}
}
uint16_t
EpcX2SnStatusTransferHeader::GetOldEnbUeX2apId () const
{
return m_oldEnbUeX2apId;
}
void
EpcX2SnStatusTransferHeader::SetOldEnbUeX2apId (uint16_t x2apId)
{
m_oldEnbUeX2apId = x2apId;
}
uint16_t
EpcX2SnStatusTransferHeader::GetNewEnbUeX2apId () const
{
return m_newEnbUeX2apId;
}
void
EpcX2SnStatusTransferHeader::SetNewEnbUeX2apId (uint16_t x2apId)
{
m_newEnbUeX2apId = x2apId;
}
std::vector <EpcX2Sap::ErabsSubjectToStatusTransferItem>
EpcX2SnStatusTransferHeader::GetErabsSubjectToStatusTransferList () const
{
return m_erabsSubjectToStatusTransferList;
}
void
EpcX2SnStatusTransferHeader::SetErabsSubjectToStatusTransferList (std::vector <EpcX2Sap::ErabsSubjectToStatusTransferItem> erabs)
{
m_headerLength += erabs.size () * (14 + (EpcX2Sap::m_maxPdcpSn / 8));
m_erabsSubjectToStatusTransferList = erabs;
}
uint32_t
EpcX2SnStatusTransferHeader::GetLengthOfIes () const
{
return m_headerLength;
}
uint32_t
EpcX2SnStatusTransferHeader::GetNumberOfIes () const
{
return m_numberOfIes;
}
/////////////////////////////////////////////////////////////////////
NS_OBJECT_ENSURE_REGISTERED (EpcX2UeContextReleaseHeader);
EpcX2UeContextReleaseHeader::EpcX2UeContextReleaseHeader ()
@@ -1102,8 +1294,8 @@ NS_OBJECT_ENSURE_REGISTERED (EpcX2ResourceStatusUpdateHeader);
EpcX2ResourceStatusUpdateHeader::EpcX2ResourceStatusUpdateHeader ()
: m_numberOfIes (3),
m_headerLength (6),
m_enb1MeasurementId (0),
m_enb2MeasurementId (0)
m_enb1MeasurementId (0xfffa),
m_enb2MeasurementId (0xfffa)
{
m_cellMeasurementResultList.clear ();
}
@@ -1112,8 +1304,8 @@ EpcX2ResourceStatusUpdateHeader::~EpcX2ResourceStatusUpdateHeader ()
{
m_numberOfIes = 0;
m_headerLength = 0;
m_enb1MeasurementId = 0;
m_enb2MeasurementId = 0;
m_enb1MeasurementId = 0xfffb;
m_enb2MeasurementId = 0xfffb;
m_cellMeasurementResultList.clear ();
}

View File

@@ -57,6 +57,7 @@ public:
enum ProcedureCode_t {
HandoverPreparation = 0,
LoadIndication = 2,
SnStatusTransfer = 4,
UeContextRelease = 5,
ResourceStatusReporting = 10
};
@@ -202,6 +203,42 @@ private:
};
class EpcX2SnStatusTransferHeader : public Header
{
public:
EpcX2SnStatusTransferHeader ();
virtual ~EpcX2SnStatusTransferHeader ();
static TypeId GetTypeId (void);
virtual TypeId GetInstanceTypeId (void) const;
virtual uint32_t GetSerializedSize (void) const;
virtual void Serialize (Buffer::Iterator start) const;
virtual uint32_t Deserialize (Buffer::Iterator start);
virtual void Print (std::ostream &os) const;
uint16_t GetOldEnbUeX2apId () const;
void SetOldEnbUeX2apId (uint16_t x2apId);
uint16_t GetNewEnbUeX2apId () const;
void SetNewEnbUeX2apId (uint16_t x2apId);
std::vector <EpcX2Sap::ErabsSubjectToStatusTransferItem> GetErabsSubjectToStatusTransferList () const;
void SetErabsSubjectToStatusTransferList (std::vector <EpcX2Sap::ErabsSubjectToStatusTransferItem> erabs);
uint32_t GetLengthOfIes () const;
uint32_t GetNumberOfIes () const;
private:
uint32_t m_numberOfIes;
uint32_t m_headerLength;
uint16_t m_oldEnbUeX2apId;
uint16_t m_newEnbUeX2apId;
std::vector <EpcX2Sap::ErabsSubjectToStatusTransferItem> m_erabsSubjectToStatusTransferList;
};
class EpcX2UeContextReleaseHeader : public Header
{
public: