23 #include "epc-sgw-pgw-application.h"
25 #include "ns3/mac48-address.h"
27 #include "ns3/inet-socket-address.h"
28 #include "ns3/epc-gtpu-header.h"
29 #include "ns3/abort.h"
41 EpcSgwPgwApplication::UeInfo::UeInfo ()
50 m_teidByBearerIdMap[bearerId] = teid;
51 return m_tftClassifier.Add (tft, teid);
61 return m_tftClassifier.Classify (p, EpcTft::DOWNLINK);
94 EpcSgwPgwApplication::GetTypeId (
void)
139 pCopy->RemoveHeader (ipv4Header);
144 std::map<Ipv4Address, Ptr<UeInfo> >::iterator it =
m_ueInfoByAddrMap.find (ueAddr);
152 uint32_t teid = it->second->Classify (packet);
155 NS_LOG_WARN (
"no matching bearer for this packet");
165 const bool succeeded =
true;
177 uint32_t teid = gtpu.GetTeid ();
227 enbInfo.enbAddr = enbAddr;
228 enbInfo.sgwAddr = sgwAddr;
229 m_enbInfoByCellId[cellId] = enbInfo;
247 ueit->second->SetUeAddr (ueAddr);
254 std::map<uint64_t, Ptr<UeInfo> >::iterator ueit =
m_ueInfoByImsiMap.find (req.imsi);
256 uint16_t cellId = req.uli.gci;
257 std::map<uint16_t, EnbInfo>::iterator enbit = m_enbInfoByCellId.find (cellId);
258 NS_ASSERT_MSG (enbit != m_enbInfoByCellId.end (),
"unknown CellId " << cellId);
260 ueit->second->SetEnbAddr (enbAddr);
265 for (std::list<EpcS11SapSgw::BearerContextToBeCreated>::iterator bit = req.bearerContextsToBeCreated.begin ();
266 bit != req.bearerContextsToBeCreated.end ();
273 uint32_t teid = ++m_teidCount;
274 ueit->second->AddBearer (bit->tft, bit->epsBearerId, teid);
277 bearerContext.sgwFteid.teid = teid;
278 bearerContext.sgwFteid.address = enbit->second.sgwAddr;
279 bearerContext.epsBearerId = bit->epsBearerId;
280 bearerContext.bearerLevelQos = bit->bearerLevelQos;
281 bearerContext.tft = bit->tft;
282 res.bearerContextsCreated.push_back (bearerContext);
289 EpcSgwPgwApplication::DoModifyBearerRequest (EpcS11SapSgw::ModifyBearerRequestMessage req)
292 uint64_t imsi = req.teid;
295 uint16_t cellId = req.uli.gci;
296 std::map<uint16_t, EnbInfo>::iterator enbit = m_enbInfoByCellId.find (cellId);
297 NS_ASSERT_MSG (enbit != m_enbInfoByCellId.end (),
"unknown CellId " << cellId);
298 Ipv4Address enbAddr = enbit->second.enbAddr;
299 ueit->second->SetEnbAddr (enbAddr);
301 EpcS11SapMme::ModifyBearerResponseMessage res;
303 res.cause = EpcS11SapMme::ModifyBearerResponseMessage::REQUEST_ACCEPTED;
uint32_t RemoveHeader(Header &header)
smart pointer class similar to boost::intrusive_ptr
#define NS_LOG_FUNCTION(parameters)
void SetS11SapMme(EpcS11SapMme *s)
EpcS11SapMme * m_s11SapMme
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
uint32_t GetSize(void) const
bool Receive(Ptr< Packet > packet, uint16_t protocol, const Address &source, const Address &destination, PacketType packetType)
void SendToTunDevice(Ptr< Packet > packet, uint32_t teid)
a polymophic address class
virtual Address GetAddress(void) const
bool RecvFromTunDevice(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber)
Ptr< VirtualNetDevice > m_tunDevice
std::map< uint64_t, Ptr< UeInfo > > m_ueInfoByImsiMap
void SetUeAddr(Ipv4Address addr)
virtual void ModifyBearerResponse(ModifyBearerResponseMessage msg)=0
uint32_t Classify(Ptr< Packet > p)
This class implements a tag that carries an address of a packet across the socket interface...
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)
#define NS_ABORT_IF(cond)
Abnormal program termination if cond is true.
Ptr< Packet > Copy(void) const
void AddBearer(Ptr< EpcTft > tft, uint8_t epsBearerId, uint32_t teid)
virtual Ptr< Packet > Recv(uint32_t maxSize, uint32_t flags)=0
Read data from the socket.
void SetUeAddress(uint64_t imsi, Ipv4Address ueAddr)
Callback< R > MakeNullCallback(void)
void AddUe(uint64_t imsi)
void SendToS1uSocket(Ptr< Packet > packet, Ipv4Address enbS1uAddress, uint32_t teid)
#define NS_ASSERT_MSG(condition, message)
Ptr< Socket > m_s1uSocket
std::map< Ipv4Address, Ptr< UeInfo > > m_ueInfoByAddrMap
Ipv4 addresses are stored in host order in this class.
virtual void CreateSessionResponse(CreateSessionResponseMessage msg)=0
void SetEnbAddr(Ipv4Address addr)
bool RemovePacketTag(Tag &tag)
EpcS11SapSgw * GetS11SapSgw()
void RecvFromS1uSocket(Ptr< Socket > socket)
virtual ~EpcSgwPgwApplication(void)
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer.
a base class which provides memory management and object aggregation
EpcS11SapSgw * m_s11SapSgw
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
void AddEnb(uint16_t cellId, Ipv4Address enbAddr, Ipv4Address sgwAddr)
void AddHeader(const Header &header)
EpcSgwPgwApplication(const Ptr< VirtualNetDevice > tunDevice, const Ptr< Socket > s1uSocket)