A Discrete-Event Network Simulator
API
epc-x2.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Manuel Requena <manuel.requena@cttc.es>
19  */
20 
21 #include "ns3/log.h"
22 #include "ns3/inet-socket-address.h"
23 #include "ns3/packet.h"
24 #include "ns3/node.h"
25 #include "ns3/epc-gtpu-header.h"
26 
27 #include "ns3/epc-x2-header.h"
28 #include "ns3/epc-x2.h"
29 
30 namespace ns3 {
31 
32 NS_LOG_COMPONENT_DEFINE ("EpcX2");
33 
34 X2IfaceInfo::X2IfaceInfo (Ipv4Address remoteIpAddr, Ptr<Socket> localCtrlPlaneSocket, Ptr<Socket> localUserPlaneSocket)
35 {
36  m_remoteIpAddr = remoteIpAddr;
37  m_localCtrlPlaneSocket = localCtrlPlaneSocket;
38  m_localUserPlaneSocket = localUserPlaneSocket;
39 }
40 
42 {
45 }
46 
49 {
50  NS_LOG_FUNCTION (this);
51  m_remoteIpAddr = value.m_remoteIpAddr;
52  m_localCtrlPlaneSocket = value.m_localCtrlPlaneSocket;
53  m_localUserPlaneSocket = value.m_localUserPlaneSocket;
54  return *this;
55 }
56 
58 
59 X2CellInfo::X2CellInfo (std::vector<uint16_t> localCellIds, std::vector<uint16_t> remoteCellIds) :
60  m_localCellIds {localCellIds},
61  m_remoteCellIds {remoteCellIds}
62 {
63 }
64 
66 {
67 }
68 
69 X2CellInfo&
71 {
72  NS_LOG_FUNCTION (this);
73  m_localCellIds = value.m_localCellIds;
74  m_remoteCellIds = value.m_remoteCellIds;
75  return *this;
76 }
77 
79 
81 
83  : m_x2cUdpPort (4444),
84  m_x2uUdpPort (2152)
85 {
86  NS_LOG_FUNCTION (this);
87 
89 }
90 
92 {
93  NS_LOG_FUNCTION (this);
94 }
95 
96 void
98 {
99  NS_LOG_FUNCTION (this);
100 
101  m_x2InterfaceSockets.clear ();
102  m_x2InterfaceCellIds.clear ();
103  delete m_x2SapProvider;
104 }
105 
106 TypeId
108 {
109  static TypeId tid = TypeId ("ns3::EpcX2")
110  .SetParent<Object> ()
111  .SetGroupName("Lte");
112  return tid;
113 }
114 
115 void
117 {
118  NS_LOG_FUNCTION (this << s);
119  m_x2SapUser = s;
120 }
121 
124 {
125  NS_LOG_FUNCTION (this);
126  return m_x2SapProvider;
127 }
128 
129 
130 void
131 EpcX2::AddX2Interface (uint16_t localCellId, Ipv4Address localX2Address, std::vector<uint16_t> remoteCellIds, Ipv4Address remoteX2Address)
132 {
133  uint16_t remoteCellId = remoteCellIds.at (0);
134  NS_LOG_FUNCTION (this << localCellId << localX2Address << remoteCellId << remoteX2Address);
135 
136  int retval;
137 
138  // Get local eNB where this X2 entity belongs to
139  Ptr<Node> localEnb = GetObject<Node> ();
140 
141  // Create X2-C socket for the local eNB
142  Ptr<Socket> localX2cSocket = Socket::CreateSocket (localEnb, TypeId::LookupByName ("ns3::UdpSocketFactory"));
143  retval = localX2cSocket->Bind (InetSocketAddress (localX2Address, m_x2cUdpPort));
144  NS_ASSERT (retval == 0);
145  localX2cSocket->SetRecvCallback (MakeCallback (&EpcX2::RecvFromX2cSocket, this));
146 
147  // Create X2-U socket for the local eNB
148  Ptr<Socket> localX2uSocket = Socket::CreateSocket (localEnb, TypeId::LookupByName ("ns3::UdpSocketFactory"));
149  retval = localX2uSocket->Bind (InetSocketAddress (localX2Address, m_x2uUdpPort));
150  NS_ASSERT (retval == 0);
151  localX2uSocket->SetRecvCallback (MakeCallback (&EpcX2::RecvFromX2uSocket, this));
152 
153  std::vector<uint16_t> localCellIds;
154  localCellIds.push_back (localCellId);
155 
156  NS_ASSERT_MSG (m_x2InterfaceSockets.find (remoteCellId) == m_x2InterfaceSockets.end (),
157  "Mapping for remoteCellId = " << remoteCellId << " is already known");
158  for (uint16_t remoteCellId: remoteCellIds)
159  {
160  m_x2InterfaceSockets [remoteCellId] = Create<X2IfaceInfo> (remoteX2Address, localX2cSocket, localX2uSocket);
161  }
162 
163  NS_ASSERT_MSG (m_x2InterfaceCellIds.find (localX2cSocket) == m_x2InterfaceCellIds.end (),
164  "Mapping for control plane localSocket = " << localX2cSocket << " is already known");
165  m_x2InterfaceCellIds [localX2cSocket] = Create<X2CellInfo> (localCellIds, remoteCellIds);
166 
167  NS_ASSERT_MSG (m_x2InterfaceCellIds.find (localX2uSocket) == m_x2InterfaceCellIds.end (),
168  "Mapping for data plane localSocket = " << localX2uSocket << " is already known");
169  m_x2InterfaceCellIds [localX2uSocket] = Create<X2CellInfo> (localCellIds, remoteCellIds);
170 }
171 
172 
173 void
175 {
176  NS_LOG_FUNCTION (this << socket);
177 
178  NS_LOG_LOGIC ("Recv X2 message: from Socket");
179  Ptr<Packet> packet = socket->Recv ();
180  NS_LOG_LOGIC ("packetLen = " << packet->GetSize ());
181 
183  "Missing infos of local and remote CellId");
184  Ptr<X2CellInfo> cellsInfo = m_x2InterfaceCellIds [socket];
185 
186  EpcX2Header x2Header;
187  packet->RemoveHeader (x2Header);
188 
189  NS_LOG_LOGIC ("X2 header: " << x2Header);
190 
191  uint8_t messageType = x2Header.GetMessageType ();
192  uint8_t procedureCode = x2Header.GetProcedureCode ();
193 
194  if (procedureCode == EpcX2Header::HandoverPreparation)
195  {
196  if (messageType == EpcX2Header::InitiatingMessage)
197  {
198  NS_LOG_LOGIC ("Recv X2 message: HANDOVER REQUEST");
199 
200  EpcX2HandoverRequestHeader x2HoReqHeader;
201  packet->RemoveHeader (x2HoReqHeader);
202 
203  NS_LOG_INFO ("X2 HandoverRequest header: " << x2HoReqHeader);
204 
206  params.oldEnbUeX2apId = x2HoReqHeader.GetOldEnbUeX2apId ();
207  params.cause = x2HoReqHeader.GetCause ();
208  params.sourceCellId = cellsInfo->m_remoteCellIds.at (0);
209  params.targetCellId = x2HoReqHeader.GetTargetCellId ();
210  params.mmeUeS1apId = x2HoReqHeader.GetMmeUeS1apId ();
213  params.bearers = x2HoReqHeader.GetBearers ();
214  params.rrcContext = packet;
215 
216  NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
217  NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId);
218  NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
219  NS_LOG_LOGIC ("mmeUeS1apId = " << params.mmeUeS1apId);
220  NS_LOG_LOGIC ("cellsInfo->m_localCellId = " << cellsInfo->m_localCellIds.at (0));
221 
223  }
224  else if (messageType == EpcX2Header::SuccessfulOutcome)
225  {
226  NS_LOG_LOGIC ("Recv X2 message: HANDOVER REQUEST ACK");
227 
228  EpcX2HandoverRequestAckHeader x2HoReqAckHeader;
229  packet->RemoveHeader (x2HoReqAckHeader);
230 
231  NS_LOG_INFO ("X2 HandoverRequestAck header: " << x2HoReqAckHeader);
232 
234  params.oldEnbUeX2apId = x2HoReqAckHeader.GetOldEnbUeX2apId ();
235  params.newEnbUeX2apId = x2HoReqAckHeader.GetNewEnbUeX2apId ();
236  params.sourceCellId = cellsInfo->m_localCellIds.at (0);
237  params.targetCellId = cellsInfo->m_remoteCellIds.at (0);
238  params.admittedBearers = x2HoReqAckHeader.GetAdmittedBearers ();
239  params.notAdmittedBearers = x2HoReqAckHeader.GetNotAdmittedBearers ();
240  params.rrcContext = packet;
241 
242  NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
243  NS_LOG_LOGIC ("newEnbUeX2apId = " << params.newEnbUeX2apId);
244  NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId);
245  NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
246 
248  }
249  else // messageType == EpcX2Header::UnsuccessfulOutcome
250  {
251  NS_LOG_LOGIC ("Recv X2 message: HANDOVER PREPARATION FAILURE");
252 
253  EpcX2HandoverPreparationFailureHeader x2HoPrepFailHeader;
254  packet->RemoveHeader (x2HoPrepFailHeader);
255 
256  NS_LOG_INFO ("X2 HandoverPreparationFailure header: " << x2HoPrepFailHeader);
257 
259  params.oldEnbUeX2apId = x2HoPrepFailHeader.GetOldEnbUeX2apId ();
260  params.sourceCellId = cellsInfo->m_localCellIds.at (0);
261  params.targetCellId = cellsInfo->m_remoteCellIds.at (0);
262  params.cause = x2HoPrepFailHeader.GetCause ();
263  params.criticalityDiagnostics = x2HoPrepFailHeader.GetCriticalityDiagnostics ();
264 
265  NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
266  NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId);
267  NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
268  NS_LOG_LOGIC ("cause = " << params.cause);
269  NS_LOG_LOGIC ("criticalityDiagnostics = " << params.criticalityDiagnostics);
270 
272  }
273  }
274  else if (procedureCode == EpcX2Header::LoadIndication)
275  {
276  if (messageType == EpcX2Header::InitiatingMessage)
277  {
278  NS_LOG_LOGIC ("Recv X2 message: LOAD INFORMATION");
279 
280  EpcX2LoadInformationHeader x2LoadInfoHeader;
281  packet->RemoveHeader (x2LoadInfoHeader);
282 
283  NS_LOG_INFO ("X2 LoadInformation header: " << x2LoadInfoHeader);
284 
286  params.cellInformationList = x2LoadInfoHeader.GetCellInformationList ();
287 
288  NS_LOG_LOGIC ("cellInformationList size = " << params.cellInformationList.size ());
289 
291  }
292  }
293  else if (procedureCode == EpcX2Header::SnStatusTransfer)
294  {
295  if (messageType == EpcX2Header::InitiatingMessage)
296  {
297  NS_LOG_LOGIC ("Recv X2 message: SN STATUS TRANSFER");
298 
299  EpcX2SnStatusTransferHeader x2SnStatusXferHeader;
300  packet->RemoveHeader (x2SnStatusXferHeader);
301 
302  NS_LOG_INFO ("X2 SnStatusTransfer header: " << x2SnStatusXferHeader);
303 
305  params.oldEnbUeX2apId = x2SnStatusXferHeader.GetOldEnbUeX2apId ();
306  params.newEnbUeX2apId = x2SnStatusXferHeader.GetNewEnbUeX2apId ();
307  params.sourceCellId = cellsInfo->m_remoteCellIds.at (0);
308  params.targetCellId = cellsInfo->m_localCellIds.at (0);
310 
311  NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
312  NS_LOG_LOGIC ("newEnbUeX2apId = " << params.newEnbUeX2apId);
313  NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId);
314  NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
315  NS_LOG_LOGIC ("erabsList size = " << params.erabsSubjectToStatusTransferList.size ());
316 
318  }
319  }
320  else if (procedureCode == EpcX2Header::UeContextRelease)
321  {
322  if (messageType == EpcX2Header::InitiatingMessage)
323  {
324  NS_LOG_LOGIC ("Recv X2 message: UE CONTEXT RELEASE");
325 
326  EpcX2UeContextReleaseHeader x2UeCtxReleaseHeader;
327  packet->RemoveHeader (x2UeCtxReleaseHeader);
328 
329  NS_LOG_INFO ("X2 UeContextRelease header: " << x2UeCtxReleaseHeader);
330 
332  params.oldEnbUeX2apId = x2UeCtxReleaseHeader.GetOldEnbUeX2apId ();
333  params.newEnbUeX2apId = x2UeCtxReleaseHeader.GetNewEnbUeX2apId ();
334 
335  NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
336  NS_LOG_LOGIC ("newEnbUeX2apId = " << params.newEnbUeX2apId);
337 
339  }
340  }
341  else if (procedureCode == EpcX2Header::ResourceStatusReporting)
342  {
343  if (messageType == EpcX2Header::InitiatingMessage)
344  {
345  NS_LOG_LOGIC ("Recv X2 message: RESOURCE STATUS UPDATE");
346 
347  EpcX2ResourceStatusUpdateHeader x2ResStatUpdHeader;
348  packet->RemoveHeader (x2ResStatUpdHeader);
349 
350  NS_LOG_INFO ("X2 ResourceStatusUpdate header: " << x2ResStatUpdHeader);
351 
353  params.targetCellId = 0;
354  params.enb1MeasurementId = x2ResStatUpdHeader.GetEnb1MeasurementId ();
355  params.enb2MeasurementId = x2ResStatUpdHeader.GetEnb2MeasurementId ();
356  params.cellMeasurementResultList = x2ResStatUpdHeader.GetCellMeasurementResultList ();
357 
358  NS_LOG_LOGIC ("enb1MeasurementId = " << params.enb1MeasurementId);
359  NS_LOG_LOGIC ("enb2MeasurementId = " << params.enb2MeasurementId);
360  NS_LOG_LOGIC ("cellMeasurementResultList size = " << params.cellMeasurementResultList.size ());
361 
363  }
364  }
365  else
366  {
367  NS_ASSERT_MSG (false, "ProcedureCode NOT SUPPORTED!!!");
368  }
369 }
370 
371 
372 void
374 {
375  NS_LOG_FUNCTION (this << socket);
376 
377  NS_LOG_LOGIC ("Recv UE DATA through X2-U interface from Socket");
378  Ptr<Packet> packet = socket->Recv ();
379  NS_LOG_LOGIC ("packetLen = " << packet->GetSize ());
380 
382  "Missing infos of local and remote CellId");
383  Ptr<X2CellInfo> cellsInfo = m_x2InterfaceCellIds [socket];
384 
385  GtpuHeader gtpu;
386  packet->RemoveHeader (gtpu);
387 
388  NS_LOG_LOGIC ("GTP-U header: " << gtpu);
389 
391  params.sourceCellId = cellsInfo->m_remoteCellIds.at (0);
392  params.targetCellId = cellsInfo->m_localCellIds.at (0);
393  params.gtpTeid = gtpu.GetTeid ();
394  params.ueData = packet;
395 
396  m_x2SapUser->RecvUeData (params);
397 }
398 
399 
400 //
401 // Implementation of the X2 SAP Provider
402 //
403 void
405 {
406  NS_LOG_FUNCTION (this);
407 
408  NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
409  NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId);
410  NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
411  NS_LOG_LOGIC ("mmeUeS1apId = " << params.mmeUeS1apId);
412 
414  "Missing infos for targetCellId = " << params.targetCellId);
415  Ptr<X2IfaceInfo> socketInfo = m_x2InterfaceSockets [params.targetCellId];
416  Ptr<Socket> sourceSocket = socketInfo->m_localCtrlPlaneSocket;
417  Ipv4Address targetIpAddr = socketInfo->m_remoteIpAddr;
418 
419  NS_LOG_LOGIC ("sourceSocket = " << sourceSocket);
420  NS_LOG_LOGIC ("targetIpAddr = " << targetIpAddr);
421 
422  NS_LOG_INFO ("Send X2 message: HANDOVER REQUEST");
423 
424  // Build the X2 message
425  EpcX2HandoverRequestHeader x2HoReqHeader;
426  x2HoReqHeader.SetOldEnbUeX2apId (params.oldEnbUeX2apId);
427  x2HoReqHeader.SetCause (params.cause);
428  x2HoReqHeader.SetTargetCellId (params.targetCellId);
429  x2HoReqHeader.SetMmeUeS1apId (params.mmeUeS1apId);
432  x2HoReqHeader.SetBearers (params.bearers);
433 
434  EpcX2Header x2Header;
437  x2Header.SetLengthOfIes (x2HoReqHeader.GetLengthOfIes ());
438  x2Header.SetNumberOfIes (x2HoReqHeader.GetNumberOfIes ());
439 
440  NS_LOG_INFO ("X2 header: " << x2Header);
441  NS_LOG_INFO ("X2 HandoverRequest header: " << x2HoReqHeader);
442 
443  // Build the X2 packet
444  Ptr<Packet> packet = (params.rrcContext != 0) ? (params.rrcContext) : (Create <Packet> ());
445  packet->AddHeader (x2HoReqHeader);
446  packet->AddHeader (x2Header);
447  NS_LOG_INFO ("packetLen = " << packet->GetSize ());
448 
449  // Send the X2 message through the socket
450  sourceSocket->SendTo (packet, 0, InetSocketAddress (targetIpAddr, m_x2cUdpPort));
451 }
452 
453 
454 void
456 {
457  NS_LOG_FUNCTION (this);
458 
459  NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
460  NS_LOG_LOGIC ("newEnbUeX2apId = " << params.newEnbUeX2apId);
461  NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId);
462  NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
463 
465  "Socket infos not defined for sourceCellId = " << params.sourceCellId);
466 
467  Ptr<Socket> localSocket = m_x2InterfaceSockets [params.sourceCellId]->m_localCtrlPlaneSocket;
468  Ipv4Address remoteIpAddr = m_x2InterfaceSockets [params.sourceCellId]->m_remoteIpAddr;
469 
470  NS_LOG_LOGIC ("localSocket = " << localSocket);
471  NS_LOG_LOGIC ("remoteIpAddr = " << remoteIpAddr);
472 
473  NS_LOG_INFO ("Send X2 message: HANDOVER REQUEST ACK");
474 
475  // Build the X2 message
476  EpcX2HandoverRequestAckHeader x2HoAckHeader;
477  x2HoAckHeader.SetOldEnbUeX2apId (params.oldEnbUeX2apId);
478  x2HoAckHeader.SetNewEnbUeX2apId (params.newEnbUeX2apId);
479  x2HoAckHeader.SetAdmittedBearers (params.admittedBearers);
480  x2HoAckHeader.SetNotAdmittedBearers (params.notAdmittedBearers);
481 
482  EpcX2Header x2Header;
485  x2Header.SetLengthOfIes (x2HoAckHeader.GetLengthOfIes ());
486  x2Header.SetNumberOfIes (x2HoAckHeader.GetNumberOfIes ());
487 
488  NS_LOG_INFO ("X2 header: " << x2Header);
489  NS_LOG_INFO ("X2 HandoverAck header: " << x2HoAckHeader);
490  NS_LOG_INFO ("RRC context: " << params.rrcContext);
491 
492  // Build the X2 packet
493  Ptr<Packet> packet = (params.rrcContext != 0) ? (params.rrcContext) : (Create <Packet> ());
494  packet->AddHeader (x2HoAckHeader);
495  packet->AddHeader (x2Header);
496  NS_LOG_INFO ("packetLen = " << packet->GetSize ());
497 
498  // Send the X2 message through the socket
499  localSocket->SendTo (packet, 0, InetSocketAddress (remoteIpAddr, m_x2cUdpPort));
500 }
501 
502 
503 void
505 {
506  NS_LOG_FUNCTION (this);
507 
508  NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
509  NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId);
510  NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
511  NS_LOG_LOGIC ("cause = " << params.cause);
512  NS_LOG_LOGIC ("criticalityDiagnostics = " << params.criticalityDiagnostics);
513 
515  "Socket infos not defined for sourceCellId = " << params.sourceCellId);
516 
517  Ptr<Socket> localSocket = m_x2InterfaceSockets [params.sourceCellId]->m_localCtrlPlaneSocket;
518  Ipv4Address remoteIpAddr = m_x2InterfaceSockets [params.sourceCellId]->m_remoteIpAddr;
519 
520  NS_LOG_LOGIC ("localSocket = " << localSocket);
521  NS_LOG_LOGIC ("remoteIpAddr = " << remoteIpAddr);
522 
523  NS_LOG_INFO ("Send X2 message: HANDOVER PREPARATION FAILURE");
524 
525  // Build the X2 message
526  EpcX2HandoverPreparationFailureHeader x2HoPrepFailHeader;
527  x2HoPrepFailHeader.SetOldEnbUeX2apId (params.oldEnbUeX2apId);
528  x2HoPrepFailHeader.SetCause (params.cause);
529  x2HoPrepFailHeader.SetCriticalityDiagnostics (params.criticalityDiagnostics);
530 
531  EpcX2Header x2Header;
534  x2Header.SetLengthOfIes (x2HoPrepFailHeader.GetLengthOfIes ());
535  x2Header.SetNumberOfIes (x2HoPrepFailHeader.GetNumberOfIes ());
536 
537  NS_LOG_INFO ("X2 header: " << x2Header);
538  NS_LOG_INFO ("X2 HandoverPrepFail header: " << x2HoPrepFailHeader);
539 
540  // Build the X2 packet
541  Ptr<Packet> packet = Create <Packet> ();
542  packet->AddHeader (x2HoPrepFailHeader);
543  packet->AddHeader (x2Header);
544  NS_LOG_INFO ("packetLen = " << packet->GetSize ());
545 
546  // Send the X2 message through the socket
547  localSocket->SendTo (packet, 0, InetSocketAddress (remoteIpAddr, m_x2cUdpPort));
548 }
549 
550 
551 void
553 {
554  NS_LOG_FUNCTION (this);
555 
556  NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
557  NS_LOG_LOGIC ("newEnbUeX2apId = " << params.newEnbUeX2apId);
558  NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId);
559  NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
560  NS_LOG_LOGIC ("erabsList size = " << params.erabsSubjectToStatusTransferList.size ());
561 
563  "Socket infos not defined for targetCellId = " << params.targetCellId);
564 
565  Ptr<Socket> localSocket = m_x2InterfaceSockets [params.targetCellId]->m_localCtrlPlaneSocket;
566  Ipv4Address remoteIpAddr = m_x2InterfaceSockets [params.targetCellId]->m_remoteIpAddr;
567 
568  NS_LOG_LOGIC ("localSocket = " << localSocket);
569  NS_LOG_LOGIC ("remoteIpAddr = " << remoteIpAddr);
570 
571  NS_LOG_INFO ("Send X2 message: SN STATUS TRANSFER");
572 
573  // Build the X2 message
574  EpcX2SnStatusTransferHeader x2SnStatusXferHeader;
575  x2SnStatusXferHeader.SetOldEnbUeX2apId (params.oldEnbUeX2apId);
576  x2SnStatusXferHeader.SetNewEnbUeX2apId (params.newEnbUeX2apId);
578 
579  EpcX2Header x2Header;
582  x2Header.SetLengthOfIes (x2SnStatusXferHeader.GetLengthOfIes ());
583  x2Header.SetNumberOfIes (x2SnStatusXferHeader.GetNumberOfIes ());
584 
585  NS_LOG_INFO ("X2 header: " << x2Header);
586  NS_LOG_INFO ("X2 SnStatusTransfer header: " << x2SnStatusXferHeader);
587 
588  // Build the X2 packet
589  Ptr<Packet> packet = Create <Packet> ();
590  packet->AddHeader (x2SnStatusXferHeader);
591  packet->AddHeader (x2Header);
592  NS_LOG_INFO ("packetLen = " << packet->GetSize ());
593 
594  // Send the X2 message through the socket
595  localSocket->SendTo (packet, 0, InetSocketAddress (remoteIpAddr, m_x2cUdpPort));
596 }
597 
598 
599 void
601 {
602  NS_LOG_FUNCTION (this);
603 
604  NS_LOG_LOGIC ("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
605  NS_LOG_LOGIC ("newEnbUeX2apId = " << params.newEnbUeX2apId);
606  NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId);
607 
609  "Socket infos not defined for sourceCellId = " << params.sourceCellId);
610 
611  Ptr<Socket> localSocket = m_x2InterfaceSockets [params.sourceCellId]->m_localCtrlPlaneSocket;
612  Ipv4Address remoteIpAddr = m_x2InterfaceSockets [params.sourceCellId]->m_remoteIpAddr;
613 
614  NS_LOG_LOGIC ("localSocket = " << localSocket);
615  NS_LOG_LOGIC ("remoteIpAddr = " << remoteIpAddr);
616 
617  NS_LOG_INFO ("Send X2 message: UE CONTEXT RELEASE");
618 
619  // Build the X2 message
620  EpcX2UeContextReleaseHeader x2UeCtxReleaseHeader;
621  x2UeCtxReleaseHeader.SetOldEnbUeX2apId (params.oldEnbUeX2apId);
622  x2UeCtxReleaseHeader.SetNewEnbUeX2apId (params.newEnbUeX2apId);
623 
624  EpcX2Header x2Header;
627  x2Header.SetLengthOfIes (x2UeCtxReleaseHeader.GetLengthOfIes ());
628  x2Header.SetNumberOfIes (x2UeCtxReleaseHeader.GetNumberOfIes ());
629 
630  NS_LOG_INFO ("X2 header: " << x2Header);
631  NS_LOG_INFO ("X2 UeContextRelease header: " << x2UeCtxReleaseHeader);
632 
633  // Build the X2 packet
634  Ptr<Packet> packet = Create <Packet> ();
635  packet->AddHeader (x2UeCtxReleaseHeader);
636  packet->AddHeader (x2Header);
637  NS_LOG_INFO ("packetLen = " << packet->GetSize ());
638 
639  // Send the X2 message through the socket
640  localSocket->SendTo (packet, 0, InetSocketAddress (remoteIpAddr, m_x2cUdpPort));
641 }
642 
643 
644 void
646 {
647  NS_LOG_FUNCTION (this);
648 
649  NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
650  NS_LOG_LOGIC ("cellInformationList size = " << params.cellInformationList.size ());
651 
653  "Missing infos for targetCellId = " << params.targetCellId);
654  Ptr<X2IfaceInfo> socketInfo = m_x2InterfaceSockets [params.targetCellId];
655  Ptr<Socket> sourceSocket = socketInfo->m_localCtrlPlaneSocket;
656  Ipv4Address targetIpAddr = socketInfo->m_remoteIpAddr;
657 
658  NS_LOG_LOGIC ("sourceSocket = " << sourceSocket);
659  NS_LOG_LOGIC ("targetIpAddr = " << targetIpAddr);
660 
661  NS_LOG_INFO ("Send X2 message: LOAD INFORMATION");
662 
663  // Build the X2 message
664  EpcX2LoadInformationHeader x2LoadInfoHeader;
665  x2LoadInfoHeader.SetCellInformationList (params.cellInformationList);
666 
667  EpcX2Header x2Header;
670  x2Header.SetLengthOfIes (x2LoadInfoHeader.GetLengthOfIes ());
671  x2Header.SetNumberOfIes (x2LoadInfoHeader.GetNumberOfIes ());
672 
673  NS_LOG_INFO ("X2 header: " << x2Header);
674  NS_LOG_INFO ("X2 LoadInformation header: " << x2LoadInfoHeader);
675 
676  // Build the X2 packet
677  Ptr<Packet> packet = Create <Packet> ();
678  packet->AddHeader (x2LoadInfoHeader);
679  packet->AddHeader (x2Header);
680  NS_LOG_INFO ("packetLen = " << packet->GetSize ());
681 
682  // Send the X2 message through the socket
683  sourceSocket->SendTo (packet, 0, InetSocketAddress (targetIpAddr, m_x2cUdpPort));
684 
685 }
686 
687 
688 void
690 {
691  NS_LOG_FUNCTION (this);
692 
693  NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
694  NS_LOG_LOGIC ("enb1MeasurementId = " << params.enb1MeasurementId);
695  NS_LOG_LOGIC ("enb2MeasurementId = " << params.enb2MeasurementId);
696  NS_LOG_LOGIC ("cellMeasurementResultList size = " << params.cellMeasurementResultList.size ());
697 
699  "Missing infos for targetCellId = " << params.targetCellId);
700  Ptr<X2IfaceInfo> socketInfo = m_x2InterfaceSockets [params.targetCellId];
701  Ptr<Socket> sourceSocket = socketInfo->m_localCtrlPlaneSocket;
702  Ipv4Address targetIpAddr = socketInfo->m_remoteIpAddr;
703 
704  NS_LOG_LOGIC ("sourceSocket = " << sourceSocket);
705  NS_LOG_LOGIC ("targetIpAddr = " << targetIpAddr);
706 
707  NS_LOG_INFO ("Send X2 message: RESOURCE STATUS UPDATE");
708 
709  // Build the X2 message
710  EpcX2ResourceStatusUpdateHeader x2ResourceStatUpdHeader;
711  x2ResourceStatUpdHeader.SetEnb1MeasurementId (params.enb1MeasurementId);
712  x2ResourceStatUpdHeader.SetEnb2MeasurementId (params.enb2MeasurementId);
713  x2ResourceStatUpdHeader.SetCellMeasurementResultList (params.cellMeasurementResultList);
714 
715  EpcX2Header x2Header;
718  x2Header.SetLengthOfIes (x2ResourceStatUpdHeader.GetLengthOfIes ());
719  x2Header.SetNumberOfIes (x2ResourceStatUpdHeader.GetNumberOfIes ());
720 
721  NS_LOG_INFO ("X2 header: " << x2Header);
722  NS_LOG_INFO ("X2 ResourceStatusUpdate header: " << x2ResourceStatUpdHeader);
723 
724  // Build the X2 packet
725  Ptr<Packet> packet = Create <Packet> ();
726  packet->AddHeader (x2ResourceStatUpdHeader);
727  packet->AddHeader (x2Header);
728  NS_LOG_INFO ("packetLen = " << packet->GetSize ());
729 
730  // Send the X2 message through the socket
731  sourceSocket->SendTo (packet, 0, InetSocketAddress (targetIpAddr, m_x2cUdpPort));
732 
733 }
734 
735 
736 void
738 {
739  NS_LOG_FUNCTION (this);
740 
741  NS_LOG_LOGIC ("sourceCellId = " << params.sourceCellId);
742  NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
743  NS_LOG_LOGIC ("gtpTeid = " << params.gtpTeid);
744 
746  "Missing infos for targetCellId = " << params.targetCellId);
747  Ptr<X2IfaceInfo> socketInfo = m_x2InterfaceSockets [params.targetCellId];
748  Ptr<Socket> sourceSocket = socketInfo->m_localUserPlaneSocket;
749  Ipv4Address targetIpAddr = socketInfo->m_remoteIpAddr;
750 
751  NS_LOG_LOGIC ("sourceSocket = " << sourceSocket);
752  NS_LOG_LOGIC ("targetIpAddr = " << targetIpAddr);
753 
754  GtpuHeader gtpu;
755  gtpu.SetTeid (params.gtpTeid);
756  gtpu.SetLength (params.ueData->GetSize () + gtpu.GetSerializedSize () - 8);
757  NS_LOG_INFO ("GTP-U header: " << gtpu);
758 
759  Ptr<Packet> packet = params.ueData;
760  packet->AddHeader (gtpu);
761 
762  NS_LOG_INFO ("Forward UE DATA through X2 interface");
763  sourceSocket->SendTo (packet, 0, InetSocketAddress (targetIpAddr, m_x2uUdpPort));
764 }
765 
766 } // namespace ns3
EpcX2HandoverPreparationFailureHeader.
void SetCriticalityDiagnostics(uint16_t criticalityDiagnostics)
Set criticality diagnostics function.
void SetCause(uint16_t cause)
Set cause function.
uint16_t GetOldEnbUeX2apId() const
Get old ENB UE X2 AP ID function.
uint16_t GetCause() const
Get cause function.
uint32_t GetLengthOfIes() const
Get length of IEs function.
uint16_t GetCriticalityDiagnostics() const
Get criticality diagnostics function.
void SetOldEnbUeX2apId(uint16_t x2apId)
Set old ENB UE X2 AP ID function.
uint32_t GetNumberOfIes() const
Get number of IEs function.
EpcX2HandoverRequestAckHeader.
uint16_t GetNewEnbUeX2apId() const
Get new ENB UE X2 AP ID function.
uint32_t GetLengthOfIes() const
Get length of IEs function.
std::vector< EpcX2Sap::ErabNotAdmittedItem > GetNotAdmittedBearers() const
Get not admitted bearers function.
uint16_t GetOldEnbUeX2apId() const
Get old ENB UE X2 AP ID function.
std::vector< EpcX2Sap::ErabAdmittedItem > GetAdmittedBearers() const
Get admittied bearers function.
void SetNotAdmittedBearers(std::vector< EpcX2Sap::ErabNotAdmittedItem > bearers)
Set not admitted bearers function.
void SetNewEnbUeX2apId(uint16_t x2apId)
Set new ENB UE X2 AP ID function.
void SetOldEnbUeX2apId(uint16_t x2apId)
Set old ENB UE X2 AP ID function.
uint32_t GetNumberOfIes() const
Get number of IEs function.
void SetAdmittedBearers(std::vector< EpcX2Sap::ErabAdmittedItem > bearers)
Set admitted bearers function.
EpcX2HandoverRequestHeader.
uint16_t GetCause() const
Get cause function.
void SetCause(uint16_t cause)
Set cause function.
void SetMmeUeS1apId(uint32_t mmeUeS1apId)
Set MME UE S1 AP ID function.
uint32_t GetMmeUeS1apId() const
Get MME UE S1 AP ID function.
void SetTargetCellId(uint16_t targetCellId)
Set target cell id function.
void SetUeAggregateMaxBitRateUplink(uint64_t bitRate)
Set UE Aggregrate Max Bit Rate Uplik function.
uint64_t GetUeAggregateMaxBitRateUplink() const
Get UE Aggregrate Max Bit Rate Uplik function.
uint16_t GetTargetCellId() const
Get target cell id function.
void SetBearers(std::vector< EpcX2Sap::ErabToBeSetupItem > bearers)
Set bearers function.
uint64_t GetUeAggregateMaxBitRateDownlink() const
Get UE Aggregate Max Bit Rate Downlink function.
void SetUeAggregateMaxBitRateDownlink(uint64_t bitRate)
Set UE Aggregrate Max Bit Rate Downlink function.
void SetOldEnbUeX2apId(uint16_t x2apId)
Set old ENB X2 AP ID function.
uint32_t GetNumberOfIes() const
Get number of IEs.
uint16_t GetOldEnbUeX2apId() const
Get old ENB X2 AP ID function.
uint32_t GetLengthOfIes() const
Get length of IEs.
std::vector< EpcX2Sap::ErabToBeSetupItem > GetBearers() const
Get bearers function.
Introspection did not find any typical Config paths.
Definition: epc-x2-header.h:34
void SetLengthOfIes(uint32_t lengthOfIes)
Set length of IEs function.
void SetProcedureCode(uint8_t procedureCode)
Set procedure code function.
uint8_t GetProcedureCode() const
Get procedure code function.
void SetNumberOfIes(uint32_t numberOfIes)
Set number of IEs function.
uint8_t GetMessageType() const
Get message type function.
void SetMessageType(uint8_t messageType)
Set message type function.
This entity is installed inside an eNB and provides the functionality for the X2 interface.
Definition: epc-x2.h:100
std::map< uint16_t, Ptr< X2IfaceInfo > > m_x2InterfaceSockets
Map the targetCellId to the corresponding (sourceSocket, remoteIpAddr) to be used to send the X2 mess...
Definition: epc-x2.h:216
EpcX2SapUser * m_x2SapUser
X2 SAP user.
Definition: epc-x2.h:206
virtual void DoSendHandoverRequestAck(EpcX2SapProvider::HandoverRequestAckParams params)
Send handover request ack function.
Definition: epc-x2.cc:455
EpcX2SapProvider * m_x2SapProvider
X2 SAP provider.
Definition: epc-x2.h:207
virtual void DoSendUeContextRelease(EpcX2SapProvider::UeContextReleaseParams params)
Send UE context release function.
Definition: epc-x2.cc:600
virtual ~EpcX2(void)
Destructor.
Definition: epc-x2.cc:91
void AddX2Interface(uint16_t enb1CellId, Ipv4Address enb1X2Address, std::vector< uint16_t > enb2CellIds, Ipv4Address enb2X2Address)
Add an X2 interface to this EPC X2 entity.
Definition: epc-x2.cc:131
static TypeId GetTypeId(void)
Get the type ID.
Definition: epc-x2.cc:107
virtual void DoSendResourceStatusUpdate(EpcX2SapProvider::ResourceStatusUpdateParams params)
Send resource status update function.
Definition: epc-x2.cc:689
friend class EpcX2SpecificEpcX2SapProvider< EpcX2 >
allow EpcX2SpecificEpcX2SapProvider<EpcX2> class friend access
Definition: epc-x2.h:102
virtual void DoSendHandoverPreparationFailure(EpcX2SapProvider::HandoverPreparationFailureParams params)
Send handover preparation failure function.
Definition: epc-x2.cc:504
void RecvFromX2cSocket(Ptr< Socket > socket)
Method to be assigned to the recv callback of the X2-C (X2 Control Plane) socket.
Definition: epc-x2.cc:174
virtual void DoSendHandoverRequest(EpcX2SapProvider::HandoverRequestParams params)
Send handover request function.
Definition: epc-x2.cc:404
virtual void DoSendUeData(EpcX2SapProvider::UeDataParams params)
Send UE data function.
Definition: epc-x2.cc:737
EpcX2SapProvider * GetEpcX2SapProvider()
Definition: epc-x2.cc:123
uint16_t m_x2uUdpPort
UDP ports to be used for the X2-U interface.
Definition: epc-x2.h:231
uint16_t m_x2cUdpPort
UDP ports to be used for the X2-C interface.
Definition: epc-x2.h:227
virtual void DoSendLoadInformation(EpcX2SapProvider::LoadInformationParams params)
Send load information function.
Definition: epc-x2.cc:645
EpcX2()
Constructor.
Definition: epc-x2.cc:82
std::map< Ptr< Socket >, Ptr< X2CellInfo > > m_x2InterfaceCellIds
Map the localSocket (the one receiving the X2 message) to the corresponding (sourceCellId,...
Definition: epc-x2.h:222
virtual void DoDispose(void)
Destructor implementation.
Definition: epc-x2.cc:97
virtual void DoSendSnStatusTransfer(EpcX2SapProvider::SnStatusTransferParams params)
Send SN status transfer function.
Definition: epc-x2.cc:552
void SetEpcX2SapUser(EpcX2SapUser *s)
Definition: epc-x2.cc:116
void RecvFromX2uSocket(Ptr< Socket > socket)
Method to be assigned to the recv callback of the X2-U (X2 User Plane) socket.
Definition: epc-x2.cc:373
EpcX2LoadInformationHeader.
std::vector< EpcX2Sap::CellInformationItem > GetCellInformationList() const
Get cell information list function.
uint32_t GetNumberOfIes() const
Get number of IEs function.
void SetCellInformationList(std::vector< EpcX2Sap::CellInformationItem > cellInformationList)
Set cell information list function.
uint32_t GetLengthOfIes() const
Get length of IEs function.
EpcX2ResourceStatusUpdateHeader.
void SetEnb2MeasurementId(uint16_t enb2MeasurementId)
Set ENB2 measurement ID function.
void SetEnb1MeasurementId(uint16_t enb1MeasurementId)
Set ENB1 measurement ID function.
uint32_t GetLengthOfIes() const
Get length of IEs function.
uint32_t GetNumberOfIes() const
Get number of IEs function.
uint16_t GetEnb2MeasurementId() const
Get ENB2 measurement ID function.
std::vector< EpcX2Sap::CellMeasurementResultItem > GetCellMeasurementResultList() const
Get cell measurement results list function.
void SetCellMeasurementResultList(std::vector< EpcX2Sap::CellMeasurementResultItem > cellMeasurementResultList)
Set cell measurement results list function.
uint16_t GetEnb1MeasurementId() const
Get ENB1 measurement ID function.
These service primitives of this part of the X2 SAP are provided by the X2 entity and issued by RRC e...
Definition: epc-x2-sap.h:344
These service primitives of this part of the X2 SAP are provided by the RRC entity and issued by the ...
Definition: epc-x2-sap.h:407
virtual void RecvUeData(UeDataParams params)=0
Receive UE data function.
virtual void RecvUeContextRelease(UeContextReleaseParams params)=0
Receive UE context release function.
virtual void RecvSnStatusTransfer(SnStatusTransferParams params)=0
Receive SN status transfer function.
virtual void RecvLoadInformation(LoadInformationParams params)=0
Receive load information function.
virtual void RecvHandoverRequestAck(HandoverRequestAckParams params)=0
Receive handover request ack function.
virtual void RecvResourceStatusUpdate(ResourceStatusUpdateParams params)=0
Receive resource status update function.
virtual void RecvHandoverPreparationFailure(HandoverPreparationFailureParams params)=0
Receive handover preparation failure function.
virtual void RecvHandoverRequest(HandoverRequestParams params)=0
Receive handover request function.
EpcX2SnStatusTransferHeader.
uint16_t GetOldEnbUeX2apId() const
Get old ENB UE X2 AP ID function.
uint16_t GetNewEnbUeX2apId() const
Get new ENB UE X2 AP ID function.
uint32_t GetNumberOfIes() const
Get number of IEs function.
void SetErabsSubjectToStatusTransferList(std::vector< EpcX2Sap::ErabsSubjectToStatusTransferItem > erabs)
Set ERABs subject to status transfer list function.
std::vector< EpcX2Sap::ErabsSubjectToStatusTransferItem > GetErabsSubjectToStatusTransferList() const
Get ERABs subject to status transfer list function.
void SetNewEnbUeX2apId(uint16_t x2apId)
Set new ENB UE X2 AP ID function.
void SetOldEnbUeX2apId(uint16_t x2apId)
Set old ENB UE X2 AP ID function.
uint32_t GetLengthOfIes() const
Get length of IEs function.
EpcX2UeContextReleaseHeader.
void SetNewEnbUeX2apId(uint16_t x2apId)
Set new ENB UE X2 AP ID function.
uint16_t GetNewEnbUeX2apId() const
Get new ENB UE X2 AP ID function.
void SetOldEnbUeX2apId(uint16_t x2apId)
Set old ENB UE X2 AP ID function.
uint32_t GetLengthOfIes() const
Get length of IEs function.
uint16_t GetOldEnbUeX2apId() const
Get old ENB UE X2 AP ID function.
uint32_t GetNumberOfIes() const
Set length of IEs function.
Implementation of the GPRS Tunnelling Protocol header according to GTPv1-U Release 10 as per 3Gpp TS ...
void SetTeid(uint32_t teid)
Set TEID function.
virtual uint32_t GetSerializedSize(void) const
uint32_t GetTeid() const
Get a tunnel endpoint identificator (TEID)
void SetLength(uint16_t length)
Set the length in octets of the payload.
an Inet address class
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:41
A base class which provides memory management and object aggregation.
Definition: object.h:88
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:280
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:256
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:856
virtual Ptr< Packet > Recv(uint32_t maxSize, uint32_t flags)=0
Read data from the socket.
void SetRecvCallback(Callback< void, Ptr< Socket > > receivedData)
Notify application when new data is available to be read.
Definition: socket.cc:128
static Ptr< Socket > CreateSocket(Ptr< Node > node, TypeId tid)
This method wraps the creation of sockets that is performed on a given node by a SocketFactory specif...
Definition: socket.cc:71
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer.
a unique identifier for an interface.
Definition: type-id.h:59
static TypeId LookupByName(std::string name)
Get a TypeId by name.
Definition: type-id.cc:829
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
X2CellInfo.
Definition: epc-x2.h:70
virtual ~X2CellInfo(void)
Definition: epc-x2.cc:65
X2CellInfo & operator=(const X2CellInfo &value)
Assignment operator.
Definition: epc-x2.cc:70
std::vector< uint16_t > m_remoteCellIds
remote cell IDs
Definition: epc-x2.h:90
X2CellInfo(std::vector< uint16_t > localCellIds, std::vector< uint16_t > remoteCellIds)
Constructor.
Definition: epc-x2.cc:59
std::vector< uint16_t > m_localCellIds
local cell IDs
Definition: epc-x2.h:89
X2IfaceInfo.
Definition: epc-x2.h:40
Ptr< Socket > m_localCtrlPlaneSocket
local control plane socket
Definition: epc-x2.h:61
Ipv4Address m_remoteIpAddr
remote IP address
Definition: epc-x2.h:60
X2IfaceInfo & operator=(const X2IfaceInfo &value)
Assignment operator.
Definition: epc-x2.cc:48
virtual ~X2IfaceInfo(void)
Definition: epc-x2.cc:41
X2IfaceInfo(Ipv4Address remoteIpAddr, Ptr< Socket > localCtrlPlaneSocket, Ptr< Socket > localUserPlaneSocket)
Constructor.
Definition: epc-x2.cc:34
Ptr< Socket > m_localUserPlaneSocket
local user plane socket
Definition: epc-x2.h:62
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:88
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:289
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1648
Parameters of the HANDOVER PREPARATION FAILURE message.
Definition: epc-x2-sap.h:263
uint16_t criticalityDiagnostics
criticality diagnostics
Definition: epc-x2-sap.h:268
uint16_t oldEnbUeX2apId
old ENB UE X2 AP ID
Definition: epc-x2-sap.h:264
Parameters of the HANDOVER REQUEST ACKNOWLEDGE message.
Definition: epc-x2-sap.h:247
std::vector< ErabNotAdmittedItem > notAdmittedBearers
not admitted bearers
Definition: epc-x2-sap.h:253
std::vector< ErabAdmittedItem > admittedBearers
admitted bearers
Definition: epc-x2-sap.h:252
uint16_t sourceCellId
source cell ID
Definition: epc-x2-sap.h:250
uint16_t newEnbUeX2apId
new ENB UE X2 AP ID
Definition: epc-x2-sap.h:249
uint16_t targetCellId
target cell ID
Definition: epc-x2-sap.h:251
uint16_t oldEnbUeX2apId
old ENB UE X2 AP ID
Definition: epc-x2-sap.h:248
Ptr< Packet > rrcContext
RRC context.
Definition: epc-x2-sap.h:254
Parameters of the HANDOVER REQUEST message.
Definition: epc-x2-sap.h:229
uint16_t oldEnbUeX2apId
old ENB UE X2 AP ID
Definition: epc-x2-sap.h:230
uint64_t ueAggregateMaxBitRateDownlink
UE aggregrate max bit rate downlink.
Definition: epc-x2-sap.h:235
uint16_t sourceCellId
source cell ID
Definition: epc-x2-sap.h:232
uint64_t ueAggregateMaxBitRateUplink
UE aggregrate max bit rate uplink.
Definition: epc-x2-sap.h:236
uint16_t targetCellId
target cell ID
Definition: epc-x2-sap.h:233
Ptr< Packet > rrcContext
RRC context.
Definition: epc-x2-sap.h:238
uint32_t mmeUeS1apId
MME UE S1 AP ID.
Definition: epc-x2-sap.h:234
std::vector< ErabToBeSetupItem > bearers
bearers
Definition: epc-x2-sap.h:237
Parameters of the LOAD INFORMATION message.
Definition: epc-x2-sap.h:304
std::vector< CellInformationItem > cellInformationList
cell information list
Definition: epc-x2-sap.h:306
uint16_t targetCellId
target cell ID
Definition: epc-x2-sap.h:305
Parameters of the RESOURCE STATUS UPDATE message.
Definition: epc-x2-sap.h:315
uint16_t enb2MeasurementId
ENB2 measurement ID.
Definition: epc-x2-sap.h:318
uint16_t enb1MeasurementId
ENB1 measurement ID.
Definition: epc-x2-sap.h:317
std::vector< CellMeasurementResultItem > cellMeasurementResultList
cell measurement result list
Definition: epc-x2-sap.h:319
Parameters of the SN STATUS TRANSFER message.
Definition: epc-x2-sap.h:277
uint16_t newEnbUeX2apId
new ENB UE X2 AP ID
Definition: epc-x2-sap.h:279
std::vector< ErabsSubjectToStatusTransferItem > erabsSubjectToStatusTransferList
ERABs subject to status transfer list.
Definition: epc-x2-sap.h:282
uint16_t oldEnbUeX2apId
old ENB UE X2 AP ID
Definition: epc-x2-sap.h:278
uint16_t targetCellId
target cell ID
Definition: epc-x2-sap.h:281
uint16_t sourceCellId
source cell ID
Definition: epc-x2-sap.h:280
Parameters of the UE CONTEXT RELEASE message.
Definition: epc-x2-sap.h:291
uint16_t newEnbUeX2apId
new ENB UE X2 AP ID
Definition: epc-x2-sap.h:293
uint16_t oldEnbUeX2apId
old ENB UE X2 AP ID
Definition: epc-x2-sap.h:292
uint16_t sourceCellId
source cell ID
Definition: epc-x2-sap.h:294
Parameters of the UE DATA primitive.
Definition: epc-x2-sap.h:329
Ptr< Packet > ueData
UE data.
Definition: epc-x2-sap.h:333
uint16_t sourceCellId
source cell ID
Definition: epc-x2-sap.h:330
uint32_t gtpTeid
GTP TEID.
Definition: epc-x2-sap.h:332
uint16_t targetCellId
target cell ID
Definition: epc-x2-sap.h:331