22 #include "ns3/inet-socket-address.h"
23 #include "ns3/packet.h"
25 #include "ns3/epc-gtpu-header.h"
27 #include "ns3/epc-x2-header.h"
28 #include "ns3/epc-x2.h"
35 X2IfaceInfo::X2IfaceInfo (Ipv4Address remoteIpAddr, Ptr<Socket> localCtrlPlaneSocket, Ptr<Socket> localUserPlaneSocket)
37 m_remoteIpAddr = remoteIpAddr;
38 m_localCtrlPlaneSocket = localCtrlPlaneSocket;
39 m_localUserPlaneSocket = localUserPlaneSocket;
42 X2IfaceInfo::~X2IfaceInfo (
void)
44 m_localCtrlPlaneSocket = 0;
45 m_localUserPlaneSocket = 0;
49 X2IfaceInfo::operator= (
const X2IfaceInfo& value)
52 m_remoteIpAddr = value.m_remoteIpAddr;
53 m_localCtrlPlaneSocket = value.m_localCtrlPlaneSocket;
54 m_localUserPlaneSocket = value.m_localUserPlaneSocket;
60 X2CellInfo::X2CellInfo (uint16_t localCellId, uint16_t remoteCellId)
62 m_localCellId = localCellId;
63 m_remoteCellId = remoteCellId;
66 X2CellInfo::~X2CellInfo (
void)
73 X2CellInfo::operator= (
const X2CellInfo& value)
76 m_localCellId = value.m_localCellId;
77 m_remoteCellId = value.m_remoteCellId;
83 NS_OBJECT_ENSURE_REGISTERED (EpcX2);
86 : m_x2cUdpPort (4444),
106 delete m_x2SapProvider;
110 EpcX2::GetTypeId (
void)
128 return m_x2SapProvider;
135 NS_LOG_FUNCTION (
this << localCellId << localX2Address << remoteCellId << remoteX2Address);
156 "Mapping for remoteCellId = " << remoteCellId <<
" is already known");
157 m_x2InterfaceSockets [remoteCellId] = Create<X2IfaceInfo> (remoteX2Address, localX2cSocket, localX2uSocket);
160 "Mapping for control plane localSocket = " << localX2cSocket <<
" is already known");
163 NS_ASSERT_MSG (m_x2InterfaceCellIds.find (localX2uSocket) == m_x2InterfaceCellIds.end (),
164 "Mapping for data plane localSocket = " << localX2uSocket <<
" is already known");
165 m_x2InterfaceCellIds [localX2uSocket] = Create<X2CellInfo> (localCellId, remoteCellId);
179 "Missing infos of local and remote CellId");
187 uint8_t messageType = x2Header.GetMessageType ();
188 uint8_t procedureCode = x2Header.GetProcedureCode ();
190 if (procedureCode == EpcX2Header::HandoverPreparation)
192 if (messageType == EpcX2Header::InitiatingMessage)
199 NS_LOG_INFO (
"X2 HandoverRequest header: " << x2HoReqHeader);
202 params.oldEnbUeX2apId = x2HoReqHeader.GetOldEnbUeX2apId ();
203 params.cause = x2HoReqHeader.GetCause ();
204 params.sourceCellId = cellsInfo->m_remoteCellId;
205 params.targetCellId = x2HoReqHeader.GetTargetCellId ();
206 params.mmeUeS1apId = x2HoReqHeader.GetMmeUeS1apId ();
207 params.ueAggregateMaxBitRateDownlink = x2HoReqHeader.GetUeAggregateMaxBitRateDownlink ();
208 params.ueAggregateMaxBitRateUplink = x2HoReqHeader.GetUeAggregateMaxBitRateUplink ();
209 params.bearers = x2HoReqHeader.GetBearers ();
210 params.rrcContext = packet;
212 NS_LOG_LOGIC (
"oldEnbUeX2apId = " << params.oldEnbUeX2apId);
213 NS_LOG_LOGIC (
"sourceCellId = " << params.sourceCellId);
214 NS_LOG_LOGIC (
"targetCellId = " << params.targetCellId);
216 NS_LOG_LOGIC (
"cellsInfo->m_localCellId = " << cellsInfo->m_localCellId);
217 NS_ASSERT_MSG (params.targetCellId == cellsInfo->m_localCellId,
218 "TargetCellId mismatches with localCellId");
222 else if (messageType == EpcX2Header::SuccessfulOutcome)
229 NS_LOG_INFO (
"X2 HandoverRequestAck header: " << x2HoReqAckHeader);
232 params.oldEnbUeX2apId = x2HoReqAckHeader.GetOldEnbUeX2apId ();
233 params.newEnbUeX2apId = x2HoReqAckHeader.GetNewEnbUeX2apId ();
234 params.sourceCellId = cellsInfo->m_localCellId;
235 params.targetCellId = cellsInfo->m_remoteCellId;
236 params.admittedBearers = x2HoReqAckHeader.GetAdmittedBearers ();
237 params.notAdmittedBearers = x2HoReqAckHeader.GetNotAdmittedBearers ();
238 params.rrcContext = packet;
240 NS_LOG_LOGIC (
"oldEnbUeX2apId = " << params.oldEnbUeX2apId);
241 NS_LOG_LOGIC (
"newEnbUeX2apId = " << params.newEnbUeX2apId);
242 NS_LOG_LOGIC (
"sourceCellId = " << params.sourceCellId);
243 NS_LOG_LOGIC (
"targetCellId = " << params.targetCellId);
245 m_x2SapUser->RecvHandoverRequestAck (params);
249 NS_LOG_LOGIC (
"Recv X2 message: HANDOVER PREPARATION FAILURE");
254 NS_LOG_INFO (
"X2 HandoverPreparationFailure header: " << x2HoPrepFailHeader);
257 params.oldEnbUeX2apId = x2HoPrepFailHeader.GetOldEnbUeX2apId ();
258 params.sourceCellId = cellsInfo->m_localCellId;
259 params.targetCellId = cellsInfo->m_remoteCellId;
260 params.cause = x2HoPrepFailHeader.GetCause ();
261 params.criticalityDiagnostics = x2HoPrepFailHeader.GetCriticalityDiagnostics ();
263 NS_LOG_LOGIC (
"oldEnbUeX2apId = " << params.oldEnbUeX2apId);
264 NS_LOG_LOGIC (
"sourceCellId = " << params.sourceCellId);
265 NS_LOG_LOGIC (
"targetCellId = " << params.targetCellId);
267 NS_LOG_LOGIC (
"criticalityDiagnostics = " << params.criticalityDiagnostics);
269 m_x2SapUser->RecvHandoverPreparationFailure (params);
272 else if (procedureCode == EpcX2Header::LoadIndication)
274 if (messageType == EpcX2Header::InitiatingMessage)
281 NS_LOG_INFO (
"X2 LoadInformation header: " << x2LoadInfoHeader);
284 params.cellInformationList = x2LoadInfoHeader.GetCellInformationList ();
286 NS_LOG_LOGIC (
"cellInformationList size = " << params.cellInformationList.size ());
288 m_x2SapUser->RecvLoadInformation (params);
291 else if (procedureCode == EpcX2Header::SnStatusTransfer)
293 if (messageType == EpcX2Header::InitiatingMessage)
300 NS_LOG_INFO (
"X2 SnStatusTransfer header: " << x2SnStatusXferHeader);
303 params.oldEnbUeX2apId = x2SnStatusXferHeader.GetOldEnbUeX2apId ();
304 params.newEnbUeX2apId = x2SnStatusXferHeader.GetNewEnbUeX2apId ();
305 params.sourceCellId = cellsInfo->m_remoteCellId;
306 params.targetCellId = cellsInfo->m_localCellId;
307 params.erabsSubjectToStatusTransferList = x2SnStatusXferHeader.GetErabsSubjectToStatusTransferList ();
309 NS_LOG_LOGIC (
"oldEnbUeX2apId = " << params.oldEnbUeX2apId);
310 NS_LOG_LOGIC (
"newEnbUeX2apId = " << params.newEnbUeX2apId);
311 NS_LOG_LOGIC (
"sourceCellId = " << params.sourceCellId);
312 NS_LOG_LOGIC (
"targetCellId = " << params.targetCellId);
313 NS_LOG_LOGIC (
"erabsList size = " << params.erabsSubjectToStatusTransferList.size ());
315 m_x2SapUser->RecvSnStatusTransfer (params);
318 else if (procedureCode == EpcX2Header::UeContextRelease)
320 if (messageType == EpcX2Header::InitiatingMessage)
327 NS_LOG_INFO (
"X2 UeContextRelease header: " << x2UeCtxReleaseHeader);
330 params.oldEnbUeX2apId = x2UeCtxReleaseHeader.GetOldEnbUeX2apId ();
331 params.newEnbUeX2apId = x2UeCtxReleaseHeader.GetNewEnbUeX2apId ();
333 NS_LOG_LOGIC (
"oldEnbUeX2apId = " << params.oldEnbUeX2apId);
334 NS_LOG_LOGIC (
"newEnbUeX2apId = " << params.newEnbUeX2apId);
336 m_x2SapUser->RecvUeContextRelease (params);
339 else if (procedureCode == EpcX2Header::ResourceStatusReporting)
341 if (messageType == EpcX2Header::InitiatingMessage)
343 NS_LOG_LOGIC (
"Recv X2 message: RESOURCE STATUS UPDATE");
348 NS_LOG_INFO (
"X2 ResourceStatusUpdate header: " << x2ResStatUpdHeader);
351 params.enb1MeasurementId = x2ResStatUpdHeader.GetEnb1MeasurementId ();
352 params.enb2MeasurementId = x2ResStatUpdHeader.GetEnb2MeasurementId ();
353 params.cellMeasurementResultList = x2ResStatUpdHeader.GetCellMeasurementResultList ();
355 NS_LOG_LOGIC (
"enb1MeasurementId = " << params.enb1MeasurementId);
356 NS_LOG_LOGIC (
"enb2MeasurementId = " << params.enb2MeasurementId);
357 NS_LOG_LOGIC (
"cellMeasurementResultList size = " << params.cellMeasurementResultList.size ());
359 m_x2SapUser->RecvResourceStatusUpdate (params);
374 NS_LOG_LOGIC (
"Recv UE DATA through X2-U interface from Socket");
379 "Missing infos of local and remote CellId");
388 params.sourceCellId = cellsInfo->m_remoteCellId;
389 params.targetCellId = cellsInfo->m_localCellId;
390 params.gtpTeid = gtpu.GetTeid ();
391 params.ueData = packet;
393 m_x2SapUser->RecvUeData (params);
405 NS_LOG_LOGIC (
"oldEnbUeX2apId = " << params.oldEnbUeX2apId);
406 NS_LOG_LOGIC (
"sourceCellId = " << params.sourceCellId);
407 NS_LOG_LOGIC (
"targetCellId = " << params.targetCellId);
411 "Missing infos for targetCellId = " << params.targetCellId);
413 Ptr<Socket> sourceSocket = socketInfo->m_localCtrlPlaneSocket;
414 Ipv4Address targetIpAddr = socketInfo->m_remoteIpAddr;
423 x2HoReqHeader.SetOldEnbUeX2apId (params.oldEnbUeX2apId);
424 x2HoReqHeader.SetCause (params.cause);
425 x2HoReqHeader.SetTargetCellId (params.targetCellId);
426 x2HoReqHeader.SetMmeUeS1apId (params.mmeUeS1apId);
427 x2HoReqHeader.SetUeAggregateMaxBitRateDownlink (params.ueAggregateMaxBitRateDownlink);
428 x2HoReqHeader.SetUeAggregateMaxBitRateUplink (params.ueAggregateMaxBitRateUplink);
429 x2HoReqHeader.SetBearers (params.bearers);
432 x2Header.SetMessageType (EpcX2Header::InitiatingMessage);
433 x2Header.SetProcedureCode (EpcX2Header::HandoverPreparation);
434 x2Header.SetLengthOfIes (x2HoReqHeader.GetLengthOfIes ());
435 x2Header.SetNumberOfIes (x2HoReqHeader.GetNumberOfIes ());
438 NS_LOG_INFO (
"X2 HandoverRequest header: " << x2HoReqHeader);
441 Ptr<Packet> packet = (params.rrcContext != 0) ? (params.rrcContext) : (Create <Packet> ());
452 EpcX2::DoSendHandoverRequestAck (EpcX2SapProvider::HandoverRequestAckParams params)
456 NS_LOG_LOGIC (
"oldEnbUeX2apId = " << params.oldEnbUeX2apId);
457 NS_LOG_LOGIC (
"newEnbUeX2apId = " << params.newEnbUeX2apId);
458 NS_LOG_LOGIC (
"sourceCellId = " << params.sourceCellId);
459 NS_LOG_LOGIC (
"targetCellId = " << params.targetCellId);
462 "Socket infos not defined for sourceCellId = " << params.sourceCellId);
470 NS_LOG_INFO (
"Send X2 message: HANDOVER REQUEST ACK");
473 EpcX2HandoverRequestAckHeader x2HoAckHeader;
474 x2HoAckHeader.SetOldEnbUeX2apId (params.oldEnbUeX2apId);
475 x2HoAckHeader.SetNewEnbUeX2apId (params.newEnbUeX2apId);
476 x2HoAckHeader.SetAdmittedBearers (params.admittedBearers);
477 x2HoAckHeader.SetNotAdmittedBearers (params.notAdmittedBearers);
479 EpcX2Header x2Header;
480 x2Header.SetMessageType (EpcX2Header::SuccessfulOutcome);
481 x2Header.SetProcedureCode (EpcX2Header::HandoverPreparation);
482 x2Header.SetLengthOfIes (x2HoAckHeader.GetLengthOfIes ());
483 x2Header.SetNumberOfIes (x2HoAckHeader.GetNumberOfIes ());
486 NS_LOG_INFO (
"X2 HandoverAck header: " << x2HoAckHeader);
487 NS_LOG_INFO (
"RRC context: " << params.rrcContext);
490 Ptr<Packet> packet = (params.rrcContext != 0) ? (params.rrcContext) : (Create <Packet> ());
492 packet->AddHeader (x2Header);
493 NS_LOG_INFO (
"packetLen = " << packet->GetSize ());
496 localSocket->SendTo (packet, 0, InetSocketAddress (remoteIpAddr,
m_x2cUdpPort));
501 EpcX2::DoSendHandoverPreparationFailure (EpcX2SapProvider::HandoverPreparationFailureParams params)
505 NS_LOG_LOGIC (
"oldEnbUeX2apId = " << params.oldEnbUeX2apId);
506 NS_LOG_LOGIC (
"sourceCellId = " << params.sourceCellId);
507 NS_LOG_LOGIC (
"targetCellId = " << params.targetCellId);
509 NS_LOG_LOGIC (
"criticalityDiagnostics = " << params.criticalityDiagnostics);
512 "Socket infos not defined for sourceCellId = " << params.sourceCellId);
520 NS_LOG_INFO (
"Send X2 message: HANDOVER PREPARATION FAILURE");
523 EpcX2HandoverPreparationFailureHeader x2HoPrepFailHeader;
524 x2HoPrepFailHeader.SetOldEnbUeX2apId (params.oldEnbUeX2apId);
525 x2HoPrepFailHeader.SetCause (params.cause);
526 x2HoPrepFailHeader.SetCriticalityDiagnostics (params.criticalityDiagnostics);
528 EpcX2Header x2Header;
529 x2Header.SetMessageType (EpcX2Header::UnsuccessfulOutcome);
530 x2Header.SetProcedureCode (EpcX2Header::HandoverPreparation);
531 x2Header.SetLengthOfIes (x2HoPrepFailHeader.GetLengthOfIes ());
532 x2Header.SetNumberOfIes (x2HoPrepFailHeader.GetNumberOfIes ());
535 NS_LOG_INFO (
"X2 HandoverPrepFail header: " << x2HoPrepFailHeader);
538 Ptr<Packet> packet = Create <Packet> ();
539 packet->AddHeader (x2HoPrepFailHeader);
540 packet->AddHeader (x2Header);
541 NS_LOG_INFO (
"packetLen = " << packet->GetSize ());
544 localSocket->SendTo (packet, 0, InetSocketAddress (remoteIpAddr,
m_x2cUdpPort));
549 EpcX2::DoSendSnStatusTransfer (EpcX2SapProvider::SnStatusTransferParams params)
553 NS_LOG_LOGIC (
"oldEnbUeX2apId = " << params.oldEnbUeX2apId);
554 NS_LOG_LOGIC (
"newEnbUeX2apId = " << params.newEnbUeX2apId);
555 NS_LOG_LOGIC (
"sourceCellId = " << params.sourceCellId);
556 NS_LOG_LOGIC (
"targetCellId = " << params.targetCellId);
557 NS_LOG_LOGIC (
"erabsList size = " << params.erabsSubjectToStatusTransferList.size ());
560 "Socket infos not defined for targetCellId = " << params.targetCellId);
568 NS_LOG_INFO (
"Send X2 message: SN STATUS TRANSFER");
571 EpcX2SnStatusTransferHeader x2SnStatusXferHeader;
572 x2SnStatusXferHeader.SetOldEnbUeX2apId (params.oldEnbUeX2apId);
573 x2SnStatusXferHeader.SetNewEnbUeX2apId (params.newEnbUeX2apId);
574 x2SnStatusXferHeader.SetErabsSubjectToStatusTransferList (params.erabsSubjectToStatusTransferList);
576 EpcX2Header x2Header;
577 x2Header.SetMessageType (EpcX2Header::InitiatingMessage);
578 x2Header.SetProcedureCode (EpcX2Header::SnStatusTransfer);
579 x2Header.SetLengthOfIes (x2SnStatusXferHeader.GetLengthOfIes ());
580 x2Header.SetNumberOfIes (x2SnStatusXferHeader.GetNumberOfIes ());
583 NS_LOG_INFO (
"X2 SnStatusTransfer header: " << x2SnStatusXferHeader);
586 Ptr<Packet> packet = Create <Packet> ();
587 packet->AddHeader (x2SnStatusXferHeader);
588 packet->AddHeader (x2Header);
589 NS_LOG_INFO (
"packetLen = " << packet->GetSize ());
592 localSocket->SendTo (packet, 0, InetSocketAddress (remoteIpAddr,
m_x2cUdpPort));
597 EpcX2::DoSendUeContextRelease (EpcX2SapProvider::UeContextReleaseParams params)
601 NS_LOG_LOGIC (
"oldEnbUeX2apId = " << params.oldEnbUeX2apId);
602 NS_LOG_LOGIC (
"newEnbUeX2apId = " << params.newEnbUeX2apId);
603 NS_LOG_LOGIC (
"sourceCellId = " << params.sourceCellId);
606 "Socket infos not defined for sourceCellId = " << params.sourceCellId);
614 NS_LOG_INFO (
"Send X2 message: UE CONTEXT RELEASE");
617 EpcX2UeContextReleaseHeader x2UeCtxReleaseHeader;
618 x2UeCtxReleaseHeader.SetOldEnbUeX2apId (params.oldEnbUeX2apId);
619 x2UeCtxReleaseHeader.SetNewEnbUeX2apId (params.newEnbUeX2apId);
621 EpcX2Header x2Header;
622 x2Header.SetMessageType (EpcX2Header::InitiatingMessage);
623 x2Header.SetProcedureCode (EpcX2Header::UeContextRelease);
624 x2Header.SetLengthOfIes (x2UeCtxReleaseHeader.GetLengthOfIes ());
625 x2Header.SetNumberOfIes (x2UeCtxReleaseHeader.GetNumberOfIes ());
628 NS_LOG_INFO (
"X2 UeContextRelease header: " << x2UeCtxReleaseHeader);
631 Ptr<Packet> packet = Create <Packet> ();
632 packet->AddHeader (x2UeCtxReleaseHeader);
633 packet->AddHeader (x2Header);
634 NS_LOG_INFO (
"packetLen = " << packet->GetSize ());
637 localSocket->SendTo (packet, 0, InetSocketAddress (remoteIpAddr,
m_x2cUdpPort));
642 EpcX2::DoSendLoadInformation (EpcX2SapProvider::LoadInformationParams params)
646 NS_LOG_LOGIC (
"targetCellId = " << params.targetCellId);
647 NS_LOG_LOGIC (
"cellInformationList size = " << params.cellInformationList.size ());
650 "Missing infos for targetCellId = " << params.targetCellId);
652 Ptr<Socket> sourceSocket = socketInfo->m_localCtrlPlaneSocket;
653 Ipv4Address targetIpAddr = socketInfo->m_remoteIpAddr;
661 EpcX2LoadInformationHeader x2LoadInfoHeader;
662 x2LoadInfoHeader.SetCellInformationList (params.cellInformationList);
664 EpcX2Header x2Header;
665 x2Header.SetMessageType (EpcX2Header::InitiatingMessage);
666 x2Header.SetProcedureCode (EpcX2Header::LoadIndication);
667 x2Header.SetLengthOfIes (x2LoadInfoHeader.GetLengthOfIes ());
668 x2Header.SetNumberOfIes (x2LoadInfoHeader.GetNumberOfIes ());
671 NS_LOG_INFO (
"X2 LoadInformation header: " << x2LoadInfoHeader);
674 Ptr<Packet> packet = Create <Packet> ();
675 packet->AddHeader (x2LoadInfoHeader);
676 packet->AddHeader (x2Header);
677 NS_LOG_INFO (
"packetLen = " << packet->GetSize ());
680 sourceSocket->SendTo (packet, 0, InetSocketAddress (targetIpAddr,
m_x2cUdpPort));
686 EpcX2::DoSendResourceStatusUpdate (EpcX2SapProvider::ResourceStatusUpdateParams params)
690 NS_LOG_LOGIC (
"targetCellId = " << params.targetCellId);
691 NS_LOG_LOGIC (
"enb1MeasurementId = " << params.enb1MeasurementId);
692 NS_LOG_LOGIC (
"enb2MeasurementId = " << params.enb2MeasurementId);
693 NS_LOG_LOGIC (
"cellMeasurementResultList size = " << params.cellMeasurementResultList.size ());
696 "Missing infos for targetCellId = " << params.targetCellId);
698 Ptr<Socket> sourceSocket = socketInfo->m_localCtrlPlaneSocket;
699 Ipv4Address targetIpAddr = socketInfo->m_remoteIpAddr;
704 NS_LOG_INFO (
"Send X2 message: RESOURCE STATUS UPDATE");
707 EpcX2ResourceStatusUpdateHeader x2ResourceStatUpdHeader;
708 x2ResourceStatUpdHeader.SetEnb1MeasurementId (params.enb1MeasurementId);
709 x2ResourceStatUpdHeader.SetEnb2MeasurementId (params.enb2MeasurementId);
710 x2ResourceStatUpdHeader.SetCellMeasurementResultList (params.cellMeasurementResultList);
712 EpcX2Header x2Header;
713 x2Header.SetMessageType (EpcX2Header::InitiatingMessage);
714 x2Header.SetProcedureCode (EpcX2Header::ResourceStatusReporting);
715 x2Header.SetLengthOfIes (x2ResourceStatUpdHeader.GetLengthOfIes ());
716 x2Header.SetNumberOfIes (x2ResourceStatUpdHeader.GetNumberOfIes ());
719 NS_LOG_INFO (
"X2 ResourceStatusUpdate header: " << x2ResourceStatUpdHeader);
722 Ptr<Packet> packet = Create <Packet> ();
723 packet->AddHeader (x2ResourceStatUpdHeader);
724 packet->AddHeader (x2Header);
725 NS_LOG_INFO (
"packetLen = " << packet->GetSize ());
728 sourceSocket->SendTo (packet, 0, InetSocketAddress (targetIpAddr,
m_x2cUdpPort));
734 EpcX2::DoSendUeData (EpcX2SapProvider::UeDataParams params)
738 NS_LOG_LOGIC (
"sourceCellId = " << params.sourceCellId);
739 NS_LOG_LOGIC (
"targetCellId = " << params.targetCellId);
743 "Missing infos for targetCellId = " << params.targetCellId);
745 Ptr<Socket> sourceSocket = socketInfo->m_localUserPlaneSocket;
746 Ipv4Address targetIpAddr = socketInfo->m_remoteIpAddr;
752 gtpu.SetTeid (params.gtpTeid);
753 gtpu.SetLength (params.ueData->GetSize () + gtpu.GetSerializedSize () - 8);
756 Ptr<Packet> packet = params.ueData;
757 packet->AddHeader (gtpu);
759 NS_LOG_INFO (
"Forward UE DATA through X2 interface");
760 sourceSocket->SendTo (packet, 0, InetSocketAddress (targetIpAddr, m_x2uUdpPort));
uint32_t RemoveHeader(Header &header)
#define NS_LOG_FUNCTION(parameters)
Parameters of the HANDOVER REQUEST message.
#define NS_ASSERT(condition)
virtual void RecvHandoverRequest(HandoverRequestParams params)=0
#define NS_LOG_COMPONENT_DEFINE(name)
uint32_t GetSize(void) const
void RecvFromX2uSocket(Ptr< Socket > socket)
void RecvFromX2cSocket(Ptr< Socket > socket)
Parameters of the HANDOVER PREPARATION FAILURE message.
Parameters of the SN STATUS TRANSFER message.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
void SetRecvCallback(Callback< void, Ptr< Socket > >)
Notify application when new data is available to be read.
static Ptr< Socket > CreateSocket(Ptr< Node > node, TypeId tid)
std::map< uint16_t, Ptr< X2IfaceInfo > > m_x2InterfaceSockets
#define NS_LOG_LOGIC(msg)
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
Parameters of the RESOURCE STATUS UPDATE message.
virtual Ptr< Packet > Recv(uint32_t maxSize, uint32_t flags)=0
Read data from the socket.
Parameters of the UE CONTEXT RELEASE message.
Parameters of the HANDOVER REQUEST ACKNOWLEDGE message.
#define NS_ASSERT_MSG(condition, message)
Ipv4 addresses are stored in host order in this class.
EpcX2SapProvider * GetEpcX2SapProvider()
void SetEpcX2SapUser(EpcX2SapUser *s)
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer.
std::map< Ptr< Socket >, Ptr< X2CellInfo > > m_x2InterfaceCellIds
a base class which provides memory management and object aggregation
void AddX2Interface(uint16_t enb1CellId, Ipv4Address enb1X2Address, uint16_t enb2CellId, Ipv4Address enb2X2Address)
virtual void DoDispose(void)
Parameters of the UE DATA primitive.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
void AddHeader(const Header &header)
static TypeId LookupByName(std::string name)