diff --git a/src/lte/model/epc-x2.cc b/src/lte/model/epc-x2.cc index 4aebc0c7f..ede805f4b 100644 --- a/src/lte/model/epc-x2.cc +++ b/src/lte/model/epc-x2.cc @@ -164,6 +164,10 @@ EpcX2::RecvFromX2cSocket (Ptr socket) Ptr packet = socket->Recv (); NS_LOG_LOGIC ("packetLen = " << packet->GetSize ()); + NS_ASSERT_MSG (m_x2InterfaceCellIds.find (socket) != m_x2InterfaceCellIds.end (), + "Missing infos of local and remote CellId"); + Ptr cellsInfo = m_x2InterfaceCellIds [socket]; + EpcX2Header x2Header; packet->RemoveHeader (x2Header); @@ -172,9 +176,6 @@ EpcX2::RecvFromX2cSocket (Ptr socket) uint8_t messageType = x2Header.GetMessageType (); uint8_t procedureCode = x2Header.GetProcedureCode (); - NS_LOG_LOGIC ("messageType = " << (uint32_t)messageType); - NS_LOG_LOGIC ("procedureCode = " << (uint32_t)procedureCode); - if (procedureCode == EpcX2Header::HandoverPreparation) { if (messageType == EpcX2Header::InitiatingMessage) @@ -186,10 +187,6 @@ EpcX2::RecvFromX2cSocket (Ptr socket) NS_LOG_INFO ("X2 HandoverRequest header: " << x2HoReqHeader); - NS_ASSERT_MSG (m_x2InterfaceCellIds.find (socket) != m_x2InterfaceCellIds.end (), - "Missing infos of local and remote CellId"); - Ptr cellsInfo = m_x2InterfaceCellIds [socket]; - EpcX2SapUser::HandoverRequestParams params; params.oldEnbUeX2apId = x2HoReqHeader.GetOldEnbUeX2apId (); params.cause = x2HoReqHeader.GetCause (); @@ -216,9 +213,7 @@ EpcX2::RecvFromX2cSocket (Ptr socket) EpcX2HandoverRequestAckHeader x2HoReqAckHeader; packet->RemoveHeader (x2HoReqAckHeader); - NS_ASSERT_MSG (m_x2InterfaceCellIds.find (socket) != m_x2InterfaceCellIds.end (), - "Missing infos of local and remote CellId"); - Ptr cellsInfo = m_x2InterfaceCellIds [socket]; + NS_LOG_INFO ("X2 HandoverRequestAck header: " << x2HoReqAckHeader); EpcX2SapUser::HandoverRequestAckParams params; params.oldEnbUeX2apId = x2HoReqAckHeader.GetOldEnbUeX2apId (); @@ -243,9 +238,7 @@ EpcX2::RecvFromX2cSocket (Ptr socket) EpcX2HandoverPreparationFailureHeader x2HoPrepFailHeader; packet->RemoveHeader (x2HoPrepFailHeader); - NS_ASSERT_MSG (m_x2InterfaceCellIds.find (socket) != m_x2InterfaceCellIds.end (), - "Missing infos of local and remote CellId"); - Ptr cellsInfo = m_x2InterfaceCellIds [socket]; + NS_LOG_INFO ("X2 HandoverPreparationFailure header: " << x2HoPrepFailHeader); EpcX2SapUser::HandoverPreparationFailureParams params; params.oldEnbUeX2apId = x2HoPrepFailHeader.GetOldEnbUeX2apId (); @@ -282,6 +275,33 @@ EpcX2::RecvFromX2cSocket (Ptr socket) m_x2SapUser->RecvLoadInformation (params); } } + else if (procedureCode == EpcX2Header::SnStatusTransfer) + { + if (messageType == EpcX2Header::InitiatingMessage) + { + NS_LOG_LOGIC ("Recv X2 message: SN STATUS TRANSFER"); + + EpcX2SnStatusTransferHeader x2SnStatusXferHeader; + packet->RemoveHeader (x2SnStatusXferHeader); + + NS_LOG_INFO ("X2 SnStatusTransfer header: " << x2SnStatusXferHeader); + + EpcX2SapUser::SnStatusTransferParams params; + params.oldEnbUeX2apId = x2SnStatusXferHeader.GetOldEnbUeX2apId (); + params.newEnbUeX2apId = x2SnStatusXferHeader.GetNewEnbUeX2apId (); + params.sourceCellId = cellsInfo->m_remoteCellId; + params.targetCellId = cellsInfo->m_localCellId; + params.erabsSubjectToStatusTransferList = x2SnStatusXferHeader.GetErabsSubjectToStatusTransferList (); + + NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId); + NS_LOG_LOGIC ("newEnbUeX2apId = " << params.newEnbUeX2apId); + NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId); + NS_LOG_LOGIC ("targetCellId = " << params.targetCellId); + NS_LOG_LOGIC ("erabsList size = " << params.erabsSubjectToStatusTransferList.size ()); + + m_x2SapUser->RecvSnStatusTransfer (params); + } + } else if (procedureCode == EpcX2Header::UeContextRelease) { if (messageType == EpcX2Header::InitiatingMessage) @@ -481,6 +501,54 @@ EpcX2::DoSendHandoverPreparationFailure (EpcX2SapProvider::HandoverPreparationFa } +void +EpcX2::DoSendSnStatusTransfer (EpcX2SapProvider::SnStatusTransferParams params) +{ + NS_LOG_FUNCTION (this); + + NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId); + NS_LOG_LOGIC ("newEnbUeX2apId = " << params.newEnbUeX2apId); + NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId); + NS_LOG_LOGIC ("targetCellId = " << params.targetCellId); + NS_LOG_LOGIC ("erabsList size = " << params.erabsSubjectToStatusTransferList.size ()); + + NS_ASSERT_MSG (m_x2InterfaceSockets.find (params.targetCellId) != m_x2InterfaceSockets.end (), + "Socket infos not defined for targetCellId = " << params.targetCellId); + + Ptr localSocket = m_x2InterfaceSockets [params.targetCellId]->m_localSocket; + Ipv4Address remoteIpAddr = m_x2InterfaceSockets [params.targetCellId]->m_remoteIpAddr; + + NS_LOG_LOGIC ("localSocket = " << localSocket); + NS_LOG_LOGIC ("remoteIpAddr = " << remoteIpAddr); + + NS_LOG_INFO ("Send X2 message: SN STATUS TRANSFER"); + + // Build the X2 message + EpcX2SnStatusTransferHeader x2SnStatusXferHeader; + x2SnStatusXferHeader.SetOldEnbUeX2apId (params.oldEnbUeX2apId); + x2SnStatusXferHeader.SetNewEnbUeX2apId (params.newEnbUeX2apId); + x2SnStatusXferHeader.SetErabsSubjectToStatusTransferList (params.erabsSubjectToStatusTransferList); + + EpcX2Header x2Header; + x2Header.SetMessageType (EpcX2Header::InitiatingMessage); + x2Header.SetProcedureCode (EpcX2Header::SnStatusTransfer); + x2Header.SetLengthOfIes (x2SnStatusXferHeader.GetLengthOfIes ()); + x2Header.SetNumberOfIes (x2SnStatusXferHeader.GetNumberOfIes ()); + + NS_LOG_INFO ("X2 header: " << x2Header); + NS_LOG_INFO ("X2 SnStatusTransfer header: " << x2SnStatusXferHeader); + + // Build the X2 packet + Ptr packet = Create (); + packet->AddHeader (x2SnStatusXferHeader); + packet->AddHeader (x2Header); + NS_LOG_INFO ("packetLen = " << packet->GetSize ()); + + // Send the X2 message through the socket + localSocket->SendTo (packet, 0, InetSocketAddress (remoteIpAddr, m_x2cUdpPort)); +} + + void EpcX2::DoSendUeContextRelease (EpcX2SapProvider::UeContextReleaseParams params) { diff --git a/src/lte/model/epc-x2.h b/src/lte/model/epc-x2.h index 3c25ca579..22bf5d496 100644 --- a/src/lte/model/epc-x2.h +++ b/src/lte/model/epc-x2.h @@ -116,6 +116,7 @@ protected: virtual void DoSendHandoverRequest (EpcX2SapProvider::HandoverRequestParams params); virtual void DoSendHandoverRequestAck (EpcX2SapProvider::HandoverRequestAckParams params); virtual void DoSendHandoverPreparationFailure (EpcX2SapProvider::HandoverPreparationFailureParams params); + virtual void DoSendSnStatusTransfer (EpcX2SapProvider::SnStatusTransferParams params); virtual void DoSendUeContextRelease (EpcX2SapProvider::UeContextReleaseParams params); virtual void DoSendLoadInformation (EpcX2SapProvider::LoadInformationParams params); virtual void DoSendResourceStatusUpdate (EpcX2SapProvider::ResourceStatusUpdateParams params);