25 #include "ns3/mac48-address.h"    27 #include "ns3/inet-socket-address.h"    28 #include "ns3/uinteger.h"    67     .AddTraceSource (
"RxFromEnb",
    68                      "Receive data packets from LTE Enb Net Device",
    70                      "ns3::EpcEnbApplication::RxTracedCallback")
    71     .AddTraceSource (
"RxFromS1u",
    72                      "Receive data packets from S1-U Net Device",
    74                      "ns3::EpcEnbApplication::RxTracedCallback")
   164   uint16_t enbUeS1Id = params.
rnti;  
   166   uint64_t imsi = mmeUeS1Id;
   170   uint16_t gci = params.
cellId;
   171   std::list<EpcS1apSapMme::ErabSwitchedInDownlinkItem> erabToBeSwitchedInDownlinkList;
   172   for (std::list<EpcEnbS1SapProvider::BearerToBeSwitched>::iterator bit = params.
bearersToBeSwitched.begin ();
   178       flowId.
m_bid = bit->epsBearerId;
   179       uint32_t teid = bit->teid;
   187       erab.
erabId = bit->epsBearerId;
   191       erabToBeSwitchedInDownlinkList.push_back (erab);
   200   std::map<uint16_t, std::map<uint8_t, uint32_t> >::iterator rntiIt = 
m_rbidTeidMap.find (rnti);
   203       for (std::map<uint8_t, uint32_t>::iterator bidIt = rntiIt->second.begin ();
   204            bidIt != rntiIt->second.end ();
   207           uint32_t teid = bidIt->second;
   212       NS_LOG_INFO (
"RNTI: " << rntiIt->first << 
" erased");
   221   uint64_t imsi = mmeUeS1Id;
   222   std::map<uint64_t, uint16_t>::iterator imsiIt = 
m_imsiRntiMap.find (imsi);
   224   uint16_t rnti = imsiIt->second;
   226   for (std::list<EpcS1apSapEnb::ErabToBeSetupItem>::iterator erabIt = erabToBeSetupList.begin ();
   227        erabIt != erabToBeSetupList.end ();
   233       params.
bearer = erabIt->erabLevelQosParameters;
   235       params.
gtpTeid = erabIt->sgwTeid;
   255   uint64_t imsi = mmeUeS1Id;
   256   std::map<uint64_t, uint16_t>::iterator imsiIt = 
m_imsiRntiMap.find (imsi);
   258   uint16_t rnti = imsiIt->second;
   281   uint16_t rnti = tag.
GetRnti ();
   282   uint8_t bid = tag.
GetBid ();
   283   NS_LOG_LOGIC (
"received packet with RNTI=" << (uint32_t) rnti << 
", BID=" << (uint32_t)  bid);
   284   std::map<uint16_t, std::map<uint8_t, uint32_t> >::iterator rntiIt = 
m_rbidTeidMap.find (rnti);
   287       NS_LOG_WARN (
"UE context not found, discarding packet");
   291       std::map<uint8_t, uint32_t>::iterator bidIt = rntiIt->second.find (bid);
   292       NS_ASSERT (bidIt != rntiIt->second.end ());
   293       uint32_t teid = bidIt->second;
   307   uint32_t teid = gtpu.
GetTeid ();
   308   std::map<uint32_t, EpsFlowId_t>::iterator it = 
m_teidRbidMap.find (teid);
   329   ipType = (ipType>>4) & 0x0f;
   336   else if (ipType == 0x06)
   342       NS_ABORT_MSG (
"EpcEnbApplication::SendToLteSocket - Unknown IP type...");
   357   gtpu.SetLength (packet->
GetSize () + gtpu.GetSerializedSize () - 8);  
   367   std::list<EpcS1apSapMme::ErabToBeReleasedIndication> erabToBeReleaseIndication;
   370   erabToBeReleaseIndication.push_back (erab);
 uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer. 
Parameters passed to DataRadioBearerSetupRequest () 
This class implements the Service Access Point (SAP) between the LteEnbRrc and the EpcEnbApplication...
E-RAB Release Indication Item IEs, 3GPP TS 36.413 version 9.8.0 section 9.1.3.7. 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
MME side of the S1-AP Service Access Point (SAP), provides the MME methods to be called when an S1-AP...
uint32_t mmeUeS1Id
mmeUeS1Id in practice, we use the IMSI 
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message. 
This class implements the Service Access Point (SAP) between the LteEnbRrc and the EpcEnbApplication...
void DoPathSwitchRequest(EpcEnbS1SapProvider::PathSwitchRequestParameters params)
Path switch request function. 
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload). 
uint8_t bearerId
the EPS Bearer Identifier 
virtual void DataRadioBearerSetupRequest(DataRadioBearerSetupRequestParameters params)=0
request the setup of a DataRadioBearer 
NS_ASSERT_MSG(false, "Ipv4AddressGenerator::MaskToIndex(): Impossible")
Ipv4Address m_enbS1uAddress
address of the eNB for S1-U communications 
uint16_t rnti
the RNTI identifying the UE for which the DataRadioBearer is to be created 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
void DoDispose(void)
Destructor implementation. 
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
Ipv4Address m_sgwS1uAddress
address of the SGW which terminates all S1-U tunnels 
std::list< BearerToBeSwitched > bearersToBeSwitched
list of bearers to be switched 
Tag used to define the RNTI and EPS bearer ID for packets interchanged between the EpcEnbApplication ...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO. 
EpsBearer bearer
the characteristics of the bearer to be setup 
Ptr< Socket > m_lteSocket
raw packet socket to send and receive the packets to and from the LTE radio interface ...
EpcEnbApplication(Ptr< Socket > lteSocket, Ptr< Socket > lteSocket6, uint16_t cellId)
Constructor. 
virtual void ErabReleaseIndication(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list< ErabToBeReleasedIndication > erabToBeReleaseIndication)=0
As per 3GPP TS 23.401 Release 9 V9.5.0 Figure 5.4.4.2-1 eNB sends indication of Bearer Release to MME...
void SendToLteSocket(Ptr< Packet > packet, uint16_t rnti, uint8_t bid)
Send a packet to the UE via the LTE radio interface of the eNB. 
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source. 
EpcS1apSapEnb * GetS1apSapEnb()
bool operator<(const EventId &a, const EventId &b)
void SendToS1uSocket(Ptr< Packet > packet, uint32_t teid)
Send a packet to the SGW via the S1-U interface. 
uint16_t rnti
the RNTI identifying the UE 
TracedCallback< Ptr< Packet > > m_rxLteSocketPktTrace
Callback to trace RX (reception) data packets from LTE Socket. 
void SetS1SapUser(EpcEnbS1SapUser *s)
Set the S1 SAP User. 
Ipv4Address enbTransportLayerAddress
address 
eNB side of the S1-AP Service Access Point (SAP), provides the eNB methods to be called when an S1-AP...
uint16_t m_gtpuUdpPort
UDP port to be used for GTP. 
EpcS1apSapMme * m_s1apSapMme
MME side of the S1-AP SAP. 
void DoInitialUeMessage(uint64_t imsi, uint16_t rnti)
Initial UE message function. 
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
virtual void PathSwitchRequest(uint64_t enbUeS1Id, uint64_t mmeUeS1Id, uint16_t gci, std::list< ErabSwitchedInDownlinkItem > erabToBeSwitchedInDownlinkList)=0
PATH SWITCH REQUEST message, see 3GPP TS 36.413 9.1.5.8. 
uint32_t gtpTeid
S1-bearer GTP tunnel endpoint identifier, see 36.423 9.2.1. 
void SetRecvCallback(Callback< void, Ptr< Socket > >)
Notify application when new data is available to be read. 
PathSwitchRequestParameters structure. 
virtual ~EpcEnbApplication(void)
Destructor. 
void RecvFromLteSocket(Ptr< Socket > socket)
Method to be assigned to the recv callback of the LTE socket. 
uint8_t GetBid(void) const
Get Bearer Id function. 
void DoInitialContextSetupRequest(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list< EpcS1apSapEnb::ErabToBeSetupItem > erabToBeSetupList)
Initial Context Setup Request. 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
static TypeId GetTypeId(void)
Get the type ID. 
virtual Ptr< Packet > Recv(uint32_t maxSize, uint32_t flags)=0
Read data from the socket. 
Ptr< Packet > Copy(void) const
performs a COW copy of the packet. 
Template for the implementation of the EpcEnbS1SapProvider as a member of an owner class of type C to...
EpcEnbS1SapProvider * GetS1SapProvider()
PathSwitchRequestAcknowledgeParameters structure. 
void RecvFromS1uSocket(Ptr< Socket > socket)
Method to be assigned to the recv callback of the S1-U socket. 
EpcEnbS1SapUser * m_s1SapUser
User for the S1 SAP. 
void DoUeContextRelease(uint16_t rnti)
UE Context Release function. 
std::map< uint32_t, EpsFlowId_t > m_teidRbidMap
map telling for each S1-U TEID the corresponding RNTI,BID 
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
Ipv4 addresses are stored in host order in this class. 
virtual void PathSwitchRequestAcknowledge(PathSwitchRequestAcknowledgeParameters params)=0
request a path switch acknowledge 
void AddPacketTag(const Tag &tag) const
Add a packet tag. 
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN. 
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer. 
bool RemovePacketTag(Tag &tag)
Remove a packet tag. 
Parameters passed to InitialContextSetupRequest () 
void DoPathSwitchRequestAcknowledge(uint64_t enbUeS1Id, uint64_t mmeUeS1Id, uint16_t cgi, std::list< EpcS1apSapEnb::ErabSwitchedInUplinkItem > erabToBeSwitchedInUplinkList)
Path Switch Request Acknowledge. 
bool operator==(const EventId &a, const EventId &b)
TracedCallback< Ptr< Packet > > m_rxS1uSocketPktTrace
Callback to trace RX (reception) data packets from S1-U Socket. 
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer. 
virtual void InitialUeMessage(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, uint64_t stmsi, uint16_t ecgi)=0
Ptr< Socket > m_lteSocket6
raw packet socket to send and receive the packets to and from the LTE radio interface ...
A base class which provides memory management and object aggregation. 
EpcS1apSapEnb * m_s1apSapEnb
ENB side of the S1-AP SAP. 
void SetS1apSapMme(EpcS1apSapMme *s)
Set the MME side of the S1-AP SAP. 
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host. 
void DoReleaseIndication(uint64_t imsi, uint16_t rnti, uint8_t bearerId)
This function accepts bearer id corresponding to a particular UE and schedules indication of bearer r...
std::map< uint16_t, std::map< uint8_t, uint32_t > > m_rbidTeidMap
map of maps telling for each RNTI and BID the corresponding S1-U TEID 
virtual void InitialContextSetupRequest(InitialContextSetupRequestParameters params)=0
Initial context setup request. 
void AddS1Interface(Ptr< Socket > s1uSocket, Ipv4Address enbAddress, Ipv4Address sgwAddress)
Add a S1-U interface to the eNB. 
E-RABs Switched in Downlink Item IE, see 3GPP TS 36.413 9.1.5.8. 
a unique identifier for an interface. 
TypeId SetParent(TypeId tid)
Set the parent TypeId. 
std::map< uint64_t, uint16_t > m_imsiRntiMap
UE context info. 
Ptr< Socket > m_s1uSocket
UDP socket to send and receive GTP-U the packets to and from the S1-U interface. 
uint16_t GetRnti(void) const
Get RNTI function. 
uint8_t m_bid
Bid, the EPS Bearer IDentifier. 
void AddHeader(const Header &header)
Add header to this packet. 
Template for the implementation of the EpcS1apSapEnb as a member of an owner class of type C to which...
EpcEnbS1SapProvider * m_s1SapProvider
Provider for the S1 SAP.