src/lte/model/epc-sgw-pgw-application.cc
changeset 11168 d09129217e78
parent 10652 dc18deba4502
child 11169 5101180376fd
--- 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