23 #include <ns3/point-to-point-epc-helper.h>
25 #include <ns3/inet-socket-address.h>
26 #include <ns3/mac48-address.h>
27 #include <ns3/eps-bearer.h>
28 #include <ns3/ipv4-address.h>
29 #include <ns3/internet-stack-helper.h>
30 #include <ns3/point-to-point-helper.h>
31 #include <ns3/packet-socket-helper.h>
32 #include <ns3/packet-socket-address.h>
33 #include <ns3/epc-enb-application.h>
34 #include <ns3/epc-sgw-pgw-application.h>
36 #include <ns3/lte-enb-rrc.h>
37 #include <ns3/epc-x2.h>
38 #include <ns3/lte-enb-net-device.h>
39 #include <ns3/lte-ue-net-device.h>
40 #include <ns3/epc-mme.h>
41 #include <ns3/epc-ue-nas.h>
51 : m_gtpuUdpPort (2152)
100 m_mme = CreateObject<EpcMme> ();
113 static TypeId tid =
TypeId (
"ns3::PointToPointEpcHelper")
117 .AddAttribute (
"S1uLinkDataRate",
118 "The data rate to be used for the next S1-U link to be created",
122 .AddAttribute (
"S1uLinkDelay",
123 "The delay to be used for the next S1-U link to be created",
127 .AddAttribute (
"S1uLinkMtu",
128 "The MTU of the next S1-U link to be created. Note that, because of the additional GTP/UDP/IP tunneling overhead, you need a MTU larger than the end-to-end MTU that you want to support.",
131 MakeUintegerChecker<uint16_t> ())
132 .AddAttribute (
"X2LinkDataRate",
133 "The data rate to be used for the next X2 link to be created",
137 .AddAttribute (
"X2LinkDelay",
138 "The delay to be used for the next X2 link to be created",
142 .AddAttribute (
"X2LinkMtu",
143 "The MTU of the next X2 link to be created. Note that, because of some big X2 messages, you need a big MTU.",
146 MakeUintegerChecker<uint16_t> ())
167 NS_ASSERT (enb == lteEnbNetDevice->GetNode ());
178 enbSgwNodes.Add (enb);
207 enbLteSocketBindAddress.
SetSingleDevice (lteEnbNetDevice->GetIfIndex ());
209 retval = enbLteSocket->
Bind (enbLteSocketBindAddress);
213 enbLteSocketConnectAddress.
SetSingleDevice (lteEnbNetDevice->GetIfIndex ());
215 retval = enbLteSocket->
Connect (enbLteSocketConnectAddress);
220 Ptr<EpcEnbApplication> enbApp = CreateObject<EpcEnbApplication> (enbLteSocket, enbS1uSocket, enbAddress, sgwAddress, cellId);
232 m_mme->AddEnb (cellId, enbAddress, enbApp->GetS1apSapEnb ());
233 m_sgwPgwApp->AddEnb (cellId, enbAddress, sgwAddress);
234 enbApp->SetS1apSapMme (
m_mme->GetS1apSapMme ());
269 uint16_t enb1CellId = enb1LteDev->
GetCellId ();
270 NS_LOG_LOGIC (
"LteEnbNetDevice #1 = " << enb1LteDev <<
" - CellId = " << enb1CellId);
274 uint16_t enb2CellId = enb2LteDev->
GetCellId ();
275 NS_LOG_LOGIC (
"LteEnbNetDevice #2 = " << enb2LteDev <<
" - CellId = " << enb2CellId);
277 enb1X2->AddX2Interface (enb1CellId, enb1X2Address, enb2CellId, enb2X2Address);
278 enb2X2->AddX2Interface (enb2CellId, enb2X2Address, enb1CellId, enb1X2Address);
280 enb1LteDev->GetRrc ()->AddX2Neighbour (enb2LteDev->GetCellId ());
281 enb2LteDev->GetRrc ()->AddX2Neighbour (enb1LteDev->GetCellId ());
306 NS_ASSERT_MSG (ueIpv4 != 0,
"UEs need to have IPv4 installed before EPS bearers can be activated");
307 int32_t
interface = ueIpv4->GetInterfaceForDevice (ueDevice);
309 NS_ASSERT (ueIpv4->GetNAddresses (interface) == 1);
310 Ipv4Address ueAddr = ueIpv4->GetAddress (interface, 0).GetLocal ();
313 uint8_t bearerId =
m_mme->AddBearer (imsi, tft, bearer);
317 ueLteDevice->GetNas ()->ActivateEpsBearer (bearer, tft);
uint32_t AddApplication(Ptr< Application > application)
Associate an Application to this Node.
DataRate m_s1uLinkDataRate
The data rate to be used for the next S1-U link to be created.
static Ipv4Address GetAny(void)
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
Ptr< EpcMme > m_mme
MME network element.
uint32_t GetNApplications(void) const
holds a vector of std::pair of Ptr and interface index.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
uint16_t GetCellId() const
static TypeId GetTypeId(void)
Register this type.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
NetDeviceContainer Install(NodeContainer c)
uint16_t m_s1uLinkMtu
The MTU of the next S1-U link to be created.
virtual Ptr< Node > GetPgwNode()
an address for a packet socket
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
virtual void AddUe(Ptr< NetDevice > ueLteDevice, uint64_t imsi)
Notify the EPC of the existance of a new UE which might attach at a later time.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
aggregate IP/TCP/UDP functionality to existing Nodes.
Ptr< EpcSgwPgwApplication > m_sgwPgwApp
SGW-PGW application.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Callback< R > MakeNullCallback(void)
Build a set of PointToPointNetDevice objects.
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
void SetSingleDevice(uint32_t device)
Set the address to match only a specified NetDevice.
a polymophic address class
Ptr< const AttributeChecker > MakeDataRateChecker(void)
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
Class for representing data rates.
This class contains the specification of EPS Bearers.
Ptr< Application > GetApplication(uint32_t index) const
Retrieve the index-th Application associated to this node.
static Mac48Address Allocate(void)
Allocate a new Mac48Address.
Time m_s1uLinkDelay
The delay to be used for the next S1-U link to be created.
AttributeValue implementation for Time.
virtual uint8_t ActivateEpsBearer(Ptr< NetDevice > ueLteDevice, uint64_t imsi, Ptr< EpcTft > tft, EpsBearer bearer)
Activate an EPS bearer, setting up the corresponding S1-U tunnel.
bool RecvFromTunDevice(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber)
Method to be assigned to the callback of the Gi TUN VirtualNetDevice.
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
Hold an unsigned integer type.
virtual void SetAddress(Address address)
Set the address of this interface.
holds a vector of ns3::NetDevice pointers
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
static Mac48Address GetBroadcast(void)
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
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...
virtual void DoDispose()
Destructor implementation.
PointToPointEpcHelper()
Constructor.
Ptr< const AttributeAccessor > MakeDataRateAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
void AggregateObject(Ptr< Object > other)
Aggregate two Objects together.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
virtual void AddEnb(Ptr< Node > enbNode, Ptr< NetDevice > lteEnbNetDevice, uint16_t cellId)
Add an eNB to the EPC.
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host.
Access to the Ipv4 forwarding table, interfaces, and configuration.
Ipv4AddressHelper m_x2Ipv4AddressHelper
helper to assign addresses to X2 NetDevices
Base helper class to handle the creation of the EPC entities.
virtual Ipv4Address GetUeDefaultGatewayAddress()
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void SetPhysicalAddress(const Address address)
Set the destination address.
keep track of a set of node pointers.
This entity is installed inside an eNB and provides the functionality for the X2 interface.
Create an EPC network with PointToPoint links.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
Time m_x2LinkDelay
The delay to be used for the next X2 link to be created.
Ipv4AddressHelper m_ueAddressHelper
helper to assign addresses to UE devices as well as to the TUN device of the SGW/PGW ...
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
uint16_t m_gtpuUdpPort
UDP port where the GTP-U Socket is bound, fixed by the standard as 2152.
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
virtual Ipv4InterfaceContainer AssignUeIpv4Address(NetDeviceContainer ueDevices)
Assign IPv4 addresses to UE devices.
Ipv4AddressHelper m_s1uIpv4AddressHelper
S1-U interfaces.
Ipv4 addresses are stored in host order in this class.
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
This application is installed inside eNBs and provides the bridge functionality for user data plane p...
void Add(NodeContainer other)
Append the contents of another NodeContainer to the end of this container.
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
AttributeValue implementation for DataRate.
virtual ~PointToPointEpcHelper()
Destructor.
Time Seconds(double value)
Construct a Time in the indicated unit.
void SetProtocol(uint16_t protocol)
Set the protocol.
DataRate m_x2LinkDataRate
The data rate to be used for the next X2 link to be created.
virtual void AddX2Interface(Ptr< Node > enbNode1, Ptr< Node > enbNode2)
Add an X2 interface between two eNB.
Ipv4Address NewNetwork(void)
Increment the network number and reset the IP address counter to the base value provided in the SetBa...
uint16_t m_x2LinkMtu
The MTU of the next X2 link to be created.
void SetSendCallback(SendCallback transmitCb)
Set the user callback to be called when a L2 packet is to be transmitted.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
The eNodeB device implementation.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
void Dispose(void)
Dispose of this Object.
virtual uint32_t GetNInterfaces(void) const =0
static const uint16_t PROT_NUMBER
Protocol number (0x0800)
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ptr< VirtualNetDevice > m_tunDevice
TUN device implementing tunneling of user data over GTP-U/UDP/IP.
Ptr< Node > m_sgwPgw
SGW-PGW network element.
static TypeId LookupByName(std::string name)
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
The LteUeNetDevice class implements the UE net device.