23 #include "epc-enb-application.h"
25 #include "ns3/mac48-address.h"
27 #include "ns3/inet-socket-address.h"
28 #include "ns3/uinteger.h"
30 #include "epc-gtpu-header.h"
31 #include "eps-bearer-tag.h"
39 EpcEnbApplication::EpsFlowId_t::EpsFlowId_t ()
43 EpcEnbApplication::EpsFlowId_t::EpsFlowId_t (
const uint16_t a,
const uint8_t b)
50 operator == (
const EpcEnbApplication::EpsFlowId_t &a,
const EpcEnbApplication::EpsFlowId_t &b)
52 return ( (a.m_rnti == b.m_rnti) && (a.m_bid == b.m_bid) );
56 operator < (
const EpcEnbApplication::EpsFlowId_t& a,
const EpcEnbApplication::EpsFlowId_t& b)
58 return ( (a.m_rnti < b.m_rnti) || ( (a.m_rnti == b.m_rnti) && (a.m_bid < b.m_bid) ) );
63 EpcEnbApplication::GetTypeId (
void)
65 static TypeId tid = TypeId (
"ns3::EpcEnbApplication")
66 .SetParent<Object> ();
76 delete m_s1SapProvider;
82 : m_lteSocket (lteSocket),
83 m_s1uSocket (s1uSocket),
84 m_enbS1uAddress (enbS1uAddress),
85 m_sgwS1uAddress (sgwS1uAddress),
132 EpcEnbApplication::DoInitialUeMessage (uint64_t imsi, uint16_t rnti)
141 EpcEnbApplication::DoPathSwitchRequest (EpcEnbS1SapProvider::PathSwitchRequestParameters params)
144 uint16_t enbUeS1Id = params.rnti;
145 uint64_t mmeUeS1Id = params.mmeUeS1Id;
146 uint64_t imsi = mmeUeS1Id;
150 uint16_t gci = params.cellId;
151 std::list<EpcS1apSapMme::ErabSwitchedInDownlinkItem> erabToBeSwitchedInDownlinkList;
152 for (std::list<EpcEnbS1SapProvider::BearerToBeSwitched>::iterator bit = params.bearersToBeSwitched.begin ();
153 bit != params.bearersToBeSwitched.end ();
157 flowId.m_rnti = params.rnti;
158 flowId.m_bid = bit->epsBearerId;
159 uint32_t teid = bit->teid;
161 EpsFlowId_t rbid (params.rnti, bit->epsBearerId);
166 EpcS1apSapMme::ErabSwitchedInDownlinkItem erab;
167 erab.erabId = bit->epsBearerId;
169 erab.enbTeid = bit->teid;
171 erabToBeSwitchedInDownlinkList.push_back (erab);
177 EpcEnbApplication::DoUeContextRelease (uint16_t rnti)
180 std::map<uint16_t, std::map<uint8_t, uint32_t> >::iterator rntiIt =
m_rbidTeidMap.find (rnti);
183 for (std::map<uint8_t, uint32_t>::iterator bidIt = rntiIt->second.begin ();
184 bidIt != rntiIt->second.end ();
187 uint32_t teid = bidIt->second;
195 EpcEnbApplication::DoInitialContextSetupRequest (uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<EpcS1apSapEnb::ErabToBeSetupItem> erabToBeSetupList)
199 for (std::list<EpcS1apSapEnb::ErabToBeSetupItem>::iterator erabIt = erabToBeSetupList.begin ();
200 erabIt != erabToBeSetupList.end ();
205 uint64_t imsi = mmeUeS1Id;
206 std::map<uint64_t, uint16_t>::iterator imsiIt =
m_imsiRntiMap.find (imsi);
208 uint16_t rnti = imsiIt->second;
210 struct EpcEnbS1SapUser::DataRadioBearerSetupRequestParameters params;
212 params.bearer = erabIt->erabLevelQosParameters;
213 params.bearerId = erabIt->erabId;
214 params.gtpTeid = erabIt->sgwTeid;
217 EpsFlowId_t rbid (rnti, erabIt->erabId);
226 EpcEnbApplication::DoPathSwitchRequestAcknowledge (uint64_t enbUeS1Id, uint64_t mmeUeS1Id, uint16_t gci, std::list<EpcS1apSapEnb::ErabSwitchedInUplinkItem> erabToBeSwitchedInUplinkList)
230 uint64_t imsi = mmeUeS1Id;
231 std::map<uint64_t, uint16_t>::iterator imsiIt =
m_imsiRntiMap.find (imsi);
233 uint16_t rnti = imsiIt->second;
234 EpcEnbS1SapUser::PathSwitchRequestAcknowledgeParameters params;
236 m_s1SapUser->PathSwitchRequestAcknowledge (params);
253 uint16_t rnti = tag.GetRnti ();
254 uint8_t bid = tag.GetBid ();
255 NS_LOG_LOGIC (
"received packet with RNTI=" << (uint32_t) rnti <<
", BID=" << (uint32_t) bid);
256 std::map<uint16_t, std::map<uint8_t, uint32_t> >::iterator rntiIt =
m_rbidTeidMap.find (rnti);
259 NS_LOG_WARN (
"UE context not found, discarding packet");
263 std::map<uint8_t, uint32_t>::iterator bidIt = rntiIt->second.find (bid);
264 NS_ASSERT (bidIt != rntiIt->second.end ());
265 uint32_t teid = bidIt->second;
278 uint32_t teid = gtpu.GetTeid ();
279 std::map<uint32_t, EpsFlowId_t>::iterator it =
m_teidRbidMap.find (teid);
308 gtpu.SetLength (packet->
GetSize () + gtpu.GetSerializedSize () - 8);
uint32_t RemoveHeader(Header &header)
#define NS_LOG_FUNCTION(parameters)
EpcEnbApplication(Ptr< Socket > lteSocket, Ptr< Socket > s1uSocket, Ipv4Address enbS1uAddress, Ipv4Address sgwS1uAddress, uint16_t cellId)
virtual void DataRadioBearerSetupRequest(DataRadioBearerSetupRequestParameters params)=0
Ipv4Address m_enbS1uAddress
void AddPacketTag(const Tag &tag) const
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
Ipv4Address m_sgwS1uAddress
uint32_t GetSize(void) const
Ptr< Socket > m_lteSocket
void SendToLteSocket(Ptr< Packet > packet, uint16_t rnti, uint8_t bid)
EpcS1apSapEnb * GetS1apSapEnb()
void SendToS1uSocket(Ptr< Packet > packet, uint32_t teid)
void SetS1SapUser(EpcEnbS1SapUser *s)
EpcS1apSapMme * m_s1apSapMme
This class implements a tag that carries an address of a packet across the socket interface...
virtual void PathSwitchRequest(uint64_t enbUeS1Id, uint64_t mmeUeS1Id, uint16_t gci, std::list< ErabSwitchedInDownlinkItem > erabToBeSwitchedInDownlinkList)=0
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
void SetRecvCallback(Callback< void, Ptr< Socket > >)
Notify application when new data is available to be read.
#define NS_LOG_LOGIC(msg)
virtual ~EpcEnbApplication(void)
void RecvFromLteSocket(Ptr< Socket > socket)
virtual Ptr< Packet > Recv(uint32_t maxSize, uint32_t flags)=0
Read data from the socket.
EpcEnbS1SapProvider * GetS1SapProvider()
void RecvFromS1uSocket(Ptr< Socket > socket)
EpcEnbS1SapUser * m_s1SapUser
std::map< uint32_t, EpsFlowId_t > m_teidRbidMap
#define NS_ASSERT_MSG(condition, message)
Ipv4 addresses are stored in host order in this class.
virtual void InitialUeMessage(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, uint64_t imsi, uint16_t ecgi)=0
bool RemovePacketTag(Tag &tag)
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer.
EpcS1apSapEnb * m_s1apSapEnb
void SetS1apSapMme(EpcS1apSapMme *s)
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
std::map< uint16_t, std::map< uint8_t, uint32_t > > m_rbidTeidMap
std::map< uint64_t, uint16_t > m_imsiRntiMap
Ptr< Socket > m_s1uSocket
void AddHeader(const Header &header)
EpcEnbS1SapProvider * m_s1SapProvider