24 #include <ns3/fatal-error.h>
26 #include <ns3/object-map.h>
27 #include <ns3/object-factory.h>
28 #include <ns3/simulator.h>
30 #include <ns3/lte-rlc.h>
31 #include <ns3/lte-rlc-tm.h>
32 #include <ns3/lte-rlc-um.h>
33 #include <ns3/lte-rlc-am.h>
34 #include <ns3/lte-pdcp.h>
35 #include <ns3/lte-radio-bearer-info.h>
98 "IDLE_CAMPED_NORMALLY",
100 "IDLE_RANDOM_ACCESS",
102 "CONNECTED_NORMALLY",
103 "CONNECTED_HANDOVER",
104 "CONNECTED_PHY_PROBLEM",
105 "CONNECTED_REESTABLISHING"
123 : m_cphySapProvider (0),
124 m_cmacSapProvider (0),
126 m_macSapProvider (0),
128 m_state (IDLE_START),
133 m_connectionPending (false),
134 m_hasReceivedMib (false),
135 m_hasReceivedSib1 (false),
136 m_hasReceivedSib2 (false),
170 .AddConstructor<LteUeRrc> ()
171 .AddAttribute (
"DataRadioBearerMap",
"List of UE RadioBearerInfo for Data Radio Bearers by LCID.",
174 MakeObjectMapChecker<LteDataRadioBearerInfo> ())
175 .AddAttribute (
"Srb0",
"SignalingRadioBearerInfo for SRB0",
178 MakePointerChecker<LteSignalingRadioBearerInfo> ())
179 .AddAttribute (
"Srb1",
"SignalingRadioBearerInfo for SRB1",
182 MakePointerChecker<LteSignalingRadioBearerInfo> ())
183 .AddAttribute (
"CellId",
184 "Serving cell identifier",
187 MakeUintegerChecker<uint16_t> ())
188 .AddAttribute (
"C-RNTI",
189 "Cell Radio Network Temporary Identifier",
192 MakeUintegerChecker<uint16_t> ())
193 .AddTraceSource (
"MibReceived",
194 "trace fired upon reception of Master Information Block",
196 .AddTraceSource (
"Sib1Received",
197 "trace fired upon reception of System Information Block Type 1",
199 .AddTraceSource (
"Sib2Received",
200 "trace fired upon reception of System Information Block Type 2",
202 .AddTraceSource (
"StateTransition",
203 "trace fired upon every UE RRC state transition",
205 .AddTraceSource (
"InitialCellSelectionEndOk",
206 "trace fired upon successful initial cell selection procedure",
208 .AddTraceSource (
"InitialCellSelectionEndError",
209 "trace fired upon failed initial cell selection procedure",
211 .AddTraceSource (
"RandomAccessSuccessful",
212 "trace fired upon successful completion of the random access procedure",
214 .AddTraceSource (
"RandomAccessError",
215 "trace fired upon failure of the random access procedure",
217 .AddTraceSource (
"ConnectionEstablished",
218 "trace fired upon successful RRC connection establishment",
220 .AddTraceSource (
"ConnectionReconfiguration",
221 "trace fired upon RRC connection reconfiguration",
223 .AddTraceSource (
"HandoverStart",
224 "trace fired upon start of a handover procedure",
226 .AddTraceSource (
"HandoverEndOk",
227 "trace fired upon successful termination of a handover procedure",
229 .AddTraceSource (
"HandoverEndError",
230 "trace fired upon failure of a handover procedure",
376 Ptr<LteRlc> rlc = CreateObject<LteRlcTm> ()->GetObject<LteRlc> ();
381 m_srb0 = CreateObject<LteSignalingRadioBearerInfo> ();
383 m_srb0->m_srbIdentity = 0;
408 std::map<uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator it =
m_drbMap.find (drbid);
414 params.lcid = it->second->m_logicalChannelIdentity;
417 <<
" on DRBID " << (uint32_t) drbid
418 <<
" (LCID " << (uint32_t) params.lcid <<
")"
419 <<
" (" << packet->
GetSize () <<
" bytes)");
420 it->second->m_pdcp->GetLtePdcpSapProvider ()->TransmitPdcpSdu (params);
501 std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt;
693 "Cell identity in SIB1 does not match with the originating cell");
708 "Cell identity in SIB1 does not match with the originating cell");
732 std::vector <LteUeCphySapUser::UeMeasurementsElement>::iterator newMeasIt;
737 newMeasIt->m_rsrq, useLayer3Filtering);
747 std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt;
980 uint16_t maxRsrpCellId = 0;
981 double maxRsrp = -std::numeric_limits<double>::infinity ();
983 std::map<uint16_t, MeasValues>::iterator it;
990 if (maxRsrp < it->second.rsrp)
992 std::set<uint16_t>::const_iterator itCell;
996 maxRsrpCellId = it->first;
997 maxRsrp = it->second.rsrp;
1002 if (maxRsrpCellId == 0)
1004 NS_LOG_WARN (
this <<
" Cell search is unable to detect surrounding cell to attach to");
1009 <<
" is the strongest untried surrounding cell");
1028 bool isSuitableCell =
false;
1029 bool isAcceptableCell =
false;
1030 std::map<uint16_t, MeasValues>::iterator storedMeasIt =
m_storedMeasValues.find (cellId);
1031 double qRxLevMeas = storedMeasIt->second.rsrp;
1033 NS_LOG_LOGIC (
this <<
" cell selection to cellId=" << cellId
1034 <<
" qrxlevmeas=" << qRxLevMeas <<
" dBm"
1035 <<
" qrxlevmin=" << qRxLevMin <<
" dBm");
1037 if (qRxLevMeas - qRxLevMin > 0)
1039 isAcceptableCell =
true;
1044 isSuitableCell = (cellCsgIndication ==
false) || (cellCsgId ==
m_csgWhiteList);
1047 << cellCsgId <<
"/" << cellCsgIndication);
1068 if (isAcceptableCell)
1099 std::list<LteRrcSap::SrbToAddMod>::const_iterator stamIt = rrcd.
srbToAddModList.begin ();
1107 NS_ASSERT_MSG (stamIt->srbIdentity == 1,
"only SRB1 supported");
1109 const uint8_t lcid = 1;
1114 rlc->SetLcId (lcid);
1118 pdcp->SetLcId (lcid);
1120 pdcp->SetLteRlcSapProvider (rlc->GetLteRlcSapProvider ());
1121 rlc->SetLteRlcSapUser (pdcp->GetLteRlcSapUser ());
1123 m_srb1 = CreateObject<LteSignalingRadioBearerInfo> ();
1126 m_srb1->m_srbIdentity = 1;
1128 m_srb1->m_logicalChannelConfig.priority = stamIt->logicalChannelConfig.priority;
1129 m_srb1->m_logicalChannelConfig.prioritizedBitRateKbps = stamIt->logicalChannelConfig.prioritizedBitRateKbps;
1130 m_srb1->m_logicalChannelConfig.bucketSizeDurationMs = stamIt->logicalChannelConfig.bucketSizeDurationMs;
1131 m_srb1->m_logicalChannelConfig.logicalChannelGroup = stamIt->logicalChannelConfig.logicalChannelGroup;
1134 lcConfig.
priority = stamIt->logicalChannelConfig.priority;
1146 ueParams.srb1SapProvider =
m_srb1->m_pdcp->GetLtePdcpSapProvider ();
1151 NS_LOG_INFO (
"request to modify SRB1 (skipping as currently not implemented)");
1157 std::list<LteRrcSap::DrbToAddMod>::const_iterator dtamIt;
1162 NS_LOG_INFO (
this <<
" IMSI " <<
m_imsi <<
" adding/modifying DRBID " << (uint32_t) dtamIt->drbIdentity <<
" LC " << (uint32_t) dtamIt->logicalChannelIdentity);
1163 NS_ASSERT_MSG (dtamIt->logicalChannelIdentity > 2,
"LCID value " << dtamIt->logicalChannelIdentity <<
" is reserved for SRBs");
1165 std::map<uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator drbMapIt =
m_drbMap.find (dtamIt->drbIdentity);
1177 switch (dtamIt->rlcConfig.choice)
1198 rlc->SetLcId (dtamIt->logicalChannelIdentity);
1201 drbInfo->m_rlc = rlc;
1202 drbInfo->m_epsBearerIdentity = dtamIt->epsBearerIdentity;
1203 drbInfo->m_logicalChannelIdentity = dtamIt->logicalChannelIdentity;
1204 drbInfo->m_drbIdentity = dtamIt->drbIdentity;
1212 pdcp->SetLcId (dtamIt->logicalChannelIdentity);
1214 pdcp->SetLteRlcSapProvider (rlc->GetLteRlcSapProvider ());
1215 rlc->SetLteRlcSapUser (pdcp->GetLteRlcSapUser ());
1216 drbInfo->m_pdcp = pdcp;
1225 lcConfig.
priority = dtamIt->logicalChannelConfig.priority;
1232 rlc->GetLteMacSapUser ());
1243 std::list<uint8_t>::iterator dtdmIt;
1248 uint8_t drbid = *dtdmIt;
1249 NS_LOG_INFO (
this <<
" IMSI " <<
m_imsi <<
" releasing DRB " << (uint32_t) drbid << drbid);
1250 std::map<uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator it =
m_drbMap.find (drbid);
1270 uint8_t measObjectId = *it;
1271 NS_LOG_LOGIC (
this <<
" deleting measObjectId " << (uint32_t) measObjectId);
1276 if (measIdIt->second.measObjectId == measObjectId)
1278 uint8_t measId = measIdIt->second.measId;
1280 NS_LOG_LOGIC (
this <<
" deleting measId " << (uint32_t) measId <<
" because referring to measObjectId " << (uint32_t) measObjectId);
1299 NS_ASSERT_MSG (it->measObjectEutra.cellsToRemoveList.empty (),
"cellsToRemoveList not supported");
1300 NS_ASSERT_MSG (it->measObjectEutra.cellsToAddModList.empty (),
"cellsToAddModList not supported");
1301 NS_ASSERT_MSG (it->measObjectEutra.cellsToRemoveList.empty (),
"blackCellsToRemoveList not supported");
1302 NS_ASSERT_MSG (it->measObjectEutra.blackCellsToAddModList.empty (),
"blackCellsToAddModList not supported");
1303 NS_ASSERT_MSG (it->measObjectEutra.haveCellForWhichToReportCGI ==
false,
"cellForWhichToReportCGI is not supported");
1305 uint8_t measObjectId = it->measObjectId;
1309 NS_LOG_LOGIC (
"measObjectId " << (uint32_t) measObjectId <<
" exists, updating entry");
1310 measObjectIt->second = *it;
1311 for (std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt
1316 if (measIdIt->second.measObjectId == measObjectId)
1318 uint8_t measId = measIdIt->second.measId;
1319 NS_LOG_LOGIC (
this <<
" found measId " << (uint32_t) measId <<
" referring to measObjectId " << (uint32_t) measObjectId);
1326 NS_LOG_LOGIC (
"measObjectId " << (uint32_t) measObjectId <<
" is new, adding entry");
1337 uint8_t reportConfigId = *it;
1338 NS_LOG_LOGIC (
this <<
" deleting reportConfigId " << (uint32_t) reportConfigId);
1343 if (measIdIt->second.reportConfigId == reportConfigId)
1345 uint8_t measId = measIdIt->second.measId;
1347 NS_LOG_LOGIC (
this <<
" deleting measId " << (uint32_t) measId <<
" because referring to reportConfigId " << (uint32_t) reportConfigId);
1367 "only trigger type EVENT is supported");
1369 uint8_t reportConfigId = it->reportConfigId;
1373 NS_LOG_LOGIC (
"reportConfigId " << (uint32_t) reportConfigId <<
" exists, updating entry");
1375 for (std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt
1380 if (measIdIt->second.reportConfigId == reportConfigId)
1382 uint8_t measId = measIdIt->second.measId;
1383 NS_LOG_LOGIC (
this <<
" found measId " << (uint32_t) measId <<
" referring to reportConfigId " << (uint32_t) reportConfigId);
1390 NS_LOG_LOGIC (
"reportConfigId " << (uint32_t) reportConfigId <<
" is new, adding entry");
1406 for (std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt
1420 uint8_t measId = *it;
1421 NS_LOG_LOGIC (
this <<
" deleting measId " << (uint32_t) measId);
1431 for (std::list<LteRrcSap::MeasIdToAddMod>::iterator it = mc.
measIdToAddModList.begin ();
1435 NS_LOG_LOGIC (
this <<
" measId " << (uint32_t) it->measId
1436 <<
" (measObjectId=" << (uint32_t) it->measObjectId
1437 <<
", reportConfigId=" << (uint32_t) it->reportConfigId
1444 std::map<uint8_t, VarMeasReport>::iterator measReportIt =
m_varMeasReportList.find (it->measId);
1447 measReportIt->second.periodicReportTimer.Cancel ();
1454 std::list<PendingTrigger_t>
s;
1477 bool useLayer3Filtering)
1479 NS_LOG_FUNCTION (
this << cellId << rsrp << rsrq << useLayer3Filtering);
1481 std::map<uint16_t, MeasValues>::iterator storedMeasIt =
m_storedMeasValues.find (cellId);;
1485 if (useLayer3Filtering)
1491 if (std::isnan (storedMeasIt->second.rsrq))
1494 storedMeasIt->second.rsrq = rsrq;
1504 storedMeasIt->second.rsrp = rsrp;
1505 storedMeasIt->second.rsrq = rsrq;
1514 std::pair<uint16_t, MeasValues> val (cellId, v);
1515 std::pair<std::map<uint16_t, MeasValues>::iterator,
bool>
1517 NS_ASSERT_MSG (ret.second ==
true,
"element already existed");
1518 storedMeasIt = ret.first;
1523 <<
", new RSRP " << rsrp <<
" stored " << storedMeasIt->second.rsrp
1524 <<
", new RSRQ " << rsrq <<
" stored " << storedMeasIt->second.rsrq);
1534 std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt =
1537 NS_ASSERT (measIdIt->first == measIdIt->second.measId);
1539 std::map<uint8_t, LteRrcSap::ReportConfigToAddMod>::iterator
1544 std::map<uint8_t, LteRrcSap::MeasObjectToAddMod>::iterator
1549 std::map<uint8_t, VarMeasReport>::iterator
1557 "only triggerType == event is supported");
1560 NS_LOG_LOGIC (
this <<
" considering measId " << (uint32_t) measId);
1561 bool eventEntryCondApplicable =
false;
1562 bool eventLeavingCondApplicable =
false;
1566 switch (reportConfigEutra.eventId)
1580 switch (reportConfigEutra.triggerQuantity)
1584 NS_ASSERT (reportConfigEutra.threshold1.choice
1590 NS_ASSERT (reportConfigEutra.threshold1.choice
1600 bool entryCond = ms - hys > thresh;
1604 if (!isMeasIdInReportList)
1606 concernedCellsEntry.push_back (
m_cellId);
1607 eventEntryCondApplicable =
true;
1616 != measReportIt->second.cellsTriggeredList.end ());
1619 else if (reportConfigEutra.timeToTrigger > 0)
1625 bool leavingCond = ms + hys < thresh;
1629 if (isMeasIdInReportList)
1636 != measReportIt->second.cellsTriggeredList.end ());
1637 concernedCellsLeaving.push_back (
m_cellId);
1638 eventLeavingCondApplicable =
true;
1641 else if (reportConfigEutra.timeToTrigger > 0)
1647 <<
" ms=" << ms <<
" thresh=" << thresh
1648 <<
" entryCond=" << entryCond
1649 <<
" leavingCond=" << leavingCond);
1667 switch (reportConfigEutra.triggerQuantity)
1671 NS_ASSERT (reportConfigEutra.threshold1.choice
1677 NS_ASSERT (reportConfigEutra.threshold1.choice
1687 bool entryCond = ms + hys < thresh;
1691 if (!isMeasIdInReportList)
1693 concernedCellsEntry.push_back (
m_cellId);
1694 eventEntryCondApplicable =
true;
1703 != measReportIt->second.cellsTriggeredList.end ());
1706 else if (reportConfigEutra.timeToTrigger > 0)
1712 bool leavingCond = ms - hys > thresh;
1716 if (isMeasIdInReportList)
1723 != measReportIt->second.cellsTriggeredList.end ());
1724 concernedCellsLeaving.push_back (
m_cellId);
1725 eventLeavingCondApplicable =
true;
1728 else if (reportConfigEutra.timeToTrigger > 0)
1734 <<
" ms=" << ms <<
" thresh=" << thresh
1735 <<
" entryCond=" << entryCond
1736 <<
" leavingCond=" << leavingCond);
1750 double ofn = measObjectEutra.offsetFreq;
1753 double ofp = measObjectEutra.offsetFreq;
1760 switch (reportConfigEutra.triggerQuantity)
1764 NS_ASSERT (reportConfigEutra.threshold1.choice
1769 NS_ASSERT (reportConfigEutra.threshold1.choice
1777 for (std::map<uint16_t, MeasValues>::iterator storedMeasIt =
m_storedMeasValues.begin ();
1781 uint16_t cellId = storedMeasIt->first;
1787 switch (reportConfigEutra.triggerQuantity)
1790 mn = storedMeasIt->second.rsrp;
1793 mn = storedMeasIt->second.rsrq;
1800 bool hasTriggered = isMeasIdInReportList
1801 && (measReportIt->second.cellsTriggeredList.find (cellId)
1802 != measReportIt->second.cellsTriggeredList.end ());
1805 bool entryCond = mn + ofn + ocn - hys > mp + ofp + ocp + off;
1811 concernedCellsEntry.push_back (cellId);
1812 eventEntryCondApplicable =
true;
1815 else if (reportConfigEutra.timeToTrigger > 0)
1821 bool leavingCond = mn + ofn + ocn + hys < mp + ofp + ocp + off;
1827 concernedCellsLeaving.push_back (cellId);
1828 eventLeavingCondApplicable =
true;
1831 else if (reportConfigEutra.timeToTrigger > 0)
1836 NS_LOG_LOGIC (
this <<
" event A3: neighbor cell " << cellId
1837 <<
" mn=" << mn <<
" mp=" << mp <<
" offset=" << off
1838 <<
" entryCond=" << entryCond
1839 <<
" leavingCond=" << leavingCond);
1855 double ofn = measObjectEutra.offsetFreq;
1861 switch (reportConfigEutra.triggerQuantity)
1864 NS_ASSERT (reportConfigEutra.threshold1.choice
1869 NS_ASSERT (reportConfigEutra.threshold1.choice
1878 for (std::map<uint16_t, MeasValues>::iterator storedMeasIt =
m_storedMeasValues.begin ();
1882 uint16_t cellId = storedMeasIt->first;
1888 switch (reportConfigEutra.triggerQuantity)
1891 mn = storedMeasIt->second.rsrp;
1894 mn = storedMeasIt->second.rsrq;
1901 bool hasTriggered = isMeasIdInReportList
1902 && (measReportIt->second.cellsTriggeredList.find (cellId)
1903 != measReportIt->second.cellsTriggeredList.end ());
1906 bool entryCond = mn + ofn + ocn - hys > thresh;
1912 concernedCellsEntry.push_back (cellId);
1913 eventEntryCondApplicable =
true;
1916 else if (reportConfigEutra.timeToTrigger > 0)
1922 bool leavingCond = mn + ofn + ocn + hys < thresh;
1928 concernedCellsLeaving.push_back (cellId);
1929 eventLeavingCondApplicable =
true;
1932 else if (reportConfigEutra.timeToTrigger > 0)
1937 NS_LOG_LOGIC (
this <<
" event A4: neighbor cell " << cellId
1938 <<
" mn=" << mn <<
" thresh=" << thresh
1939 <<
" entryCond=" << entryCond
1940 <<
" leavingCond=" << leavingCond);
1958 double ofn = measObjectEutra.offsetFreq;
1965 switch (reportConfigEutra.triggerQuantity)
1969 NS_ASSERT (reportConfigEutra.threshold1.choice
1971 NS_ASSERT (reportConfigEutra.threshold2.choice
1978 NS_ASSERT (reportConfigEutra.threshold1.choice
1980 NS_ASSERT (reportConfigEutra.threshold2.choice
1991 bool entryCond = mp + hys < thresh1;
1995 for (std::map<uint16_t, MeasValues>::iterator storedMeasIt =
m_storedMeasValues.begin ();
1999 uint16_t cellId = storedMeasIt->first;
2005 switch (reportConfigEutra.triggerQuantity)
2008 mn = storedMeasIt->second.rsrp;
2011 mn = storedMeasIt->second.rsrq;
2018 bool hasTriggered = isMeasIdInReportList
2019 && (measReportIt->second.cellsTriggeredList.find (cellId)
2020 != measReportIt->second.cellsTriggeredList.end ());
2024 entryCond = mn + ofn + ocn - hys > thresh2;
2030 concernedCellsEntry.push_back (cellId);
2031 eventEntryCondApplicable =
true;
2034 else if (reportConfigEutra.timeToTrigger > 0)
2039 NS_LOG_LOGIC (
this <<
" event A5: neighbor cell " << cellId
2040 <<
" mn=" << mn <<
" mp=" << mp
2041 <<
" thresh2=" << thresh2
2042 <<
" thresh1=" << thresh1
2043 <<
" entryCond=" << entryCond);
2051 <<
" mp=" << mp <<
" thresh1=" << thresh1
2052 <<
" entryCond=" << entryCond);
2054 if (reportConfigEutra.timeToTrigger > 0)
2060 if (isMeasIdInReportList)
2063 bool leavingCond = mp - hys > thresh1;
2067 if (reportConfigEutra.timeToTrigger == 0)
2071 for (std::map<uint16_t, MeasValues>::iterator storedMeasIt =
m_storedMeasValues.begin ();
2075 uint16_t cellId = storedMeasIt->first;
2081 if (measReportIt->second.cellsTriggeredList.find (cellId)
2082 != measReportIt->second.cellsTriggeredList.end ())
2084 concernedCellsLeaving.push_back (cellId);
2085 eventLeavingCondApplicable =
true;
2093 for (std::map<uint16_t, MeasValues>::iterator storedMeasIt =
m_storedMeasValues.begin ();
2097 uint16_t cellId = storedMeasIt->first;
2103 if (measReportIt->second.cellsTriggeredList.find (cellId)
2104 != measReportIt->second.cellsTriggeredList.end ())
2106 switch (reportConfigEutra.triggerQuantity)
2109 mn = storedMeasIt->second.rsrp;
2112 mn = storedMeasIt->second.rsrq;
2121 leavingCond = mn + ofn + ocn + hys < thresh2;
2133 concernedCellsLeaving.push_back (cellId);
2134 eventLeavingCondApplicable =
true;
2136 NS_LOG_LOGIC (
this <<
" event A5: neighbor cell " << cellId
2137 <<
" mn=" << mn <<
" mp=" << mp
2138 <<
" thresh2=" << thresh2
2139 <<
" thresh1=" << thresh1
2140 <<
" leavingCond=" << leavingCond);
2150 <<
" mp=" << mp <<
" thresh1=" << thresh1
2151 <<
" leavingCond=" << leavingCond);
2156 if (reportConfigEutra.timeToTrigger > 0)
2163 for (std::map<uint16_t, MeasValues>::iterator storedMeasIt =
m_storedMeasValues.begin ();
2167 uint16_t cellId = storedMeasIt->first;
2173 if (measReportIt->second.cellsTriggeredList.find (cellId)
2174 != measReportIt->second.cellsTriggeredList.end ())
2176 switch (reportConfigEutra.triggerQuantity)
2179 mn = storedMeasIt->second.rsrp;
2182 mn = storedMeasIt->second.rsrq;
2190 leavingCond = mn + ofn + ocn + hys < thresh2;
2194 concernedCellsLeaving.push_back (cellId);
2195 eventLeavingCondApplicable =
true;
2198 NS_LOG_LOGIC (
this <<
" event A5: neighbor cell " << cellId
2199 <<
" mn=" << mn <<
" mp=" << mp
2200 <<
" thresh2=" << thresh2
2201 <<
" thresh1=" << thresh1
2202 <<
" leavingCond=" << leavingCond);
2218 NS_FATAL_ERROR (
"unsupported eventId " << reportConfigEutra.eventId);
2223 NS_LOG_LOGIC (
this <<
" eventEntryCondApplicable=" << eventEntryCondApplicable
2224 <<
" eventLeavingCondApplicable=" << eventLeavingCondApplicable);
2226 if (eventEntryCondApplicable)
2228 if (reportConfigEutra.timeToTrigger == 0)
2239 measId, concernedCellsEntry);
2240 std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
2243 enteringTriggerIt->second.push_back (t);
2247 if (eventLeavingCondApplicable)
2251 && reportConfigEutra.reportOnLeave;
2253 if (reportConfigEutra.timeToTrigger == 0)
2264 measId, concernedCellsLeaving, reportOnLeave);
2265 std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
2268 leavingTriggerIt->second.push_back (t);
2279 std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
2283 if (!it1->second.empty ())
2285 std::list<PendingTrigger_t>::iterator it2;
2286 for (it2 = it1->second.begin (); it2 != it1->second.end (); ++it2)
2289 NS_LOG_LOGIC (
this <<
" canceling entering time-to-trigger event at "
2294 it1->second.clear ();
2303 std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
2307 std::list<PendingTrigger_t>::iterator it2 = it1->second.begin ();
2308 while (it2 != it1->second.end ())
2312 ConcernedCells_t::iterator it3;
2313 for (it3 = it2->concernedCells.begin ();
2314 it3 != it2->concernedCells.end (); ++it3)
2318 it3 = it2->concernedCells.erase (it3);
2322 if (it2->concernedCells.empty ())
2324 NS_LOG_LOGIC (
this <<
" canceling entering time-to-trigger event at "
2327 it2 = it1->second.erase (it2);
2341 std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
2345 if (!it1->second.empty ())
2347 std::list<PendingTrigger_t>::iterator it2;
2348 for (it2 = it1->second.begin (); it2 != it1->second.end (); ++it2)
2351 NS_LOG_LOGIC (
this <<
" canceling leaving time-to-trigger event at "
2356 it1->second.clear ();
2365 std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
2369 std::list<PendingTrigger_t>::iterator it2 = it1->second.begin ();
2370 while (it2 != it1->second.end ())
2374 ConcernedCells_t::iterator it3;
2375 for (it3 = it2->concernedCells.begin ();
2376 it3 != it2->concernedCells.end (); ++it3)
2380 it3 = it2->concernedCells.erase (it3);
2384 if (it2->concernedCells.empty ())
2386 NS_LOG_LOGIC (
this <<
" canceling leaving time-to-trigger event at "
2389 it2 = it1->second.erase (it2);
2404 std::map<uint8_t, VarMeasReport>::iterator
2411 std::pair<uint8_t, VarMeasReport> val (measId, r);
2412 std::pair<std::map<uint8_t, VarMeasReport>::iterator,
bool>
2414 NS_ASSERT_MSG (ret.second ==
true,
"element already existed");
2415 measReportIt = ret.first;
2420 for (ConcernedCells_t::const_iterator it = enteringCells.begin ();
2421 it != enteringCells.end ();
2424 measReportIt->second.cellsTriggeredList.insert (*it);
2427 NS_ASSERT (!measReportIt->second.cellsTriggeredList.empty ());
2428 measReportIt->second.numberOfReportsSent = 0;
2429 measReportIt->second.periodicReportTimer
2434 std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
2437 if (!enteringTriggerIt->second.empty ())
2445 enteringTriggerIt->second.pop_front ();
2447 if (!enteringTriggerIt->second.empty ())
2454 for (ConcernedCells_t::const_iterator it = enteringCells.begin ();
2455 it != enteringCells.end (); ++it)
2472 std::map<uint8_t, VarMeasReport>::iterator
2476 for (ConcernedCells_t::const_iterator it = leavingCells.begin ();
2477 it != leavingCells.end ();
2480 measReportIt->second.cellsTriggeredList.erase (*it);
2489 if (measReportIt->second.cellsTriggeredList.empty ())
2491 measReportIt->second.periodicReportTimer.Cancel ();
2495 std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
2498 if (!leavingTriggerIt->second.empty ())
2506 leavingTriggerIt->second.pop_front ();
2508 if (!leavingTriggerIt->second.empty ())
2515 for (ConcernedCells_t::const_iterator it = leavingCells.begin ();
2516 it != leavingCells.end (); ++it)
2532 std::map<uint8_t, VarMeasReport>::iterator
2536 NS_LOG_LOGIC (
this <<
" deleting existing report for measId " << (uint16_t) measId);
2537 measReportIt->second.periodicReportTimer.Cancel ();
2551 std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator
2555 std::map<uint8_t, LteRrcSap::ReportConfigToAddMod>::iterator
2562 measResults.
measId = measId;
2569 "RSRP " << (uint32_t) measResults.
rsrpResult <<
" (" << servingMeasIt->second.rsrp <<
" dBm) "
2570 "RSRQ " << (uint32_t) measResults.
rsrqResult <<
" (" << servingMeasIt->second.rsrq <<
" dB)");
2572 std::map<uint8_t, VarMeasReport>::iterator measReportIt =
m_varMeasReportList.find (measId);
2575 NS_LOG_ERROR (
"no entry found in m_varMeasReportList for measId " << (uint32_t) measId);
2579 if (!(measReportIt->second.cellsTriggeredList.empty ()))
2581 std::multimap<double, uint16_t> sortedNeighCells;
2582 for (std::set<uint16_t>::iterator cellsTriggeredIt = measReportIt->second.cellsTriggeredList.begin ();
2583 cellsTriggeredIt != measReportIt->second.cellsTriggeredList.end ();
2586 uint16_t cellId = *cellsTriggeredIt;
2589 std::map<uint16_t, MeasValues>::iterator neighborMeasIt =
m_storedMeasValues.find (cellId);
2590 double triggerValue;
2591 switch (reportConfigEutra.triggerQuantity)
2594 triggerValue = neighborMeasIt->second.rsrp;
2597 triggerValue = neighborMeasIt->second.rsrq;
2603 sortedNeighCells.insert (std::pair<double, uint16_t> (triggerValue, cellId));
2607 std::multimap<double, uint16_t>::reverse_iterator sortedNeighCellsIt;
2609 for (sortedNeighCellsIt = sortedNeighCells.rbegin (), count = 0;
2610 sortedNeighCellsIt != sortedNeighCells.rend () && count < reportConfigEutra.maxReportCells;
2611 ++sortedNeighCellsIt, ++count)
2613 uint16_t cellId = sortedNeighCellsIt->second;
2614 std::map<uint16_t, MeasValues>::iterator neighborMeasIt =
m_storedMeasValues.find (cellId);
2618 measResultEutra.haveCgiInfo =
false;
2619 measResultEutra.haveRsrpResult =
true;
2621 measResultEutra.haveRsrqResult =
true;
2623 NS_LOG_INFO (
this <<
" reporting neighbor cell " << (uint32_t) measResultEutra.physCellId
2624 <<
" RSRP " << (uint32_t) measResultEutra.rsrpResult
2625 <<
" (" << neighborMeasIt->second.rsrp <<
" dBm)"
2626 <<
" RSRQ " << (uint32_t) measResultEutra.rsrqResult
2627 <<
" (" << neighborMeasIt->second.rsrq <<
" dB)");
2634 NS_LOG_WARN (
this <<
" cellsTriggeredList is empty");
2642 measReportIt->second.numberOfReportsSent++;
2643 measReportIt->second.periodicReportTimer.Cancel ();
2645 Time reportInterval;
2646 switch (reportConfigEutra.reportInterval)
2649 reportInterval = MilliSeconds (120);
2652 reportInterval = MilliSeconds (240);
2655 reportInterval = MilliSeconds (480);
2658 reportInterval = MilliSeconds (640);
2661 reportInterval = MilliSeconds (1024);
2664 reportInterval = MilliSeconds (2048);
2667 reportInterval = MilliSeconds (5120);
2670 reportInterval = MilliSeconds (10240);
2673 reportInterval = Seconds (60);
2676 reportInterval = Seconds (360);
2679 reportInterval = Seconds (720);
2682 reportInterval = Seconds (1800);
2685 reportInterval = Seconds (3600);
2688 NS_FATAL_ERROR (
"Unsupported reportInterval " << (uint16_t) reportConfigEutra.reportInterval);
2693 measReportIt->second.periodicReportTimer
2720 std::map<uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator it;
2741 std::map<uint8_t, uint8_t>::iterator it =
m_bid2DrbidMap.find (bid);
static Time GetDelayLeft(const EventId &id)
uint8_t numberOfRaPreambles
LtePdcpSapProvider * srb1SapProvider
keep track of time values and allow control of global simulation resolution
uint8_t raResponseWindowSize
virtual void Reset()=0
reset the PHY
CarrierFreqEutra carrierFreq
smart pointer class similar to boost::intrusive_ptr
#define NS_LOG_FUNCTION(parameters)
Part of the RRC protocol.
void DoRecvRrcConnectionSetup(LteRrcSap::RrcConnectionSetup msg)
Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionSetup interface...
void DoRecvMasterInformationBlock(uint16_t cellId, LteRrcSap::MasterInformationBlock msg)
std::map< uint8_t, LteRrcSap::MeasObjectToAddMod > measObjectList
std::vector< struct UeMeasurementsElement > m_ueMeasurementsList
void CancelEnteringTrigger(uint8_t measId)
Clear all the waiting triggers in m_enteringTriggerQueue which are associated with the given measurem...
void DoRecvSystemInformationBlockType1(uint16_t cellId, LteRrcSap::SystemInformationBlockType1 msg)
RSRP is used for the threshold.
static TypeId GetTypeId(void)
static double IeValue2ActualHysteresis(uint8_t hysteresisIeValue)
Returns the actual value of a hysteresis parameter.
std::list< MeasObjectToAddMod > measObjectToAddModList
LtePdcpSapUser * m_drbPdcpSapUser
void DoRecvSystemInformation(LteRrcSap::SystemInformation msg)
Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvSystemInformation interface...
uint16_t bucketSizeDurationMs
uint8_t numberOfRaPreambles
Template for the implementation of the LteUeCphySapUser as a member of an owner class of type C to wh...
SoundingRsUlConfigDedicated soundingRsUlConfigDedicated
static TypeId GetTypeId(void)
void SetAsSapUser(LteAsSapUser *s)
Set the AS SAP user to interact with the NAS entity.
void MeasurementReportTriggering(uint8_t measId)
Evaluate the reporting criteria of a measurement identity and invoke some reporting actions based on ...
QuantityConfig quantityConfig
void DoRecvRrcConnectionReject(LteRrcSap::RrcConnectionReject msg)
Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionReject interface...
std::list< uint8_t > reportConfigToRemoveList
bool m_hasReceivedSib2
true if SIB2 was received for the current cell
std::list< MeasResultEutra > measResultListEutra
int8_t qRxLevMin
INTEGER (-70..-22), actual value = IE value * 2 [dBm].
std::map< uint8_t, Ptr< LteDataRadioBearerInfo > > m_drbMap
void ApplyMeasConfig(LteRrcSap::MeasConfig mc)
Update the current measurement configuration m_varMeasConfig.
Specifies criteria for triggering of an E-UTRA measurement reporting event.
virtual void DoDispose(void)
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
void SetUseRlcSm(bool val)
virtual void SendRrcConnectionReconfigurationCompleted(RrcConnectionReconfigurationCompleted msg)=0
Send an RRCConnectionReconfigurationComplete message to the serving eNodeB during an RRC connection r...
virtual void Reset()=0
reset the MAC
uint8_t measId
The measurement identity which raised the trigger.
#define NS_ASSERT(condition)
std::list< SrbToAddMod > srbToAddModList
void DoSetTemporaryCellRnti(uint16_t rnti)
NS_OBJECT_ENSURE_REGISTERED(NullMessageSimulatorImpl)
Represents a single triggered event from a measurement identity which reporting criteria have been fu...
RadioResourceConfigDedicated radioResourceConfigDedicated
LteUeRrc()
create an RRC instance for use within an ue
std::list< uint8_t > measObjectToRemoveList
void SetTypeId(TypeId tid)
virtual void StartContentionBasedRandomAccessProcedure()=0
tell the MAC to start a contention-based random access procedure, e.g., to perform RRC connection est...
uint32_t GetSize(void) const
Service Access Point (SAP) offered by the UE PHY to the UE RRC for control purposes.
virtual void SynchronizeWithEnb(uint16_t cellId)=0
Tell the PHY entity to synchronize with a given eNodeB over the currently active EARFCN for communica...
virtual ~LteUeRrc()
Destructor.
EventId timer
The pending reporting event, scheduled at the end of the time-to-trigger.
void CancelLeavingTrigger(uint8_t measId)
Clear all the waiting triggers in m_leavingTriggerQueue which are associated with the given measureme...
virtual void NotifyRandomAccessSuccessful()
Notify the RRC that the MAC Random Access procedure completed successfully.
Ptr< const AttributeAccessor > MakeObjectMapAccessor(U T::*memberContainer)
virtual void SetRnti(uint16_t rnti)=0
virtual void NotifyConnectionSuccessful()=0
Notify the NAS that RRC Connection Establishment was successful.
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...
uint16_t GetUlEarfcn() const
This class implements the Access Stratum (AS) Service Access Point (SAP), i.e., the interface between...
virtual void RemoveLc(uint8_t lcId)=0
remove an existing LC
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached.
NS_LOG_COMPONENT_DEFINE("LteUeRrc")
bool m_hasReceivedMib
true if MIB was received for the current cell
RachConfigDedicated rachConfigDedicated
void DoRecvRrcConnectionReestablishmentReject(LteRrcSap::RrcConnectionReestablishmentReject msg)
Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionReestablishmentReject i...
bool m_connectionPending
true if a connection request by upper layers is pending
LtePdcpSapUser * srb1SapUser
bool m_hasReceivedSib1
true if SIB1 was received for the current cell
#define NS_FATAL_ERROR(msg)
fatal error handling
LteMacSapProvider * m_macSapProvider
bool haveRadioResourceConfigDedicated
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 ...
virtual void SendRrcConnectionSetupCompleted(RrcConnectionSetupCompleted msg)=0
Send an RRCConnectionSetupComplete message to the serving eNodeB during an RRC connection establishme...
uint8_t rrcTransactionIdentifier
Ptr< Packet > pdcpSdu
the RRC PDU
uint8_t Bid2Drbid(uint8_t bid)
PreambleInfo preambleInfo
double GetSeconds(void) const
Parameters for LtePdcpSapUser::ReceivePdcpSdu.
LteUeCmacSapUser * GetLteUeCmacSapUser()
friend class UeMemberLteUeCmacSapUser
static const Time UE_MEASUREMENT_REPORT_DELAY
Artificial delay of UE measurements procedure.
LteRrcSap::QuantityConfig quantityConfig
void SetLteUeRrcSapUser(LteUeRrcSapUser *s)
set the RRC SAP this RRC should interact with
LteUeRrcSapUser * m_rrcSapUser
TracedCallback< uint64_t, uint16_t, uint16_t > m_handoverEndOkTrace
uint16_t m_dlEarfcn
downlink carrier frequency
Ptr< LteSignalingRadioBearerInfo > m_srb0
ConcernedCells_t concernedCells
The list of cells responsible for this trigger.
static TypeId GetTypeId(void)
Represents a measurement result from a certain cell.
static double IeValue2ActualA3Offset(int8_t a3OffsetIeValue)
Returns the actual value of an a3-Offset parameter.
Ptr< Object > Create(void) const
TracedCallback< uint64_t, uint16_t, uint16_t, uint16_t > m_handoverStartTrace
void DoRecvRrcConnectionReconfiguration(LteRrcSap::RrcConnectionReconfiguration msg)
Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionReconfiguration interfa...
void DoRecvRrcConnectionReestablishment(LteRrcSap::RrcConnectionReestablishment msg)
Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionReestablishment interfa...
uint8_t m_dlBandwidth
downlink bandwidth in RBs
Service Access Point (SAP) offered by the UE PHY to the UE RRC for control purposes.
Hold an unsigned integer type.
TracedCallback< uint64_t, uint16_t, uint16_t > m_randomAccessErrorTrace
uint8_t rrcTransactionIdentifier
TracedCallback< uint64_t, uint16_t, uint16_t > m_sib2ReceivedTrace
void EvaluateCellForSelection()
Performs cell selection evaluation to the current serving cell.
std::list< MeasIdToAddMod > measIdToAddModList
bool haveRachConfigDedicated
virtual void DoInitialize(void)
This method is called only once by Object::Initialize.
std::map< uint16_t, MeasValues > m_storedMeasValues
Internal storage of the latest measurement results from all detected detected cells, indexed by the cell ID where the measurement was taken from.
PhysicalConfigDedicated physicalConfigDedicated
Ptr< LteSignalingRadioBearerInfo > m_srb1
LteUeCphySapProvider * m_cphySapProvider
uint8_t filterCoefficientRSRP
uint8_t GetUlBandwidth() const
void SetLteUeCmacSapProvider(LteUeCmacSapProvider *s)
set the CMAC SAP this RRC should interact with
Parameters for LtePdcpSapProvider::TransmitPdcpSdu.
Template for the implementation of the LteAsSapProvider as a member of an owner class of type C to wh...
uint32_t m_csgWhiteList
List of CSG ID which this UE entity has access to.
Service Access Point (SAP) offered by the UE MAC to the UE RRC.
uint8_t rrcTransactionIdentifier
std::map< uint8_t, LteRrcSap::MeasIdToAddMod > measIdList
#define NS_LOG_LOGIC(msg)
std::map< uint8_t, uint8_t > m_bid2DrbidMap
void SetLteMacSapProvider(LteMacSapProvider *s)
set the MAC SAP provider.
TracedCallback< uint64_t, uint16_t > m_initialCellSelectionEndOkTrace
RadioResourceConfigDedicated radioResourceConfigDedicated
uint8_t rrcTransactionIdentifier
void SetLteUeCphySapProvider(LteUeCphySapProvider *s)
set the CPHY SAP this RRC should use to interact with the PHY
void SwitchToState(State s)
static double IeValue2ActualQRxLevMin(int8_t qRxLevMinIeValue)
Returns the actual value of an Q-RxLevMin parameter.
TracedCallback< uint64_t, uint16_t > m_initialCellSelectionEndErrorTrace
VarMeasConfig m_varMeasConfig
Includes the accumulated configuration of the measurements to be performed by the UE...
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...
Event A2: Serving becomes worse than absolute threshold.
std::map< uint8_t, LteRrcSap::ReportConfigToAddMod > reportConfigList
LteUeCphySapUser * m_cphySapUser
virtual void Setup(SetupParameters params)=0
virtual void SetSrsConfigurationIndex(uint16_t srcCi)=0
Ptr< Packet > pdcpSdu
the RRC PDU
uint16_t targetPhysCellId
LteAsSapUser * m_asSapUser
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Template for the implementation of the LteUeRrcSapProvider as a member of an owner class of type C to...
bool haveMobilityControlInfo
virtual void StartCellSearch(uint16_t dlEarfcn)=0
Tell the PHY entity to listen to PSS from surrounding cells and measure the RSRP. ...
void DoNotifyRandomAccessSuccessful()
uint8_t GetDlBandwidth() const
uint16_t GetDlEarfcn() const
bool haveMeasResultNeighCells
uint8_t filterCoefficientRSRQ
const char * g_ueRrcStateName[LteUeRrc::NUM_STATES]
TracedCallback< uint64_t, uint16_t, uint16_t, uint16_t > m_sib1ReceivedTrace
double rsrq
Measured RSRQ in dB.
void DoSendData(Ptr< Packet > packet, uint8_t bid)
Service Access Point (SAP) offered by the UE MAC to the UE RRC.
This class implements the Access Stratum (AS) Service Access Point (SAP), i.e., the interface between...
static EventId ScheduleNow(MEM mem_ptr, OBJ obj)
Schedule an event to expire Now.
bool haveSoundingRsUlConfigDedicated
uint16_t m_ulEarfcn
uplink carrier frequency
static Time Now(void)
Return the "current simulation time".
Reference Signal Received Quality.
LteRlcSapUser * srb0SapUser
void DoRecvRrcConnectionRelease(LteRrcSap::RrcConnectionRelease msg)
Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionRelease interface...
double rsrp
Measured RSRP in dBm.
virtual void AddLc(uint8_t lcId, LogicalChannelConfig lcConfig, LteMacSapUser *msu)=0
add a new Logical Channel (LC)
void VarMeasReportListErase(uint8_t measId, ConcernedCells_t leavingCells, bool reportOnLeave)
Remove some cells from an existing reporting entry in m_varMeasReportList.
Event A5: PCell becomes worse than absolute threshold1 AND Neighbour becomes better than another abso...
CarrierBandwidthEutra carrierBandwidth
uint8_t m_ulBandwidth
uplink bandwidth in RBs
#define NS_ASSERT_MSG(condition, message)
LteUeCphySapUser * GetLteUeCphySapUser()
TracedCallback< uint64_t, uint16_t, uint16_t > m_connectionReconfigurationTrace
Ptr< LteSignalingRadioBearerInfo > m_srb1Old
virtual void SendMeasurementReport(MeasurementReport msg)=0
Send a MeasurementReport message to the serving eNodeB during a measurement reporting procedure (Sect...
State
The states of the UE RRC entity.
virtual void StartNonContentionBasedRandomAccessProcedure(uint16_t rnti, uint8_t rapId, uint8_t prachMask)=0
tell the MAC to start a non-contention-based random access procedure, e.g., as a consequence of hando...
virtual void SetDlBandwidth(uint8_t dlBandwidth)=0
uint64_t GetImsi(void) const
RachConfigCommon rachConfigCommon
instantiate subclasses of ns3::Object.
static uint8_t Dbm2RsrpRange(double dbm)
convert an RSRP value in dBm to the corresponding range as per 3GPP TS 36.133 section 9...
uint8_t raResponseWindowSize
void SaveUeMeasurements(uint16_t cellId, double rsrp, double rsrq, bool useLayer3Filtering)
Keep the given measurement result as the latest measurement figures, to be utilised by UE RRC functio...
std::string ToString(EpcUeNas::State s)
uint16_t prioritizedBitRateKbps
bool haveCarrierBandwidth
virtual void SetTransmissionMode(uint8_t txMode)=0
bool haveAntennaInfoDedicated
Event A3: Neighbour becomes amount of offset better than PCell.
void DoSetCsgWhiteList(uint32_t csgId)
void DoNotifyRandomAccessFailed()
void DoCompleteSetup(LteUeRrcSapProvider::CompleteSetupParameters params)
Part of the RRC protocol. Implement the LteUeRrcSapProvider::CompleteSetup interface.
LteUeRrcSapProvider * m_rrcSapProvider
void ApplyRadioResourceConfigDedicated(LteRrcSap::RadioResourceConfigDedicated rrcd)
TracedCallback< uint64_t, uint16_t, uint16_t > m_connectionEstablishedTrace
uint16_t GetCellId() const
std::list< DrbToAddMod > drbToAddModList
virtual void NotifyConnectionReleased()=0
Notify the NAS that RRC Connection was released.
std::map< uint8_t, VarMeasReport > m_varMeasReportList
The list of active reporting entries, indexed by the measurement identity which triggered the reporti...
virtual void NotifyConnectionFailed()=0
Notify the NAS that RRC Connection Establishment failed.
LteAsSapProvider * m_asSapProvider
#define NS_LOG_DEBUG(msg)
LteRlcSapProvider * srb0SapProvider
TracedCallback< uint64_t, uint16_t, uint16_t, uint16_t > m_mibReceivedTrace
LteUeCmacSapProvider * m_cmacSapProvider
std::set< uint16_t > m_acceptableCell
List of cell ID of acceptable cells for cell selection that have been detected.
LteAsSapProvider * GetAsSapProvider()
Service Access Point (SAP) offered by the MAC to the RLC See Femto Forum MAC Scheduler Interface Spec...
void DoReportUeMeasurements(LteUeCphySapUser::UeMeasurementsParameters params)
Event A4: Neighbour becomes better than absolute threshold.
MobilityControlInfo mobilityControlInfo
void DoStartCellSelection(uint16_t dlEarfcn)
Represents a single measurement reporting entry., which includes information about a measurement for ...
Reference Signal Received Power.
#define NS_LOG_ERROR(msg)
AntennaInfoDedicated antennaInfo
TracedCallback< uint64_t, uint16_t, uint16_t, State, State > m_stateTransitionTrace
void SendMeasurementReport(uint8_t measId)
Produce a proper measurement report from the given measurement identity's reporting entry in m_varMea...
a base class which provides memory management and object aggregation
void SynchronizeToStrongestCell()
Go through the list of measurement results, choose the one with the strongest RSRP, and tell PHY to synchronize to it.
contain a set of ns3::Object pointers.
void DoReceivePdcpSdu(LtePdcpSapUser::ReceivePdcpSduParameters params)
virtual void SendRrcConnectionRequest(RrcConnectionRequest msg)=0
Send an _RRCConnectionRequest message to the serving eNodeB during an RRC connection establishment pr...
Part of the RRC protocol.
static uint8_t Db2RsrqRange(double db)
convert an RSRQ value in dB to the corresponding range as per 3GPP TS 36.133 section 9...
virtual void RecvData(Ptr< Packet > packet)=0
receive a data packet
UeMemberLteUeCmacSapUser(LteUeRrc *rrc)
LteUeRrcSapProvider * GetLteUeRrcSapProvider()
std::list< uint16_t > ConcernedCells_t
List of cell IDs which are responsible for a certain trigger.
void VarMeasReportListAdd(uint8_t measId, ConcernedCells_t enteringCells)
Compose a new reporting entry of the given measurement identity, insert it into m_varMeasReportList, and set it up for submission to eNodeB.
Ptr< T > GetObject(void) const
virtual void SetTemporaryCellRnti(uint16_t rnti)
TracedCallback< uint64_t, uint16_t, uint16_t > m_randomAccessSuccessfulTrace
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...
std::list< uint8_t > measIdToRemoveList
This abstract base class defines the API to interact with the Radio Link Control (LTE_RLC) in LTE...
a unique identifier for an interface.
virtual void ConfigureUplink(uint16_t ulEarfcn, uint8_t ulBandwidth)=0
Configure uplink (normally done after reception of SIB2)
std::list< ReportConfigToAddMod > reportConfigToAddModList
virtual void ConfigureRach(RachConfig rc)=0
TypeId SetParent(TypeId tid)
std::list< uint8_t > drbToReleaseList
static TypeId GetTypeId(void)
void SetImsi(uint64_t imsi)
uint8_t m_lastRrcTransactionIdentifier
void VarMeasReportListClear(uint8_t measId)
Remove the reporting entry of the given measurement identity from m_varMeasReportList.
void LeaveConnectedMode()
TracedCallback< uint64_t, uint16_t, uint16_t > m_handoverEndErrorTrace
RaSupervisionInfo raSupervisionInfo
LteRrcSap::SystemInformationBlockType1 m_lastSib1
Stored content of the last SIB1 received.
virtual void NotifyRandomAccessFailed()
Notify the RRC that the MAC Random Access procedure failed.
LteUeCmacSapUser * m_cmacSapUser
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 ...
void DoForceCampedOnEnb(uint16_t cellId, uint16_t dlEarfcn)
RSRQ is used for the threshold.
uint8_t logicalChannelGroup
Event A1: Serving becomes better than absolute threshold.