24 #include <ns3/object-factory.h>
27 #include <ns3/simulator.h>
28 #include <ns3/trace-source-accessor.h>
29 #include <ns3/antenna-model.h>
30 #include "lte-spectrum-phy.h"
31 #include "lte-spectrum-signal-parameters.h"
32 #include "lte-net-device.h"
33 #include "lte-radio-bearer-tag.h"
34 #include "lte-sinr-chunk-processor.h"
35 #include "lte-phy-tag.h"
36 #include <ns3/lte-mi-error-model.h>
37 #include <ns3/lte-radio-bearer-tag.h>
38 #include <ns3/boolean.h>
39 #include <ns3/double.h>
40 #include <ns3/config.h>
50 static const Time UL_SRS_DURATION =
NanoSeconds (71429 -1);
54 static const Time DL_CTRL_DURATION =
NanoSeconds (214286 -1);
56 double EffectiveCodingRate[29] = {
95 TbId_t::TbId_t (
const uint16_t a,
const uint8_t b)
102 operator == (
const TbId_t &a,
const TbId_t &b)
104 return ( (a.m_rnti == b.m_rnti) && (a.m_layer == b.m_layer) );
108 operator < (
const TbId_t& a,
const TbId_t& b)
110 return ( (a.m_rnti < b.m_rnti) || ( (a.m_rnti == b.m_rnti) && (a.m_layer < b.m_layer) ) );
113 NS_OBJECT_ENSURE_REGISTERED (LteSpectrumPhy);
115 LteSpectrumPhy::LteSpectrumPhy ()
117 m_transmissionMode (0),
121 m_random = CreateObject<UniformRandomVariable> ();
122 m_random->SetAttribute (
"Min", DoubleValue (0.0));
123 m_random->SetAttribute (
"Max", DoubleValue (1.0));
124 m_interferenceData = CreateObject<LteInterference> ();
125 m_interferenceCtrl = CreateObject<LteInterference> ();
127 for (uint8_t i = 0; i < 7; i++)
129 m_txModeGain.push_back (1.0);
134 LteSpectrumPhy::~LteSpectrumPhy ()
137 m_expectedTbs.clear ();
138 m_txModeGain.clear ();
147 m_interferenceData->Dispose ();
148 m_interferenceData = 0;
149 m_interferenceCtrl->Dispose ();
150 m_interferenceCtrl = 0;
151 m_ltePhyTxEndCallback = MakeNullCallback< void, Ptr<const Packet> > ();
152 m_ltePhyRxDataEndErrorCallback = MakeNullCallback< void > ();
153 m_ltePhyRxDataEndOkCallback = MakeNullCallback< void, Ptr<Packet> > ();
154 m_ltePhyRxCtrlEndOkCallback = MakeNullCallback< void, std::list<Ptr<LteControlMessage> > > ();
155 m_ltePhyRxCtrlEndErrorCallback = MakeNullCallback< void > ();
156 m_ltePhyDlHarqFeedbackCallback = MakeNullCallback< void, DlInfoListElement_s > ();
157 m_ltePhyUlHarqFeedbackCallback = MakeNullCallback< void, UlInfoListElement_s > ();
165 case LteSpectrumPhy::IDLE:
168 case LteSpectrumPhy::RX_DATA:
171 case LteSpectrumPhy::RX_CTRL:
174 case LteSpectrumPhy::TX:
185 LteSpectrumPhy::GetTypeId (
void)
187 static TypeId tid = TypeId (
"ns3::LteSpectrumPhy")
188 .SetParent<SpectrumPhy> ()
189 .AddTraceSource (
"TxStart",
190 "Trace fired when a new transmission is started",
192 .AddTraceSource (
"TxEnd",
193 "Trace fired when a previosuly started transmission is finished",
195 .AddTraceSource (
"RxStart",
196 "Trace fired when the start of a signal is detected",
198 .AddTraceSource (
"RxEndOk",
199 "Trace fired when a previosuly started RX terminates successfully",
201 .AddTraceSource (
"RxEndError",
202 "Trace fired when a previosuly started RX terminates with an error",
204 .AddAttribute (
"DataErrorModelEnabled",
205 "Activate/Deactivate the error model of data (TBs of PDSCH and PUSCH) [by default is active].",
207 MakeBooleanAccessor (&LteSpectrumPhy::m_dataErrorModelEnabled),
208 MakeBooleanChecker ())
209 .AddAttribute (
"CtrlErrorModelEnabled",
210 "Activate/Deactivate the error model of control (PCFICH-PDCCH decodification) [by default is active].",
212 MakeBooleanAccessor (&LteSpectrumPhy::m_ctrlErrorModelEnabled),
213 MakeBooleanChecker ())
214 .AddTraceSource (
"DlPhyReception",
215 "DL reception PHY layer statistics.",
217 .AddTraceSource (
"UlPhyReception",
218 "DL reception PHY layer statistics.",
274 return m_rxSpectrumModel;
292 m_rxSpectrumModel = noisePsd->GetSpectrumModel ();
293 m_interferenceData->SetNoisePowerSpectralDensity (noisePsd);
294 m_interferenceCtrl->SetNoisePowerSpectralDensity (noisePsd);
304 m_transmissionMode = 0;
307 m_endRxDataEvent.
Cancel ();
308 m_endRxDlCtrlEvent.
Cancel ();
309 m_endRxUlSrsEvent.
Cancel ();
310 m_rxControlMessageList.clear ();
311 m_expectedTbs.clear ();
312 m_txControlMessageList.clear ();
313 m_rxPacketBurstList.clear ();
315 m_rxSpectrumModel = 0;
324 m_ltePhyTxEndCallback = c;
332 m_ltePhyRxDataEndErrorCallback = c;
340 m_ltePhyRxDataEndOkCallback = c;
347 m_ltePhyRxCtrlEndOkCallback = c;
354 m_ltePhyRxCtrlEndErrorCallback = c;
361 m_ltePhyDlHarqFeedbackCallback = c;
368 m_ltePhyUlHarqFeedbackCallback = c;
388 ChangeState (newState);
393 LteSpectrumPhy::ChangeState (State newState)
395 NS_LOG_LOGIC (
this <<
" state: " << m_state <<
" -> " << newState);
401 LteSpectrumPhy::SetHarqPhyModule (Ptr<LteHarqPhy> harq)
403 m_harqPhyModule = harq;
415 m_phyTxStartTrace (pb);
421 NS_FATAL_ERROR (
"cannot TX while RX: according to FDD channel acces, the physical layer for transmission cannot be used for reception");
425 NS_FATAL_ERROR (
"cannot TX while already TX: the MAC should avoid this");
436 m_txPacketBurst = pb;
445 txParams->duration = duration;
446 txParams->txPhy = GetObject<SpectrumPhy> ();
447 txParams->txAntenna = m_antenna;
448 txParams->psd = m_txPsd;
449 txParams->packetBurst = pb;
450 txParams->ctrlMsgList = ctrlMsgList;
451 txParams->cellId = m_cellId;
452 m_channel->StartTx (txParams);
477 NS_FATAL_ERROR (
"cannot TX while RX: according to FDD channel acces, the physical layer for transmission cannot be used for reception");
481 NS_FATAL_ERROR (
"cannot TX while already TX: the MAC should avoid this");
501 txParams->duration = DL_CTRL_DURATION;
502 txParams->txPhy = GetObject<SpectrumPhy> ();
503 txParams->txAntenna = m_antenna;
504 txParams->psd = m_txPsd;
505 txParams->cellId = m_cellId;
506 txParams->ctrlMsgList = ctrlMsgList;
507 m_channel->StartTx (txParams);
533 NS_FATAL_ERROR (
"cannot TX while RX: according to FDD channel acces, the physical layer for transmission cannot be used for reception");
537 NS_FATAL_ERROR (
"cannot TX while already TX: the MAC should avoid this");
557 txParams->duration = UL_SRS_DURATION;
558 txParams->txPhy = GetObject<SpectrumPhy> ();
559 txParams->txAntenna = m_antenna;
560 txParams->psd = m_txPsd;
561 txParams->cellId = m_cellId;
562 m_channel->StartTx (txParams);
578 LteSpectrumPhy::EndTx ()
585 m_phyTxEndTrace (m_txPacketBurst);
587 if (!m_ltePhyTxEndCallback.IsNull ())
589 for (std::list<
Ptr<Packet> >::const_iterator iter = m_txPacketBurst->Begin (); iter
590 != m_txPacketBurst->End (); ++iter)
593 m_ltePhyTxEndCallback (packet);
609 Time duration = spectrumRxParams->duration;
614 if (lteDataRxParams != 0)
616 m_interferenceData->AddSignal (rxPsd, duration);
617 StartRxData (lteDataRxParams);
623 if ((lteDlCtrlRxParams!=0)||(lteUlSrsRxParams!=0))
625 m_interferenceCtrl->AddSignal (rxPsd, duration);
626 StartRxCtrl (spectrumRxParams);
631 m_interferenceData->AddSignal (rxPsd, duration);
632 m_interferenceCtrl->AddSignal (rxPsd, duration);
645 NS_FATAL_ERROR (
"cannot RX while TX: according to FDD channel access, the physical layer for transmission cannot be used for reception");
659 if (params->cellId == m_cellId)
661 NS_LOG_LOGIC (
this <<
" synchronized with this signal (cellId=" << params->cellId <<
")");
662 if ((m_rxPacketBurstList.empty ())&&(m_rxControlMessageList.empty ()))
668 m_firstRxDuration = params->duration;
669 NS_LOG_LOGIC (
this <<
" scheduling EndRx with delay " << params->duration.GetSeconds () <<
"s");
670 m_endRxDataEvent =
Simulator::Schedule (params->duration, &LteSpectrumPhy::EndRxData,
this);
680 && (m_firstRxDuration == params->duration));
683 ChangeState (RX_DATA);
684 if (params->packetBurst)
686 m_rxPacketBurstList.push_back (params->packetBurst);
687 m_interferenceData->StartRx (params->psd);
689 m_phyRxStartTrace (params->packetBurst);
691 NS_LOG_DEBUG (
this <<
" insert msgs " << params->ctrlMsgList.size ());
692 m_rxControlMessageList.insert (m_rxControlMessageList.end (), params->ctrlMsgList.begin (), params->ctrlMsgList.end ());
694 NS_LOG_LOGIC (
this <<
" numSimultaneousRxEvents = " << m_rxPacketBurstList.size ());
698 NS_LOG_LOGIC (
this <<
" not in sync with this signal (cellId="
699 << params->cellId <<
", m_cellId=" << m_cellId <<
")");
715 LteSpectrumPhy::StartRxCtrl (Ptr<SpectrumSignalParameters> params)
721 NS_FATAL_ERROR (
"cannot RX while TX: according to FDD channel access, the physical layer for transmission cannot be used for reception");
737 Ptr<LteSpectrumSignalParametersDlCtrlFrame> lteDlCtrlRxParams = DynamicCast<LteSpectrumSignalParametersDlCtrlFrame> (params);
738 if (lteDlCtrlRxParams!=0)
740 cellId = lteDlCtrlRxParams->cellId;
745 Ptr<LteSpectrumSignalParametersUlSrsFrame> lteUlSrsRxParams = DynamicCast<LteSpectrumSignalParametersUlSrsFrame> (params);
746 cellId = lteUlSrsRxParams->cellId;
749 if (cellId == m_cellId)
751 NS_LOG_LOGIC (
this <<
" synchronized with this signal (cellId=" << cellId <<
")");
756 NS_ASSERT (m_rxControlMessageList.empty ());
758 m_firstRxDuration = params->duration;
759 NS_LOG_LOGIC (
this <<
" scheduling EndRx with delay " << params->duration);
763 m_rxControlMessageList = lteDlCtrlRxParams->ctrlMsgList;
764 m_endRxDlCtrlEvent =
Simulator::Schedule (params->duration, &LteSpectrumPhy::EndRxDlCtrl,
this);
768 m_endRxUlSrsEvent =
Simulator::Schedule (params->duration, &LteSpectrumPhy::EndRxUlSrs,
this);
771 else if (m_state == RX_CTRL)
778 && (m_firstRxDuration == params->duration));
781 ChangeState (RX_CTRL);
782 m_interferenceCtrl->StartRx (params->psd);
788 NS_LOG_LOGIC (
this <<
" not in sync with this signal (cellId="
789 << cellId <<
", m_cellId=" << m_cellId <<
")");
807 m_sinrPerceived = sinr;
812 LteSpectrumPhy::AddExpectedTb (uint16_t rnti, uint8_t ndi, uint16_t size, uint8_t mcs, std::vector<int> map, uint8_t layer, uint8_t harqId,uint8_t rv,
bool downlink)
814 NS_LOG_FUNCTION (
this <<
" rnti: " << rnti <<
" NDI " << (uint16_t)ndi <<
" size " << size <<
" mcs " << (uint16_t)mcs <<
" layer " << (uint16_t)layer <<
" rv " << (uint16_t)rv);
817 tbId.m_layer = layer;
818 expectedTbs_t::iterator it;
819 it = m_expectedTbs.find (tbId);
820 if (it != m_expectedTbs.end ())
823 m_expectedTbs.erase (it);
826 tbInfo_t tbInfo = {ndi, size, mcs, map, harqId, rv, 0.0, downlink,
false,
false};
827 m_expectedTbs.insert (std::pair<TbId_t, tbInfo_t> (tbId,tbInfo));
832 LteSpectrumPhy::EndRxData ()
841 m_interferenceData->EndRx ();
842 NS_LOG_DEBUG (
this <<
" No. of burts " << m_rxPacketBurstList.size ());
843 NS_LOG_DEBUG (
this <<
" Expected TBs " << m_expectedTbs.size ());
844 expectedTbs_t::iterator itTb = m_expectedTbs.begin ();
847 NS_LOG_DEBUG (
this <<
" txMode " << (uint16_t)m_transmissionMode <<
" gain " << m_txModeGain.at (m_transmissionMode));
848 NS_ASSERT (m_transmissionMode < m_txModeGain.size ());
849 m_sinrPerceived *= m_txModeGain.at (m_transmissionMode);
851 while (itTb!=m_expectedTbs.end ())
853 if ((m_dataErrorModelEnabled)&&(m_rxPacketBurstList.size ()>0))
856 HarqProcessInfoList_t harqInfoList;
857 if ((*itTb).second.ndi == 0)
860 uint16_t ulHarqId = 0;
861 if ((*itTb).second.downlink)
863 harqInfoList = m_harqPhyModule->GetHarqProcessInfoDl ((*itTb).second.harqProcessId, (*itTb).first.m_layer);
867 harqInfoList = m_harqPhyModule->GetHarqProcessInfoUl ((*itTb).first.m_rnti, ulHarqId);
871 (*itTb).second.mi = tbStats.mi;
872 (*itTb).second.corrupt =
m_random->
GetValue () > tbStats.tbler ?
false :
true;
873 NS_LOG_DEBUG (
this <<
"RNTI " << (*itTb).first.m_rnti <<
" size " << (*itTb).second.size <<
" mcs " << (uint32_t)(*itTb).second.mcs <<
" bitmap " << (*itTb).second.rbBitmap.size () <<
" layer " << (uint16_t)(*itTb).first.m_layer <<
" TBLER " << tbStats.tbler <<
" corrupted " << (*itTb).second.corrupt);
875 PhyReceptionStatParameters params;
877 params.m_cellId = m_cellId;
879 params.m_rnti = (*itTb).first.m_rnti;
880 params.m_txMode = m_transmissionMode;
881 params.m_layer = (*itTb).first.m_layer;
882 params.m_mcs = (*itTb).second.mcs;
883 params.m_size = (*itTb).second.size;
884 params.m_rv = (*itTb).second.rv;
885 params.m_ndi = (*itTb).second.ndi;
886 params.m_correctness = (uint8_t)!(*itTb).second.corrupt;
887 if ((*itTb).second.downlink)
895 params.m_rv = harqInfoList.size ();
902 std::map <uint16_t, DlInfoListElement_s> harqDlInfoMap;
903 for (std::list<Ptr<PacketBurst> >::const_iterator i = m_rxPacketBurstList.begin ();
904 i != m_rxPacketBurstList.end (); ++i)
906 for (std::list<Ptr<Packet> >::const_iterator j = (*i)->Begin (); j != (*i)->End (); ++j)
909 LteRadioBearerTag tag;
910 (*j)->PeekPacketTag (tag);
912 tbId.m_rnti = tag.GetRnti ();
913 tbId.m_layer = tag.GetLayer ();
914 itTb = m_expectedTbs.find (tbId);
915 NS_LOG_INFO (
this <<
" Packet of " << tbId.m_rnti <<
" layer " << (uint16_t) tag.GetLayer ());
916 if (itTb!=m_expectedTbs.end ())
918 if (!(*itTb).second.corrupt)
920 m_phyRxEndOkTrace (*j);
922 if (!m_ltePhyRxDataEndOkCallback.IsNull ())
924 m_ltePhyRxDataEndOkCallback (*j);
930 m_phyRxEndErrorTrace (*j);
934 if (!(*itTb).second.harqFeedbackSent)
936 (*itTb).second.harqFeedbackSent =
true;
937 if (!(*itTb).second.downlink)
939 UlInfoListElement_s harqUlInfo;
940 harqUlInfo.m_rnti = tbId.m_rnti;
941 harqUlInfo.m_tpc = 0;
942 if ((*itTb).second.corrupt)
944 harqUlInfo.m_receptionStatus = UlInfoListElement_s::NotOk;
945 NS_LOG_DEBUG (
this <<
" RNTI " << tbId.m_rnti <<
" send UL-HARQ-NACK");
946 m_harqPhyModule->UpdateUlHarqProcessStatus (tbId.m_rnti, (*itTb).second.mi, (*itTb).second.size, (*itTb).second.size / EffectiveCodingRate [(*itTb).second.mcs]);
950 harqUlInfo.m_receptionStatus = UlInfoListElement_s::Ok;
951 NS_LOG_DEBUG (
this <<
" RNTI " << tbId.m_rnti <<
" send UL-HARQ-ACK");
952 m_harqPhyModule->ResetUlHarqProcessStatus (tbId.m_rnti, (*itTb).second.harqProcessId);
954 if (!m_ltePhyUlHarqFeedbackCallback.IsNull ())
956 m_ltePhyUlHarqFeedbackCallback (harqUlInfo);
961 std::map <uint16_t, DlInfoListElement_s>::iterator itHarq = harqDlInfoMap.find (tbId.m_rnti);
962 if (itHarq==harqDlInfoMap.end ())
964 DlInfoListElement_s harqDlInfo;
965 harqDlInfo.m_harqStatus.resize (m_layersNum, DlInfoListElement_s::NACK);
966 harqDlInfo.m_rnti = tbId.m_rnti;
967 harqDlInfo.m_harqProcessId = (*itTb).second.harqProcessId;
968 if ((*itTb).second.corrupt)
970 harqDlInfo.m_harqStatus.at (tbId.m_layer) = DlInfoListElement_s::NACK;
971 NS_LOG_DEBUG (
this <<
" RNTI " << tbId.m_rnti <<
" harqId " << (uint16_t)(*itTb).second.harqProcessId <<
" layer " <<(uint16_t)tbId.m_layer <<
" send DL-HARQ-NACK");
972 m_harqPhyModule->UpdateDlHarqProcessStatus ((*itTb).second.harqProcessId, tbId.m_layer, (*itTb).second.mi, (*itTb).second.size, (*itTb).second.size / EffectiveCodingRate [(*itTb).second.mcs]);
977 harqDlInfo.m_harqStatus.at (tbId.m_layer) = DlInfoListElement_s::ACK;
978 NS_LOG_DEBUG (
this <<
" RNTI " << tbId.m_rnti <<
" harqId " << (uint16_t)(*itTb).second.harqProcessId <<
" layer " <<(uint16_t)tbId.m_layer <<
" size " << (*itTb).second.size <<
" send DL-HARQ-ACK");
979 m_harqPhyModule->ResetDlHarqProcessStatus ((*itTb).second.harqProcessId);
981 harqDlInfoMap.insert (std::pair <uint16_t, DlInfoListElement_s> (tbId.m_rnti, harqDlInfo));
985 if ((*itTb).second.corrupt)
987 (*itHarq).second.m_harqStatus.at (tbId.m_layer) = DlInfoListElement_s::NACK;
988 NS_LOG_DEBUG (
this <<
" RNTI " << tbId.m_rnti <<
" harqId " << (uint16_t)(*itTb).second.harqProcessId <<
" layer " <<(uint16_t)tbId.m_layer <<
" size " << (*itHarq).second.m_harqStatus.size () <<
" send DL-HARQ-NACK");
989 m_harqPhyModule->UpdateDlHarqProcessStatus ((*itTb).second.harqProcessId, tbId.m_layer, (*itTb).second.mi, (*itTb).second.size, (*itTb).second.size / EffectiveCodingRate [(*itTb).second.mcs]);
993 NS_ASSERT_MSG (tbId.m_layer < (*itHarq).second.m_harqStatus.size (),
" layer " << (uint16_t)tbId.m_layer);
994 (*itHarq).second.m_harqStatus.at (tbId.m_layer) = DlInfoListElement_s::ACK;
995 NS_LOG_DEBUG (
this <<
" RNTI " << tbId.m_rnti <<
" harqId " << (uint16_t)(*itTb).second.harqProcessId <<
" layer " << (uint16_t)tbId.m_layer <<
" size " << (*itHarq).second.m_harqStatus.size () <<
" send DL-HARQ-ACK");
996 m_harqPhyModule->ResetDlHarqProcessStatus ((*itTb).second.harqProcessId);
1006 std::map <uint16_t, DlInfoListElement_s>::iterator itHarq;
1007 for (itHarq = harqDlInfoMap.begin (); itHarq != harqDlInfoMap.end (); itHarq++)
1009 if (!m_ltePhyDlHarqFeedbackCallback.IsNull ())
1011 m_ltePhyDlHarqFeedbackCallback ((*itHarq).second);
1015 if (!m_rxControlMessageList.empty ())
1017 if (!m_ltePhyRxCtrlEndOkCallback.IsNull ())
1019 m_ltePhyRxCtrlEndOkCallback (m_rxControlMessageList);
1023 m_rxPacketBurstList.clear ();
1024 m_rxControlMessageList.clear ();
1025 m_expectedTbs.clear ();
1030 LteSpectrumPhy::EndRxDlCtrl ()
1039 m_interferenceCtrl->EndRx ();
1041 NS_LOG_DEBUG (
this <<
" txMode " << (uint16_t)m_transmissionMode <<
" gain " << m_txModeGain.at (m_transmissionMode));
1042 NS_ASSERT (m_transmissionMode < m_txModeGain.size ());
1043 if (m_transmissionMode>0)
1046 m_sinrPerceived *= m_txModeGain.at (1);
1050 if (m_ctrlErrorModelEnabled)
1055 NS_LOG_DEBUG (
this <<
" PCFICH-PDCCH Decodification, errorRate " << errorRate <<
" error " << error);
1060 if (!m_ltePhyRxCtrlEndOkCallback.IsNull ())
1063 m_ltePhyRxCtrlEndOkCallback (m_rxControlMessageList);
1068 if (!m_ltePhyRxCtrlEndErrorCallback.IsNull ())
1071 m_ltePhyRxCtrlEndErrorCallback ();
1075 m_rxControlMessageList.clear ();
1079 LteSpectrumPhy::EndRxUlSrs ()
1083 m_interferenceCtrl->EndRx ();
1097 m_interferenceCtrl->AddRsPowerChunkProcessor (p);
1104 m_interferenceData->AddSinrChunkProcessor (p);
1110 m_interferenceData->AddInterferenceChunkProcessor (p);
1116 m_interferenceCtrl->AddSinrChunkProcessor (p);
1123 NS_ASSERT_MSG (txMode < m_txModeGain.size (),
"TransmissionMode not available: 1.." << m_txModeGain.size ());
1124 m_transmissionMode = txMode;
1125 m_layersNum = TransmissionModesLayers::TxMode2LayerNum (txMode);
1130 LteSpectrumPhy::SetTxModeGain (uint8_t txMode,
double gain)
1132 NS_LOG_FUNCTION (
this <<
" txmode " << (uint16_t)txMode <<
" gain " << gain);
1134 gain = std::pow (10.0, (gain / 10.0));
1135 if (m_txModeGain.size () < txMode)
1137 m_txModeGain.resize (txMode);
1139 std::vector <double> temp;
1140 temp = m_txModeGain;
1141 m_txModeGain.clear ();
1142 for (uint8_t i = 0; i < temp.size (); i++)
1146 m_txModeGain.push_back (gain);
1150 m_txModeGain.push_back (temp.at (i));
void SetLtePhyTxEndCallback(LtePhyTxEndCallback c)
Time NanoSeconds(uint64_t ns)
create ns3::Time instances in units of nanoseconds.
#define NS_LOG_FUNCTION(parameters)
void SetStream(int64_t stream)
Specifies the stream number for this RNG stream.
void SetState(State newState)
Set the state of the phy layer.
#define NS_ASSERT(condition)
void SetLtePhyRxDataEndErrorCallback(LtePhyRxDataEndErrorCallback c)
#define NS_LOG_COMPONENT_DEFINE(name)
void SetTransmissionMode(uint8_t txMode)
virtual void DoDispose(void)
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Ptr< SpectrumChannel > GetChannel()
static TbStats_t GetTbDecodificationStats(const SpectrumValue &sinr, const std::vector< int > &map, uint16_t size, uint8_t mcs, HarqProcessInfoList_t miHistory)
run the error-model algorithm for the specified TB
void SetNoisePowerSpectralDensity(Ptr< const SpectrumValue > noisePsd)
set the noise power spectral density
Ptr< UniformRandomVariable > m_random
Provides uniform random variables.
void SetDevice(Ptr< NetDevice > d)
#define NS_FATAL_ERROR(msg)
fatal error handling
void SetLtePhyUlHarqFeedbackCallback(LtePhyUlHarqFeedbackCallback c)
void SetLtePhyRxCtrlEndOkCallback(LtePhyRxCtrlEndOkCallback c)
void SetTxPowerSpectralDensity(Ptr< SpectrumValue > txPsd)
void SetLtePhyRxCtrlEndErrorCallback(LtePhyRxCtrlEndErrorCallback c)
bool StartTxDataFrame(Ptr< PacketBurst > pb, std::list< Ptr< LteControlMessage > > ctrlMsgList, Time duration)
int64_t AssignStreams(int64_t stream)
static double GetPcfichPdcchError(const SpectrumValue &sinr)
run the error-model algorithm for the specified PCFICH+PDCCH channels
#define NS_LOG_LOGIC(msg)
Ptr< NetDevice > GetDevice()
std::ostream & operator<<(std::ostream &os, const Angles &a)
Ptr< Packet > Copy(void) const
void SetAntenna(Ptr< AntennaModel > a)
void AddRsPowerChunkProcessor(Ptr< LteSinrChunkProcessor > p)
void AddExpectedTb(uint16_t rnti, uint8_t ndi, uint16_t size, uint8_t mcs, std::vector< int > map, uint8_t layer, uint8_t harqId, uint8_t rv, bool downlink)
Ptr< const SpectrumModel > GetRxSpectrumModel() const
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Ptr< AntennaModel > GetRxAntenna()
Ptr< MobilityModel > GetMobility()
bool StartTxDlCtrlFrame(std::list< Ptr< LteControlMessage > > ctrlMsgList)
void SetChannel(Ptr< SpectrumChannel > c)
TracedCallback< PhyReceptionStatParameters > m_ulPhyReception
#define NS_ASSERT_MSG(condition, message)
void SetLtePhyDlHarqFeedbackCallback(LtePhyDlHarqFeedbackCallback c)
void AddCtrlSinrChunkProcessor(Ptr< LteSinrChunkProcessor > p)
void AddDataSinrChunkProcessor(Ptr< LteSinrChunkProcessor > p)
#define NS_LOG_DEBUG(msg)
void SetLtePhyRxDataEndOkCallback(LtePhyRxDataEndOkCallback c)
void SetMobility(Ptr< MobilityModel > m)
void AddInterferenceChunkProcessor(Ptr< LteSinrChunkProcessor > p)
void StartRx(Ptr< SpectrumSignalParameters > params)
Set of values corresponding to a given SpectrumModel.
void UpdateSinrPerceived(const SpectrumValue &sinr)
int64_t GetMilliSeconds(void) const
void SetCellId(uint16_t cellId)
TracedCallback< PhyReceptionStatParameters > m_dlPhyReception