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 () |