28 #include <ns3/fatal-error.h>
30 #include <ns3/lte-pdcp.h>
31 #include <ns3/lte-radio-bearer-info.h>
32 #include <ns3/lte-rlc-am.h>
33 #include <ns3/lte-rlc-tm.h>
34 #include <ns3/lte-rlc-um.h>
35 #include <ns3/lte-rlc.h>
36 #include <ns3/object-factory.h>
37 #include <ns3/object-map.h>
38 #include <ns3/simulator.h>
100 "IDLE_CAMPED_NORMALLY",
102 "IDLE_RANDOM_ACCESS",
104 "CONNECTED_NORMALLY",
105 "CONNECTED_HANDOVER",
106 "CONNECTED_PHY_PROBLEM",
107 "CONNECTED_REESTABLISHING",
117 : m_cmacSapProvider(0),
118 m_rrcSapUser(nullptr),
119 m_macSapProvider(nullptr),
120 m_asSapUser(nullptr),
121 m_ccmRrcSapProvider(nullptr),
127 m_connectionPending(false),
128 m_hasReceivedMib(false),
129 m_hasReceivedSib1(false),
130 m_hasReceivedSib2(false),
132 m_noOfSyncIndications(0),
133 m_leaveConnectedMode(false),
135 m_connEstFailCountLimit(0),
136 m_connEstFailCount(0),
185 .AddAttribute(
"DataRadioBearerMap",
186 "List of UE RadioBearerInfo for Data Radio Bearers by LCID.",
189 MakeObjectMapChecker<LteDataRadioBearerInfo>())
190 .AddAttribute(
"Srb0",
191 "SignalingRadioBearerInfo for SRB0",
194 MakePointerChecker<LteSignalingRadioBearerInfo>())
195 .AddAttribute(
"Srb1",
196 "SignalingRadioBearerInfo for SRB1",
199 MakePointerChecker<LteSignalingRadioBearerInfo>())
200 .AddAttribute(
"CellId",
201 "Serving cell identifier",
204 MakeUintegerChecker<uint16_t>())
205 .AddAttribute(
"C-RNTI",
206 "Cell Radio Network Temporary Identifier",
209 MakeUintegerChecker<uint16_t>())
212 "Timer for the RRC Connection Establishment procedure "
213 "(i.e., the procedure is deemed as failed if it takes longer than this). "
214 "Standard values: 100ms, 200ms, 300ms, 400ms, 600ms, 1000ms, 1500ms, 2000ms",
221 "Timer for detecting the Radio link failure "
222 "(i.e., the radio link is deemed as failed if this timer expires). "
223 "Standard values: 0ms 50ms, 100ms, 200ms, 500ms, 1000ms, 2000ms",
230 "This specifies the maximum number of out-of-sync indications. "
231 "Standard values: 1, 2, 3, 4, 6, 8, 10, 20",
234 MakeUintegerChecker<uint8_t>(1, 20))
237 "This specifies the maximum number of in-sync indications. "
238 "Standard values: 1, 2, 3, 4, 5, 6, 8, 10",
241 MakeUintegerChecker<uint8_t>(1, 10))
242 .AddTraceSource(
"MibReceived",
243 "trace fired upon reception of Master Information Block",
245 "ns3::LteUeRrc::MibSibHandoverTracedCallback")
246 .AddTraceSource(
"Sib1Received",
247 "trace fired upon reception of System Information Block Type 1",
249 "ns3::LteUeRrc::MibSibHandoverTracedCallback")
250 .AddTraceSource(
"Sib2Received",
251 "trace fired upon reception of System Information Block Type 2",
253 "ns3::LteUeRrc::ImsiCidRntiTracedCallback")
254 .AddTraceSource(
"StateTransition",
255 "trace fired upon every UE RRC state transition",
257 "ns3::LteUeRrc::StateTracedCallback")
258 .AddTraceSource(
"InitialCellSelectionEndOk",
259 "trace fired upon successful initial cell selection procedure",
261 "ns3::LteUeRrc::CellSelectionTracedCallback")
262 .AddTraceSource(
"InitialCellSelectionEndError",
263 "trace fired upon failed initial cell selection procedure",
265 "ns3::LteUeRrc::CellSelectionTracedCallback")
266 .AddTraceSource(
"RandomAccessSuccessful",
267 "trace fired upon successful completion of the random access procedure",
269 "ns3::LteUeRrc::ImsiCidRntiTracedCallback")
270 .AddTraceSource(
"RandomAccessError",
271 "trace fired upon failure of the random access procedure",
273 "ns3::LteUeRrc::ImsiCidRntiTracedCallback")
274 .AddTraceSource(
"ConnectionEstablished",
275 "trace fired upon successful RRC connection establishment",
277 "ns3::LteUeRrc::ImsiCidRntiTracedCallback")
278 .AddTraceSource(
"ConnectionTimeout",
279 "trace fired upon timeout RRC connection establishment because of T300",
281 "ns3::LteUeRrc::ImsiCidRntiCountTracedCallback")
282 .AddTraceSource(
"ConnectionReconfiguration",
283 "trace fired upon RRC connection reconfiguration",
285 "ns3::LteUeRrc::ImsiCidRntiTracedCallback")
286 .AddTraceSource(
"HandoverStart",
287 "trace fired upon start of a handover procedure",
289 "ns3::LteUeRrc::MibSibHandoverTracedCallback")
290 .AddTraceSource(
"HandoverEndOk",
291 "trace fired upon successful termination of a handover procedure",
293 "ns3::LteUeRrc::ImsiCidRntiTracedCallback")
294 .AddTraceSource(
"HandoverEndError",
295 "trace fired upon failure of a handover procedure",
297 "ns3::LteUeRrc::ImsiCidRntiTracedCallback")
298 .AddTraceSource(
"SCarrierConfigured",
299 "trace fired after configuring secondary carriers",
301 "ns3::LteUeRrc::SCarrierConfiguredTracedCallback")
302 .AddTraceSource(
"Srb1Created",
303 "trace fired after SRB1 is created",
305 "ns3::LteUeRrc::ImsiCidRntiTracedCallback")
306 .AddTraceSource(
"DrbCreated",
307 "trace fired after DRB is created",
309 "ns3::LteUeRrc::ImsiCidRntiLcIdTracedCallback")
310 .AddTraceSource(
"RadioLinkFailure",
311 "trace fired upon failure of radio link",
313 "ns3::LteUeRrc::ImsiCidRntiTracedCallback")
316 "trace fired upon receiving in Sync or out of Sync indications from UE PHY",
318 "ns3::LteUeRrc::PhySyncDetectionTracedCallback");
472 if (cellId == cphySap->GetCellId())
541 m_srb0 = CreateObject<LteSignalingRadioBearerInfo>();
543 m_srb0->m_srbIdentity = 0;
563 if (m_numberOfComponentCarriers < MIN_NO_CC || m_numberOfComponentCarriers >
MAX_NO_CC)
592 std::map<uint8_t, Ptr<LteDataRadioBearerInfo>>::iterator it =
m_drbMap.find(drbid);
598 params.lcid = it->second->m_logicalChannelIdentity;
600 NS_LOG_LOGIC(
this <<
" RNTI=" <<
m_rnti <<
" sending packet " << packet <<
" on DRBID "
601 << (uint32_t)drbid <<
" (LCID " << (uint32_t)
params.lcid <<
")"
602 <<
" (" << packet->
GetSize() <<
" bytes)");
603 it->second->m_pdcp->GetLtePdcpSapProvider()->TransmitPdcpSdu(
params);
682 std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt;
879 "Cell identity in SIB1 does not match with the originating cell");
894 "Cell identity in SIB1 does not match with the originating cell");
917 bool triggering =
true;
918 std::vector<LteUeCphySapUser::UeMeasurementsElement>::iterator newMeasIt;
919 for (newMeasIt =
params.m_ueMeasurementsList.begin();
920 newMeasIt !=
params.m_ueMeasurementsList.end();
923 if (
params.m_componentCarrierId != 0)
932 params.m_componentCarrierId);
944 std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt;
997 rc.connEstFailCount =
1002 <<
"of connEstFailCount");
1040 "Sync indications should be zero "
1041 "when a new RRC connection is established. Current value = "
1056 NS_LOG_INFO(
"DoRecvRrcConnectionReconfiguration haveNonCriticalExtension:"
1074 cmacSapProvider->Reset();
1078 cphySapProvider->Reset();
1093 "handover is only supported with non-contention-based random access procedure");
1116 <<
" Handover. Configuring secondary carriers");
1245 uint16_t maxRsrpCellId = 0;
1246 double maxRsrp = -std::numeric_limits<double>::infinity();
1247 double minRsrp = -140.0;
1249 std::map<uint16_t, MeasValues>::iterator it;
1256 if (maxRsrp < it->
second.rsrp && it->second.rsrp > minRsrp)
1258 std::set<uint16_t>::const_iterator itCell;
1262 maxRsrpCellId = it->first;
1263 maxRsrp = it->second.rsrp;
1268 if (maxRsrpCellId == 0)
1270 NS_LOG_WARN(
this <<
" Cell search is unable to detect surrounding cell to attach to");
1275 <<
" is the strongest untried surrounding cell");
1293 bool isSuitableCell =
false;
1294 bool isAcceptableCell =
false;
1295 std::map<uint16_t, MeasValues>::iterator storedMeasIt =
m_storedMeasValues.find(cellId);
1296 double qRxLevMeas = storedMeasIt->second.rsrp;
1299 NS_LOG_LOGIC(
this <<
" cell selection to cellId=" << cellId <<
" qrxlevmeas=" << qRxLevMeas
1301 <<
" qrxlevmin=" << qRxLevMin <<
" dBm");
1303 if (qRxLevMeas - qRxLevMin > 0)
1305 isAcceptableCell =
true;
1310 isSuitableCell = (cellCsgIndication ==
false) || (cellCsgId ==
m_csgWhiteList);
1313 <<
"/" << cellCsgIndication);
1348 if (isAcceptableCell)
1379 uint8_t ccId = scell.sCellIndex;
1381 uint16_t physCellId = scell.cellIdentification.physCellId;
1383 scell.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulBandwidth;
1385 scell.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulCarrierFreq;
1386 uint16_t dlBand = scell.radioResourceConfigCommonSCell.nonUlConfiguration.dlBandwidth;
1387 uint32_t dlEarfcn = scell.cellIdentification.dlCarrierFreq;
1388 uint8_t txMode = scell.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell
1389 .antennaInfo.transmissionMode;
1390 uint16_t srsIndex = scell.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell
1391 .soundingRsUlConfigDedicated.srsConfigIndex;
1397 scell.radioResourceConfigCommonSCell.nonUlConfiguration.pdschConfigCommon
1398 .referenceSignalPower);
1404 scell.radioResourceConfigDedicatedSCell.physicalConfigDedicatedSCell
1405 .pdschConfigDedicated;
1438 std::list<LteRrcSap::SrbToAddMod>::const_iterator stamIt = rrcd.
srbToAddModList.begin();
1446 NS_ASSERT_MSG(stamIt->srbIdentity == 1,
"only SRB1 supported");
1448 const uint8_t lcid = 1;
1457 pdcp->SetLcId(lcid);
1462 m_srb1 = CreateObject<LteSignalingRadioBearerInfo>();
1465 m_srb1->m_srbIdentity = 1;
1468 m_srb1->m_logicalChannelConfig.priority = stamIt->logicalChannelConfig.priority;
1469 m_srb1->m_logicalChannelConfig.prioritizedBitRateKbps =
1470 stamIt->logicalChannelConfig.prioritizedBitRateKbps;
1471 m_srb1->m_logicalChannelConfig.bucketSizeDurationMs =
1472 stamIt->logicalChannelConfig.bucketSizeDurationMs;
1473 m_srb1->m_logicalChannelConfig.logicalChannelGroup =
1474 stamIt->logicalChannelConfig.logicalChannelGroup;
1477 lcConfig.
priority = stamIt->logicalChannelConfig.priority;
1494 NS_LOG_INFO(
"request to modify SRB1 (skipping as currently not implemented)");
1499 std::list<LteRrcSap::DrbToAddMod>::const_iterator dtamIt;
1503 << (uint32_t)dtamIt->drbIdentity <<
" LC "
1504 << (uint32_t)dtamIt->logicalChannelIdentity);
1506 "LCID value " << dtamIt->logicalChannelIdentity <<
" is reserved for SRBs");
1508 std::map<uint8_t, Ptr<LteDataRadioBearerInfo>>::iterator drbMapIt =
1509 m_drbMap.find(dtamIt->drbIdentity);
1521 switch (dtamIt->rlcConfig.choice)
1542 rlc->
SetLcId(dtamIt->logicalChannelIdentity);
1545 drbInfo->m_rlc = rlc;
1546 drbInfo->m_epsBearerIdentity = dtamIt->epsBearerIdentity;
1547 drbInfo->m_logicalChannelIdentity = dtamIt->logicalChannelIdentity;
1548 drbInfo->m_drbIdentity = dtamIt->drbIdentity;
1556 pdcp->SetLcId(dtamIt->logicalChannelIdentity);
1560 drbInfo->m_pdcp = pdcp;
1571 lcConfig.
priority = dtamIt->logicalChannelConfig.priority;
1578 << (uint16_t)dtamIt->logicalChannelIdentity);
1580 std::vector<LteUeCcmRrcSapProvider::LcsConfig> lcOnCcMapping =
1585 NS_LOG_DEBUG(
"Size of lcOnCcMapping vector " << lcOnCcMapping.size());
1586 std::vector<LteUeCcmRrcSapProvider::LcsConfig>::iterator itLcOnCcMapping =
1587 lcOnCcMapping.begin();
1589 "Component carrier manager failed to add LC for data radio bearer");
1591 for (itLcOnCcMapping = lcOnCcMapping.begin(); itLcOnCcMapping != lcOnCcMapping.end();
1595 << (uint16_t)itLcOnCcMapping->lcConfig.logicalChannelGroup
1596 <<
" ComponentCarrierId "
1597 << (uint16_t)itLcOnCcMapping->componentCarrierId);
1598 uint8_t index = itLcOnCcMapping->componentCarrierId;
1600 itLcOnCcMapping->lcConfig;
1618 std::list<uint8_t>::iterator dtdmIt;
1621 uint8_t drbid = *dtdmIt;
1622 NS_LOG_INFO(
this <<
" IMSI " <<
m_imsi <<
" releasing DRB " << (uint32_t)drbid);
1623 std::map<uint8_t, Ptr<LteDataRadioBearerInfo>>::iterator it =
m_drbMap.find(drbid);
1647 uint8_t measObjectId = *it;
1648 NS_LOG_LOGIC(
this <<
" deleting measObjectId " << (uint32_t)measObjectId);
1650 std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt =
1654 if (measIdIt->second.measObjectId == measObjectId)
1656 uint8_t measId = measIdIt->second.measId;
1658 NS_LOG_LOGIC(
this <<
" deleting measId " << (uint32_t)measId
1659 <<
" because referring to measObjectId "
1660 << (uint32_t)measObjectId);
1678 NS_ASSERT_MSG(it->measObjectEutra.cellsToRemoveList.empty(),
1679 "cellsToRemoveList not supported");
1680 NS_ASSERT_MSG(it->measObjectEutra.cellsToAddModList.empty(),
1681 "cellsToAddModList not supported");
1682 NS_ASSERT_MSG(it->measObjectEutra.cellsToRemoveList.empty(),
1683 "blackCellsToRemoveList not supported");
1684 NS_ASSERT_MSG(it->measObjectEutra.blackCellsToAddModList.empty(),
1685 "blackCellsToAddModList not supported");
1686 NS_ASSERT_MSG(it->measObjectEutra.haveCellForWhichToReportCGI ==
false,
1687 "cellForWhichToReportCGI is not supported");
1689 uint8_t measObjectId = it->measObjectId;
1690 std::map<uint8_t, LteRrcSap::MeasObjectToAddMod>::iterator measObjectIt =
1694 NS_LOG_LOGIC(
"measObjectId " << (uint32_t)measObjectId <<
" exists, updating entry");
1695 measObjectIt->second = *it;
1696 for (std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt =
1701 if (measIdIt->second.measObjectId == measObjectId)
1703 uint8_t measId = measIdIt->second.measId;
1704 NS_LOG_LOGIC(
this <<
" found measId " << (uint32_t)measId
1705 <<
" referring to measObjectId " << (uint32_t)measObjectId);
1712 NS_LOG_LOGIC(
"measObjectId " << (uint32_t)measObjectId <<
" is new, adding entry");
1722 uint8_t reportConfigId = *it;
1723 NS_LOG_LOGIC(
this <<
" deleting reportConfigId " << (uint32_t)reportConfigId);
1725 std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt =
1729 if (measIdIt->second.reportConfigId == reportConfigId)
1731 uint8_t measId = measIdIt->second.measId;
1733 NS_LOG_LOGIC(
this <<
" deleting measId " << (uint32_t)measId
1734 <<
" because referring to reportConfigId "
1735 << (uint32_t)reportConfigId);
1748 for (std::list<LteRrcSap::ReportConfigToAddMod>::iterator it =
1755 "only trigger type EVENT is supported");
1757 uint8_t reportConfigId = it->reportConfigId;
1758 std::map<uint8_t, LteRrcSap::ReportConfigToAddMod>::iterator reportConfigIt =
1762 NS_LOG_LOGIC(
"reportConfigId " << (uint32_t)reportConfigId
1763 <<
" exists, updating entry");
1765 for (std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt =
1770 if (measIdIt->second.reportConfigId == reportConfigId)
1772 uint8_t measId = measIdIt->second.measId;
1773 NS_LOG_LOGIC(
this <<
" found measId " << (uint32_t)measId
1774 <<
" referring to reportConfigId "
1775 << (uint32_t)reportConfigId);
1782 NS_LOG_LOGIC(
"reportConfigId " << (uint32_t)reportConfigId <<
" is new, adding entry");
1806 for (std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt =
1820 uint8_t measId = *it;
1821 NS_LOG_LOGIC(
this <<
" deleting measId " << (uint32_t)measId);
1831 for (std::list<LteRrcSap::MeasIdToAddMod>::iterator it = mc.
measIdToAddModList.begin();
1835 NS_LOG_LOGIC(
this <<
" measId " << (uint32_t)it->measId
1836 <<
" (measObjectId=" << (uint32_t)it->measObjectId
1837 <<
", reportConfigId=" << (uint32_t)it->reportConfigId <<
")");
1843 std::map<uint8_t, VarMeasReport>::iterator measReportIt =
1847 measReportIt->second.periodicReportTimer.Cancel();
1851 ->second.reportConfigEutra.triggerType !=
1855 std::list<PendingTrigger_t> s;
1880 bool useLayer3Filtering,
1881 uint8_t componentCarrierId)
1883 NS_LOG_FUNCTION(
this << cellId << +componentCarrierId << rsrp << rsrq << useLayer3Filtering);
1885 std::map<uint16_t, MeasValues>::iterator storedMeasIt =
m_storedMeasValues.find(cellId);
1889 if (useLayer3Filtering)
1895 if (std::isnan(storedMeasIt->second.rsrq))
1898 storedMeasIt->second.rsrq = rsrq;
1902 storedMeasIt->second.rsrq =
1909 storedMeasIt->second.rsrp = rsrp;
1910 storedMeasIt->second.rsrq = rsrq;
1921 std::pair<uint16_t, MeasValues> val(cellId, v);
1922 std::pair<std::map<uint16_t, MeasValues>::iterator,
bool> ret =
1924 NS_ASSERT_MSG(ret.second ==
true,
"element already existed");
1925 storedMeasIt = ret.first;
1929 << cellId <<
", carrier component Id " << componentCarrierId <<
", new RSRP "
1930 << rsrp <<
" stored " << storedMeasIt->second.rsrp <<
", new RSRQ " << rsrq
1931 <<
" stored " << storedMeasIt->second.rsrq);
1940 std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt =
1943 NS_ASSERT(measIdIt->first == measIdIt->second.measId);
1945 std::map<uint8_t, LteRrcSap::ReportConfigToAddMod>::iterator reportConfigIt =
1950 std::map<uint8_t, LteRrcSap::MeasObjectToAddMod>::iterator measObjectIt =
1955 std::map<uint8_t, VarMeasReport>::iterator measReportIt =
m_varMeasReportList.find(measId);
1961 "only triggerType == event is supported");
1964 NS_LOG_LOGIC(
this <<
" considering measId " << (uint32_t)measId);
1965 bool eventEntryCondApplicable =
false;
1966 bool eventLeavingCondApplicable =
false;
1977 uint16_t servingCellId = 0;
1980 if (cphySapProvider->GetDlEarfcn() == measObjectEutra.
carrierFreq)
1982 servingCellId = cphySapProvider->GetCellId();
1986 if (servingCellId == 0)
1991 switch (reportConfigEutra.
eventId)
2026 bool entryCond = ms - hys > thresh;
2030 if (!isMeasIdInReportList)
2032 concernedCellsEntry.push_back(servingCellId);
2033 eventEntryCondApplicable =
true;
2041 NS_ASSERT(measReportIt->second.cellsTriggeredList.find(servingCellId) !=
2042 measReportIt->second.cellsTriggeredList.end());
2051 bool leavingCond = ms + hys < thresh;
2055 if (isMeasIdInReportList)
2062 measReportIt->second.cellsTriggeredList.end());
2063 concernedCellsLeaving.push_back(
m_cellId);
2064 eventLeavingCondApplicable =
true;
2072 NS_LOG_LOGIC(
this <<
" event A1: serving cell " << servingCellId <<
" ms=" << ms
2073 <<
" thresh=" << thresh <<
" entryCond=" << entryCond
2074 <<
" leavingCond=" << leavingCond);
2112 bool entryCond = ms + hys < thresh;
2116 if (!isMeasIdInReportList)
2118 concernedCellsEntry.push_back(servingCellId);
2119 eventEntryCondApplicable =
true;
2127 NS_ASSERT(measReportIt->second.cellsTriggeredList.find(servingCellId) !=
2128 measReportIt->second.cellsTriggeredList.end());
2137 bool leavingCond = ms - hys > thresh;
2141 if (isMeasIdInReportList)
2147 NS_ASSERT(measReportIt->second.cellsTriggeredList.find(servingCellId) !=
2148 measReportIt->second.cellsTriggeredList.end());
2149 concernedCellsLeaving.push_back(servingCellId);
2150 eventLeavingCondApplicable =
true;
2158 NS_LOG_LOGIC(
this <<
" event A2: serving cell " << servingCellId <<
" ms=" << ms
2159 <<
" thresh=" << thresh <<
" entryCond=" << entryCond
2160 <<
" leavingCond=" << leavingCond);
2173 double ofn = measObjectEutra
2177 double ofp = measObjectEutra
2203 for (std::map<uint16_t, MeasValues>::iterator storedMeasIt =
m_storedMeasValues.begin();
2207 uint16_t cellId = storedMeasIt->first;
2223 mn = storedMeasIt->second.rsrp;
2226 mn = storedMeasIt->second.rsrq;
2234 isMeasIdInReportList && (measReportIt->second.cellsTriggeredList.find(cellId) !=
2235 measReportIt->second.cellsTriggeredList.end());
2238 bool entryCond = mn + ofn + ocn - hys > mp + ofp + ocp + off;
2244 concernedCellsEntry.push_back(cellId);
2245 eventEntryCondApplicable =
true;
2254 bool leavingCond = mn + ofn + ocn + hys < mp + ofp + ocp + off;
2260 concernedCellsLeaving.push_back(cellId);
2261 eventLeavingCondApplicable =
true;
2269 NS_LOG_LOGIC(
this <<
" event A3: neighbor cell " << cellId <<
" mn=" << mn
2270 <<
" mp=" << mp <<
" offset=" << off <<
" entryCond=" << entryCond
2271 <<
" leavingCond=" << leavingCond);
2286 double ofn = measObjectEutra
2311 for (std::map<uint16_t, MeasValues>::iterator storedMeasIt =
m_storedMeasValues.begin();
2315 uint16_t cellId = storedMeasIt->first;
2324 mn = storedMeasIt->second.rsrp;
2327 mn = storedMeasIt->second.rsrq;
2335 isMeasIdInReportList && (measReportIt->second.cellsTriggeredList.find(cellId) !=
2336 measReportIt->second.cellsTriggeredList.end());
2339 bool entryCond = mn + ofn + ocn - hys > thresh;
2345 concernedCellsEntry.push_back(cellId);
2346 eventEntryCondApplicable =
true;
2355 bool leavingCond = mn + ofn + ocn + hys < thresh;
2361 concernedCellsLeaving.push_back(cellId);
2362 eventLeavingCondApplicable =
true;
2370 NS_LOG_LOGIC(
this <<
" event A4: neighbor cell " << cellId <<
" mn=" << mn
2371 <<
" thresh=" << thresh <<
" entryCond=" << entryCond
2372 <<
" leavingCond=" << leavingCond);
2389 double ofn = measObjectEutra
2424 bool entryCond = mp + hys < thresh1;
2428 for (std::map<uint16_t, MeasValues>::iterator storedMeasIt =
m_storedMeasValues.begin();
2432 uint16_t cellId = storedMeasIt->first;
2441 mn = storedMeasIt->second.rsrp;
2444 mn = storedMeasIt->second.rsrq;
2452 isMeasIdInReportList && (measReportIt->second.cellsTriggeredList.find(cellId) !=
2453 measReportIt->second.cellsTriggeredList.end());
2457 entryCond = mn + ofn + ocn - hys > thresh2;
2463 concernedCellsEntry.push_back(cellId);
2464 eventEntryCondApplicable =
true;
2472 NS_LOG_LOGIC(
this <<
" event A5: neighbor cell " << cellId <<
" mn=" << mn
2473 <<
" mp=" << mp <<
" thresh2=" << thresh2
2474 <<
" thresh1=" << thresh1 <<
" entryCond=" << entryCond);
2482 <<
" thresh1=" << thresh1 <<
" entryCond=" << entryCond);
2490 if (isMeasIdInReportList)
2493 bool leavingCond = mp - hys > thresh1;
2501 for (std::map<uint16_t, MeasValues>::iterator storedMeasIt =
2506 uint16_t cellId = storedMeasIt->first;
2512 if (measReportIt->second.cellsTriggeredList.find(cellId) !=
2513 measReportIt->second.cellsTriggeredList.end())
2515 concernedCellsLeaving.push_back(cellId);
2516 eventLeavingCondApplicable =
true;
2524 for (std::map<uint16_t, MeasValues>::iterator storedMeasIt =
2529 uint16_t cellId = storedMeasIt->first;
2535 if (measReportIt->second.cellsTriggeredList.find(cellId) !=
2536 measReportIt->second.cellsTriggeredList.end())
2541 mn = storedMeasIt->second.rsrp;
2544 mn = storedMeasIt->second.rsrq;
2553 leavingCond = mn + ofn + ocn + hys < thresh2;
2565 concernedCellsLeaving.push_back(cellId);
2566 eventLeavingCondApplicable =
true;
2568 NS_LOG_LOGIC(
this <<
" event A5: neighbor cell " << cellId
2569 <<
" mn=" << mn <<
" mp=" << mp
2570 <<
" thresh2=" << thresh2 <<
" thresh1=" << thresh1
2571 <<
" leavingCond=" << leavingCond);
2581 <<
" thresh1=" << thresh1 <<
" leavingCond=" << leavingCond);
2593 for (std::map<uint16_t, MeasValues>::iterator storedMeasIt =
2598 uint16_t cellId = storedMeasIt->first;
2604 if (measReportIt->second.cellsTriggeredList.find(cellId) !=
2605 measReportIt->second.cellsTriggeredList.end())
2610 mn = storedMeasIt->second.rsrp;
2613 mn = storedMeasIt->second.rsrq;
2621 leavingCond = mn + ofn + ocn + hys < thresh2;
2625 concernedCellsLeaving.push_back(cellId);
2626 eventLeavingCondApplicable =
true;
2629 NS_LOG_LOGIC(
this <<
" event A5: neighbor cell " << cellId <<
" mn=" << mn
2630 <<
" mp=" << mp <<
" thresh2=" << thresh2 <<
" thresh1="
2631 << thresh1 <<
" leavingCond=" << leavingCond);
2652 NS_LOG_LOGIC(
this <<
" eventEntryCondApplicable=" << eventEntryCondApplicable
2653 <<
" eventLeavingCondApplicable=" << eventLeavingCondApplicable);
2655 if (eventEntryCondApplicable)
2670 concernedCellsEntry);
2671 std::map<uint8_t, std::list<PendingTrigger_t>>::iterator enteringTriggerIt =
2674 enteringTriggerIt->second.push_back(t);
2678 if (eventLeavingCondApplicable)
2681 bool reportOnLeave =
2698 concernedCellsLeaving,
2700 std::map<uint8_t, std::list<PendingTrigger_t>>::iterator leavingTriggerIt =
2703 leavingTriggerIt->second.push_back(t);
2714 std::map<uint8_t, std::list<PendingTrigger_t>>::iterator it1 =
2718 if (!it1->second.empty())
2720 std::list<PendingTrigger_t>::iterator it2;
2721 for (it2 = it1->second.begin(); it2 != it1->second.end(); ++it2)
2724 NS_LOG_LOGIC(
this <<
" canceling entering time-to-trigger event at "
2729 it1->second.clear();
2738 std::map<uint8_t, std::list<PendingTrigger_t>>::iterator it1 =
2742 std::list<PendingTrigger_t>::iterator it2 = it1->second.begin();
2743 while (it2 != it1->second.end())
2747 ConcernedCells_t::iterator it3;
2748 for (it3 = it2->concernedCells.begin(); it3 != it2->concernedCells.end(); ++it3)
2752 it3 = it2->concernedCells.erase(it3);
2756 if (it2->concernedCells.empty())
2758 NS_LOG_LOGIC(
this <<
" canceling entering time-to-trigger event at "
2761 it2 = it1->second.erase(it2);
2775 std::map<uint8_t, std::list<PendingTrigger_t>>::iterator it1 =
2779 if (!it1->second.empty())
2781 std::list<PendingTrigger_t>::iterator it2;
2782 for (it2 = it1->second.begin(); it2 != it1->second.end(); ++it2)
2785 NS_LOG_LOGIC(
this <<
" canceling leaving time-to-trigger event at "
2790 it1->second.clear();
2799 std::map<uint8_t, std::list<PendingTrigger_t>>::iterator it1 =
2803 std::list<PendingTrigger_t>::iterator it2 = it1->second.begin();
2804 while (it2 != it1->second.end())
2808 ConcernedCells_t::iterator it3;
2809 for (it3 = it2->concernedCells.begin(); it3 != it2->concernedCells.end(); ++it3)
2813 it3 = it2->concernedCells.erase(it3);
2817 if (it2->concernedCells.empty())
2819 NS_LOG_LOGIC(
this <<
" canceling leaving time-to-trigger event at "
2822 it2 = it1->second.erase(it2);
2837 std::map<uint8_t, VarMeasReport>::iterator measReportIt =
m_varMeasReportList.find(measId);
2843 std::pair<uint8_t, VarMeasReport> val(measId, r);
2844 std::pair<std::map<uint8_t, VarMeasReport>::iterator,
bool> ret =
2846 NS_ASSERT_MSG(ret.second ==
true,
"element already existed");
2847 measReportIt = ret.first;
2852 for (ConcernedCells_t::const_iterator it = enteringCells.begin(); it != enteringCells.end();
2855 measReportIt->second.cellsTriggeredList.insert(*it);
2858 NS_ASSERT(!measReportIt->second.cellsTriggeredList.empty());
2861 if (!measReportIt->second.periodicReportTimer.IsRunning())
2863 measReportIt->second.numberOfReportsSent = 0;
2864 measReportIt->second.periodicReportTimer =
2871 std::map<uint8_t, std::list<PendingTrigger_t>>::iterator enteringTriggerIt =
2874 if (!enteringTriggerIt->second.empty())
2882 enteringTriggerIt->second.pop_front();
2884 if (!enteringTriggerIt->second.empty())
2891 for (ConcernedCells_t::const_iterator it = enteringCells.begin();
2892 it != enteringCells.end();
2909 std::map<uint8_t, VarMeasReport>::iterator measReportIt =
m_varMeasReportList.find(measId);
2912 for (ConcernedCells_t::const_iterator it = leavingCells.begin(); it != leavingCells.end(); ++it)
2914 measReportIt->second.cellsTriggeredList.erase(*it);
2923 if (measReportIt->second.cellsTriggeredList.empty())
2925 measReportIt->second.periodicReportTimer.Cancel();
2929 std::map<uint8_t, std::list<PendingTrigger_t>>::iterator leavingTriggerIt =
2932 if (!leavingTriggerIt->second.empty())
2940 leavingTriggerIt->second.pop_front();
2942 if (!leavingTriggerIt->second.empty())
2949 for (ConcernedCells_t::const_iterator it = leavingCells.begin();
2950 it != leavingCells.end();
2967 std::map<uint8_t, VarMeasReport>::iterator measReportIt =
m_varMeasReportList.find(measId);
2970 NS_LOG_LOGIC(
this <<
" deleting existing report for measId " << (uint16_t)measId);
2971 measReportIt->second.periodicReportTimer.Cancel();
2985 std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt =
2989 std::map<uint8_t, LteRrcSap::ReportConfigToAddMod>::iterator reportConfigIt =
2996 measResults.
measId = measId;
2998 std::map<uint8_t, VarMeasReport>::iterator measReportIt =
m_varMeasReportList.find(measId);
3001 NS_LOG_ERROR(
"no entry found in m_varMeasReportList for measId " << (uint32_t)measId);
3014 << servingMeasIt->second.rsrp
3018 << servingMeasIt->second.rsrq <<
" dB)");
3022 componentCarrierId++)
3030 measResultServFreq.
servFreqId = componentCarrierId;
3043 if (!(measReportIt->second.cellsTriggeredList.empty()))
3045 std::multimap<double, uint16_t> sortedNeighCells;
3046 for (std::set<uint16_t>::iterator cellsTriggeredIt =
3047 measReportIt->second.cellsTriggeredList.begin();
3048 cellsTriggeredIt != measReportIt->second.cellsTriggeredList.end();
3051 uint16_t cellId = *cellsTriggeredIt;
3054 std::map<uint16_t, MeasValues>::iterator neighborMeasIt =
3056 double triggerValue;
3060 triggerValue = neighborMeasIt->second.rsrp;
3063 triggerValue = neighborMeasIt->second.rsrq;
3069 sortedNeighCells.insert(std::pair<double, uint16_t>(triggerValue, cellId));
3073 std::multimap<double, uint16_t>::reverse_iterator sortedNeighCellsIt;
3075 for (sortedNeighCellsIt = sortedNeighCells.rbegin(), count = 0;
3076 sortedNeighCellsIt != sortedNeighCells.rend() &&
3078 ++sortedNeighCellsIt, ++count)
3080 uint16_t cellId = sortedNeighCellsIt->second;
3081 std::map<uint16_t, MeasValues>::iterator neighborMeasIt =
3094 << (uint32_t)measResultEutra.
physCellId <<
" RSRP "
3095 << (uint32_t)measResultEutra.
rsrpResult <<
" ("
3096 << neighborMeasIt->second.rsrp <<
" dBm)"
3097 <<
" RSRQ " << (uint32_t)measResultEutra.
rsrqResult <<
" ("
3098 << neighborMeasIt->second.rsrq <<
" dB)");
3105 NS_LOG_WARN(
this <<
" cellsTriggeredList is empty");
3113 measReportIt->second.numberOfReportsSent++;
3114 measReportIt->second.periodicReportTimer.Cancel();
3116 Time reportInterval;
3147 reportInterval =
Seconds(360);
3150 reportInterval =
Seconds(720);
3153 reportInterval =
Seconds(1800);
3156 reportInterval =
Seconds(3600);
3165 measReportIt->second.periodicReportTimer =
3192 std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt;
3269 std::map<uint8_t, uint8_t>::iterator it =
m_bid2DrbidMap.find(bid);
3296 NS_LOG_INFO(
"Starting initial cell selection after RLF");
3366 NS_LOG_INFO(
this <<
" Total Number of Sync indications from PHY "
3387 NS_LOG_DEBUG(
"The number of sync indication received by RRC from PHY: "
static uint8_t Dbm2RsrpRange(double dbm)
convert an RSRP value in dBm to the corresponding range as per 3GPP TS 36.133 section 9....
static double RsrpRange2Dbm(uint8_t range)
converts an RSRP range to dBm as per 3GPP TS 36.133 section 9.1.4 RSRP Measurement Report Mapping
static double RsrqRange2Db(uint8_t range)
converts an RSRQ range to dB as per 3GPP TS 36.133 section 9.1.7 RSRQ Measurement Report Mapping
static double IeValue2ActualQRxLevMin(int8_t qRxLevMinIeValue)
Returns the actual value of an Q-RxLevMin parameter.
static double IeValue2ActualHysteresis(uint8_t hysteresisIeValue)
Returns the actual value of a hysteresis parameter.
static uint8_t Db2RsrqRange(double db)
convert an RSRQ value in dB to the corresponding range as per 3GPP TS 36.133 section 9....
static double IeValue2ActualA3Offset(int8_t a3OffsetIeValue)
Returns the actual value of an a3-Offset parameter.
void Cancel()
This method is syntactic sugar for the ns3::Simulator::Cancel method.
bool IsRunning() const
This method is syntactic sugar for !IsExpired().
This class implements the Access Stratum (AS) Service Access Point (SAP), i.e., the interface between...
This class implements the Access Stratum (AS) Service Access Point (SAP), i.e., the interface between...
virtual void NotifyConnectionFailed()=0
Notify the NAS that RRC Connection Establishment failed.
virtual void NotifyConnectionSuccessful()=0
Notify the NAS that RRC Connection Establishment was successful.
virtual void NotifyConnectionReleased()=0
Notify the NAS that RRC Connection was released.
virtual void RecvData(Ptr< Packet > packet)=0
receive a data packet
Service Access Point (SAP) offered by the MAC to the RLC See Femto Forum MAC Scheduler Interface Spec...
Service Access Point (SAP) offered by the MAC to the RLC See Femto Forum MAC Scheduler Interface Spec...
static TypeId GetTypeId()
Get the type ID.
This abstract base class defines the API to interact with the Radio Link Control (LTE_RLC) in LTE,...
void SetLteRlcSapUser(LteRlcSapUser *s)
void SetRnti(uint16_t rnti)
void SetLteMacSapProvider(LteMacSapProvider *s)
LteMacSapUser * GetLteMacSapUser()
void SetLcId(uint8_t lcId)
LteRlcSapProvider * GetLteRlcSapProvider()
static TypeId GetTypeId()
Get the type ID.
static TypeId GetTypeId()
Get the type ID.
static double ConvertPdschConfigDedicated2Double(PdschConfigDedicated pdschConfigDedicated)
Convert PDSCH config dedicated function.
Service Access Point (SAP) offered by the UE component carrier manager to the UE RRC.
virtual std::vector< LteUeCcmRrcSapProvider::LcsConfig > AddLc(uint8_t lcId, LteUeCmacSapProvider::LogicalChannelConfig lcConfig, LteMacSapUser *msu)=0
add a new Logical Channel (LC)
virtual void Reset()=0
Reset LC maps.
virtual LteMacSapUser * ConfigureSignalBearer(uint8_t lcid, LteUeCmacSapProvider::LogicalChannelConfig lcConfig, LteMacSapUser *msu)=0
Add the Signal Bearer for a specific Ue in LteUeComponenCarrierManager.
Service Access Point (SAP) offered by the UE RRC to the UE CCM.
Service Access Point (SAP) offered by the UE MAC to the UE RRC.
Service Access Point (SAP) offered by the UE MAC to the UE RRC.
Service Access Point (SAP) offered by the UE PHY to the UE RRC for control purposes.
Service Access Point (SAP) offered by the UE PHY to the UE RRC for control purposes.
friend class MemberLteUeCcmRrcSapUser< LteUeRrc >
allow MemberLteUeCcmRrcSapUser<LteUeRrc> class friend access
void DoRecvRrcConnectionReconfiguration(LteRrcSap::RrcConnectionReconfiguration msg)
Part of the RRC protocol.
uint8_t m_lastRrcTransactionIdentifier
last RRC transaction identifier
bool m_connectionPending
True if a connection request by upper layers is pending.
bool m_hasReceivedSib1
True if SIB1 was received for the current cell.
void SendMeasurementReport(uint8_t measId)
Produce a proper measurement report from the given measurement identity's reporting entry in m_varMea...
std::map< uint8_t, std::list< PendingTrigger_t > > m_enteringTriggerQueue
List of triggers that were raised because entering condition have been true, but are still delayed fr...
void DoCompleteSetup(LteUeRrcSapProvider::CompleteSetupParameters params)
Part of the RRC protocol.
void DoNotifyOutOfSync()
Do notify out of sync function.
LteUeCcmRrcSapUser * GetLteCcmRrcSapUser()
Get the Component Carrier Management SAP offered by this RRC.
void DoRecvRrcConnectionReject(LteRrcSap::RrcConnectionReject msg)
Part of the RRC protocol.
uint16_t m_previousCellId
the cell id of the previous cell UE was attached to
Ptr< LteSignalingRadioBearerInfo > m_srb1Old
SRB1 configuration before RRC connection reconfiguration.
static TypeId GetTypeId()
Get the type ID.
void SwitchToState(State s)
Switch the UE RRC to the given state.
void DoDisconnect()
Disconnect function.
LteMacSapProvider * m_macSapProvider
MAC SAP provider.
void DoNotifyRandomAccessFailed()
Notify random access failed function.
TracedCallback< uint64_t, uint16_t, uint16_t, uint16_t > m_mibReceivedTrace
The MibReceived trace source.
LteUeCmacSapUser * GetLteUeCmacSapUser()
This function is overloaded to maintain backward compatibility.
void SetLteUeCmacSapProvider(LteUeCmacSapProvider *s)
set the CMAC SAP this RRC should interact with
uint64_t m_imsi
The unique UE identifier.
uint8_t m_n311
The 'N311' attribute.
Ptr< LteSignalingRadioBearerInfo > m_srb0
The Srb0 attribute.
uint8_t m_connEstFailCountLimit
the counter value for T300 timer expiration received from the eNB
LteUeCphySapUser * GetLteUeCphySapUser()
void DoConnect()
Connect function.
TracedCallback< uint64_t, uint16_t, uint16_t > m_handoverEndErrorTrace
The HandoverEndError trace source.
State
The states of the UE RRC entity.
@ CONNECTED_REESTABLISHING
TracedCallback< uint64_t, uint16_t, uint16_t, State, State > m_stateTransitionTrace
The StateTransition trace source.
VarMeasConfig m_varMeasConfig
Includes the accumulated configuration of the measurements to be performed by the UE.
friend class MemberLteUeRrcSapProvider< LteUeRrc >
allow MemberLteUeRrcSapProvider<LteUeRrc> class friend access
void ApplyMeasConfig(LteRrcSap::MeasConfig mc)
Update the current measurement configuration m_varMeasConfig.
LteRrcSap::PdschConfigDedicated m_pdschConfigDedicated
the PDSCH config dedicated
uint8_t m_n310
The 'N310' attribute.
void SetUseRlcSm(bool val)
TracedCallback< uint64_t, uint16_t > m_initialCellSelectionEndErrorTrace
The InitialCellSelectionEndError trace source.
EventId m_radioLinkFailureDetected
Time limit (given by m_t310) before the radio link is considered to have failed.
void DoRecvRrcConnectionReestablishmentReject(LteRrcSap::RrcConnectionReestablishmentReject msg)
Part of the RRC protocol.
void DoNotifyRandomAccessSuccessful()
Notify random access successful function.
LteUeRrcSapProvider * m_rrcSapProvider
RRC SAP provider.
void VarMeasReportListErase(uint8_t measId, ConcernedCells_t leavingCells, bool reportOnLeave)
Remove some cells from an existing reporting entry in m_varMeasReportList.
void DoRecvRrcConnectionSetup(LteRrcSap::RrcConnectionSetup msg)
Part of the RRC protocol.
void CancelLeavingTrigger(uint8_t measId)
Clear all the waiting triggers in m_leavingTriggerQueue which are associated with the given measureme...
bool m_leaveConnectedMode
true if UE NAS ask UE RRC to leave connected mode, e.g., after RLF, i.e.
void DoRecvRrcConnectionReestablishment(LteRrcSap::RrcConnectionReestablishment msg)
Part of the RRC protocol.
bool m_hasReceivedSib2
True if SIB2 was received for the current cell.
void SynchronizeToStrongestCell()
Go through the list of measurement results, choose the one with the strongest RSRP,...
std::map< uint8_t, uint8_t > m_bid2DrbidMap
bid to DR bid map
void SetLteUeCphySapProvider(LteUeCphySapProvider *s)
set the CPHY SAP this RRC should use to interact with the PHY
std::vector< LteUeCmacSapProvider * > m_cmacSapProvider
UE CMac SAP provider.
uint32_t m_dlEarfcn
Downlink carrier frequency.
LteUeCcmRrcSapProvider * m_ccmRrcSapProvider
Interface to the LteUeComponentCarrierManage instance.
void DoSetCsgWhiteList(uint32_t csgId)
Set CSG white list function.
void ApplyRadioResourceConfigDedicatedSecondaryCarrier(LteRrcSap::NonCriticalExtensionConfiguration nonCec)
Apply radio resource config dedicated secondary carrier.
LteAsSapProvider * GetAsSapProvider()
void DoSetTemporaryCellRnti(uint16_t rnti)
Set temporary cell rnti function.
void SetLteMacSapProvider(LteMacSapProvider *s)
set the MAC SAP provider.
TracedCallback< uint64_t, uint16_t, uint16_t > m_radioLinkFailureTrace
The 'RadioLinkFailure' trace source.
uint32_t m_ulEarfcn
Uplink carrier frequency.
TracedCallback< uint64_t, uint16_t, uint16_t > m_connectionEstablishedTrace
The ConnectionEstablished trace source.
uint8_t GetDlBandwidth() const
TracedCallback< uint64_t, uint16_t, uint16_t, uint16_t > m_sib1ReceivedTrace
The Sib1Received trace source.
TracedCallback< uint64_t, uint16_t, uint16_t > m_randomAccessErrorTrace
The RandomAccessError trace source.
uint32_t GetDlEarfcn() const
std::list< LteRrcSap::SCellToAddMod > m_sCellToAddModList
Secondary carriers.
LtePdcpSapUser * m_drbPdcpSapUser
DRB PDCP SAP user.
TracedCallback< Ptr< LteUeRrc >, std::list< LteRrcSap::SCellToAddMod > > m_sCarrierConfiguredTrace
The SCarrierConfigured trace source.
void DoStartCellSelection(uint32_t dlEarfcn)
Start cell selection function.
friend class MemberLteAsSapProvider< LteUeRrc >
allow MemberLteAsSapProvider<LteUeRrc> class friend access
bool m_useRlcSm
True if RLC SM is to be used, false if RLC UM/AM are to be used.
TracedCallback< uint64_t, uint16_t, uint16_t > m_handoverEndOkTrace
The HandoverEndOk trace source.
TracedCallback< uint64_t, uint16_t, uint16_t, std::string, uint8_t > m_phySyncDetectionTrace
The 'PhySyncDetection' trace source.
std::map< uint8_t, std::list< PendingTrigger_t > > m_leavingTriggerQueue
List of triggers that were raised because leaving condition have been true, but are still delayed fro...
Time m_t310
The 'T310' attribute.
friend class UeMemberLteUeCmacSapUser
allow UeMemberLteUeCmacSapUser class friend access
void RadioLinkFailureDetected()
Radio link failure detected function.
State m_state
The current UE RRC state.
std::vector< LteUeCphySapProvider * > m_cphySapProvider
UE CPhy SAP provider.
LteUeCcmRrcSapUser * m_ccmRrcSapUser
CCM RRC SAP user.
TracedCallback< uint64_t, uint16_t, uint16_t, uint8_t > m_drbCreatedTrace
The DrbCreated trace source.
uint16_t m_numberOfComponentCarriers
The number of component carriers.
std::map< uint8_t, VarMeasReport > m_varMeasReportList
The list of active reporting entries, indexed by the measurement identity which triggered the reporti...
std::vector< LteUeCmacSapUser * > m_cmacSapUser
UE CMac SAP user.
TracedCallback< uint64_t, uint16_t, uint16_t > m_srb1CreatedTrace
The Srb1Created trace source.
TracedCallback< uint64_t, uint16_t > m_initialCellSelectionEndOkTrace
The InitialCellSelectionEndOk trace source.
uint8_t GetUlBandwidth() const
void DoSendData(Ptr< Packet > packet, uint8_t bid)
Send data function.
LteAsSapProvider * m_asSapProvider
AS SAP provider.
uint16_t m_rnti
The C-RNTI attribute.
uint8_t m_noOfSyncIndications
number of in-sync or out-of-sync indications coming from PHY layer
uint16_t GetCellId() const
void DoSetNumberOfComponentCarriers(uint16_t noOfComponentCarriers)
RRC CCM SAP USER Method.
~LteUeRrc() override
Destructor.
void CancelEnteringTrigger(uint8_t measId)
Clear all the waiting triggers in m_enteringTriggerQueue which are associated with the given measurem...
std::map< uint16_t, MeasValues > m_storedMeasValues
Internal storage of the latest measurement results from all detected detected cells,...
void DoReportUeMeasurements(LteUeCphySapUser::UeMeasurementsParameters params)
Report UE measurements function.
LteUeRrcSapUser * m_rrcSapUser
RRC SAP user.
TracedCallback< uint64_t, uint16_t, uint16_t > m_connectionReconfigurationTrace
The ConnectionReconfiguration trace source.
void MeasurementReportTriggering(uint8_t measId)
Evaluate the reporting criteria of a measurement identity and invoke some reporting actions based on ...
void SaveUeMeasurements(uint16_t cellId, double rsrp, double rsrq, bool useLayer3Filtering, uint8_t componentCarrierId)
Keep the given measurement result as the latest measurement figures, to be utilised by UE RRC functio...
void SetLteCcmRrcSapProvider(LteUeCcmRrcSapProvider *s)
set the Component Carrier Management SAP this RRC should interact with
TracedCallback< uint64_t, uint16_t, uint16_t > m_sib2ReceivedTrace
The Sib2Received trace source.
void LeaveConnectedMode()
Leave connected mode method Resets the UE back to an appropriate state depending on the nature of cau...
uint32_t GetUlEarfcn() const
void VarMeasReportListClear(uint8_t measId)
Remove the reporting entry of the given measurement identity from m_varMeasReportList.
LteUeRrcSapProvider * GetLteUeRrcSapProvider()
std::map< uint8_t, Ptr< LteDataRadioBearerInfo > > m_drbMap
The DataRadioBearerMap attribute.
uint16_t m_cellId
The CellId attribute.
uint8_t m_connEstFailCount
the counter to count T300 timer expiration
void DoRecvMasterInformationBlock(uint16_t cellId, LteRrcSap::MasterInformationBlock msg)
Receive master information block function.
void DoReceivePdcpSdu(LtePdcpSapUser::ReceivePdcpSduParameters params)
Receive PDCP SDU function.
TracedCallback< uint64_t, uint16_t, uint16_t, uint8_t > m_connectionTimeoutTrace
The ConnectionTimeout trace source.
std::set< uint16_t > m_acceptableCell
List of cell ID of acceptable cells for cell selection that have been detected.
Time m_t300
The T300 attribute.
EventId m_connectionTimeout
Invokes ConnectionEstablishmentTimeout() if RRC connection establishment procedure for this UE takes ...
void VarMeasReportListAdd(uint8_t measId, ConcernedCells_t enteringCells)
Compose a new reporting entry of the given measurement identity, insert it into m_varMeasReportList,...
std::vector< LteUeCphySapUser * > m_cphySapUser
UE CPhy SAP user.
void ConnectionTimeout()
Invoked after timer T300 expires, notifying upper layers that RRC connection establishment procedure ...
bool m_hasReceivedMib
True if MIB was received for the current cell.
void DoRecvRrcConnectionRelease(LteRrcSap::RrcConnectionRelease msg)
Part of the RRC protocol.
std::list< uint16_t > ConcernedCells_t
List of cell IDs which are responsible for a certain trigger.
void EvaluateCellForSelection()
Performs cell selection evaluation to the current serving cell.
void DoRecvSystemInformationBlockType1(uint16_t cellId, LteRrcSap::SystemInformationBlockType1 msg)
Receive system information block type 1 function.
void StartConnection()
Start connection function.
void DoRecvSystemInformation(LteRrcSap::SystemInformation msg)
Part of the RRC protocol.
void DoNotifyInSync()
Do notify in sync function.
uint16_t m_ulBandwidth
Uplink bandwidth in RBs.
LteUeRrc()
create an RRC instance for use within an ue
uint32_t m_csgWhiteList
List of CSG ID which this UE entity has access to.
uint16_t GetPreviousCellId() const
Get the previous cell id.
void InitializeSap()
Initiaize SAP.
void DisposeOldSrb1()
Dispose old SRB1.
void DoInitialize() override
Initialize() implementation.
friend class LtePdcpSpecificLtePdcpSapUser< LteUeRrc >
allow LtePdcpSpecificLtePdcpSapUser<LteUeRrc> class friend access
TracedCallback< uint64_t, uint16_t, uint16_t > m_randomAccessSuccessfulTrace
The RandomAccessSuccessful trace source.
bool IsServingCell(uint16_t cellId) const
LteRrcSap::SystemInformationBlockType1 m_lastSib1
Stored content of the last SIB1 received.
static const std::string ToString(LteUeRrc::State s)
void SetAsSapUser(LteAsSapUser *s)
Set the AS SAP user to interact with the NAS entity.
void SetLteUeRrcSapUser(LteUeRrcSapUser *s)
set the RRC SAP this RRC should interact with
uint16_t m_dlBandwidth
Downlink bandwidth in RBs.
Ptr< LteSignalingRadioBearerInfo > m_srb1
The Srb1 attribute.
LteAsSapUser * m_asSapUser
AS SAP user.
void SetImsi(uint64_t imsi)
void DoForceCampedOnEnb(uint16_t cellId, uint32_t dlEarfcn)
Force camped on ENB function.
void DoDispose() override
Destructor implementation.
void StorePreviousCellId(uint16_t cellId)
Store the previous cell id.
void ResetRlfParams()
Reset radio link failure parameters.
void DoResetSyncIndicationCounter()
Do reset sync indication counter function.
void ApplyRadioResourceConfigDedicated(LteRrcSap::RadioResourceConfigDedicated rrcd)
Apply radio resource config dedicated.
uint8_t Bid2Drbid(uint8_t bid)
Bid 2 DR bid.
TracedCallback< uint64_t, uint16_t, uint16_t, uint16_t > m_handoverStartTrace
The HandoverStart trace source.
Part of the RRC protocol.
Part of the RRC protocol.
virtual void Setup(SetupParameters params)=0
Setup function.
virtual void SendRrcConnectionReconfigurationCompleted(RrcConnectionReconfigurationCompleted msg)=0
Send an RRCConnectionReconfigurationComplete message to the serving eNodeB during an RRC connection r...
virtual void SendMeasurementReport(MeasurementReport msg)=0
Send a MeasurementReport message to the serving eNodeB during a measurement reporting procedure (Sect...
virtual void SendIdealUeContextRemoveRequest(uint16_t rnti)=0
Send UE context remove request function.
virtual void SendRrcConnectionRequest(RrcConnectionRequest msg)=0
Send an _RRCConnectionRequest message to the serving eNodeB during an RRC connection establishment pr...
virtual void SendRrcConnectionSetupCompleted(RrcConnectionSetupCompleted msg)=0
Send an RRCConnectionSetupComplete message to the serving eNodeB during an RRC connection establishme...
Template for the implementation of the LteUeCphySapUser as a member of an owner class of type C to wh...
Instantiate subclasses of ns3::Object.
Ptr< Object > Create() const
Create an Object instance of the configured TypeId.
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory.
A base class which provides memory management and object aggregation.
void Initialize()
Invoke DoInitialize on all Objects aggregated to this one.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
uint32_t GetSize() const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Hold objects of type Ptr<T>.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static void Cancel(const EventId &id)
Set the cancel bit on this event: the event's associated function will not be invoked when it expires...
static EventId ScheduleNow(FUNC f, Ts &&... args)
Schedule an event to expire Now.
static Time GetDelayLeft(const EventId &id)
Get the remaining time until this event will execute.
Simulation virtual time values and global simulation resolution.
double GetSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
AttributeValue implementation for Time.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
UeMemberLteUeCmacSapUser class.
UeMemberLteUeCmacSapUser(LteUeRrc *rrc)
Constructor.
LteUeRrc * m_rrc
the RRC class
void SetTemporaryCellRnti(uint16_t rnti) override
void NotifyRandomAccessSuccessful() override
Notify the RRC that the MAC Random Access procedure completed successfully.
void NotifyRandomAccessFailed() override
Notify the RRC that the MAC Random Access procedure failed.
Hold an unsigned integer type.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
ObjectPtrContainerValue ObjectMapValue
ObjectMapValue is an alias for ObjectPtrContainerValue.
Ptr< const AttributeAccessor > MakeObjectMapAccessor(U T::*memberVariable)
MakeAccessorHelper implementation for ObjectVector.
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Time Seconds(double value)
Construct a Time in the indicated unit.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
static const Time UE_MEASUREMENT_REPORT_DELAY
Artificial delay of UE measurements procedure.
static const std::string g_ueRrcStateName[LteUeRrc::NUM_STATES]
Map each of UE RRC states to its string representation.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
params
Fit Fluctuating Two Ray model to the 3GPP TR 38.901 using the Anderson-Darling goodness-of-fit ##.
Parameters for LtePdcpSapProvider::TransmitPdcpSdu.
Parameters for LtePdcpSapUser::ReceivePdcpSdu.
uint8_t transmissionMode
transmission mode
uint16_t dlBandwidth
DL bandwidth.
uint16_t ulBandwidth
UL bandwidth.
uint32_t dlCarrierFreq
DL carrier frequency.
uint32_t ulCarrierFreq
UL carrier frequency.
int8_t qRxLevMin
INTEGER (-70..-22), actual value = IE value * 2 [dBm].
uint32_t ulCarrierFreq
UL carrier frequency.
uint16_t ulBandwidth
UL bandwidth.
std::list< uint8_t > measIdToRemoveList
measure ID to remove list
std::list< MeasObjectToAddMod > measObjectToAddModList
measure object to add mod list
std::list< uint8_t > reportConfigToRemoveList
report config to remove list
std::list< uint8_t > measObjectToRemoveList
measure object to remove list
bool haveMeasGapConfig
have measure gap config?
QuantityConfig quantityConfig
quantity config
bool haveSmeasure
have S measure?
bool haveSpeedStatePars
have speed state parameters?
std::list< ReportConfigToAddMod > reportConfigToAddModList
report config to add mod list
std::list< MeasIdToAddMod > measIdToAddModList
measure ID to add mod list
bool haveQuantityConfig
have quantity config?
MeasObjectEutra structure.
int8_t offsetFreq
offset frequency
uint32_t carrierFreq
carrier frequency
MeasResultEutra structure.
uint8_t rsrqResult
RSRQ result.
uint8_t rsrpResult
RSRP result.
bool haveRsrpResult
have RSRP result
bool haveRsrqResult
have RSRQ result?
uint16_t physCellId
Phy cell ID.
bool haveCgiInfo
have CGI info?
uint8_t rsrqResult
the RSRQ result
uint8_t rsrpResult
the RSRP result
uint8_t rsrpResult
the RSRP result
uint8_t rsrqResult
the RSRQ result
MeasResultServFreq structure.
bool haveMeasResultSCell
have measResultSCell?
bool haveMeasResultBestNeighCell
have measResultBestNeighCell?
uint16_t servFreqId
serving cell index
MeasResultSCell measResultSCell
SCell measurement results.
bool haveMeasResultNeighCells
have measure result neighbor cells
std::list< MeasResultEutra > measResultListEutra
measure result list eutra
bool haveMeasResultServFreqList
has measResultServFreqList-r10
std::list< MeasResultServFreq > measResultServFreqList
MeasResultServFreqList-r10.
MeasResultPCell measResultPCell
measurement result primary cell
MeasurementReport structure.
MeasResults measResults
measure results
MobilityControlInfo structure.
RachConfigDedicated rachConfigDedicated
RACH config dedicated.
bool haveRachConfigDedicated
Have RACH config dedicated?
uint16_t newUeIdentity
new UE identity
bool haveCarrierBandwidth
have carrier bandwidth?
bool haveCarrierFreq
have carrier frequency?
CarrierBandwidthEutra carrierBandwidth
carrier bandwidth
CarrierFreqEutra carrierFreq
carrier frequency
uint16_t targetPhysCellId
target Phy cell ID
NonCriticalExtensionConfiguration structure.
std::list< uint8_t > sCellToReleaseList
SCell to release list.
std::list< SCellToAddMod > sCellToAddModList
SCell to add mod list.
int8_t referenceSignalPower
INTEGER (-60..50),.
PdschConfigDedicated structure.
PhysicalConfigDedicated structure.
PdschConfigDedicated pdschConfigDedicated
PDSCH config dedicated.
bool haveAntennaInfoDedicated
have antenna info dedicated?
SoundingRsUlConfigDedicated soundingRsUlConfigDedicated
sounding RS UL config dedicated
bool haveSoundingRsUlConfigDedicated
have sounding RS UL config dedicated?
bool havePdschConfigDedicated
have PDSCH config dedicated?
AntennaInfoDedicated antennaInfo
antenna info
uint8_t numberOfRaPreambles
number of RA preambles
uint8_t filterCoefficientRSRQ
filter coefficient RSRQ
uint8_t filterCoefficientRSRP
filter coefficient RSRP
uint8_t raResponseWindowSize
RA response window size.
uint8_t preambleTransMax
preamble transmit maximum
TxFailParam txFailParam
txFailParams
PreambleInfo preambleInfo
preamble info
RaSupervisionInfo raSupervisionInfo
RA supervision info.
uint8_t raPreambleIndex
RA preamble index.
uint8_t raPrachMaskIndex
RA PRACH mask index.
RachConfigCommon rachConfigCommon
RACH config common.
PdschConfigCommon pdschConfigCommon
PDSCH config common.
RadioResourceConfigDedicated structure.
PhysicalConfigDedicated physicalConfigDedicated
physical config dedicated
std::list< uint8_t > drbToReleaseList
DRB to release list.
std::list< DrbToAddMod > drbToAddModList
DRB to add mod list.
std::list< SrbToAddMod > srbToAddModList
SRB to add mod list.
Specifies criteria for triggering of an E-UTRA measurement reporting event.
bool reportOnLeave
Indicates whether or not the UE shall initiate the measurement reporting procedure when the leaving c...
uint8_t maxReportCells
Maximum number of cells, excluding the serving cell, to be included in the measurement report.
@ RSRP
Reference Signal Received Power.
@ RSRQ
Reference Signal Received Quality.
uint8_t hysteresis
Parameter used within the entry and leave condition of an event triggered reporting condition.
enum ns3::LteRrcSap::ReportConfigEutra::@68 reportInterval
Report interval enumeration.
ThresholdEutra threshold2
Threshold for event A5.
enum ns3::LteRrcSap::ReportConfigEutra::@64 triggerType
Trigger enumeration.
enum ns3::LteRrcSap::ReportConfigEutra::@65 eventId
Event enumeration.
enum ns3::LteRrcSap::ReportConfigEutra::@66 triggerQuantity
Trigger type enumeration.
@ PERIODICAL
periodical report
ThresholdEutra threshold1
Threshold for event A1, A2, A4, and A5.
@ EVENT_A2
Event A2: Serving becomes worse than absolute threshold.
@ EVENT_A3
Event A3: Neighbour becomes amount of offset better than PCell.
@ EVENT_A4
Event A4: Neighbour becomes better than absolute threshold.
@ EVENT_A1
Event A1: Serving becomes better than absolute threshold.
@ EVENT_A5
Event A5: PCell becomes worse than absolute threshold1 AND Neighbour becomes better than another abso...
int8_t a3Offset
Offset value for Event A3.
uint16_t timeToTrigger
Time during which specific criteria for the event needs to be met in order to trigger a measurement r...
RrcConnectionReconfigurationCompleted structure.
uint8_t rrcTransactionIdentifier
RRC transaction identifier.
RrcConnectionReconfiguration structure.
uint8_t rrcTransactionIdentifier
RRC transaction identifier.
bool haveMobilityControlInfo
have mobility control info
NonCriticalExtensionConfiguration nonCriticalExtension
3GPP TS 36.331 v.11.10 R11 Sec.
bool haveRadioResourceConfigDedicated
have radio resource config dedicated
RadioResourceConfigDedicated radioResourceConfigDedicated
radio resource config dedicated
bool haveNonCriticalExtension
have critical extension?
MeasConfig measConfig
measure config
bool haveMeasConfig
have measure config
MobilityControlInfo mobilityControlInfo
mobility control info
RrcConnectionReestablishment structure.
RrcConnectionReestablishmentReject structure.
RrcConnectionReject structure.
RrcConnectionRelease structure.
uint8_t rrcTransactionIdentifier
RRC transaction identifier.
RrcConnectionRequest structure.
uint64_t ueIdentity
UE identity.
RrcConnectionSetupCompleted structure.
uint8_t rrcTransactionIdentifier
RRC transaction identifier.
RrcConnectionSetup structure.
uint8_t rrcTransactionIdentifier
RRC transaction identifier.
RadioResourceConfigDedicated radioResourceConfigDedicated
radio resource config dedicated
uint16_t srsConfigIndex
SRS config index.
@ THRESHOLD_RSRP
RSRP is used for the threshold.
@ THRESHOLD_RSRQ
RSRQ is used for the threshold.
uint8_t range
Value range used in RSRP/RSRQ threshold.
enum ns3::LteRrcSap::ThresholdEutra::@63 choice
Threshold enumeration.
uint8_t connEstFailCount
Number of times that the UE detects T300 expiry on the same cell.
LogicalChannelConfig structure.
uint16_t prioritizedBitRateKbps
prioritize bit rate Kbps
uint16_t bucketSizeDurationMs
bucket size duration ms
uint8_t logicalChannelGroup
logical channel group
UeMeasurementsParameters structure.
Represents a measurement result from a certain cell.
uint32_t carrierFreq
Measurement object frequency.
double rsrp
Measured RSRP in dBm.
double rsrq
Measured RSRQ in dB.
Represents a single triggered event from a measurement identity which reporting criteria have been fu...
ConcernedCells_t concernedCells
The list of cells responsible for this trigger.
EventId timer
The pending reporting event, scheduled at the end of the time-to-trigger.
uint8_t measId
The measurement identity which raised the trigger.
std::map< uint8_t, LteRrcSap::ReportConfigToAddMod > reportConfigList
report config list
LteRrcSap::QuantityConfig quantityConfig
quantity config
std::map< uint8_t, LteRrcSap::MeasObjectToAddMod > measObjectList
measure object list
std::map< uint8_t, LteRrcSap::MeasIdToAddMod > measIdList
measure ID list
Represents a single measurement reporting entry., which includes information about a measurement for ...
CompleteSetupParameters structure.
SetupParameters structure.
LteRlcSapProvider * srb0SapProvider
SRB0 SAP provider.
LtePdcpSapProvider * srb1SapProvider
SRB1 SAP provider.