A Discrete-Event Network Simulator
API
epc-x2.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Author: Manuel Requena <manuel.requena@cttc.es>
18  */
19 
20 #include "ns3/epc-x2.h"
21 
22 #include "ns3/epc-gtpu-header.h"
23 #include "ns3/epc-x2-header.h"
24 #include "ns3/inet-socket-address.h"
25 #include "ns3/log.h"
26 #include "ns3/node.h"
27 #include "ns3/packet.h"
28 
29 namespace ns3
30 {
31 
33 
35  Ptr<Socket> localCtrlPlaneSocket,
36  Ptr<Socket> localUserPlaneSocket)
37 {
38  m_remoteIpAddr = remoteIpAddr;
39  m_localCtrlPlaneSocket = localCtrlPlaneSocket;
40  m_localUserPlaneSocket = localUserPlaneSocket;
41 }
42 
44 {
45  m_localCtrlPlaneSocket = nullptr;
46  m_localUserPlaneSocket = nullptr;
47 }
48 
51 {
52  NS_LOG_FUNCTION(this);
53  m_remoteIpAddr = value.m_remoteIpAddr;
54  m_localCtrlPlaneSocket = value.m_localCtrlPlaneSocket;
55  m_localUserPlaneSocket = value.m_localUserPlaneSocket;
56  return *this;
57 }
58 
60 
61 X2CellInfo::X2CellInfo(std::vector<uint16_t> localCellIds, std::vector<uint16_t> remoteCellIds)
62  : m_localCellIds{localCellIds},
63  m_remoteCellIds{remoteCellIds}
64 {
65 }
66 
68 {
69 }
70 
73 {
74  NS_LOG_FUNCTION(this);
75  m_localCellIds = value.m_localCellIds;
76  m_remoteCellIds = value.m_remoteCellIds;
77  return *this;
78 }
79 
81 
83 
85  : m_x2cUdpPort(4444),
86  m_x2uUdpPort(2152)
87 {
88  NS_LOG_FUNCTION(this);
89 
91 }
92 
94 {
95  NS_LOG_FUNCTION(this);
96 }
97 
98 void
100 {
101  NS_LOG_FUNCTION(this);
102 
103  m_x2InterfaceSockets.clear();
104  m_x2InterfaceCellIds.clear();
105  delete m_x2SapProvider;
106 }
107 
108 TypeId
110 {
111  static TypeId tid = TypeId("ns3::EpcX2").SetParent<Object>().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 void
130 EpcX2::AddX2Interface(uint16_t localCellId,
131  Ipv4Address localX2Address,
132  std::vector<uint16_t> remoteCellIds,
133  Ipv4Address remoteX2Address)
134 {
135  uint16_t remoteCellId = remoteCellIds.at(0);
136  NS_LOG_FUNCTION(this << localCellId << localX2Address << remoteCellId << remoteX2Address);
137 
138  int retval;
139 
140  // Get local eNB where this X2 entity belongs to
141  Ptr<Node> localEnb = GetObject<Node>();
142 
143  // Create X2-C socket for the local eNB
144  Ptr<Socket> localX2cSocket =
145  Socket::CreateSocket(localEnb, TypeId::LookupByName("ns3::UdpSocketFactory"));
146  retval = localX2cSocket->Bind(InetSocketAddress(localX2Address, m_x2cUdpPort));
147  NS_ASSERT(retval == 0);
148  localX2cSocket->SetRecvCallback(MakeCallback(&EpcX2::RecvFromX2cSocket, this));
149 
150  // Create X2-U socket for the local eNB
151  Ptr<Socket> localX2uSocket =
152  Socket::CreateSocket(localEnb, TypeId::LookupByName("ns3::UdpSocketFactory"));
153  retval = localX2uSocket->Bind(InetSocketAddress(localX2Address, m_x2uUdpPort));
154  NS_ASSERT(retval == 0);
155  localX2uSocket->SetRecvCallback(MakeCallback(&EpcX2::RecvFromX2uSocket, this));
156 
157  std::vector<uint16_t> localCellIds;
158  localCellIds.push_back(localCellId);
159 
160  NS_ASSERT_MSG(m_x2InterfaceSockets.find(remoteCellId) == m_x2InterfaceSockets.end(),
161  "Mapping for remoteCellId = " << remoteCellId << " is already known");
162  for (uint16_t remoteCellId : remoteCellIds)
163  {
164  m_x2InterfaceSockets[remoteCellId] =
165  Create<X2IfaceInfo>(remoteX2Address, localX2cSocket, localX2uSocket);
166  }
167 
168  NS_ASSERT_MSG(m_x2InterfaceCellIds.find(localX2cSocket) == m_x2InterfaceCellIds.end(),
169  "Mapping for control plane localSocket = " << localX2cSocket
170  << " is already known");
171  m_x2InterfaceCellIds[localX2cSocket] = Create<X2CellInfo>(localCellIds, remoteCellIds);
172 
173  NS_ASSERT_MSG(m_x2InterfaceCellIds.find(localX2uSocket) == m_x2InterfaceCellIds.end(),
174  "Mapping for data plane localSocket = " << localX2uSocket << " is already known");
175  m_x2InterfaceCellIds[localX2uSocket] = Create<X2CellInfo>(localCellIds, remoteCellIds);
176 }
177 
178 void
180 {
181  NS_LOG_FUNCTION(this << socket);
182 
183  NS_LOG_LOGIC("Recv X2 message: from Socket");
184  Ptr<Packet> packet = socket->Recv();
185  NS_LOG_LOGIC("packetLen = " << packet->GetSize());
186 
188  "Missing infos of local and remote CellId");
189  Ptr<X2CellInfo> cellsInfo = m_x2InterfaceCellIds[socket];
190 
191  EpcX2Header x2Header;
192  packet->RemoveHeader(x2Header);
193 
194  NS_LOG_LOGIC("X2 header: " << x2Header);
195 
196  uint8_t messageType = x2Header.GetMessageType();
197  uint8_t procedureCode = x2Header.GetProcedureCode();
198 
199  if (procedureCode == EpcX2Header::HandoverPreparation)
200  {
201  if (messageType == EpcX2Header::InitiatingMessage)
202  {
203  NS_LOG_LOGIC("Recv X2 message: HANDOVER REQUEST");
204 
205  EpcX2HandoverRequestHeader x2HoReqHeader;
206  packet->RemoveHeader(x2HoReqHeader);
207 
208  NS_LOG_INFO("X2 HandoverRequest header: " << x2HoReqHeader);
209 
211  params.oldEnbUeX2apId = x2HoReqHeader.GetOldEnbUeX2apId();
212  params.cause = x2HoReqHeader.GetCause();
213  params.sourceCellId = cellsInfo->m_remoteCellIds.at(0);
214  params.targetCellId = x2HoReqHeader.GetTargetCellId();
215  params.mmeUeS1apId = x2HoReqHeader.GetMmeUeS1apId();
216  params.ueAggregateMaxBitRateDownlink = x2HoReqHeader.GetUeAggregateMaxBitRateDownlink();
217  params.ueAggregateMaxBitRateUplink = x2HoReqHeader.GetUeAggregateMaxBitRateUplink();
218  params.bearers = x2HoReqHeader.GetBearers();
219  params.rrcContext = packet;
220 
221  NS_LOG_LOGIC("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
222  NS_LOG_LOGIC("sourceCellId = " << params.sourceCellId);
223  NS_LOG_LOGIC("targetCellId = " << params.targetCellId);
224  NS_LOG_LOGIC("mmeUeS1apId = " << params.mmeUeS1apId);
225  NS_LOG_LOGIC("cellsInfo->m_localCellId = " << cellsInfo->m_localCellIds.at(0));
226 
228  }
229  else if (messageType == EpcX2Header::SuccessfulOutcome)
230  {
231  NS_LOG_LOGIC("Recv X2 message: HANDOVER REQUEST ACK");
232 
233  EpcX2HandoverRequestAckHeader x2HoReqAckHeader;
234  packet->RemoveHeader(x2HoReqAckHeader);
235 
236  NS_LOG_INFO("X2 HandoverRequestAck header: " << x2HoReqAckHeader);
237 
239  params.oldEnbUeX2apId = x2HoReqAckHeader.GetOldEnbUeX2apId();
240  params.newEnbUeX2apId = x2HoReqAckHeader.GetNewEnbUeX2apId();
241  params.sourceCellId = cellsInfo->m_localCellIds.at(0);
242  params.targetCellId = cellsInfo->m_remoteCellIds.at(0);
243  params.admittedBearers = x2HoReqAckHeader.GetAdmittedBearers();
244  params.notAdmittedBearers = x2HoReqAckHeader.GetNotAdmittedBearers();
245  params.rrcContext = packet;
246 
247  NS_LOG_LOGIC("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
248  NS_LOG_LOGIC("newEnbUeX2apId = " << params.newEnbUeX2apId);
249  NS_LOG_LOGIC("sourceCellId = " << params.sourceCellId);
250  NS_LOG_LOGIC("targetCellId = " << params.targetCellId);
251 
253  }
254  else // messageType == EpcX2Header::UnsuccessfulOutcome
255  {
256  NS_LOG_LOGIC("Recv X2 message: HANDOVER PREPARATION FAILURE");
257 
258  EpcX2HandoverPreparationFailureHeader x2HoPrepFailHeader;
259  packet->RemoveHeader(x2HoPrepFailHeader);
260 
261  NS_LOG_INFO("X2 HandoverPreparationFailure header: " << x2HoPrepFailHeader);
262 
264  params.oldEnbUeX2apId = x2HoPrepFailHeader.GetOldEnbUeX2apId();
265  params.sourceCellId = cellsInfo->m_localCellIds.at(0);
266  params.targetCellId = cellsInfo->m_remoteCellIds.at(0);
267  params.cause = x2HoPrepFailHeader.GetCause();
268  params.criticalityDiagnostics = x2HoPrepFailHeader.GetCriticalityDiagnostics();
269 
270  NS_LOG_LOGIC("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
271  NS_LOG_LOGIC("sourceCellId = " << params.sourceCellId);
272  NS_LOG_LOGIC("targetCellId = " << params.targetCellId);
273  NS_LOG_LOGIC("cause = " << params.cause);
274  NS_LOG_LOGIC("criticalityDiagnostics = " << params.criticalityDiagnostics);
275 
277  }
278  }
279  else if (procedureCode == EpcX2Header::LoadIndication)
280  {
281  if (messageType == EpcX2Header::InitiatingMessage)
282  {
283  NS_LOG_LOGIC("Recv X2 message: LOAD INFORMATION");
284 
285  EpcX2LoadInformationHeader x2LoadInfoHeader;
286  packet->RemoveHeader(x2LoadInfoHeader);
287 
288  NS_LOG_INFO("X2 LoadInformation header: " << x2LoadInfoHeader);
289 
291  params.cellInformationList = x2LoadInfoHeader.GetCellInformationList();
292 
293  NS_LOG_LOGIC("cellInformationList size = " << params.cellInformationList.size());
294 
296  }
297  }
298  else if (procedureCode == EpcX2Header::SnStatusTransfer)
299  {
300  if (messageType == EpcX2Header::InitiatingMessage)
301  {
302  NS_LOG_LOGIC("Recv X2 message: SN STATUS TRANSFER");
303 
304  EpcX2SnStatusTransferHeader x2SnStatusXferHeader;
305  packet->RemoveHeader(x2SnStatusXferHeader);
306 
307  NS_LOG_INFO("X2 SnStatusTransfer header: " << x2SnStatusXferHeader);
308 
310  params.oldEnbUeX2apId = x2SnStatusXferHeader.GetOldEnbUeX2apId();
311  params.newEnbUeX2apId = x2SnStatusXferHeader.GetNewEnbUeX2apId();
312  params.sourceCellId = cellsInfo->m_remoteCellIds.at(0);
313  params.targetCellId = cellsInfo->m_localCellIds.at(0);
314  params.erabsSubjectToStatusTransferList =
315  x2SnStatusXferHeader.GetErabsSubjectToStatusTransferList();
316 
317  NS_LOG_LOGIC("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
318  NS_LOG_LOGIC("newEnbUeX2apId = " << params.newEnbUeX2apId);
319  NS_LOG_LOGIC("sourceCellId = " << params.sourceCellId);
320  NS_LOG_LOGIC("targetCellId = " << params.targetCellId);
321  NS_LOG_LOGIC("erabsList size = " << params.erabsSubjectToStatusTransferList.size());
322 
324  }
325  }
326  else if (procedureCode == EpcX2Header::UeContextRelease)
327  {
328  if (messageType == EpcX2Header::InitiatingMessage)
329  {
330  NS_LOG_LOGIC("Recv X2 message: UE CONTEXT RELEASE");
331 
332  EpcX2UeContextReleaseHeader x2UeCtxReleaseHeader;
333  packet->RemoveHeader(x2UeCtxReleaseHeader);
334 
335  NS_LOG_INFO("X2 UeContextRelease header: " << x2UeCtxReleaseHeader);
336 
338  params.oldEnbUeX2apId = x2UeCtxReleaseHeader.GetOldEnbUeX2apId();
339  params.newEnbUeX2apId = x2UeCtxReleaseHeader.GetNewEnbUeX2apId();
340 
341  NS_LOG_LOGIC("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
342  NS_LOG_LOGIC("newEnbUeX2apId = " << params.newEnbUeX2apId);
343 
345  }
346  }
347  else if (procedureCode == EpcX2Header::ResourceStatusReporting)
348  {
349  if (messageType == EpcX2Header::InitiatingMessage)
350  {
351  NS_LOG_LOGIC("Recv X2 message: RESOURCE STATUS UPDATE");
352 
353  EpcX2ResourceStatusUpdateHeader x2ResStatUpdHeader;
354  packet->RemoveHeader(x2ResStatUpdHeader);
355 
356  NS_LOG_INFO("X2 ResourceStatusUpdate header: " << x2ResStatUpdHeader);
357 
359  params.targetCellId = 0;
360  params.enb1MeasurementId = x2ResStatUpdHeader.GetEnb1MeasurementId();
361  params.enb2MeasurementId = x2ResStatUpdHeader.GetEnb2MeasurementId();
362  params.cellMeasurementResultList = x2ResStatUpdHeader.GetCellMeasurementResultList();
363 
364  NS_LOG_LOGIC("enb1MeasurementId = " << params.enb1MeasurementId);
365  NS_LOG_LOGIC("enb2MeasurementId = " << params.enb2MeasurementId);
366  NS_LOG_LOGIC(
367  "cellMeasurementResultList size = " << params.cellMeasurementResultList.size());
368 
370  }
371  }
372  else if (procedureCode == EpcX2Header::HandoverCancel)
373  {
374  if (messageType == EpcX2Header::SuccessfulOutcome)
375  {
376  NS_LOG_LOGIC("Recv X2 message: HANDOVER CANCEL");
377 
378  EpcX2HandoverCancelHeader x2HoCancelHeader;
379  packet->RemoveHeader(x2HoCancelHeader);
380 
381  NS_LOG_INFO("X2 HandoverCancel header: " << x2HoCancelHeader);
382 
384  params.oldEnbUeX2apId = x2HoCancelHeader.GetOldEnbUeX2apId();
385  params.newEnbUeX2apId = x2HoCancelHeader.GetNewEnbUeX2apId();
386  params.sourceCellId = cellsInfo->m_localCellIds.at(0);
387  params.targetCellId = cellsInfo->m_remoteCellIds.at(0);
388  params.cause = x2HoCancelHeader.GetCause();
389 
390  NS_LOG_LOGIC("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
391  NS_LOG_LOGIC("newEnbUeX2apId = " << params.newEnbUeX2apId);
392  NS_LOG_LOGIC("sourceCellId = " << params.sourceCellId);
393  NS_LOG_LOGIC("targetCellId = " << params.targetCellId);
394  NS_LOG_LOGIC("cause = " << params.cause);
395 
397  }
398  }
399  else
400  {
401  NS_ASSERT_MSG(false, "ProcedureCode NOT SUPPORTED!!!");
402  }
403 }
404 
405 void
407 {
408  NS_LOG_FUNCTION(this << socket);
409 
410  NS_LOG_LOGIC("Recv UE DATA through X2-U interface from Socket");
411  Ptr<Packet> packet = socket->Recv();
412  NS_LOG_LOGIC("packetLen = " << packet->GetSize());
413 
415  "Missing infos of local and remote CellId");
416  Ptr<X2CellInfo> cellsInfo = m_x2InterfaceCellIds[socket];
417 
418  GtpuHeader gtpu;
419  packet->RemoveHeader(gtpu);
420 
421  NS_LOG_LOGIC("GTP-U header: " << gtpu);
422 
424  params.sourceCellId = cellsInfo->m_remoteCellIds.at(0);
425  params.targetCellId = cellsInfo->m_localCellIds.at(0);
426  params.gtpTeid = gtpu.GetTeid();
427  params.ueData = packet;
428 
430 }
431 
432 //
433 // Implementation of the X2 SAP Provider
434 //
435 void
437 {
438  NS_LOG_FUNCTION(this);
439 
440  NS_LOG_LOGIC("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
441  NS_LOG_LOGIC("sourceCellId = " << params.sourceCellId);
442  NS_LOG_LOGIC("targetCellId = " << params.targetCellId);
443  NS_LOG_LOGIC("mmeUeS1apId = " << params.mmeUeS1apId);
444 
446  "Missing infos for targetCellId = " << params.targetCellId);
447  Ptr<X2IfaceInfo> socketInfo = m_x2InterfaceSockets[params.targetCellId];
448  Ptr<Socket> sourceSocket = socketInfo->m_localCtrlPlaneSocket;
449  Ipv4Address targetIpAddr = socketInfo->m_remoteIpAddr;
450 
451  NS_LOG_LOGIC("sourceSocket = " << sourceSocket);
452  NS_LOG_LOGIC("targetIpAddr = " << targetIpAddr);
453 
454  NS_LOG_INFO("Send X2 message: HANDOVER REQUEST");
455 
456  // Build the X2 message
457  EpcX2HandoverRequestHeader x2HoReqHeader;
458  x2HoReqHeader.SetOldEnbUeX2apId(params.oldEnbUeX2apId);
459  x2HoReqHeader.SetCause(params.cause);
460  x2HoReqHeader.SetTargetCellId(params.targetCellId);
461  x2HoReqHeader.SetMmeUeS1apId(params.mmeUeS1apId);
462  x2HoReqHeader.SetUeAggregateMaxBitRateDownlink(params.ueAggregateMaxBitRateDownlink);
463  x2HoReqHeader.SetUeAggregateMaxBitRateUplink(params.ueAggregateMaxBitRateUplink);
464  x2HoReqHeader.SetBearers(params.bearers);
465 
466  EpcX2Header x2Header;
469  x2Header.SetLengthOfIes(x2HoReqHeader.GetLengthOfIes());
470  x2Header.SetNumberOfIes(x2HoReqHeader.GetNumberOfIes());
471 
472  NS_LOG_INFO("X2 header: " << x2Header);
473  NS_LOG_INFO("X2 HandoverRequest header: " << x2HoReqHeader);
474 
475  // Build the X2 packet
476  Ptr<Packet> packet = (params.rrcContext) ? (params.rrcContext) : (Create<Packet>());
477  packet->AddHeader(x2HoReqHeader);
478  packet->AddHeader(x2Header);
479  NS_LOG_INFO("packetLen = " << packet->GetSize());
480 
481  // Send the X2 message through the socket
482  sourceSocket->SendTo(packet, 0, InetSocketAddress(targetIpAddr, m_x2cUdpPort));
483 }
484 
485 void
487 {
488  NS_LOG_FUNCTION(this);
489 
490  NS_LOG_LOGIC("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
491  NS_LOG_LOGIC("newEnbUeX2apId = " << params.newEnbUeX2apId);
492  NS_LOG_LOGIC("sourceCellId = " << params.sourceCellId);
493  NS_LOG_LOGIC("targetCellId = " << params.targetCellId);
494 
496  "Socket infos not defined for sourceCellId = " << params.sourceCellId);
497 
498  Ptr<Socket> localSocket = m_x2InterfaceSockets[params.sourceCellId]->m_localCtrlPlaneSocket;
499  Ipv4Address remoteIpAddr = m_x2InterfaceSockets[params.sourceCellId]->m_remoteIpAddr;
500 
501  NS_LOG_LOGIC("localSocket = " << localSocket);
502  NS_LOG_LOGIC("remoteIpAddr = " << remoteIpAddr);
503 
504  NS_LOG_INFO("Send X2 message: HANDOVER REQUEST ACK");
505 
506  // Build the X2 message
507  EpcX2HandoverRequestAckHeader x2HoAckHeader;
508  x2HoAckHeader.SetOldEnbUeX2apId(params.oldEnbUeX2apId);
509  x2HoAckHeader.SetNewEnbUeX2apId(params.newEnbUeX2apId);
510  x2HoAckHeader.SetAdmittedBearers(params.admittedBearers);
511  x2HoAckHeader.SetNotAdmittedBearers(params.notAdmittedBearers);
512 
513  EpcX2Header x2Header;
516  x2Header.SetLengthOfIes(x2HoAckHeader.GetLengthOfIes());
517  x2Header.SetNumberOfIes(x2HoAckHeader.GetNumberOfIes());
518 
519  NS_LOG_INFO("X2 header: " << x2Header);
520  NS_LOG_INFO("X2 HandoverAck header: " << x2HoAckHeader);
521  NS_LOG_INFO("RRC context: " << params.rrcContext);
522 
523  // Build the X2 packet
524  Ptr<Packet> packet = (params.rrcContext) ? (params.rrcContext) : (Create<Packet>());
525  packet->AddHeader(x2HoAckHeader);
526  packet->AddHeader(x2Header);
527  NS_LOG_INFO("packetLen = " << packet->GetSize());
528 
529  // Send the X2 message through the socket
530  localSocket->SendTo(packet, 0, InetSocketAddress(remoteIpAddr, m_x2cUdpPort));
531 }
532 
533 void
535 {
536  NS_LOG_FUNCTION(this);
537 
538  NS_LOG_LOGIC("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
539  NS_LOG_LOGIC("sourceCellId = " << params.sourceCellId);
540  NS_LOG_LOGIC("targetCellId = " << params.targetCellId);
541  NS_LOG_LOGIC("cause = " << params.cause);
542  NS_LOG_LOGIC("criticalityDiagnostics = " << params.criticalityDiagnostics);
543 
545  "Socket infos not defined for sourceCellId = " << params.sourceCellId);
546 
547  Ptr<Socket> localSocket = m_x2InterfaceSockets[params.sourceCellId]->m_localCtrlPlaneSocket;
548  Ipv4Address remoteIpAddr = m_x2InterfaceSockets[params.sourceCellId]->m_remoteIpAddr;
549 
550  NS_LOG_LOGIC("localSocket = " << localSocket);
551  NS_LOG_LOGIC("remoteIpAddr = " << remoteIpAddr);
552 
553  NS_LOG_INFO("Send X2 message: HANDOVER PREPARATION FAILURE");
554 
555  // Build the X2 message
556  EpcX2HandoverPreparationFailureHeader x2HoPrepFailHeader;
557  x2HoPrepFailHeader.SetOldEnbUeX2apId(params.oldEnbUeX2apId);
558  x2HoPrepFailHeader.SetCause(params.cause);
559  x2HoPrepFailHeader.SetCriticalityDiagnostics(params.criticalityDiagnostics);
560 
561  EpcX2Header x2Header;
564  x2Header.SetLengthOfIes(x2HoPrepFailHeader.GetLengthOfIes());
565  x2Header.SetNumberOfIes(x2HoPrepFailHeader.GetNumberOfIes());
566 
567  NS_LOG_INFO("X2 header: " << x2Header);
568  NS_LOG_INFO("X2 HandoverPrepFail header: " << x2HoPrepFailHeader);
569 
570  // Build the X2 packet
571  Ptr<Packet> packet = Create<Packet>();
572  packet->AddHeader(x2HoPrepFailHeader);
573  packet->AddHeader(x2Header);
574  NS_LOG_INFO("packetLen = " << packet->GetSize());
575 
576  // Send the X2 message through the socket
577  localSocket->SendTo(packet, 0, InetSocketAddress(remoteIpAddr, m_x2cUdpPort));
578 }
579 
580 void
582 {
583  NS_LOG_FUNCTION(this);
584 
585  NS_LOG_LOGIC("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
586  NS_LOG_LOGIC("newEnbUeX2apId = " << params.newEnbUeX2apId);
587  NS_LOG_LOGIC("sourceCellId = " << params.sourceCellId);
588  NS_LOG_LOGIC("targetCellId = " << params.targetCellId);
589  NS_LOG_LOGIC("erabsList size = " << params.erabsSubjectToStatusTransferList.size());
590 
592  "Socket infos not defined for targetCellId = " << params.targetCellId);
593 
594  Ptr<Socket> localSocket = m_x2InterfaceSockets[params.targetCellId]->m_localCtrlPlaneSocket;
595  Ipv4Address remoteIpAddr = m_x2InterfaceSockets[params.targetCellId]->m_remoteIpAddr;
596 
597  NS_LOG_LOGIC("localSocket = " << localSocket);
598  NS_LOG_LOGIC("remoteIpAddr = " << remoteIpAddr);
599 
600  NS_LOG_INFO("Send X2 message: SN STATUS TRANSFER");
601 
602  // Build the X2 message
603  EpcX2SnStatusTransferHeader x2SnStatusXferHeader;
604  x2SnStatusXferHeader.SetOldEnbUeX2apId(params.oldEnbUeX2apId);
605  x2SnStatusXferHeader.SetNewEnbUeX2apId(params.newEnbUeX2apId);
606  x2SnStatusXferHeader.SetErabsSubjectToStatusTransferList(
607  params.erabsSubjectToStatusTransferList);
608 
609  EpcX2Header x2Header;
612  x2Header.SetLengthOfIes(x2SnStatusXferHeader.GetLengthOfIes());
613  x2Header.SetNumberOfIes(x2SnStatusXferHeader.GetNumberOfIes());
614 
615  NS_LOG_INFO("X2 header: " << x2Header);
616  NS_LOG_INFO("X2 SnStatusTransfer header: " << x2SnStatusXferHeader);
617 
618  // Build the X2 packet
619  Ptr<Packet> packet = Create<Packet>();
620  packet->AddHeader(x2SnStatusXferHeader);
621  packet->AddHeader(x2Header);
622  NS_LOG_INFO("packetLen = " << packet->GetSize());
623 
624  // Send the X2 message through the socket
625  localSocket->SendTo(packet, 0, InetSocketAddress(remoteIpAddr, m_x2cUdpPort));
626 }
627 
628 void
630 {
631  NS_LOG_FUNCTION(this);
632 
633  NS_LOG_LOGIC("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
634  NS_LOG_LOGIC("newEnbUeX2apId = " << params.newEnbUeX2apId);
635  NS_LOG_LOGIC("sourceCellId = " << params.sourceCellId);
636 
638  "Socket infos not defined for sourceCellId = " << params.sourceCellId);
639 
640  Ptr<Socket> localSocket = m_x2InterfaceSockets[params.sourceCellId]->m_localCtrlPlaneSocket;
641  Ipv4Address remoteIpAddr = m_x2InterfaceSockets[params.sourceCellId]->m_remoteIpAddr;
642 
643  NS_LOG_LOGIC("localSocket = " << localSocket);
644  NS_LOG_LOGIC("remoteIpAddr = " << remoteIpAddr);
645 
646  NS_LOG_INFO("Send X2 message: UE CONTEXT RELEASE");
647 
648  // Build the X2 message
649  EpcX2UeContextReleaseHeader x2UeCtxReleaseHeader;
650  x2UeCtxReleaseHeader.SetOldEnbUeX2apId(params.oldEnbUeX2apId);
651  x2UeCtxReleaseHeader.SetNewEnbUeX2apId(params.newEnbUeX2apId);
652 
653  EpcX2Header x2Header;
656  x2Header.SetLengthOfIes(x2UeCtxReleaseHeader.GetLengthOfIes());
657  x2Header.SetNumberOfIes(x2UeCtxReleaseHeader.GetNumberOfIes());
658 
659  NS_LOG_INFO("X2 header: " << x2Header);
660  NS_LOG_INFO("X2 UeContextRelease header: " << x2UeCtxReleaseHeader);
661 
662  // Build the X2 packet
663  Ptr<Packet> packet = Create<Packet>();
664  packet->AddHeader(x2UeCtxReleaseHeader);
665  packet->AddHeader(x2Header);
666  NS_LOG_INFO("packetLen = " << packet->GetSize());
667 
668  // Send the X2 message through the socket
669  localSocket->SendTo(packet, 0, InetSocketAddress(remoteIpAddr, m_x2cUdpPort));
670 }
671 
672 void
674 {
675  NS_LOG_FUNCTION(this);
676 
677  NS_LOG_LOGIC("targetCellId = " << params.targetCellId);
678  NS_LOG_LOGIC("cellInformationList size = " << params.cellInformationList.size());
679 
681  "Missing infos for targetCellId = " << params.targetCellId);
682  Ptr<X2IfaceInfo> socketInfo = m_x2InterfaceSockets[params.targetCellId];
683  Ptr<Socket> sourceSocket = socketInfo->m_localCtrlPlaneSocket;
684  Ipv4Address targetIpAddr = socketInfo->m_remoteIpAddr;
685 
686  NS_LOG_LOGIC("sourceSocket = " << sourceSocket);
687  NS_LOG_LOGIC("targetIpAddr = " << targetIpAddr);
688 
689  NS_LOG_INFO("Send X2 message: LOAD INFORMATION");
690 
691  // Build the X2 message
692  EpcX2LoadInformationHeader x2LoadInfoHeader;
693  x2LoadInfoHeader.SetCellInformationList(params.cellInformationList);
694 
695  EpcX2Header x2Header;
698  x2Header.SetLengthOfIes(x2LoadInfoHeader.GetLengthOfIes());
699  x2Header.SetNumberOfIes(x2LoadInfoHeader.GetNumberOfIes());
700 
701  NS_LOG_INFO("X2 header: " << x2Header);
702  NS_LOG_INFO("X2 LoadInformation header: " << x2LoadInfoHeader);
703 
704  // Build the X2 packet
705  Ptr<Packet> packet = Create<Packet>();
706  packet->AddHeader(x2LoadInfoHeader);
707  packet->AddHeader(x2Header);
708  NS_LOG_INFO("packetLen = " << packet->GetSize());
709 
710  // Send the X2 message through the socket
711  sourceSocket->SendTo(packet, 0, InetSocketAddress(targetIpAddr, m_x2cUdpPort));
712 }
713 
714 void
716 {
717  NS_LOG_FUNCTION(this);
718 
719  NS_LOG_LOGIC("targetCellId = " << params.targetCellId);
720  NS_LOG_LOGIC("enb1MeasurementId = " << params.enb1MeasurementId);
721  NS_LOG_LOGIC("enb2MeasurementId = " << params.enb2MeasurementId);
722  NS_LOG_LOGIC("cellMeasurementResultList size = " << params.cellMeasurementResultList.size());
723 
725  "Missing infos for targetCellId = " << params.targetCellId);
726  Ptr<X2IfaceInfo> socketInfo = m_x2InterfaceSockets[params.targetCellId];
727  Ptr<Socket> sourceSocket = socketInfo->m_localCtrlPlaneSocket;
728  Ipv4Address targetIpAddr = socketInfo->m_remoteIpAddr;
729 
730  NS_LOG_LOGIC("sourceSocket = " << sourceSocket);
731  NS_LOG_LOGIC("targetIpAddr = " << targetIpAddr);
732 
733  NS_LOG_INFO("Send X2 message: RESOURCE STATUS UPDATE");
734 
735  // Build the X2 message
736  EpcX2ResourceStatusUpdateHeader x2ResourceStatUpdHeader;
737  x2ResourceStatUpdHeader.SetEnb1MeasurementId(params.enb1MeasurementId);
738  x2ResourceStatUpdHeader.SetEnb2MeasurementId(params.enb2MeasurementId);
739  x2ResourceStatUpdHeader.SetCellMeasurementResultList(params.cellMeasurementResultList);
740 
741  EpcX2Header x2Header;
744  x2Header.SetLengthOfIes(x2ResourceStatUpdHeader.GetLengthOfIes());
745  x2Header.SetNumberOfIes(x2ResourceStatUpdHeader.GetNumberOfIes());
746 
747  NS_LOG_INFO("X2 header: " << x2Header);
748  NS_LOG_INFO("X2 ResourceStatusUpdate header: " << x2ResourceStatUpdHeader);
749 
750  // Build the X2 packet
751  Ptr<Packet> packet = Create<Packet>();
752  packet->AddHeader(x2ResourceStatUpdHeader);
753  packet->AddHeader(x2Header);
754  NS_LOG_INFO("packetLen = " << packet->GetSize());
755 
756  // Send the X2 message through the socket
757  sourceSocket->SendTo(packet, 0, InetSocketAddress(targetIpAddr, m_x2cUdpPort));
758 }
759 
760 void
762 {
763  NS_LOG_FUNCTION(this);
764 
765  NS_LOG_LOGIC("sourceCellId = " << params.sourceCellId);
766  NS_LOG_LOGIC("targetCellId = " << params.targetCellId);
767  NS_LOG_LOGIC("gtpTeid = " << params.gtpTeid);
768 
770  "Missing infos for targetCellId = " << params.targetCellId);
771  Ptr<X2IfaceInfo> socketInfo = m_x2InterfaceSockets[params.targetCellId];
772  Ptr<Socket> sourceSocket = socketInfo->m_localUserPlaneSocket;
773  Ipv4Address targetIpAddr = socketInfo->m_remoteIpAddr;
774 
775  NS_LOG_LOGIC("sourceSocket = " << sourceSocket);
776  NS_LOG_LOGIC("targetIpAddr = " << targetIpAddr);
777 
778  GtpuHeader gtpu;
779  gtpu.SetTeid(params.gtpTeid);
780  gtpu.SetLength(params.ueData->GetSize() + gtpu.GetSerializedSize() -
781  8);
782  NS_LOG_INFO("GTP-U header: " << gtpu);
783 
784  Ptr<Packet> packet = params.ueData;
785  packet->AddHeader(gtpu);
786 
787  NS_LOG_INFO("Forward UE DATA through X2 interface");
788  sourceSocket->SendTo(packet, 0, InetSocketAddress(targetIpAddr, m_x2uUdpPort));
789 }
790 
791 void
793 {
794  NS_LOG_FUNCTION(this);
795 
796  NS_LOG_LOGIC("oldEnbUeX2apId = " << params.oldEnbUeX2apId);
797  NS_LOG_LOGIC("newEnbUeX2apId = " << params.newEnbUeX2apId);
798  NS_LOG_LOGIC("sourceCellId = " << params.sourceCellId);
799  NS_LOG_LOGIC("targetCellId = " << params.targetCellId);
800 
802  "Socket infos not defined for targetCellId = " << params.targetCellId);
803 
804  Ptr<Socket> localSocket = m_x2InterfaceSockets[params.targetCellId]->m_localCtrlPlaneSocket;
805  Ipv4Address remoteIpAddr = m_x2InterfaceSockets[params.targetCellId]->m_remoteIpAddr;
806 
807  NS_LOG_LOGIC("localSocket = " << localSocket);
808  NS_LOG_LOGIC("remoteIpAddr = " << remoteIpAddr);
809 
810  NS_LOG_INFO("Send X2 message: HANDOVER CANCEL");
811 
812  // Build the X2 message
813  EpcX2HandoverCancelHeader x2HandoverCancelHeader;
814  x2HandoverCancelHeader.SetOldEnbUeX2apId(params.oldEnbUeX2apId);
815  x2HandoverCancelHeader.SetNewEnbUeX2apId(params.newEnbUeX2apId);
816  x2HandoverCancelHeader.SetCause(params.cause);
817 
818  EpcX2Header x2Header;
821  x2Header.SetLengthOfIes(x2HandoverCancelHeader.GetLengthOfIes());
822  x2Header.SetNumberOfIes(x2HandoverCancelHeader.GetNumberOfIes());
823 
824  NS_LOG_INFO("X2 header: " << x2Header);
825  NS_LOG_INFO("X2 UeContextRelease header: " << x2HandoverCancelHeader);
826 
827  // Build the X2 packet
828  Ptr<Packet> packet = Create<Packet>();
829  packet->AddHeader(x2HandoverCancelHeader);
830  packet->AddHeader(x2Header);
831  NS_LOG_INFO("packetLen = " << packet->GetSize());
832 
833  // Send the X2 message through the socket
834  localSocket->SendTo(packet, 0, InetSocketAddress(remoteIpAddr, m_x2cUdpPort));
835 }
836 
837 } // namespace ns3
EpcX2HandoverCancelHeader.
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.
void SetCause(uint16_t cause)
Set cause function.
uint16_t GetCause() const
Get cause function.
uint32_t GetNumberOfIes() const
Get number of IEs function.
void SetNewEnbUeX2apId(uint16_t x2apId)
Set new ENB UE X2 AP ID function.
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 Aggregate Max Bit Rate Uplik function.
uint64_t GetUeAggregateMaxBitRateUplink() const
Get UE Aggregate 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 Aggregate 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:32
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:98
EpcX2SapUser * m_x2SapUser
X2 SAP user.
Definition: epc-x2.h:209
virtual void DoSendHandoverRequestAck(EpcX2SapProvider::HandoverRequestAckParams params)
Send handover request ack function.
Definition: epc-x2.cc:486
EpcX2SapProvider * m_x2SapProvider
X2 SAP provider.
Definition: epc-x2.h:210
virtual void DoSendUeContextRelease(EpcX2SapProvider::UeContextReleaseParams params)
Send UE context release function.
Definition: epc-x2.cc:629
void DoDispose() override
Destructor implementation.
Definition: epc-x2.cc:99
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:130
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:217
virtual void DoSendResourceStatusUpdate(EpcX2SapProvider::ResourceStatusUpdateParams params)
Send resource status update function.
Definition: epc-x2.cc:715
friend class EpcX2SpecificEpcX2SapProvider< EpcX2 >
allow EpcX2SpecificEpcX2SapProvider<EpcX2> class friend access
Definition: epc-x2.h:100
virtual void DoSendHandoverPreparationFailure(EpcX2SapProvider::HandoverPreparationFailureParams params)
Send handover preparation failure function.
Definition: epc-x2.cc:534
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:179
~EpcX2() override
Destructor.
Definition: epc-x2.cc:93
virtual void DoSendHandoverRequest(EpcX2SapProvider::HandoverRequestParams params)
Send handover request function.
Definition: epc-x2.cc:436
static TypeId GetTypeId()
Get the type ID.
Definition: epc-x2.cc:109
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:223
virtual void DoSendUeData(EpcX2SapProvider::UeDataParams params)
Send UE data function.
Definition: epc-x2.cc:761
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:232
uint16_t m_x2cUdpPort
UDP ports to be used for the X2-C interface.
Definition: epc-x2.h:228
virtual void DoSendLoadInformation(EpcX2SapProvider::LoadInformationParams params)
Send load information function.
Definition: epc-x2.cc:673
EpcX2()
Constructor.
Definition: epc-x2.cc:84
virtual void DoSendSnStatusTransfer(EpcX2SapProvider::SnStatusTransferParams params)
Send SN status transfer function.
Definition: epc-x2.cc:581
void SetEpcX2SapUser(EpcX2SapUser *s)
Definition: epc-x2.cc:116
virtual void DoSendHandoverCancel(EpcX2SapProvider::HandoverCancelParams params)
Send Handover Cancel function.
Definition: epc-x2.cc:792
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:406
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:358
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:426
virtual void RecvUeData(UeDataParams params)=0
Receive UE data function.
virtual void RecvUeContextRelease(UeContextReleaseParams params)=0
Receive UE context release function.
virtual void RecvHandoverCancel(HandoverCancelParams params)=0
Receive handover cancel 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.
uint32_t GetSerializedSize() const override
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:43
A base class which provides memory management and object aggregation.
Definition: object.h:89
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:294
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:268
uint32_t GetSize() const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:863
void SetRecvCallback(Callback< void, Ptr< Socket >> receivedData)
Notify application when new data is available to be read.
Definition: socket.cc:126
virtual Ptr< Packet > Recv(uint32_t maxSize, uint32_t flags)=0
Read data from the socket.
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:72
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:60
static TypeId LookupByName(std::string name)
Get a TypeId by name.
Definition: type-id.cc:839
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:935
X2CellInfo.
Definition: epc-x2.h:69
X2CellInfo & operator=(const X2CellInfo &value)
Assignment operator.
Definition: epc-x2.cc:72
std::vector< uint16_t > m_remoteCellIds
remote cell IDs
Definition: epc-x2.h:89
X2CellInfo(std::vector< uint16_t > localCellIds, std::vector< uint16_t > remoteCellIds)
Constructor.
Definition: epc-x2.cc:61
std::vector< uint16_t > m_localCellIds
local cell IDs
Definition: epc-x2.h:88
virtual ~X2CellInfo()
Definition: epc-x2.cc:67
X2IfaceInfo.
Definition: epc-x2.h:38
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:50
virtual ~X2IfaceInfo()
Definition: epc-x2.cc:43
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:66
#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:86
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:282
#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:275
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:46
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:707
value
Definition: second.py:41
params
Fit Fluctuating Two Ray model to the 3GPP TR 38.901 using the Anderson-Darling goodness-of-fit ##.
Parameters of the HANDOVER CANCEL message.
Definition: epc-x2-sap.h:344
Parameters of the HANDOVER PREPARATION FAILURE message.
Definition: epc-x2-sap.h:263
Parameters of the HANDOVER REQUEST ACKNOWLEDGE message.
Definition: epc-x2-sap.h:247
Parameters of the HANDOVER REQUEST message.
Definition: epc-x2-sap.h:229
Parameters of the LOAD INFORMATION message.
Definition: epc-x2-sap.h:305
Parameters of the RESOURCE STATUS UPDATE message.
Definition: epc-x2-sap.h:316
Parameters of the SN STATUS TRANSFER message.
Definition: epc-x2-sap.h:277
Parameters of the UE CONTEXT RELEASE message.
Definition: epc-x2-sap.h:292
Parameters of the UE DATA primitive.
Definition: epc-x2-sap.h:331