24 #include <ns3/object-factory.h>
27 #include <ns3/simulator.h>
28 #include <ns3/trace-source-accessor.h>
29 #include <ns3/antenna-model.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>
117 m_transmissionMode (0),
121 m_random = CreateObject<UniformRandomVariable> ();
127 for (uint8_t i = 0; i < 7; i++)
196 .AddTraceSource (
"TxStart",
197 "Trace fired when a new transmission is started",
199 "ns3::PacketBurst::TracedCallback")
200 .AddTraceSource (
"TxEnd",
201 "Trace fired when a previosuly started transmission is finished",
203 "ns3::PacketBurst::TracedCallback")
204 .AddTraceSource (
"RxStart",
205 "Trace fired when the start of a signal is detected",
207 "ns3::PacketBurst::TracedCallback")
208 .AddTraceSource (
"RxEndOk",
209 "Trace fired when a previosuly started RX terminates successfully",
211 "ns3::Packet::TracedCallback")
212 .AddTraceSource (
"RxEndError",
213 "Trace fired when a previosuly started RX terminates with an error",
215 "ns3::Packet::TracedCallback")
216 .AddAttribute (
"DataErrorModelEnabled",
217 "Activate/Deactivate the error model of data (TBs of PDSCH and PUSCH) [by default is active].",
221 .AddAttribute (
"CtrlErrorModelEnabled",
222 "Activate/Deactivate the error model of control (PCFICH-PDCCH decodification) [by default is active].",
226 .AddTraceSource (
"DlPhyReception",
227 "DL reception PHY layer statistics.",
229 "ns3::PhyReceptionStatParameters::TracedCallback")
230 .AddTraceSource (
"UlPhyReception",
231 "DL reception PHY layer statistics.",
233 "ns3::PhyReceptionStatParameters::TracedCallback")
435 NS_FATAL_ERROR (
"cannot TX while RX: according to FDD channel acces, the physical layer for transmission cannot be used for reception");
441 NS_FATAL_ERROR (
"cannot TX while already TX: the MAC should avoid this");
461 txParams->duration = duration;
462 txParams->txPhy = GetObject<SpectrumPhy> ();
465 txParams->packetBurst = pb;
466 txParams->ctrlMsgList = ctrlMsgList;
492 NS_FATAL_ERROR (
"cannot TX while RX: according to FDD channel acces, the physical layer for transmission cannot be used for reception");
498 NS_FATAL_ERROR (
"cannot TX while already TX: the MAC should avoid this");
519 txParams->txPhy = GetObject<SpectrumPhy> ();
524 txParams->ctrlMsgList = ctrlMsgList;
550 NS_FATAL_ERROR (
"cannot TX while RX: according to FDD channel acces, the physical layer for transmission cannot be used for reception");
556 NS_FATAL_ERROR (
"cannot TX while already TX: the MAC should avoid this");
577 txParams->txPhy = GetObject<SpectrumPhy> ();
640 Time duration = spectrumRxParams->duration;
647 if (lteDataRxParams != 0)
652 else if (lteDlCtrlRxParams!=0)
657 else if (lteUlSrsRxParams!=0)
679 NS_FATAL_ERROR (
"cannot RX while TX: according to FDD channel access, the physical layer for transmission cannot be used for reception");
695 NS_LOG_LOGIC (
this <<
" synchronized with this signal (cellId=" << params->cellId <<
")");
703 NS_LOG_LOGIC (
this <<
" scheduling EndRx with delay " << params->duration.GetSeconds () <<
"s");
718 if (params->packetBurst)
725 NS_LOG_DEBUG (
this <<
" insert msgs " << params->ctrlMsgList.size ());
732 NS_LOG_LOGIC (
this <<
" not in sync with this signal (cellId="
733 << params->cellId <<
", m_cellId=" <<
m_cellId <<
")");
758 cellId = lteDlCtrlRxParams->cellId;
775 if (lteDlCtrlRxParams->pss ==
true)
789 << cellId <<
", m_cellId=" <<
m_cellId <<
")");
795 NS_LOG_LOGIC (
this <<
" synchronized with this signal (cellId=" << cellId <<
")");
800 NS_LOG_LOGIC (
this <<
" scheduling EndRx with delay " << lteDlCtrlRxParams->duration);
810 NS_LOG_LOGIC (
this <<
" not synchronizing with this signal (cellId="
811 << cellId <<
", m_cellId=" <<
m_cellId <<
")");
841 NS_FATAL_ERROR (
"cannot RX while TX: according to FDD channel access, the physical layer for transmission cannot be used for reception");
859 cellId = lteUlSrsRxParams->cellId;
862 NS_LOG_LOGIC (
this <<
" synchronized with this signal (cellId=" << cellId <<
")");
870 NS_LOG_LOGIC (
this <<
" scheduling EndRx with delay " << lteUlSrsRxParams->duration);
888 NS_LOG_LOGIC (
this <<
" not in sync with this signal (cellId="
889 << cellId <<
", m_cellId=" <<
m_cellId <<
")");
912 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)
914 NS_LOG_FUNCTION (
this <<
" rnti: " << rnti <<
" NDI " << (uint16_t)ndi <<
" size " << size <<
" mcs " << (uint16_t)mcs <<
" layer " << (uint16_t)layer <<
" rv " << (uint16_t)rv);
918 expectedTbs_t::iterator it;
926 tbInfo_t tbInfo = {ndi, size, mcs, map, harqId, rv, 0.0, downlink,
false,
false};
927 m_expectedTbs.insert (std::pair<TbId_t, tbInfo_t> (tbId,tbInfo));
957 if ((*itTb).second.ndi == 0)
960 uint16_t ulHarqId = 0;
961 if ((*itTb).second.downlink)
963 harqInfoList =
m_harqPhyModule->GetHarqProcessInfoDl ((*itTb).second.harqProcessId, (*itTb).first.m_layer);
967 harqInfoList =
m_harqPhyModule->GetHarqProcessInfoUl ((*itTb).first.m_rnti, ulHarqId);
971 (*itTb).second.mi = tbStats.
mi;
973 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);
979 params.
m_rnti = (*itTb).first.m_rnti;
981 params.
m_layer = (*itTb).first.m_layer;
982 params.
m_mcs = (*itTb).second.mcs;
983 params.
m_size = (*itTb).second.size;
984 params.
m_rv = (*itTb).second.rv;
985 params.
m_ndi = (*itTb).second.ndi;
987 if ((*itTb).second.downlink)
995 params.
m_rv = harqInfoList.size ();
1002 std::map <uint16_t, DlInfoListElement_s> harqDlInfoMap;
1010 (*j)->PeekPacketTag (tag);
1018 if (!(*itTb).second.corrupt)
1034 if (!(*itTb).second.harqFeedbackSent)
1036 (*itTb).second.harqFeedbackSent =
true;
1037 if (!(*itTb).second.downlink)
1041 harqUlInfo.
m_tpc = 0;
1042 if ((*itTb).second.corrupt)
1046 m_harqPhyModule->UpdateUlHarqProcessStatus (tbId.
m_rnti, (*itTb).second.mi, (*itTb).second.size, (*itTb).second.size / EffectiveCodingRate [(*itTb).second.mcs]);
1061 std::map <uint16_t, DlInfoListElement_s>::iterator itHarq = harqDlInfoMap.find (tbId.
m_rnti);
1062 if (itHarq==harqDlInfoMap.end ())
1068 if ((*itTb).second.corrupt)
1071 NS_LOG_DEBUG (
this <<
" RNTI " << tbId.
m_rnti <<
" harqId " << (uint16_t)(*itTb).second.harqProcessId <<
" layer " <<(uint16_t)tbId.
m_layer <<
" send DL-HARQ-NACK");
1072 m_harqPhyModule->UpdateDlHarqProcessStatus ((*itTb).second.harqProcessId, tbId.
m_layer, (*itTb).second.mi, (*itTb).second.size, (*itTb).second.size / EffectiveCodingRate [(*itTb).second.mcs]);
1078 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");
1079 m_harqPhyModule->ResetDlHarqProcessStatus ((*itTb).second.harqProcessId);
1081 harqDlInfoMap.insert (std::pair <uint16_t, DlInfoListElement_s> (tbId.
m_rnti, harqDlInfo));
1085 if ((*itTb).second.corrupt)
1088 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");
1089 m_harqPhyModule->UpdateDlHarqProcessStatus ((*itTb).second.harqProcessId, tbId.
m_layer, (*itTb).second.mi, (*itTb).second.size, (*itTb).second.size / EffectiveCodingRate [(*itTb).second.mcs]);
1095 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");
1096 m_harqPhyModule->ResetDlHarqProcessStatus ((*itTb).second.harqProcessId);
1106 std::map <uint16_t, DlInfoListElement_s>::iterator itHarq;
1107 for (itHarq = harqDlInfoMap.begin (); itHarq != harqDlInfoMap.end (); itHarq++)
1155 NS_LOG_DEBUG (
this <<
" PCFICH-PDCCH Decodification, errorRate " << errorRate <<
" error " << error);
1243 NS_LOG_FUNCTION (
this <<
" txmode " << (uint16_t)txMode <<
" gain " << gain);
1245 gain = std::pow (10.0, (gain / 10.0));
1250 std::vector <double> temp;
1253 for (uint8_t i = 0; i < temp.size (); i++)
static const Time UL_SRS_DURATION
Ptr< LteHarqPhy > m_harqPhyModule
Simulation virtual time values and global simulation resolution.
Smart pointer class similar to boost::intrusive_ptr.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
void SetStream(int64_t stream)
Specifies the stream number for this RNG stream.
void StartRxData(Ptr< LteSpectrumSignalParametersDataFrame > params)
Abstract base class for Spectrum-aware PHY layers.
Ptr< LteInterference > m_interferenceCtrl
AttributeValue implementation for Boolean.
LtePhyRxCtrlEndOkCallback m_ltePhyRxCtrlEndOkCallback
uint8_t m_mcs
MCS for transport block.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
TracedCallback< Ptr< const PacketBurst > > m_phyTxEndTrace
void AddDataSinrChunkProcessor(Ptr< LteChunkProcessor > p)
uint16_t GetRnti(void) const
void SetState(State newState)
Set the state of the phy layer.
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
bool IsNull(void) const
Check for null implementation.
void StartRxUlSrs(Ptr< LteSpectrumSignalParametersUlSrsFrame > lteUlSrsRxParams)
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
uint8_t m_rv
the redundancy version (HARQ)
TracedCallback< Ptr< const Packet > > m_phyRxEndErrorTrace
void SetLtePhyRxDataEndErrorCallback(LtePhyRxDataEndErrorCallback c)
set the callback for the end of a RX in error, as part of the interconnections between the PHY and th...
Channel is IDLE, no packet is being transmitted.
void SetTxModeGain(uint8_t txMode, double gain)
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
LtePhyRxCtrlEndErrorCallback m_ltePhyRxCtrlEndErrorCallback
void SetTransmissionMode(uint8_t txMode)
Ptr< SpectrumChannel > m_channel
std::list< Ptr< LteControlMessage > > m_txControlMessageList
virtual void DoDispose(void)
Destructor implementation.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_FATAL_ERROR(msg)
Fatal error handling.
expectedTbs_t m_expectedTbs
Ptr< LteInterference > m_interferenceData
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached.
Ptr< SpectrumChannel > GetChannel()
LtePhyRxDataEndErrorCallback m_ltePhyRxDataEndErrorCallback
See section 4.3.12 ulInfoListElement.
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 AddCtrlSinrChunkProcessor(Ptr< LteChunkProcessor > p)
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)
set the associated NetDevice instance
std::list< Ptr< PacketBurst > > m_rxPacketBurstList
static const Time DL_CTRL_DURATION
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
void AddInterferenceCtrlChunkProcessor(Ptr< LteChunkProcessor > p)
LteChunkProcessor devoted to evaluate interference + noise power in control symbols of the subframe...
void SetLtePhyUlHarqFeedbackCallback(LtePhyUlHarqFeedbackCallback c)
set the callback for the UL HARQ feedback as part of the interconnections between the LteSpectrumPhy ...
void ChangeState(State newState)
std::list< Ptr< LteControlMessage > > m_rxControlMessageList
void SetLtePhyRxCtrlEndOkCallback(LtePhyRxCtrlEndOkCallback c)
set the callback for the successful end of a RX ctrl frame, as part of the interconnections between t...
void SetTxPowerSpectralDensity(Ptr< SpectrumValue > txPsd)
set the Power Spectral Density of outgoing signals in W/Hz.
void SetLtePhyRxCtrlEndErrorCallback(LtePhyRxCtrlEndErrorCallback c)
set the callback for the erroneous end of a RX ctrl frame, as part of the interconnections between th...
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
Ptr< AntennaModel > m_antenna
TracedCallback< Ptr< const PacketBurst > > m_phyRxStartTrace
LtePhyRxDataEndOkCallback m_ltePhyRxDataEndOkCallback
void AddDataPowerChunkProcessor(Ptr< LteChunkProcessor > p)
static uint8_t TxMode2LayerNum(uint8_t txMode)
static const double EffectiveCodingRate[29]
bool StartTxDataFrame(Ptr< PacketBurst > pb, std::list< Ptr< LteControlMessage > > ctrlMsgList, Time duration)
Start a transmission of data frame in DL and UL.
uint8_t m_transmissionMode
uint8_t m_layer
the layer (cw) of the transmission
Ptr< MobilityModel > m_mobility
void SetHarqPhyModule(Ptr< LteHarqPhy > harq)
virtual ~LteSpectrumPhy()
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
static double GetPcfichPdcchError(const SpectrumValue &sinr)
run the error-model algorithm for the specified PCFICH+PDCCH channels
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
virtual void DoDispose()
Destructor implementation.
See section 4.3.23 dlInfoListElement.
bool operator<(const int64x64_t &lhs, const int64x64_t &rhs)
Less than operator.
Ptr< NetDevice > GetDevice()
get the associated NetDevice instance
Ptr< SpectrumValue > m_txPsd
std::ostream & operator<<(std::ostream &os, const Angles &a)
print a struct Angles to output
void SetAntenna(Ptr< AntennaModel > a)
set the AntennaModel to be used
EventId m_endRxDlCtrlEvent
bool m_dataErrorModelEnabled
uint8_t m_ndi
new data indicator flag
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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 AttributeChecker > MakeBooleanChecker(void)
Ptr< AntennaModel > GetRxAntenna()
get the AntennaModel used by the NetDevice for reception
Ptr< MobilityModel > GetMobility()
get the associated MobilityModel instance
Ptr< const SpectrumModel > m_rxSpectrumModel
LtePhyDlHarqFeedbackCallback m_ltePhyDlHarqFeedbackCallback
std::vector< enum HarqStatus_e > m_harqStatus
Ptr< PacketBurst > m_txPacketBurst
void SetChannel(Ptr< SpectrumChannel > c)
Set the channel attached to this device.
void AddInterferenceDataChunkProcessor(Ptr< LteChunkProcessor > p)
LteChunkProcessor devoted to evaluate interference + noise power in data symbols of the subframe...
uint8_t m_txMode
the transmission Mode
uint16_t m_size
Size of transport block.
void Reset()
reset the internal state
TracedCallback< PhyReceptionStatParameters > m_ulPhyReception
Trace information regarding PHY stats from UL Rx perspective PhyReceptionStatParameters (see lte-comm...
static Time Now(void)
Return the current simulation virtual time.
Ptr< NetDevice > m_device
bool m_ctrlErrorModelEnabled
uint8_t m_correctness
correctness of the TB received
LtePhyUlHarqFeedbackCallback m_ltePhyUlHarqFeedbackCallback
static TypeId GetTypeId(void)
TracedCallback< Ptr< const Packet > > m_phyRxEndOkTrace
bool StartTxDlCtrlFrame(std::list< Ptr< LteControlMessage > > ctrlMsgList, bool pss)
Start a transmission of control frame in DL.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
uint16_t m_rnti
C-RNTI scheduled.
uint16_t m_cellId
Cell ID of the attached Enb.
void SetLtePhyDlHarqFeedbackCallback(LtePhyDlHarqFeedbackCallback c)
set the callback for the DL HARQ feedback as part of the interconnections between the LteSpectrumPhy ...
void SetLtePhyRxPssCallback(LtePhyRxPssCallback c)
set the callback for the reception of the PSS as part of the interconnections between the LteSpectrum...
LtePhyRxPssCallback m_ltePhyRxPssCallback
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
bool operator==(const EventId &a, const EventId &b)
EventId m_endRxUlSrsEvent
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
Tag used to define the RNTI and LC id for each MAC packet trasmitted.
void SetLtePhyRxDataEndOkCallback(LtePhyRxDataEndOkCallback c)
set the callback for the successful end of a RX, as part of the interconnections between the PHY and ...
void AddRsPowerChunkProcessor(Ptr< LteChunkProcessor > p)
void SetMobility(Ptr< MobilityModel > m)
Set the mobility model associated with this device.
enum ns3::UlInfoListElement_s::ReceptionStatus_e m_receptionStatus
void StartRx(Ptr< SpectrumSignalParameters > params)
Notify the SpectrumPhy instance of an incoming signal.
This class can be used to hold variables of floating point type such as 'double' or 'float'...
TracedCallback< Ptr< const PacketBurst > > m_phyTxStartTrace
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Set of values corresponding to a given SpectrumModel.
uint64_t m_imsi
IMSI of the scheduled UE.
void StartRxDlCtrl(Ptr< LteSpectrumSignalParametersDlCtrlFrame > lteDlCtrlRxParams)
a unique identifier for an interface.
uint8_t GetLayer(void) const
void UpdateSinrPerceived(const SpectrumValue &sinr)
int64_t GetMilliSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
TypeId SetParent(TypeId tid)
bool StartTxUlSrsFrame()
Start a transmission of control frame in UL.
void SetCellId(uint16_t cellId)
SpectrumValue m_sinrPerceived
std::vector< double > m_txModeGain
TracedCallback< PhyReceptionStatParameters > m_dlPhyReception
Trace information regarding PHY stats from DL Rx perspective PhyReceptionStatParameters (see lte-comm...
std::vector< HarqProcessInfoElement_t > HarqProcessInfoList_t