23 #include "ns3/fatal-error.h"
25 #include "ns3/abort.h"
26 #include "ns3/pointer.h"
27 #include "ns3/object-map.h"
28 #include "ns3/object-factory.h"
29 #include "ns3/simulator.h"
46 #include <ns3/simulator.h>
100 "INITIAL_RANDOM_ACCESS",
102 "CONNECTION_REJECTED",
103 "CONNECTED_NORMALLY",
104 "CONNECTION_RECONFIGURATION",
105 "CONNECTION_REESTABLISHMENT",
106 "HANDOVER_PREPARATION",
108 "HANDOVER_PATH_SWITCH",
134 : m_lastAllocatedDrbid (0),
137 m_lastRrcTransactionIdentifier (0),
140 m_pendingRrcConnectionReconfiguration (false),
143 m_needTransmissionModeConfiguration (false)
168 Ptr<LteRlc> rlc = CreateObject<LteRlcTm> ()->GetObject<LteRlc> ();
173 m_srb0 = CreateObject<LteSignalingRadioBearerInfo> ();
190 Ptr<LteRlc> rlc = CreateObject<LteRlcAm> ()->GetObject<LteRlc> ();
202 m_srb1 = CreateObject<LteSignalingRadioBearerInfo> ();
240 Time maxConnectionDelay;
282 .AddConstructor<UeManager> ()
283 .AddAttribute (
"DataRadioBearerMap",
"List of UE DataRadioBearerInfo by DRBID.",
286 MakeObjectMapChecker<LteDataRadioBearerInfo> ())
287 .AddAttribute (
"Srb0",
"SignalingRadioBearerInfo for SRB0",
290 MakePointerChecker<LteSignalingRadioBearerInfo> ())
291 .AddAttribute (
"Srb1",
"SignalingRadioBearerInfo for SRB1",
294 MakePointerChecker<LteSignalingRadioBearerInfo> ())
295 .AddAttribute (
"C-RNTI",
296 "Cell Radio Network Temporary Identifier",
300 MakeUintegerChecker<uint16_t> ())
301 .AddTraceSource (
"StateTransition",
302 "fired upon every UE state transition seen by the UeManager at the eNB RRC",
330 NS_ASSERT_MSG ( bearerId == 0 || bid == bearerId,
"bearer ID mismatch (" << (uint32_t) bid <<
" != " << (uint32_t) bearerId <<
", the assumption that ID are allocated in the same way by MME and RRC is not valid any more");
342 x2uTeidInfo.
drbid = drbid;
343 std::pair<std::map<uint32_t, LteEnbRrc::X2uTeidInfo>::iterator,
bool>
344 ret =
m_rrc->
m_x2uTeidInfoMap.insert (std::pair<uint32_t, LteEnbRrc::X2uTeidInfo> (gtpTeid, x2uTeidInfo));
345 NS_ASSERT_MSG (ret.second ==
true,
"overwriting a pre-existing entry in m_x2uTeidInfoMap");
356 drbInfo->
m_rlc = rlc;
430 std::map <uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator drbIt =
m_drbMap.find (*drbIdIt);
432 drbIt->second->m_rlc->Initialize ();
433 if (drbIt->second->m_pdcp)
435 drbIt->second->m_pdcp->Initialize ();
447 std::map <uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator it =
m_drbMap.find (drbid);
448 NS_ASSERT_MSG (it !=
m_drbMap.end (),
"request to remove radio bearer with unknown drbid " << drbid);
591 if (0 != drbIt->second->m_rlc->GetObject<
LteRlcAm> ())
637 NS_LOG_LOGIC (
"queueing data on PDCP for transmission over the air");
650 NS_LOG_LOGIC (
"forwarding data to target eNB over X2-U");
667 std::vector<EpcX2Sap::ErabToBeSetupItem>
671 std::vector<EpcX2Sap::ErabToBeSetupItem> ret;
677 etbsi.
erabId = it->second->m_epsBearerIdentity;
681 etbsi.
gtpTeid = it->second->m_gtpTeid;
682 ret.push_back (etbsi);
694 NS_LOG_INFO (
"Send UE CONTEXT RELEASE from target eNB to source eNB");
718 NS_LOG_INFO (
"target eNB sent HO preparation failure, aborting HO");
732 for (std::vector<EpcX2Sap::ErabsSubjectToStatusTransferItem>::iterator erabIt
850 NS_LOG_INFO (
"Send PATH SWITCH REQUEST to the MME");
862 b.
teid = it->second->m_gtpTeid;
982 const uint8_t MAX_DRB_ID = 32;
985 drbid = (drbid + 1) % MAX_DRB_ID)
1007 std::map<uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator it =
m_drbMap.find (drbid);
1017 std::map <uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator it =
m_drbMap.find (drbid);
1018 NS_ASSERT_MSG (it !=
m_drbMap.end (),
"request to remove radio bearer with unknown drbid " << drbid);
1055 dtam.
rlcConfig = it->second->m_rlcConfig;
1161 : m_x2SapProvider (0),
1162 m_cmacSapProvider (0),
1164 m_macSapProvider (0),
1165 m_s1SapProvider (0),
1166 m_cphySapProvider (0),
1167 m_configured (false),
1168 m_lastAllocatedRnti (0),
1169 m_srsCurrentPeriodicityId (0),
1170 m_lastAllocatedConfigurationIndex (0),
1171 m_reconfigureUes (false)
1208 .AddConstructor<LteEnbRrc> ()
1209 .AddAttribute (
"UeMap",
"List of UeManager by C-RNTI.",
1212 MakeObjectMapChecker<UeManager> ())
1213 .AddAttribute (
"DefaultTransmissionMode",
1214 "The default UEs' transmission mode (0: SISO)",
1217 MakeUintegerChecker<uint8_t> ())
1218 .AddAttribute (
"EpsBearerToRlcMapping",
1219 "Specify which type of RLC will be used for each type of EPS bearer. ",
1226 .AddAttribute (
"SystemInformationPeriodicity",
1227 "The interval for sending system information (Time value)",
1231 .AddAttribute (
"SrsPeriodicity",
1232 "The SRS periodicity in milliseconds",
1236 MakeUintegerChecker<uint32_t> ())
1237 .AddAttribute (
"AdmitHandoverRequest",
1238 "Whether to admit an X2 handover request from another eNB",
1241 MakeBooleanChecker ())
1242 .AddAttribute (
"AdmitRrcConnectionRequest",
1243 "Whether to admit a connection request from a Ue",
1246 MakeBooleanChecker ())
1247 .AddTraceSource (
"NewUeContext",
1248 "trace fired upon creation of a new UE context",
1250 .AddTraceSource (
"ConnectionEstablished",
1251 "trace fired upon successful RRC connection establishment",
1253 .AddTraceSource (
"ConnectionReconfiguration",
1254 "trace fired upon RRC connection reconfiguration",
1256 .AddTraceSource (
"HandoverStart",
1257 "trace fired upon start of a handover procedure",
1259 .AddTraceSource (
"HandoverEndOk",
1260 "trace fired upon successful termination of a handover procedure",
1347 std::map<uint16_t, Ptr<UeManager> >::iterator it =
m_ueMap.find (rnti);
1389 NS_ASSERT_MSG (found,
"no EpsBearerTag found in packet to be sent");
1515 if (anrcrv.
valid ==
false)
1517 NS_LOG_INFO (
this <<
"failed to allocate a preamble for non-contention based RA => cannot accept HO");
1519 NS_FATAL_ERROR (
"should trigger HO Preparation Failure, but it is not implemented");
1533 for (std::vector <EpcX2Sap::ErabToBeSetupItem>::iterator it = req.
bearers.begin ();
1537 ueManager->
SetupDataRadioBearer (it->erabLevelQosParameters, it->erabId, it->gtpTeid, it->transportLayerAddress);
1564 ackParams.
rrcContext = encodedHandoverCommand;
1566 NS_LOG_LOGIC (
"Send X2 message: HANDOVER REQUEST ACK");
1581 NS_LOG_LOGIC (
"Recv X2 message: HANDOVER REQUEST ACK");
1598 NS_LOG_LOGIC (
"Recv X2 message: HANDOVER PREPARATION FAILURE");
1650 NS_ASSERT (
"Processing of LOAD INFORMATION X2 message IS NOT IMPLEMENTED");
1658 NS_LOG_LOGIC (
"Recv X2 message: RESOURCE STATUS UPDATE");
1662 NS_ASSERT (
"Processing of RESOURCE STATUS UPDATE X2 message IS NOT IMPLEMENTED");
1670 NS_LOG_LOGIC (
"Recv UE DATA FORWARDING through X2 interface");
1677 std::map<uint32_t, X2uTeidInfo>::iterator
1730 NS_ASSERT_MSG (found,
"no more RNTIs available (do you have more than 65535 UEs in a cell?)");
1732 Ptr<UeManager> ueManager = CreateObject<UeManager> (
this, rnti, state);
1744 std::map <uint16_t, Ptr<UeManager> >::iterator it =
m_ueMap.find (rnti);
1746 uint16_t srsCi = (*it).second->GetSrsConfigurationIndex ();
1814 std::ostringstream allowedValues;
1819 NS_FATAL_ERROR (
"illecit SRS periodicity value " << p <<
". Allowed values: " << allowedValues.str ());
1843 <<
") for current SRS periodicity "
1845 <<
", consider increasing the value of ns3::LteEnbRrc::SrsPeriodicity");
1860 if ((*rit) <
g_srsCiHigh[m_srsCurrentPeriodicityId])
1898 if (bearer.
IsGbr ())