23 #include <ns3/emu-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/packet-socket-helper.h>
31 #include <ns3/packet-socket-address.h>
32 #include <ns3/epc-enb-application.h>
33 #include <ns3/epc-sgw-pgw-application.h>
34 #include <ns3/emu-fd-net-device-helper.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>
42 #include <ns3/string.h>
43 #include <ns3/abort.h>
56 : m_gtpuUdpPort (2152)
72 .AddConstructor<EmuEpcHelper> ()
73 .AddAttribute (
"sgwDeviceName",
74 "The name of the device used for the S1-U interface of the SGW",
78 .AddAttribute (
"enbDeviceName",
79 "The name of the device used for the S1-U interface of the eNB",
83 .AddAttribute (
"SgwMacAddress",
84 "MAC address used for the SGW ",
88 .AddAttribute (
"EnbMacAddressBase",
89 "First 5 bytes of the Enb MAC address base",
144 m_mme = CreateObject<EpcMme> ();
184 NS_ASSERT (enb == lteEnbNetDevice->GetNode ());
200 std::ostringstream enbMacAddress;
201 enbMacAddress <<
m_enbMacAddressBase <<
":" << std::hex << std::setfill (
'0') << std::setw (2) << cellId;
202 NS_LOG_LOGIC (
"MAC address of enB with cellId " << cellId <<
" : " << enbMacAddress.str ());
204 enbDev->SetAttribute (
"Address",
Mac48AddressValue (enbMacAddress.str ().c_str ()));
212 Ipv4Address enbAddress = enbIpIfaces.GetAddress (0);
223 enbLteSocketBindAddress.
SetSingleDevice (lteEnbNetDevice->GetIfIndex ());
225 retval = enbLteSocket->
Bind (enbLteSocketBindAddress);
229 enbLteSocketConnectAddress.
SetSingleDevice (lteEnbNetDevice->GetIfIndex ());
231 retval = enbLteSocket->
Connect (enbLteSocketConnectAddress);
236 Ptr<EpcEnbApplication> enbApp = CreateObject<EpcEnbApplication> (enbLteSocket, enbS1uSocket, enbAddress, sgwAddress, cellId);
248 m_mme->AddEnb (cellId, enbAddress, enbApp->GetS1apSapEnb ());
249 m_sgwPgwApp->AddEnb (cellId, enbAddress, sgwAddress);
250 enbApp->SetS1apSapMme (
m_mme->GetS1apSapMme ());
265 NS_LOG_LOGIC (
"number of Ipv4 ifaces of the eNB #1: " << enb1Ipv4->GetNInterfaces ());
266 NS_LOG_LOGIC (
"number of Ipv4 ifaces of the eNB #2: " << enb2Ipv4->GetNInterfaces ());
274 int32_t enb1Interface = enb1Ipv4->GetInterfaceForDevice (enb1EpcDev);
275 int32_t enb2Interface = enb2Ipv4->GetInterfaceForDevice (enb2EpcDev);
278 NS_ASSERT (enb1Ipv4->GetNAddresses (enb1Interface) == 1);
279 NS_ASSERT (enb2Ipv4->GetNAddresses (enb2Interface) == 1);
280 Ipv4Address enb1Addr = enb1Ipv4->GetAddress (enb1Interface, 0).GetLocal ();
281 Ipv4Address enb2Addr = enb2Ipv4->GetAddress (enb2Interface, 0).GetLocal ();
288 uint16_t enb1CellId = enb1LteDev->
GetCellId ();
289 NS_LOG_LOGIC (
"LteEnbNetDevice #1 = " << enb1LteDev <<
" - CellId = " << enb1CellId);
293 uint16_t enb2CellId = enb2LteDev->
GetCellId ();
294 NS_LOG_LOGIC (
"LteEnbNetDevice #2 = " << enb2LteDev <<
" - CellId = " << enb2CellId);
296 enb1X2->AddX2Interface (enb1CellId, enb1Addr, enb2CellId, enb2Addr);
297 enb2X2->AddX2Interface (enb2CellId, enb2Addr, enb1CellId, enb1Addr);
299 enb1LteDev->GetRrc ()->AddX2Neighbour (enb2LteDev->GetCellId ());
300 enb2LteDev->GetRrc ()->AddX2Neighbour (enb1LteDev->GetCellId ());
324 NS_ASSERT_MSG (ueIpv4 != 0,
"UEs need to have IPv4 installed before EPS bearers can be activated");
325 int32_t
interface = ueIpv4->GetInterfaceForDevice (ueDevice);
327 NS_ASSERT (ueIpv4->GetNAddresses (interface) == 1);
328 Ipv4Address ueAddr = ueIpv4->GetAddress (interface, 0).GetLocal ();
331 m_mme->AddBearer (imsi, tft, bearer);
uint32_t AddApplication(Ptr< Application > application)
Associate an Application to this Node.
static TypeId GetTypeId(void)
virtual NetDeviceContainer Install(Ptr< Node > node) const
This method creates a FdNetDevice and associates it to a node.
void ActivateEpsBearer(EpsBearer bearer, Ptr< EpcTft > tft)
Activate an EPS bearer.
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 "...
uint32_t GetNApplications(void) const
holds a vector of std::pair of Ptr and interface index.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register the class in the ns-3 factory.
uint16_t GetCellId() const
hold variables of type string
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
uint16_t m_gtpuUdpPort
UDP port where the GTP-U Socket is bound, fixed by the standard as 2152.
std::string m_sgwDeviceName
Ipv4InterfaceContainer m_sgwIpIfaces
EmuEpcHelper()
Constructor.
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...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
aggregate IP/TCP/UDP functionality to existing Nodes.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Callback< R > MakeNullCallback(void)
void SetSingleDevice(uint32_t device)
Set the address to match only a specified NetDevice.
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.
a polymophic address class
virtual void DoInitialize()
This method is called only once by Object::Initialize.
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.
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.
void SetIpv4StackInstall(bool enable)
Enable/disable IPv4 stack install.
virtual void SetAddress(Address address)
Set the address of this interface.
holds a vector of ns3::NetDevice pointers
virtual void AddX2Interface(Ptr< Node > enbNode1, Ptr< Node > enbNode2)
Add an X2 interface between two eNB.
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
static Mac48Address GetBroadcast(void)
virtual void AddEnb(Ptr< Node > enbNode, Ptr< NetDevice > lteEnbNetDevice, uint16_t cellId)
Add an eNB to the EPC.
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...
void AggregateObject(Ptr< Object > other)
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host.
Access to the Ipv4 forwarding table, interfaces, and configuration.
uint32_t GetNDevices(void) const
void SetDeviceName(std::string deviceName)
Set the device name of this device.
std::string m_enbMacAddressBase
std::string m_sgwMacAddress
Base helper class to handle the creation of the EPC entities.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
virtual Ipv4Address GetUeDefaultGatewayAddress()
void SetPhysicalAddress(const Address address)
Set the destination address.
This entity is installed inside an eNB and provides the functionality for the X2 interface.
virtual Ipv4InterfaceContainer AssignUeIpv4Address(NetDeviceContainer ueDevices)
Assign IPv4 addresses to UE devices.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
virtual void ActivateEpsBearer(Ptr< NetDevice > ueLteDevice, uint64_t imsi, Ptr< EpcTft > tft, EpsBearer bearer)
Activate an EPS bearer, setting up the corresponding S1-U tunnel.
virtual ~EmuEpcHelper()
Destructor.
static EventId ScheduleNow(MEM mem_ptr, OBJ obj)
Schedule an event to expire Now.
Ptr< EpcSgwPgwApplication > m_sgwPgwApp
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
#define NS_ABORT_IF(cond)
Abnormal program termination if cond is true.
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...
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
virtual Ptr< Node > GetPgwNode()
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
hold objects of type ns3::Mac48Address
std::string m_enbDeviceName
void Initialize(void)
This method calls the virtual DoInitialize method on all the objects aggregated to this object...
void SetProtocol(uint16_t protocol)
Set the protocol.
Ipv4AddressHelper m_ueAddressHelper
helper to assign addresses to UE devices as well as to the TUN device of the SGW/PGW ...
void SetSendCallback(SendCallback transmitCb)
Set the user callback to be called when a L2 packet is to be transmitted.
Ipv4AddressHelper m_epcIpv4AddressHelper
helper to assign addresses to S1-U NetDevices
virtual void DoDispose()
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
void SetAttribute(std::string name, const AttributeValue &value)
The eNodeB device implementation.
Ptr< T > GetObject(void) const
build a set of FdNetDevice objects attached to a physical network interface
Ptr< VirtualNetDevice > m_tunDevice
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
void Dispose(void)
Run the DoDispose methods of this object and all the objects aggregated to it.
Ptr< Node > m_sgwPgw
SGW-PGW network element.
virtual uint32_t GetNInterfaces(void) const =0
virtual void DoInitialize(void)
This method is called only once by Object::Initialize.
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.
static TypeId LookupByName(std::string name)
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
The LteUeNetDevice class implements the UE net device.