--- a/src/lte/model/epc-sgw-pgw-application.cc Sun Jun 15 08:54:48 2014 -0700
+++ b/src/lte/model/epc-sgw-pgw-application.cc Thu Nov 27 16:01:05 2014 +0100
@@ -51,6 +51,13 @@
return m_tftClassifier.Add (tft, teid);
}
+void
+EpcSgwPgwApplication::UeInfo::RemoveBearer (uint8_t bearerId)
+{
+ NS_LOG_FUNCTION (this << bearerId);
+ m_teidByBearerIdMap.erase (bearerId);
+}
+
uint32_t
EpcSgwPgwApplication::UeInfo::Classify (Ptr<Packet> p)
{
@@ -144,7 +151,7 @@
std::map<Ipv4Address, Ptr<UeInfo> >::iterator it = m_ueInfoByAddrMap.find (ueAddr);
if (it == m_ueInfoByAddrMap.end ())
{
- NS_LOG_WARN ("unknown UE address " << ueAddr) ;
+ NS_LOG_WARN ("unknown UE address " << ueAddr);
}
else
{
@@ -204,7 +211,7 @@
gtpu.SetLength (packet->GetSize () + gtpu.GetSerializedSize () - 8);
packet->AddHeader (gtpu);
uint32_t flags = 0;
- m_s1uSocket->SendTo (packet, flags, InetSocketAddress(enbAddr, m_gtpuUdpPort));
+ m_s1uSocket->SendTo (packet, flags, InetSocketAddress (enbAddr, m_gtpuUdpPort));
}
@@ -305,4 +312,44 @@
m_s11SapMme->ModifyBearerResponse (res);
}
-}; // namespace ns3
+void
+EpcSgwPgwApplication::DoDeleteBearerCommand (EpcS11SapSgw::DeleteBearerCommandMessage req)
+{
+ NS_LOG_FUNCTION (this << req.teid);
+ uint64_t imsi = req.teid; // trick to avoid the need for allocating TEIDs on the S11 interface
+ std::map<uint64_t, Ptr<UeInfo> >::iterator ueit = m_ueInfoByImsiMap.find (imsi);
+ NS_ASSERT_MSG (ueit != m_ueInfoByImsiMap.end (), "unknown IMSI " << imsi);
+
+ EpcS11SapMme::DeleteBearerRequestMessage res;
+ res.teid = imsi;
+
+ for (std::list<EpcS11SapSgw::BearerContextToBeRemoved>::iterator bit = req.bearerContextsToBeRemoved.begin ();
+ bit != req.bearerContextsToBeRemoved.end ();
+ ++bit)
+ {
+ EpcS11SapMme::BearerContextRemoved bearerContext;
+ bearerContext.epsBearerId = bit->epsBearerId;
+ res.bearerContextsRemoved.push_back (bearerContext);
+ }
+ //schedules Delete Bearer Request towards MME
+ m_s11SapMme->DeleteBearerRequest (res);
+}
+
+void
+EpcSgwPgwApplication::DoDeleteBearerResponse (EpcS11SapSgw::DeleteBearerResponseMessage req)
+{
+ NS_LOG_FUNCTION (this << req.teid);
+ uint64_t imsi = req.teid; // trick to avoid the need for allocating TEIDs on the S11 interface
+ std::map<uint64_t, Ptr<UeInfo> >::iterator ueit = m_ueInfoByImsiMap.find (imsi);
+ NS_ASSERT_MSG (ueit != m_ueInfoByImsiMap.end (), "unknown IMSI " << imsi);
+
+ for (std::list<EpcS11SapSgw::BearerContextRemovedSgwPgw>::iterator bit = req.bearerContextsRemoved.begin ();
+ bit != req.bearerContextsRemoved.end ();
+ ++bit)
+ {
+ //Function to remove de-activated bearer contexts from S-Gw and P-Gw side
+ ueit->second->RemoveBearer (bit->epsBearerId);
+ }
+}
+
+} // namespace ns3