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
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.
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.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
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.
void SetRecvCallback(Callback< void, Ptr< Socket > > receivedData)
Notify application when new data is available to be read.
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
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
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.
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...
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.