src/lte/model/lte-enb-rrc.cc
changeset 9599 fc4c980050f2
parent 9593 d1da1374c434
child 9601 869b6ed3ad40
equal deleted inserted replaced
9598:5bc54db84485 9599:fc4c980050f2
   271   m_rrc->m_cphySapProvider->RemoveUe (m_rnti);
   271   m_rrc->m_cphySapProvider->RemoveUe (m_rnti);
   272   if (m_rrc->m_s1SapProvider != 0)
   272   if (m_rrc->m_s1SapProvider != 0)
   273     {
   273     {
   274       m_rrc->m_s1SapProvider->UeContextRelease (m_rnti);
   274       m_rrc->m_s1SapProvider->UeContextRelease (m_rnti);
   275     }
   275     }
       
   276   // delete eventual X2-U TEIDs
       
   277   for (std::map <uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator it = m_drbMap.begin ();
       
   278        it != m_drbMap.end ();
       
   279        ++it)
       
   280     {
       
   281       m_rrc->m_x2uTeidInfoMap.erase (it->second->m_gtpTeid);
       
   282     }    
   276 }
   283 }
   277 
   284 
   278 TypeId UeManager::GetTypeId (void)
   285 TypeId UeManager::GetTypeId (void)
   279 {
   286 {
   280   static TypeId  tid = TypeId ("ns3::UeManager")
   287   static TypeId  tid = TypeId ("ns3::UeManager")
   318   drbInfo->m_drbIdentity = drbid;
   325   drbInfo->m_drbIdentity = drbid;
   319   drbInfo->m_logicalChannelIdentity = lcid;
   326   drbInfo->m_logicalChannelIdentity = lcid;
   320   drbInfo->m_gtpTeid = gtpTeid;
   327   drbInfo->m_gtpTeid = gtpTeid;
   321   drbInfo->m_transportLayerAddress = transportLayerAddress;
   328   drbInfo->m_transportLayerAddress = transportLayerAddress;
   322 
   329 
       
   330   if (m_state == HANDOVER_JOINING)
       
   331     {
       
   332       // setup TEIDs for receiving data eventually forwarded over X2-U 
       
   333       LteEnbRrc::X2uTeidInfo x2uTeidInfo;
       
   334       x2uTeidInfo.rnti = m_rnti;
       
   335       x2uTeidInfo.drbid = drbid;
       
   336       std::pair<std::map<uint32_t, LteEnbRrc::X2uTeidInfo>::iterator, bool>
       
   337         ret = m_rrc->m_x2uTeidInfoMap.insert (std::pair<uint32_t, LteEnbRrc::X2uTeidInfo> (gtpTeid, x2uTeidInfo));
       
   338       NS_ASSERT_MSG (ret.second == true, "overwriting a pre-existing entry in m_x2uTeidInfoMap");
       
   339     }
       
   340 
   323   TypeId rlcTypeId = m_rrc->GetRlcType (bearer);
   341   TypeId rlcTypeId = m_rrc->GetRlcType (bearer);
   324 
   342 
   325   ObjectFactory rlcObjectFactory;
   343   ObjectFactory rlcObjectFactory;
   326   rlcObjectFactory.SetTypeId (rlcTypeId);
   344   rlcObjectFactory.SetTypeId (rlcTypeId);
   327   Ptr<LteRlc> rlc = rlcObjectFactory.Create ()->GetObject<LteRlc> ();
   345   Ptr<LteRlc> rlc = rlcObjectFactory.Create ()->GetObject<LteRlc> ();
   419 {
   437 {
   420   NS_LOG_FUNCTION (this << (uint32_t) m_rnti << (uint32_t) drbid);
   438   NS_LOG_FUNCTION (this << (uint32_t) m_rnti << (uint32_t) drbid);
   421   uint8_t lcid = Drbid2Lcid (drbid);
   439   uint8_t lcid = Drbid2Lcid (drbid);
   422   std::map <uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator it = m_drbMap.find (drbid);
   440   std::map <uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator it = m_drbMap.find (drbid);
   423   NS_ASSERT_MSG (it != m_drbMap.end (), "request to remove radio bearer with unknown drbid " << drbid);
   441   NS_ASSERT_MSG (it != m_drbMap.end (), "request to remove radio bearer with unknown drbid " << drbid);
       
   442 
       
   443   // first delete eventual X2-U TEIDs
       
   444   m_rrc->m_x2uTeidInfoMap.erase (it->second->m_gtpTeid);
       
   445 
   424   m_drbMap.erase (it);
   446   m_drbMap.erase (it);
   425   m_rrc->m_cmacSapProvider->ReleaseLc (m_rnti, lcid);
   447   m_rrc->m_cmacSapProvider->ReleaseLc (m_rnti, lcid);
   426 
   448 
   427   LteRrcSap::RadioResourceConfigDedicated rrcd;
   449   LteRrcSap::RadioResourceConfigDedicated rrcd;
   428   rrcd.havePhysicalConfigDedicated = false;
   450   rrcd.havePhysicalConfigDedicated = false;
   578 
   600 
   579 void
   601 void
   580 UeManager::SendData (uint8_t bid, Ptr<Packet> p)
   602 UeManager::SendData (uint8_t bid, Ptr<Packet> p)
   581 {
   603 {
   582   NS_LOG_FUNCTION (this << p << (uint16_t) bid);
   604   NS_LOG_FUNCTION (this << p << (uint16_t) bid);
   583   LtePdcpSapProvider::TransmitPdcpSduParameters params;
   605    switch (m_state)
   584   params.pdcpSdu = p;
   606     {
   585   params.rnti = m_rnti;
   607     case INITIAL_RANDOM_ACCESS:
   586   params.lcid = Bid2Lcid (bid);
   608     case CONNECTION_SETUP:
   587   uint8_t drbid = Bid2Drbid (bid);
   609       NS_LOG_WARN ("not connected, discarding packet");
   588   LtePdcpSapProvider* pdcpSapProvider = GetDataRadioBearerInfo (drbid)->m_pdcp->GetLtePdcpSapProvider ();
   610       return;
   589   pdcpSapProvider->TransmitPdcpSdu (params);
   611       break;      
       
   612       
       
   613     case CONNECTED_NORMALLY:      
       
   614     case CONNECTION_RECONFIGURATION:
       
   615     case CONNECTION_REESTABLISHMENT:
       
   616     case HANDOVER_PREPARATION:
       
   617     case HANDOVER_JOINING:
       
   618     case HANDOVER_PATH_SWITCH:
       
   619       {
       
   620         NS_LOG_LOGIC ("queueing data on PDCP for transmission over the air");
       
   621         LtePdcpSapProvider::TransmitPdcpSduParameters params;
       
   622         params.pdcpSdu = p;
       
   623         params.rnti = m_rnti;
       
   624         params.lcid = Bid2Lcid (bid);
       
   625         uint8_t drbid = Bid2Drbid (bid);
       
   626         LtePdcpSapProvider* pdcpSapProvider = GetDataRadioBearerInfo (drbid)->m_pdcp->GetLtePdcpSapProvider ();
       
   627         pdcpSapProvider->TransmitPdcpSdu (params);
       
   628       }
       
   629       break;
       
   630       
       
   631     case HANDOVER_LEAVING:
       
   632       {
       
   633         NS_LOG_LOGIC ("forwarding data to target eNB over X2-U");
       
   634         uint8_t drbid = Bid2Drbid (bid);        
       
   635         EpcX2Sap::UeDataParams params;
       
   636         params.sourceCellId = m_rrc->m_cellId;
       
   637         params.targetCellId = m_targetCellId;
       
   638         params.gtpTeid = GetDataRadioBearerInfo (drbid)->m_gtpTeid;
       
   639         params.ueData = p;
       
   640         m_rrc->m_x2SapProvider->SendUeData (params);
       
   641       }      
       
   642       break;
       
   643       
       
   644     default:
       
   645       NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state));
       
   646       break;      
       
   647     }
   590 }
   648 }
   591 
   649 
   592 std::vector<EpcX2Sap::ErabToBeSetupItem>   
   650 std::vector<EpcX2Sap::ErabToBeSetupItem>   
   593 UeManager::GetErabList ()
   651 UeManager::GetErabList ()
   594 {
   652 {
  1575   NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
  1633   NS_LOG_LOGIC ("targetCellId = " << params.targetCellId);
  1576   NS_LOG_LOGIC ("gtpTeid = " << params.gtpTeid);
  1634   NS_LOG_LOGIC ("gtpTeid = " << params.gtpTeid);
  1577   NS_LOG_LOGIC ("ueData = " << params.ueData);
  1635   NS_LOG_LOGIC ("ueData = " << params.ueData);
  1578   NS_LOG_LOGIC ("ueData size = " << params.ueData->GetSize ());
  1636   NS_LOG_LOGIC ("ueData size = " << params.ueData->GetSize ());
  1579 
  1637 
  1580   NS_ASSERT ("Processing of UE DATA FORWARDING through X2 interface IS NOT IMPLEMENTED");
  1638   std::map<uint32_t, X2uTeidInfo>::iterator 
       
  1639     teidInfoIt = m_x2uTeidInfoMap.find (params.gtpTeid);
       
  1640   if (teidInfoIt != m_x2uTeidInfoMap.end ())    
       
  1641     {
       
  1642       GetUeManager (teidInfoIt->second.rnti)->SendData (teidInfoIt->second.drbid, params.ueData);
       
  1643     }
       
  1644   else
       
  1645     {
       
  1646       NS_FATAL_ERROR ("X2-U data received but no X2uTeidInfo found");
       
  1647     }
  1581 }
  1648 }
  1582 
  1649 
  1583 
  1650 
  1584 uint16_t 
  1651 uint16_t 
  1585 LteEnbRrc::DoAllocateTemporaryCellRnti ()
  1652 LteEnbRrc::DoAllocateTemporaryCellRnti ()