A Discrete-Event Network Simulator
API
lte-ue-phy.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2010 TELEMATICS LAB, DEE - Politecnico di Bari
4  * Copyright (c) 2018 Fraunhofer ESK : RLF extensions
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation;
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  * Author: Giuseppe Piro <g.piro@poliba.it>
20  * Marco Miozzo <marco.miozzo@cttc.es>
21  * Nicola Baldo <nbaldo@cttc.es>
22  * Modified by:
23  * Vignesh Babu <ns3-dev@esk.fraunhofer.de> (RLF extensions)
24  */
25 
26 #include <ns3/object-factory.h>
27 #include <ns3/log.h>
28 #include <ns3/node.h>
29 #include <cfloat>
30 #include <cmath>
31 #include <ns3/simulator.h>
32 #include <ns3/double.h>
33 #include "lte-ue-phy.h"
34 #include "lte-enb-phy.h"
35 #include "lte-net-device.h"
36 #include "lte-ue-net-device.h"
37 #include "lte-enb-net-device.h"
39 #include "lte-amc.h"
40 #include "lte-ue-mac.h"
41 #include "ff-mac-common.h"
42 #include "lte-chunk-processor.h"
43 #include <ns3/lte-common.h>
44 #include <ns3/pointer.h>
45 #include <ns3/boolean.h>
46 #include <ns3/lte-ue-power-control.h>
47 
48 namespace ns3 {
49 
50 NS_LOG_COMPONENT_DEFINE ("LteUePhy");
51 
52 
53 
61 static const Time UL_DATA_DURATION = NanoSeconds (1e6 - 71429 - 1);
62 
67 static const Time UL_SRS_DELAY_FROM_SUBFRAME_START = NanoSeconds (1e6 - 71429);
68 
69 
70 
71 
73 // member SAP forwarders
75 
78 {
79 public:
86 
87  // inherited from LtePhySapProvider
88  virtual void SendMacPdu (Ptr<Packet> p);
90  virtual void SendRachPreamble (uint32_t prachId, uint32_t raRnti);
91  virtual void NotifyConnectionSuccessful ();
92 
93 private:
95 };
96 
98 {
99 
100 }
101 
102 void
104 {
105  m_phy->DoSendMacPdu (p);
106 }
107 
108 void
110 {
112 }
113 
114 void
115 UeMemberLteUePhySapProvider::SendRachPreamble (uint32_t prachId, uint32_t raRnti)
116 {
117  m_phy->DoSendRachPreamble (prachId, raRnti);
118 }
119 
120 void
122 {
124 }
125 
126 
128 // LteUePhy methods
130 
132 static const std::string g_uePhyStateName[LteUePhy::NUM_STATES] =
133 {
134  "CELL_SEARCH",
135  "SYNCHRONIZED"
136 };
137 
142 static inline const std::string & ToString (LteUePhy::State s)
143 {
144  return g_uePhyStateName[s];
145 }
146 
147 
148 NS_OBJECT_ENSURE_REGISTERED (LteUePhy);
149 
150 
152 {
153  NS_LOG_FUNCTION (this);
154  NS_FATAL_ERROR ("This constructor should not be called");
155 }
156 
158  : LtePhy (dlPhy, ulPhy),
159  m_uePhySapUser (0),
160  m_ueCphySapUser (0),
161  m_state (CELL_SEARCH),
162  m_subframeNo (0),
163  m_rsReceivedPowerUpdated (false),
164  m_rsInterferencePowerUpdated (false),
165  m_dataInterferencePowerUpdated (false),
166  m_pssReceived (false),
167  m_ueMeasurementsFilterPeriod (MilliSeconds (200)),
168  m_ueMeasurementsFilterLast (MilliSeconds (0)),
169  m_rsrpSinrSampleCounter (0),
170  m_imsi (0)
171 {
172  m_amc = CreateObject <LteAmc> ();
173  m_powerControl = CreateObject <LteUePowerControl> ();
177 
178  NS_ASSERT_MSG (Simulator::Now ().GetNanoSeconds () == 0,
179  "Cannot create UE devices after simulation started");
181 
182  DoReset ();
183 }
184 
185 
187 {
188  m_txModeGain.clear ();
189 }
190 
191 void
193 {
194  NS_LOG_FUNCTION (this);
195  delete m_uePhySapProvider;
196  delete m_ueCphySapProvider;
198 }
199 
200 
201 
202 TypeId
204 {
205  static TypeId tid = TypeId ("ns3::LteUePhy")
206  .SetParent<LtePhy> ()
207  .SetGroupName("Lte")
208  .AddConstructor<LteUePhy> ()
209  .AddAttribute ("TxPower",
210  "Transmission power in dBm",
211  DoubleValue (10.0),
214  MakeDoubleChecker<double> ())
215  .AddAttribute ("NoiseFigure",
216  "Loss (dB) in the Signal-to-Noise-Ratio due to non-idealities in the receiver."
217  " According to Wikipedia (http://en.wikipedia.org/wiki/Noise_figure), this is "
218  "\"the difference in decibels (dB) between"
219  " the noise output of the actual receiver to the noise output of an "
220  " ideal receiver with the same overall gain and bandwidth when the receivers "
221  " are connected to sources at the standard noise temperature T0.\" "
222  "In this model, we consider T0 = 290K.",
223  DoubleValue (9.0),
226  MakeDoubleChecker<double> ())
227  .AddAttribute ("TxMode1Gain",
228  "Transmission mode 1 gain in dB",
229  DoubleValue (0.0),
231  MakeDoubleChecker<double> ())
232  .AddAttribute ("TxMode2Gain",
233  "Transmission mode 2 gain in dB",
234  DoubleValue (4.2),
236  MakeDoubleChecker<double> ())
237  .AddAttribute ("TxMode3Gain",
238  "Transmission mode 3 gain in dB",
239  DoubleValue (-2.8),
241  MakeDoubleChecker<double> ())
242  .AddAttribute ("TxMode4Gain",
243  "Transmission mode 4 gain in dB",
244  DoubleValue (0.0),
246  MakeDoubleChecker<double> ())
247  .AddAttribute ("TxMode5Gain",
248  "Transmission mode 5 gain in dB",
249  DoubleValue (0.0),
251  MakeDoubleChecker<double> ())
252  .AddAttribute ("TxMode6Gain",
253  "Transmission mode 6 gain in dB",
254  DoubleValue (0.0),
256  MakeDoubleChecker<double> ())
257  .AddAttribute ("TxMode7Gain",
258  "Transmission mode 7 gain in dB",
259  DoubleValue (0.0),
261  MakeDoubleChecker<double> ())
262  .AddTraceSource ("ReportCurrentCellRsrpSinr",
263  "RSRP and SINR statistics.",
265  "ns3::LteUePhy::RsrpSinrTracedCallback")
266  .AddAttribute ("RsrpSinrSamplePeriod",
267  "The sampling period for reporting RSRP-SINR stats (default value 1)",
268  UintegerValue (1),
270  MakeUintegerChecker<uint16_t> ())
271  .AddTraceSource ("UlPhyTransmission",
272  "DL transmission PHY layer statistics.",
274  "ns3::PhyTransmissionStatParameters::TracedCallback")
275  .AddAttribute ("DlSpectrumPhy",
276  "The downlink LteSpectrumPhy associated to this LtePhy",
278  PointerValue (),
280  MakePointerChecker <LteSpectrumPhy> ())
281  .AddAttribute ("UlSpectrumPhy",
282  "The uplink LteSpectrumPhy associated to this LtePhy",
284  PointerValue (),
286  MakePointerChecker <LteSpectrumPhy> ())
287  .AddAttribute ("RsrqUeMeasThreshold",
288  "Receive threshold for PSS on RSRQ [dB]",
289  DoubleValue (-1000.0),
291  MakeDoubleChecker<double> ())
292  .AddAttribute ("UeMeasurementsFilterPeriod",
293  "Time period for reporting UE measurements, i.e., the"
294  "length of layer-1 filtering.",
295  TimeValue (MilliSeconds (200)),
297  MakeTimeChecker ())
298  .AddAttribute ("DownlinkCqiPeriodicity",
299  "Periodicity in milliseconds for reporting the"
300  "wideband and subband downlink CQIs to the eNB",
301  TimeValue (MilliSeconds (1)),
303  MakeTimeChecker ())
304  .AddTraceSource ("ReportUeMeasurements",
305  "Report UE measurements RSRP (dBm) and RSRQ (dB).",
307  "ns3::LteUePhy::RsrpRsrqTracedCallback")
308  .AddTraceSource ("StateTransition",
309  "Trace fired upon every UE PHY state transition",
311  "ns3::LteUePhy::StateTracedCallback")
312  .AddAttribute ("EnableUplinkPowerControl",
313  "If true, Uplink Power Control will be enabled.",
314  BooleanValue (true),
317  .AddAttribute ("Qout",
318  "corresponds to 10% block error rate of a hypothetical PDCCH transmission"
319  "taking into account the PCFICH errors with transmission parameters."
320  "see 3GPP TS 36.213 4.2.1 and TS 36.133 7.6",
321  DoubleValue (-5),
323  MakeDoubleChecker<double> ())
324  .AddAttribute ("Qin",
325  "corresponds to 2% block error rate of a hypothetical PDCCH transmission"
326  "taking into account the PCFICH errors with transmission parameters."
327  "see 3GPP TS 36.213 4.2.1 and TS 36.133 7.6",
328  DoubleValue (-3.9),
330  MakeDoubleChecker<double> ())
331  .AddAttribute ("NumQoutEvalSf",
332  "This specifies the total number of consecutive subframes"
333  "which corresponds to the Qout evaluation period",
334  UintegerValue (200), //see 3GPP 3GPP TS 36.133 7.6.2.1
337  MakeUintegerChecker<uint16_t> ())
338  .AddAttribute ("NumQinEvalSf",
339  "This specifies the total number of consecutive subframes"
340  "which corresponds to the Qin evaluation period",
341  UintegerValue (100), //see 3GPP 3GPP TS 36.133 7.6.2.1
344  MakeUintegerChecker<uint16_t> ())
345  .AddAttribute ("EnableRlfDetection",
346  "If true, RLF detection will be enabled.",
347  BooleanValue (true),
350  ;
351  return tid;
352 }
353 
354 void
356 {
357  NS_LOG_FUNCTION (this);
358 
359  NS_ABORT_MSG_IF (m_netDevice == nullptr, "LteNetDevice is not available in LteUePhy");
360  Ptr<Node> node = m_netDevice->GetNode ();
361  NS_ABORT_MSG_IF (node == nullptr, "Node is not available in the LteNetDevice of LteUePhy");
362  uint32_t nodeId = node->GetId ();
363 
364  //ScheduleWithContext() is needed here to set context for logs,
365  //because Initialize() is called outside of Node::AddDevice().
366 
368 
370 }
371 
372 void
374 {
375  NS_LOG_FUNCTION (this);
376  m_uePhySapUser = s;
377 }
378 
381 {
382  NS_LOG_FUNCTION (this);
383  return (m_uePhySapProvider);
384 }
385 
386 
387 void
389 {
390  NS_LOG_FUNCTION (this);
391  m_ueCphySapUser = s;
392 }
393 
396 {
397  NS_LOG_FUNCTION (this);
398  return (m_ueCphySapProvider);
399 }
400 
401 void
403 {
404  NS_LOG_FUNCTION (this << nf);
405  m_noiseFigure = nf;
406 }
407 
408 double
410 {
411  NS_LOG_FUNCTION (this);
412  return m_noiseFigure;
413 }
414 
415 void
417 {
418  NS_LOG_FUNCTION (this << pow);
419  m_txPower = pow;
420  m_powerControl->SetTxPower (pow);
421 }
422 
423 double
425 {
426  NS_LOG_FUNCTION (this);
427  return m_txPower;
428 }
429 
432 {
433  NS_LOG_FUNCTION (this);
434  return m_powerControl;
435 }
436 
437 uint8_t
439 {
440  return (m_macChTtiDelay);
441 }
442 
445 {
446  return m_downlinkSpectrumPhy;
447 }
448 
451 {
452  return m_uplinkSpectrumPhy;
453 }
454 
455 void
456 LteUePhy::SetNumQoutEvalSf (uint16_t numSubframes)
457 {
458  NS_LOG_FUNCTION (this << numSubframes);
459  NS_ABORT_MSG_IF (numSubframes % 10 != 0, "Number of subframes used for Qout "
460  "evaluation must be multiple of 10");
461  m_numOfQoutEvalSf = numSubframes;
462 }
463 
464 void
465 LteUePhy::SetNumQinEvalSf (uint16_t numSubframes)
466 {
467  NS_LOG_FUNCTION (this << numSubframes);
468  NS_ABORT_MSG_IF (numSubframes % 10 != 0, "Number of subframes used for Qin "
469  "evaluation must be multiple of 10");
470  m_numOfQinEvalSf = numSubframes;
471 }
472 
473 uint16_t
475 {
476  NS_LOG_FUNCTION (this);
477  return m_numOfQoutEvalSf;
478 }
479 
480 uint16_t
482 {
483  NS_LOG_FUNCTION (this);
484  return m_numOfQinEvalSf;
485 }
486 
487 void
489 {
490  NS_LOG_FUNCTION (this);
491 
492  SetMacPdu (p);
493 }
494 
495 
496 void
498 {
500 }
501 
502 void
504 {
505  NS_LOG_FUNCTION (this);
506 
508 
510  m_uplinkSpectrumPhy->SetTxPowerSpectralDensity (txPsd);
511 }
512 
513 
514 void
515 LteUePhy::SetSubChannelsForReception (std::vector <int> mask)
516 {
517  NS_LOG_FUNCTION (this);
519 }
520 
521 
522 std::vector <int>
524 {
525  NS_LOG_FUNCTION (this);
527 }
528 
529 
530 std::vector <int>
532 {
533  NS_LOG_FUNCTION (this);
535 }
536 
537 
540 {
541  NS_LOG_FUNCTION (this);
542  LteSpectrumValueHelper psdHelper;
544 
545  return psd;
546 }
547 
548 void
550 {
551  NS_LOG_FUNCTION (this);
561  if (m_cellId == 0)
562  {
563  return;
564  }
565  m_ctrlSinrForRlf = sinr;
566  GenerateCqiRsrpRsrq (sinr);
567 }
568 
569 void
571 {
572  NS_LOG_FUNCTION (this << sinr);
573 
575  NS_ASSERT (m_cellId > 0);
576 
577  if (m_dlConfigured && m_ulConfigured && (m_rnti > 0))
578  {
579  // check periodic wideband CQI
581  {
582  NS_LOG_DEBUG("Reporting P10 CQI at : " << Simulator::Now().GetMilliSeconds()
583  << " ms. Last reported at : " << m_p10CqiLast.GetMilliSeconds() << " ms");
584  Ptr<LteUeNetDevice> thisDevice = GetDevice ()->GetObject<LteUeNetDevice> ();
586  if (msg)
587  {
589  }
591  }
592  // check aperiodic high-layer configured subband CQI
594  {
595  NS_LOG_DEBUG("Reporting A30 CQI at : " << Simulator::Now().GetMilliSeconds()
596  << " ms. Last reported at : " << m_a30CqiLast.GetMilliSeconds() << " ms");
597  Ptr<LteUeNetDevice> thisDevice = GetDevice ()->GetObject<LteUeNetDevice> ();
599  if (msg)
600  {
602  }
604  }
605  }
606 
607  // Generate PHY trace
610  {
611  NS_ASSERT_MSG (m_rsReceivedPowerUpdated, " RS received power info obsolete");
612  // RSRP evaluated as averaged received power among RBs
613  double sum = 0.0;
614  uint8_t rbNum = 0;
615  Values::const_iterator it;
617  {
618  // convert PSD [W/Hz] to linear power [W] for the single RE
619  // we consider only one RE for the RS since the channel is
620  // flat within the same RB
621  double powerTxW = ((*it) * 180000.0) / 12.0;
622  sum += powerTxW;
623  rbNum++;
624  }
625  double rsrp = (rbNum > 0) ? (sum / rbNum) : DBL_MAX;
626  // averaged SINR among RBs
627  double avSinr = ComputeAvgSinr (sinr);
628 
629  NS_LOG_INFO (this << " cellId " << m_cellId << " rnti " << m_rnti << " RSRP " << rsrp << " SINR " << avSinr << " ComponentCarrierId " << (uint16_t) m_componentCarrierId);
630  //trigger RLF detection only when UE has an active RRC connection
631  //and RLF detection attribute is set to true
633  {
634  double avrgSinrForRlf = ComputeAvgSinr (m_ctrlSinrForRlf);
635  RlfDetection (10 * log10 (avrgSinrForRlf));
636  }
637 
640  }
641 
642  if (m_pssReceived)
643  {
644  // measure instantaneous RSRQ now
645  NS_ASSERT_MSG (m_rsInterferencePowerUpdated, " RS interference power info obsolete");
646 
647  std::list <PssElement>::iterator itPss = m_pssList.begin ();
648  while (itPss != m_pssList.end ())
649  {
650  uint16_t rbNum = 0;
651  double rssiSum = 0.0;
652 
653  Values::const_iterator itIntN = m_rsInterferencePower.ConstValuesBegin ();
654  Values::const_iterator itPj = m_rsReceivedPower.ConstValuesBegin ();
655  for (itPj = m_rsReceivedPower.ConstValuesBegin ();
657  itIntN++, itPj++)
658  {
659  rbNum++;
660  // convert PSD [W/Hz] to linear power [W] for the single RE
661  double interfPlusNoisePowerTxW = ((*itIntN) * 180000.0) / 12.0;
662  double signalPowerTxW = ((*itPj) * 180000.0) / 12.0;
663  rssiSum += (2 * (interfPlusNoisePowerTxW + signalPowerTxW));
664  }
665 
666  NS_ASSERT (rbNum == (*itPss).nRB);
667  double rsrq_dB = 10 * log10 ((*itPss).pssPsdSum / rssiSum);
668 
669  if (rsrq_dB > m_pssReceptionThreshold)
670  {
671  NS_LOG_INFO (this << " PSS RNTI " << m_rnti << " cellId " << m_cellId
672  << " has RSRQ " << rsrq_dB << " and RBnum " << rbNum);
673  // store measurements
674  std::map <uint16_t, UeMeasurementsElement>::iterator itMeasMap;
675  itMeasMap = m_ueMeasurementsMap.find ((*itPss).cellId);
676  if (itMeasMap != m_ueMeasurementsMap.end ())
677  {
678  (*itMeasMap).second.rsrqSum += rsrq_dB;
679  (*itMeasMap).second.rsrqNum++;
680  }
681  else
682  {
683  NS_LOG_WARN ("race condition of bug 2091 occurred");
684  }
685  }
686 
687  itPss++;
688 
689  } // end of while (itPss != m_pssList.end ())
690 
691  m_pssList.clear ();
692 
693  } // end of if (m_pssReceived)
694 
695 } // end of void LteUePhy::GenerateCtrlCqiReport (const SpectrumValue& sinr)
696 
697 double
699 {
700  NS_LOG_FUNCTION (this);
701 
702  // averaged SINR among RBs
703  double sum = 0.0;
704  uint8_t rbNum = 0;
705  Values::const_iterator it;
706 
707  for (it = sinr.ConstValuesBegin (); it != sinr.ConstValuesEnd (); it++)
708  {
709  sum += (*it);
710  rbNum++;
711  }
712 
713  double avrgSinr = (rbNum > 0) ? (sum / rbNum) : DBL_MAX;
714 
715  return avrgSinr;
716 }
717 
718 void
720 {
721  // Not used by UE, CQI are based only on RS
722 }
723 
724 void
726 {
727  NS_LOG_FUNCTION (this);
728 
738  if (m_cellId == 0)
739  {
740  return;
741  }
742 
744  //NOTE: The SINR received by this method is
745  //based on CTRL, which is not used to compute
746  //PDSCH (i.e., data) based SINR. It is used
747  //for RLF detection.
748  m_ctrlSinrForRlf = sinr;
749 
752  {
753  // we have a measurement of interf + noise for the denominator
754  // of SINR = S/(I+N)
755  mixedSinr /= m_dataInterferencePower;
757  NS_LOG_LOGIC ("data interf measurement available, SINR = " << mixedSinr);
758  }
759  else
760  {
761  // we did not see any interference on data, so interference is
762  // there and we have only noise at the denominator of SINR
763  mixedSinr /= (*m_noisePsd);
764  NS_LOG_LOGIC ("no data interf measurement available, SINR = " << mixedSinr);
765  }
766 
767  /*
768  * some RBs are not used in PDSCH and their SINR is very high
769  * for example with bandwidth 25, last RB is not used
770  * it can make avgSinr value very high, what is incorrect
771  */
772  uint32_t rbgSize = GetRbgSize ();
773  uint32_t modulo = m_dlBandwidth % rbgSize;
774  double avgMixedSinr = 0;
775  uint32_t usedRbgNum = 0;
776  for(uint32_t i = 0; i < (m_dlBandwidth-1-modulo); i++)
777  {
778  usedRbgNum++;
779  avgMixedSinr+=mixedSinr[i];
780  }
781  avgMixedSinr = avgMixedSinr/usedRbgNum;
782  for(uint32_t i = 0; i < modulo; i++)
783  {
784  mixedSinr[m_dlBandwidth-1-i] = avgMixedSinr;
785  }
786 
787  GenerateCqiRsrpRsrq (mixedSinr);
788 }
789 
790 void
792 {
793  NS_LOG_FUNCTION (this << interf);
795  m_rsInterferencePower = interf;
796 }
797 
798 void
800 {
801  NS_LOG_FUNCTION (this << interf);
802 
804  m_dataInterferencePower = interf;
805 }
806 
807 void
809 {
810  NS_LOG_FUNCTION (this << power);
812  m_rsReceivedPower = power;
813 
815  {
816  double sum = 0;
817  uint32_t rbNum = 0;
818  Values::const_iterator it;
820  {
821  double powerTxW = ((*it) * 180000);
822  sum += powerTxW;
823  rbNum++;
824  }
825  double rsrp = 10 * log10 (sum) + 30;
826 
827  NS_LOG_INFO ("RSRP: " << rsrp);
828  m_powerControl->SetRsrp (rsrp);
829  }
830 }
831 
834 {
835  NS_LOG_FUNCTION (this);
836 
837 
838  // apply transmission mode gain
840  SpectrumValue newSinr = sinr;
841  newSinr *= m_txModeGain.at (m_transmissionMode);
842 
843  // CREATE DlCqiLteControlMessage
844  Ptr<DlCqiLteControlMessage> msg = Create<DlCqiLteControlMessage> ();
845  CqiListElement_s dlcqi;
846  std::vector<int> cqi;
848  {
849  cqi = m_amc->CreateCqiFeedbacks (newSinr, m_dlBandwidth);
850 
852  int nbSubChannels = cqi.size ();
853  double cqiSum = 0.0;
854  int activeSubChannels = 0;
855  // average the CQIs of the different RBs
856  for (int i = 0; i < nbSubChannels; i++)
857  {
858  if (cqi.at (i) != -1)
859  {
860  cqiSum += cqi.at (i);
861  activeSubChannels++;
862  }
863  NS_LOG_DEBUG (this << " subch " << i << " cqi " << cqi.at (i));
864  }
865  dlcqi.m_rnti = m_rnti;
866  dlcqi.m_ri = 1; // not yet used
867  dlcqi.m_cqiType = CqiListElement_s::P10; // Peridic CQI using PUCCH wideband
868  NS_ASSERT_MSG (nLayer > 0, " nLayer negative");
869  NS_ASSERT_MSG (nLayer < 3, " nLayer limit is 2s");
870  for (int i = 0; i < nLayer; i++)
871  {
872  if (activeSubChannels > 0)
873  {
874  dlcqi.m_wbCqi.push_back ((uint16_t) cqiSum / activeSubChannels);
875  }
876  else
877  {
878  // approximate with the worst case -> CQI = 1
879  dlcqi.m_wbCqi.push_back (1);
880  }
881  }
882  //NS_LOG_DEBUG (this << " Generate P10 CQI feedback " << (uint16_t) cqiSum / activeSubChannels);
883  dlcqi.m_wbPmi = 0; // not yet used
884  // dl.cqi.m_sbMeasResult others CQI report modes: not yet implemented
885  }
887  {
888  cqi = m_amc->CreateCqiFeedbacks (newSinr, GetRbgSize ());
890  int nbSubChannels = cqi.size ();
891  int rbgSize = GetRbgSize ();
892  double cqiSum = 0.0;
893  int cqiNum = 0;
894  SbMeasResult_s rbgMeas;
895  //NS_LOG_DEBUG (this << " Create A30 CQI feedback, RBG " << rbgSize << " cqiNum " << nbSubChannels << " band " << (uint16_t)m_dlBandwidth);
896  for (int i = 0; i < nbSubChannels; i++)
897  {
898  if (cqi.at (i) != -1)
899  {
900  cqiSum += cqi.at (i);
901  }
902  // else "nothing" no CQI is treated as CQI = 0 (worst case scenario)
903  cqiNum++;
904  if (cqiNum == rbgSize)
905  {
906  // average the CQIs of the different RBGs
907  //NS_LOG_DEBUG (this << " RBG CQI " << (uint16_t) cqiSum / rbgSize);
908  HigherLayerSelected_s hlCqi;
909  hlCqi.m_sbPmi = 0; // not yet used
910  for (int i = 0; i < nLayer; i++)
911  {
912  hlCqi.m_sbCqi.push_back ((uint16_t) cqiSum / rbgSize);
913  }
914  rbgMeas.m_higherLayerSelected.push_back (hlCqi);
915  cqiSum = 0.0;
916  cqiNum = 0;
917  }
918  }
919  dlcqi.m_rnti = m_rnti;
920  dlcqi.m_ri = 1; // not yet used
921  dlcqi.m_cqiType = CqiListElement_s::A30; // Aperidic CQI using PUSCH
922  //dlcqi.m_wbCqi.push_back ((uint16_t) cqiSum / nbSubChannels);
923  dlcqi.m_wbPmi = 0; // not yet used
924  dlcqi.m_sbMeasResult = rbgMeas;
925  }
926 
927  msg->SetDlCqi (dlcqi);
928  return msg;
929 }
930 
931 
932 void
934 {
935  NS_LOG_FUNCTION (this << Simulator::Now ());
936  NS_LOG_DEBUG (this << " Report UE Measurements ");
937 
939 
940  std::map <uint16_t, UeMeasurementsElement>::iterator it;
941  for (it = m_ueMeasurementsMap.begin (); it != m_ueMeasurementsMap.end (); it++)
942  {
943  double avg_rsrp = (*it).second.rsrpSum / (double)(*it).second.rsrpNum;
944  double avg_rsrq = (*it).second.rsrqSum / (double)(*it).second.rsrqNum;
945  /*
946  * In CELL_SEARCH state, this may result in avg_rsrq = 0/0 = -nan.
947  * UE RRC must take this into account when receiving measurement reports.
948  * TODO remove this shortcoming by calculating RSRQ during CELL_SEARCH
949  */
950  NS_LOG_DEBUG (this << " CellId " << (*it).first
951  << " RSRP " << avg_rsrp
952  << " (nSamples " << (uint16_t)(*it).second.rsrpNum << ")"
953  << " RSRQ " << avg_rsrq
954  << " (nSamples " << (uint16_t)(*it).second.rsrqNum << ")"
955  << " ComponentCarrierID " << (uint16_t)m_componentCarrierId);
956 
958  newEl.m_cellId = (*it).first;
959  newEl.m_rsrp = avg_rsrp;
960  newEl.m_rsrq = avg_rsrq;
961  ret.m_ueMeasurementsList.push_back (newEl);
963 
964  // report to UE measurements trace
965  m_reportUeMeasurements (m_rnti, (*it).first, avg_rsrp, avg_rsrq, ((*it).first == m_cellId ? 1 : 0), m_componentCarrierId);
966  }
967 
968  // report to RRC
970 
971  m_ueMeasurementsMap.clear ();
973 }
974 
975 void
977 {
978  NS_LOG_FUNCTION (this << cqiPeriodicity);
979  m_a30CqiPeriodicity = cqiPeriodicity;
980  m_p10CqiPeriodicity = cqiPeriodicity;
981 }
982 
983 void
985 {
986  NS_LOG_FUNCTION (this << msg);
987 
988  SetControlMessages (msg);
989 }
990 
991 void
992 LteUePhy::DoSendRachPreamble (uint32_t raPreambleId, uint32_t raRnti)
993 {
994  NS_LOG_FUNCTION (this << raPreambleId);
995 
996  // unlike other control messages, RACH preamble is sent ASAP
997  Ptr<RachPreambleLteControlMessage> msg = Create<RachPreambleLteControlMessage> ();
998  msg->SetRapId (raPreambleId);
999  m_raPreambleId = raPreambleId;
1000  m_raRnti = raRnti;
1001  m_controlMessagesQueue.at (0).push_back (msg);
1002 }
1003 
1004 void
1006 {
1012  if (m_componentCarrierId == 0)
1013  {
1014  m_isConnected = true;
1015  // Initialize the parameters for radio link failure detection
1017  }
1018 }
1019 
1020 
1021 
1022 void
1024 {
1025  NS_LOG_FUNCTION (this);
1026 
1027  std::list<Ptr<LteControlMessage> >::iterator it;
1028  NS_LOG_DEBUG (this << " I am rnti = " << m_rnti << " and I received msgs " << (uint16_t) msgList.size ());
1029  for (it = msgList.begin (); it != msgList.end (); it++)
1030  {
1031  Ptr<LteControlMessage> msg = (*it);
1032 
1033  if (msg->GetMessageType () == LteControlMessage::DL_DCI)
1034  {
1035  Ptr<DlDciLteControlMessage> msg2 = DynamicCast<DlDciLteControlMessage> (msg);
1036 
1037  DlDciListElement_s dci = msg2->GetDci ();
1038  if (dci.m_rnti != m_rnti)
1039  {
1040  // DCI not for me
1041  continue;
1042  }
1043 
1044  if (dci.m_resAlloc != 0)
1045  {
1046  NS_FATAL_ERROR ("Resource Allocation type not implemented");
1047  }
1048 
1049  std::vector <int> dlRb;
1050 
1051  // translate the DCI to Spectrum framework
1052  uint32_t mask = 0x1;
1053  for (int i = 0; i < 32; i++)
1054  {
1055  if (((dci.m_rbBitmap & mask) >> i) == 1)
1056  {
1057  for (int k = 0; k < GetRbgSize (); k++)
1058  {
1059  dlRb.push_back ((i * GetRbgSize ()) + k);
1060 // NS_LOG_DEBUG(this << " RNTI " << m_rnti << " RBG " << i << " DL-DCI allocated PRB " << (i*GetRbgSize()) + k);
1061  }
1062  }
1063  mask = (mask << 1);
1064  }
1066  {
1067  m_powerControl->ReportTpc (dci.m_tpc);
1068  }
1069 
1070 
1071  // send TB info to LteSpectrumPhy
1072  NS_LOG_DEBUG (this << " UE " << m_rnti << " DL-DCI " << dci.m_rnti << " bitmap " << dci.m_rbBitmap);
1073  for (uint8_t i = 0; i < dci.m_tbsSize.size (); i++)
1074  {
1075  m_downlinkSpectrumPhy->AddExpectedTb (dci.m_rnti, dci.m_ndi.at (i), dci.m_tbsSize.at (i), dci.m_mcs.at (i), dlRb, i, dci.m_harqProcess, dci.m_rv.at (i), true /* DL */);
1076  }
1077 
1079 
1080 
1081  }
1082  else if (msg->GetMessageType () == LteControlMessage::UL_DCI)
1083  {
1084  // set the uplink bandwidth according to the UL-CQI
1085  Ptr<UlDciLteControlMessage> msg2 = DynamicCast<UlDciLteControlMessage> (msg);
1086  UlDciListElement_s dci = msg2->GetDci ();
1087  if (dci.m_rnti != m_rnti)
1088  {
1089  // DCI not for me
1090  continue;
1091  }
1092  NS_LOG_INFO (this << " UL DCI");
1093  std::vector <int> ulRb;
1094  for (int i = 0; i < dci.m_rbLen; i++)
1095  {
1096  ulRb.push_back (i + dci.m_rbStart);
1097  //NS_LOG_DEBUG (this << " UE RB " << i + dci.m_rbStart);
1098  }
1100  // fire trace of UL Tx PHY stats
1101  HarqProcessInfoList_t harqInfoList = m_harqPhyModule->GetHarqProcessInfoUl (m_rnti, 0);
1103  params.m_cellId = m_cellId;
1104  params.m_imsi = 0; // it will be set by DlPhyTransmissionCallback in LteHelper
1106  params.m_rnti = m_rnti;
1107  params.m_txMode = 0; // always SISO for UE
1108  params.m_layer = 0;
1109  params.m_mcs = dci.m_mcs;
1110  params.m_size = dci.m_tbSize;
1111  params.m_rv = harqInfoList.size ();
1112  params.m_ndi = dci.m_ndi;
1113  params.m_ccId = m_componentCarrierId;
1114  m_ulPhyTransmission (params);
1115  // pass the info to the MAC
1117  }
1118  else if (msg->GetMessageType () == LteControlMessage::RAR)
1119  {
1120  Ptr<RarLteControlMessage> rarMsg = DynamicCast<RarLteControlMessage> (msg);
1121  if (rarMsg->GetRaRnti () == m_raRnti)
1122  {
1123  for (std::list<RarLteControlMessage::Rar>::const_iterator it = rarMsg->RarListBegin (); it != rarMsg->RarListEnd (); ++it)
1124  {
1125  if (it->rapId != m_raPreambleId)
1126  {
1127  // UL grant not for me
1128  continue;
1129  }
1130  else
1131  {
1132  NS_LOG_INFO ("received RAR RNTI " << m_raRnti);
1133  // set the uplink bandwidth according to the UL grant
1134  std::vector <int> ulRb;
1135  for (int i = 0; i < it->rarPayload.m_grant.m_rbLen; i++)
1136  {
1137  ulRb.push_back (i + it->rarPayload.m_grant.m_rbStart);
1138  }
1139 
1141  // pass the info to the MAC
1143  // reset RACH variables with out of range values
1144  m_raPreambleId = 255;
1145  m_raRnti = 11;
1146  }
1147  }
1148  }
1149  }
1150  else if (msg->GetMessageType () == LteControlMessage::MIB)
1151  {
1152  NS_LOG_INFO ("received MIB");
1153  NS_ASSERT (m_cellId > 0);
1154  Ptr<MibLteControlMessage> msg2 = DynamicCast<MibLteControlMessage> (msg);
1156  }
1157  else if (msg->GetMessageType () == LteControlMessage::SIB1)
1158  {
1159  NS_LOG_INFO ("received SIB1");
1160  NS_ASSERT (m_cellId > 0);
1161  Ptr<Sib1LteControlMessage> msg2 = DynamicCast<Sib1LteControlMessage> (msg);
1163  }
1164  else
1165  {
1166  // pass the message to UE-MAC
1168  }
1169 
1170  }
1171 
1172 
1173 }
1174 
1175 
1176 void
1178 {
1179  NS_LOG_FUNCTION (this << cellId << (*p));
1180 
1181  double sum = 0.0;
1182  uint16_t nRB = 0;
1183  Values::const_iterator itPi;
1184  for (itPi = p->ConstValuesBegin (); itPi != p->ConstValuesEnd (); itPi++)
1185  {
1186  // convert PSD [W/Hz] to linear power [W] for the single RE
1187  double powerTxW = ((*itPi) * 180000.0) / 12.0;
1188  sum += powerTxW;
1189  nRB++;
1190  }
1191 
1192  // measure instantaneous RSRP now
1193  double rsrp_dBm = 10 * log10 (1000 * (sum / (double)nRB));
1194  NS_LOG_INFO (this << " PSS RNTI " << m_rnti << " cellId " << m_cellId
1195  << " has RSRP " << rsrp_dBm << " and RBnum " << nRB);
1196  // note that m_pssReceptionThreshold does not apply here
1197 
1198  // store measurements
1199  std::map <uint16_t, UeMeasurementsElement>::iterator itMeasMap = m_ueMeasurementsMap.find (cellId);
1200  if (itMeasMap == m_ueMeasurementsMap.end ())
1201  {
1202  // insert new entry
1203  UeMeasurementsElement newEl;
1204  newEl.rsrpSum = rsrp_dBm;
1205  newEl.rsrpNum = 1;
1206  newEl.rsrqSum = 0;
1207  newEl.rsrqNum = 0;
1208  m_ueMeasurementsMap.insert (std::pair <uint16_t, UeMeasurementsElement> (cellId, newEl));
1209  }
1210  else
1211  {
1212  (*itMeasMap).second.rsrpSum += rsrp_dBm;
1213  (*itMeasMap).second.rsrpNum++;
1214  }
1215 
1216  /*
1217  * Collect the PSS for later processing in GenerateCtrlCqiReport()
1218  * (to be called from ChunkProcessor after RX is finished).
1219  */
1220  m_pssReceived = true;
1221  PssElement el;
1222  el.cellId = cellId;
1223  el.pssPsdSum = sum;
1224  el.nRB = nRB;
1225  m_pssList.push_back (el);
1226 
1227 } // end of void LteUePhy::ReceivePss (uint16_t cellId, Ptr<SpectrumValue> p)
1228 
1229 
1230 void
1232 {
1234 }
1235 
1236 
1237 void
1238 LteUePhy::SubframeIndication (uint32_t frameNo, uint32_t subframeNo)
1239 {
1240  NS_LOG_FUNCTION (this << frameNo << subframeNo);
1241 
1242  NS_ASSERT_MSG (frameNo > 0, "the SRS index check code assumes that frameNo starts at 1");
1243 
1244  // refresh internal variables
1245  m_rsReceivedPowerUpdated = false;
1247  m_pssReceived = false;
1248 
1249  if (m_ulConfigured)
1250  {
1251  // update uplink transmission mask according to previous UL-CQIs
1252  std::vector <int> rbMask = m_subChannelsForTransmissionQueue.at (0);
1254 
1255  // shift the queue
1256  for (uint8_t i = 1; i < m_macChTtiDelay; i++)
1257  {
1259  }
1261 
1263  {
1264 
1265  NS_ASSERT_MSG (subframeNo > 0 && subframeNo <= 10, "the SRS index check code assumes that subframeNo starts at 1");
1266  if ((((frameNo-1)*10 + (subframeNo-1)) % m_srsPeriodicity) == m_srsSubframeOffset)
1267  {
1268  NS_LOG_INFO ("frame " << frameNo << " subframe " << subframeNo << " sending SRS (offset=" << m_srsSubframeOffset << ", period=" << m_srsPeriodicity << ")");
1271  this);
1272  }
1273  }
1274 
1275  std::list<Ptr<LteControlMessage> > ctrlMsg = GetControlMessages ();
1276  // send packets in queue
1277  NS_LOG_LOGIC (this << " UE - start slot for PUSCH + PUCCH - RNTI " << m_rnti << " CELLID " << m_cellId);
1278  // send the current burts of packets
1280  if (pb)
1281  {
1283  {
1286  }
1287  m_uplinkSpectrumPhy->StartTxDataFrame (pb, ctrlMsg, UL_DATA_DURATION);
1288  }
1289  else
1290  {
1291  // send only PUCCH (ideal: fake null bandwidth signal)
1292  if (ctrlMsg.size ()>0)
1293  {
1294  NS_LOG_LOGIC (this << " UE - start TX PUCCH (NO PUSCH)");
1295  std::vector <int> dlRb;
1296 
1298  {
1300  }
1301 
1303  m_uplinkSpectrumPhy->StartTxDataFrame (pb, ctrlMsg, UL_DATA_DURATION);
1304  }
1305  else
1306  {
1307  NS_LOG_LOGIC (this << " UE - UL NOTHING TO SEND");
1308  }
1309  }
1310  } // m_configured
1311 
1312  // trigger the MAC
1313  m_uePhySapUser->SubframeIndication (frameNo, subframeNo);
1314 
1315  m_subframeNo = subframeNo;
1316  ++subframeNo;
1317  if (subframeNo > 10)
1318  {
1319  ++frameNo;
1320  subframeNo = 1;
1321  }
1322 
1323  // schedule next subframe indication
1324  Simulator::Schedule (Seconds (GetTti ()), &LteUePhy::SubframeIndication, this, frameNo, subframeNo);
1325 }
1326 
1327 
1328 void
1330 {
1331  NS_LOG_FUNCTION (this << " UE " << m_rnti << " start tx SRS, cell Id " << (uint32_t) m_cellId);
1332  NS_ASSERT (m_cellId > 0);
1333  // set the current tx power spectral density (full bandwidth)
1334  std::vector <int> dlRb;
1335  for (uint8_t i = 0; i < m_ulBandwidth; i++)
1336  {
1337  dlRb.push_back (i);
1338  }
1339 
1341  {
1343  }
1344 
1346  m_uplinkSpectrumPhy->StartTxUlSrsFrame ();
1347 }
1348 
1349 
1350 void
1352 {
1353  NS_LOG_FUNCTION (this);
1354 
1355  m_rnti = 0;
1356  m_cellId = 0;
1357  m_isConnected = false;
1358  m_transmissionMode = 0;
1359  m_srsPeriodicity = 0;
1360  m_srsConfigured = false;
1361  m_dlConfigured = false;
1362  m_ulConfigured = false;
1363  m_raPreambleId = 255; // value out of range
1364  m_raRnti = 11; // value out of range
1368  m_paLinear = 1;
1369 
1370  m_packetBurstQueue.clear ();
1371  m_controlMessagesQueue.clear ();
1373  for (int i = 0; i < m_macChTtiDelay; i++)
1374  {
1375  Ptr<PacketBurst> pb = CreateObject <PacketBurst> ();
1376  m_packetBurstQueue.push_back (pb);
1377  std::list<Ptr<LteControlMessage> > l;
1378  m_controlMessagesQueue.push_back (l);
1379  }
1380  std::vector <int> ulRb;
1382 
1384  m_downlinkSpectrumPhy->Reset ();
1385  m_uplinkSpectrumPhy->Reset ();
1386  m_pssList.clear ();
1391  m_downlinkSpectrumPhy->m_interferenceCtrl->EndRx ();
1392  m_downlinkSpectrumPhy->m_interferenceData->EndRx ();
1393 
1394 } // end of void LteUePhy::DoReset ()
1395 
1396 void
1397 LteUePhy::DoStartCellSearch (uint32_t dlEarfcn)
1398 {
1399  NS_LOG_FUNCTION (this << dlEarfcn);
1400  m_dlEarfcn = dlEarfcn;
1401  DoSetDlBandwidth (6); // configure DL for receiving PSS
1403 }
1404 
1405 void
1406 LteUePhy::DoSynchronizeWithEnb (uint16_t cellId, uint32_t dlEarfcn)
1407 {
1408  NS_LOG_FUNCTION (this << cellId << dlEarfcn);
1409  m_dlEarfcn = dlEarfcn;
1410  DoSynchronizeWithEnb (cellId);
1411 }
1412 
1413 void
1415 {
1416  NS_LOG_FUNCTION (this << cellId);
1417 
1418  if (cellId == 0)
1419  {
1420  NS_FATAL_ERROR ("Cell ID shall not be zero");
1421  }
1422 
1423  m_cellId = cellId;
1424  m_downlinkSpectrumPhy->SetCellId (cellId);
1425  m_uplinkSpectrumPhy->SetCellId (cellId);
1426 
1427  // configure DL for receiving the BCH with the minimum bandwidth
1428  DoSetDlBandwidth (6);
1429 
1430  m_dlConfigured = false;
1431  m_ulConfigured = false;
1432 
1434 }
1435 
1436 void
1437 LteUePhy::DoSetDlBandwidth (uint8_t dlBandwidth)
1438 {
1439  NS_LOG_FUNCTION (this << (uint32_t) dlBandwidth);
1440  if (m_dlBandwidth != dlBandwidth or !m_dlConfigured)
1441  {
1442  m_dlBandwidth = dlBandwidth;
1443 
1444  static const int Type0AllocationRbg[4] = {
1445  10, // RGB size 1
1446  26, // RGB size 2
1447  63, // RGB size 3
1448  110 // RGB size 4
1449  }; // see table 7.1.6.1-1 of 36.213
1450  for (int i = 0; i < 4; i++)
1451  {
1452  if (dlBandwidth < Type0AllocationRbg[i])
1453  {
1454  m_rbgSize = i + 1;
1455  break;
1456  }
1457  }
1458 
1460  m_downlinkSpectrumPhy->SetNoisePowerSpectralDensity (m_noisePsd);
1461  m_downlinkSpectrumPhy->GetChannel ()->AddRx (m_downlinkSpectrumPhy);
1462  }
1463  m_dlConfigured = true;
1464 }
1465 
1466 
1467 void
1468 LteUePhy::DoConfigureUplink (uint32_t ulEarfcn, uint8_t ulBandwidth)
1469 {
1470  m_ulEarfcn = ulEarfcn;
1471  m_ulBandwidth = ulBandwidth;
1472  m_ulConfigured = true;
1473 }
1474 
1475 void
1476 LteUePhy::DoConfigureReferenceSignalPower (int8_t referenceSignalPower)
1477 {
1478  NS_LOG_FUNCTION (this);
1479  m_powerControl->ConfigureReferenceSignalPower (referenceSignalPower);
1480 }
1481 
1482 void
1483 LteUePhy::DoSetRnti (uint16_t rnti)
1484 {
1485  NS_LOG_FUNCTION (this << rnti);
1486  m_rnti = rnti;
1487 
1490 }
1491 
1492 void
1494 {
1495  NS_LOG_FUNCTION (this << (uint16_t)txMode);
1496  m_transmissionMode = txMode;
1497  m_downlinkSpectrumPhy->SetTransmissionMode (txMode);
1498 }
1499 
1500 void
1502 {
1503  NS_LOG_FUNCTION (this << srcCi);
1506  m_srsConfigured = true;
1507 
1508  // a guard time is needed for the case where the SRS periodicity is changed dynamically at run time
1509  // if we use a static one, we can have a 0ms guard time
1511  NS_LOG_DEBUG (this << " UE SRS P " << m_srsPeriodicity << " RNTI " << m_rnti << " offset " << m_srsSubframeOffset << " cellId " << m_cellId << " CI " << srcCi);
1512 }
1513 
1514 void
1516 {
1517  NS_LOG_FUNCTION (this << pa);
1518  m_paLinear = pow (10,(pa/10));
1519 }
1520 
1521 void
1522 LteUePhy::DoSetRsrpFilterCoefficient (uint8_t rsrpFilterCoefficient)
1523 {
1524  NS_LOG_FUNCTION (this << (uint16_t) (rsrpFilterCoefficient));
1525  m_powerControl->SetRsrpFilterCoefficient (rsrpFilterCoefficient);
1526 }
1527 
1528 void
1530 {
1531  NS_LOG_FUNCTION (this);
1532  m_downlinkSpectrumPhy->m_harqPhyModule->ClearDlHarqBuffer (m_rnti); //flush HARQ buffers
1535  m_pssReceived = false;
1536  DoReset ();
1537 }
1538 
1539 void
1541 {
1542  NS_LOG_FUNCTION (this);
1543 
1545 }
1546 
1547 void
1549 {
1550  NS_LOG_FUNCTION (this);
1551  // indicates that the downlink radio link quality has to be monitored for in-sync indications
1552  m_downlinkInSync = false;
1553 }
1554 
1555 void
1556 LteUePhy::DoSetImsi (uint64_t imsi)
1557 {
1558  NS_LOG_FUNCTION (this);
1559  m_imsi = imsi;
1560 }
1561 
1562 void
1564 {
1565  NS_LOG_FUNCTION (this);
1566  m_numOfSubframes = 0;
1567  m_sinrDbFrame = 0;
1568  m_numOfFrames = 0;
1569  m_downlinkInSync = true;
1570 }
1571 
1572 void
1573 LteUePhy::RlfDetection (double sinrDb)
1574 {
1575  NS_LOG_FUNCTION (this << sinrDb);
1576  m_sinrDbFrame += sinrDb;
1577  m_numOfSubframes++;
1578  NS_LOG_LOGIC ("No of Subframes: " << m_numOfSubframes << " UE synchronized: " << m_downlinkInSync);
1579  //check for out_of_snyc indications first when UE is both DL and UL synchronized
1580  //m_downlinkInSync=true indicates that the evaluation is for out-of-sync indications
1581  if (m_downlinkInSync && m_numOfSubframes == 10)
1582  {
1588  {
1589  m_numOfFrames++; //increment the counter if a frame cannot be decoded
1590  NS_LOG_LOGIC ("No of Frames which cannot be decoded: " << m_numOfFrames);
1591  }
1592  else
1593  {
1599  NS_LOG_INFO ("Resetting frame counter at phy. Current value = " << m_numOfFrames);
1600  m_numOfFrames = 0;
1601  // Also reset the sync indicator counter at RRC
1603  }
1604  m_numOfSubframes = 0;
1605  m_sinrDbFrame = 0;
1606  }
1613  {
1614  NS_LOG_LOGIC ("At " << Simulator::Now ().GetMilliSeconds()
1615  << " ms UE PHY sending out of snyc indication to UE RRC layer");
1617  m_numOfFrames = 0;
1618  }
1619  //check for in_snyc indications when T310 timer is started
1620  //m_downlinkInSync=false indicates that the evaluation is for in-sync indications
1621  if (!m_downlinkInSync && m_numOfSubframes == 10)
1622  {
1629  {
1630  m_numOfFrames++; //increment the counter if a frame can be decoded
1631  NS_LOG_LOGIC ("No of Frames successfully decoded: " << m_numOfFrames);
1632  }
1633  else
1634  {
1640  m_numOfFrames = 0;
1641  // Also reset the sync indicator counter at RRC
1643  }
1644  m_numOfSubframes = 0;
1645  m_sinrDbFrame = 0;
1646  }
1652  {
1653  NS_LOG_LOGIC ("At " << Simulator::Now ().GetMilliSeconds()
1654  << " ms UE PHY sending in snyc indication to UE RRC layer");
1656  m_numOfFrames = 0;
1657  }
1658 }
1659 
1660 
1661 void
1663 {
1664  SetTxModeGain (1, gain);
1665 }
1666 
1667 void
1669 {
1670  SetTxModeGain (2, gain);
1671 }
1672 
1673 void
1675 {
1676  SetTxModeGain (3, gain);
1677 }
1678 
1679 void
1681 {
1682  SetTxModeGain (4, gain);
1683 }
1684 
1685 void
1687 {
1688  SetTxModeGain (5, gain);
1689 }
1690 
1691 void
1693 {
1694  SetTxModeGain (6, gain);
1695 }
1696 
1697 void
1699 {
1700  SetTxModeGain (7, gain);
1701 }
1702 
1703 
1704 void
1705 LteUePhy::SetTxModeGain (uint8_t txMode, double gain)
1706 {
1707  NS_LOG_FUNCTION (this << gain);
1708  // convert to linear
1709  double gainLin = std::pow (10.0, (gain / 10.0));
1710  if (m_txModeGain.size () < txMode)
1711  {
1712  m_txModeGain.resize (txMode);
1713  }
1714  std::vector <double> temp;
1715  temp = m_txModeGain;
1716  m_txModeGain.clear ();
1717  for (uint8_t i = 0; i < temp.size (); i++)
1718  {
1719  if (i==txMode-1)
1720  {
1721  m_txModeGain.push_back (gainLin);
1722  }
1723  else
1724  {
1725  m_txModeGain.push_back (temp.at (i));
1726  }
1727  }
1728  // forward the info to DL LteSpectrumPhy
1729  m_downlinkSpectrumPhy->SetTxModeGain (txMode, gain);
1730 }
1731 
1732 
1733 
1734 void
1736 {
1737  NS_LOG_FUNCTION (this);
1738  // generate feedback to eNB and send it through ideal PUCCH
1739  Ptr<DlHarqFeedbackLteControlMessage> msg = Create<DlHarqFeedbackLteControlMessage> ();
1740  msg->SetDlHarqFeedback (m);
1741  SetControlMessages (msg);
1742 }
1743 
1744 void
1746 {
1747  m_harqPhyModule = harq;
1748 }
1749 
1750 
1753 {
1754  NS_LOG_FUNCTION (this);
1755  return m_state;
1756 }
1757 
1758 
1759 void
1761 {
1762  NS_LOG_FUNCTION (this << newState);
1763  State oldState = m_state;
1764  m_state = newState;
1765  NS_LOG_INFO (this << " cellId=" << m_cellId << " rnti=" << m_rnti
1766  << " UePhy " << ToString (oldState)
1767  << " --> " << ToString (newState));
1768  m_stateTransitionTrace (m_cellId, m_rnti, oldState, newState);
1769 }
1770 
1771 
1772 } // namespace ns3
See section 4.3.1 dlDciListElement.
Definition: ff-mac-common.h:93
void SetTxPower(double value)
Set transmit power function.
uint16_t m_srsConfigured
SRS configured.
Definition: lte-ue-phy.h:678
virtual void DoInitialize(void)
Initialize() implementation.
Definition: object.cc:353
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
uint8_t m_txMode
the transmission Mode
Definition: lte-common.h:192
UeMemberLteUePhySapProvider class.
Definition: lte-ue-phy.cc:77
double m_qOut
The &#39;Qout&#39; attribute.
Definition: lte-ue-phy.h:800
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
virtual void ReceiveLteControlMessage(Ptr< LteControlMessage > msg)=0
Receive SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control channel.
double m_noiseFigure
Loss (dB) in the Signal-to-Noise-Ratio due to non-idealities in the receiver.
Definition: lte-phy.h:261
See section 4.3.25 sbMeasResult.
Ptr< LteSpectrumPhy > GetUlSpectrumPhy() const
Get Uplink spectrum phy.
Definition: lte-ue-phy.cc:450
uint8_t m_componentCarrierId
component carrier ID
double pssPsdSum
PSS PSD sum.
Definition: lte-ue-phy.h:711
AttributeValue implementation for Boolean.
Definition: boolean.h:36
double m_txPower
Transmission power in dBm.
Definition: lte-phy.h:249
std::vector< struct UeMeasurementsElement > m_ueMeasurementsList
UE measurement list.
virtual void GenerateMixedCqiReport(const SpectrumValue &sinr)
Create the mixed CQI report.
Definition: lte-ue-phy.cc:725
LteUePhySapUser * m_uePhySapUser
UE Phy SAP user.
Definition: lte-ue-phy.h:666
uint32_t GetId(void) const
Definition: node.cc:107
void SetTxMode5Gain(double gain)
Set transmit mode 5 gain function.
Definition: lte-ue-phy.cc:1686
void SetCellId(uint16_t cellId)
Set the cell ID function.
virtual void SendMacPdu(Ptr< Packet > p)
Send the MAC PDU to the channel.
Definition: lte-ue-phy.cc:103
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
uint8_t m_componentCarrierId
component carrier Id used to address sap
Definition: lte-phy.h:311
virtual void GenerateDataCqiReport(const SpectrumValue &sinr)
generate a CQI report based on the given SINR of Data frame (used for PUSCH CQIs) ...
Definition: lte-ue-phy.cc:719
std::list< PssElement > m_pssList
PSS list.
Definition: lte-ue-phy.h:714
void SetTxMode2Gain(double gain)
Set transmit mode 2 gain function.
Definition: lte-ue-phy.cc:1668
uint16_t cellId
cell ID
Definition: lte-ue-phy.h:710
bool m_ulConfigured
UL configured?
Definition: lte-ue-phy.h:684
NS_ASSERT_MSG(false, "Ipv4AddressGenerator::MaskToIndex(): Impossible")
std::vector< Ptr< PacketBurst > > m_packetBurstQueue
A queue of packet bursts to be sent.
Definition: lte-phy.h:289
std::vector< int > GetSubChannelsForTransmission(void)
Get a list of sub channels to use in RX.
Definition: lte-ue-phy.cc:523
virtual void GenerateCtrlCqiReport(const SpectrumValue &sinr)
generate a CQI report based on the given SINR of Ctrl frame
Definition: lte-ue-phy.cc:549
double m_qIn
The &#39;Qin&#39; attribute.
Definition: lte-ue-phy.h:793
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: boolean.h:84
TracedCallback< uint16_t, uint16_t, double, double, bool, uint8_t > m_reportUeMeasurements
The ReportUeMeasurements trace source.
Definition: lte-ue-phy.h:772
Time m_a30CqiLast
last aperiodic CQI
Definition: lte-ue-phy.h:663
double GetPuschTxPower(std::vector< int > rb)
Get PUSCH transmit power function.
void SetSubChannelsForTransmission(std::vector< int > mask)
Set a list of sub channels to use in TX.
Definition: lte-ue-phy.cc:503
double m_paLinear
PA linear.
Definition: lte-ue-phy.h:681
LteUePhySapProvider * m_uePhySapProvider
UE Phy SAP provider.
Definition: lte-ue-phy.h:665
uint8_t rsrqNum
Number of RSRQ samples.
Definition: lte-ue-phy.h:728
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
Definition: assert.h:67
void SetTxMode6Gain(double gain)
Set transmit mode 6 gain function.
Definition: lte-ue-phy.cc:1692
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:204
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1070
Ptr< LteSpectrumPhy > m_downlinkSpectrumPhy
The downlink LteSpectrumPhy associated to this LtePhy.
Definition: lte-phy.h:238
See section 4.3.2 ulDciListElement.
Service Access Point (SAP) offered by the UE PHY to the UE RRC for control purposes.
virtual void SendLteControlMessage(Ptr< LteControlMessage > msg)
Send SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control channel.
Definition: lte-ue-phy.cc:109
See section 4.3.24 cqiListElement.
std::vector< double > m_txModeGain
the transmit mode gain
Definition: lte-ue-phy.h:674
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:280
void DoResetPhyAfterRlf()
Reset Phy after radio link failure function.
Definition: lte-ue-phy.cc:1529
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:162
uint16_t GetNumQoutEvalSf() const
Get number of Qout evaluation subframes.
Definition: lte-ue-phy.cc:474
Summary results of measuring a specific cell. Used for layer-1 filtering.
Definition: lte-ue-phy.h:723
SpectrumValue m_dataInterferencePower
data interference power
Definition: lte-ue-phy.h:704
uint16_t GetSrsPeriodicity(uint16_t srcCi) const
Definition: lte-phy.cc:150
uint8_t GetMacChDelay(void) const
Get MAC to Channel delay.
Definition: lte-ue-phy.cc:438
void QueueSubChannelsForTransmission(std::vector< int > rbMap)
Queue subchannels for transmission function.
Definition: lte-ue-phy.cc:1231
uint8_t m_rv
the redundancy version (HARQ)
Definition: lte-common.h:196
Service Access Point (SAP) offered by the PHY to the MAC.
void SetTxModeGain(uint8_t txMode, double gain)
Set transmit mode gain function.
Definition: lte-ue-phy.cc:1705
void SetDownlinkCqiPeriodicity(Time cqiPeriodicity)
Set the periodicty for the downlink periodic wideband and aperiodic subband CQI reporting.
Definition: lte-ue-phy.cc:976
Ptr< LteUePowerControl > m_powerControl
Pointer to UE Uplink Power Control entity.
Definition: lte-ue-phy.h:651
virtual void DoSendMacPdu(Ptr< Packet > p)
Queue the MAC PDU to be sent (according to m_macChTtiDelay)
Definition: lte-ue-phy.cc:488
std::vector< int > GetSubChannelsForReception(void)
Get a list of sub channels to use in RX.
Definition: lte-ue-phy.cc:531
This class defines all functions to create spectrum model for lte.
Values::const_iterator ConstValuesBegin() const
uint8_t m_transmissionMode
the transmission mode
Definition: lte-ue-phy.h:673
void DoSetRsrpFilterCoefficient(uint8_t rsrpFilterCoefficient)
Do set RSRP filter coefficient.
Definition: lte-ue-phy.cc:1522
EventId m_sendSrsEvent
send SRS event
Definition: lte-ue-phy.h:774
void SetHarqPhyModule(Ptr< LteHarqPhy > harq)
Set the HARQ PHY module.
Definition: lte-ue-phy.cc:1745
static Ptr< SpectrumValue > CreateUlTxPowerSpectralDensity(uint16_t earfcn, uint8_t bandwidth, double powerTx, std::vector< int > activeRbs)
create a spectrum value representing the uplink power spectral density of a signal to be transmitted...
uint8_t m_ulBandwidth
The UL bandwidth in number of PRBs.
Definition: lte-phy.h:269
bool m_pssReceived
PSS received?
Definition: lte-ue-phy.h:706
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
void DoSetSrsConfigurationIndex(uint16_t srcCi)
Set SRS configuration index function.
Definition: lte-ue-phy.cc:1501
static Ptr< SpectrumValue > CreateNoisePowerSpectralDensity(uint32_t earfcn, uint8_t bandwidth, double noiseFigure)
create a SpectrumValue that models the power spectral density of AWGN
phy
Definition: third.py:86
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
Definition: time.cc:446
State
The states of the UE PHY entity.
Definition: lte-ue-phy.h:66
static const int Type0AllocationRbg[4]
Type 0 RGB allocation.
void DoSetTransmissionMode(uint8_t txMode)
Set transmission mode function.
Definition: lte-ue-phy.cc:1493
The attribute can be read.
Definition: type-id.h:63
void DoConfigureUplink(uint32_t ulEarfcn, uint8_t ulBandwidth)
Configure UL uplink function.
Definition: lte-ue-phy.cc:1468
UeMemberLteUePhySapProvider(LteUePhy *phy)
Constructor.
Definition: lte-ue-phy.cc:97
double GetTti(void) const
Definition: lte-phy.cc:142
Template for the implementation of the LteUeCphySapProvider as a member of an owner class of type C t...
double m_pssReceptionThreshold
The RsrqUeMeasThreshold attribute.
Definition: lte-ue-phy.h:720
void DoStartInSnycDetection()
Start in Snyc detection function.
Definition: lte-ue-phy.cc:1548
uint8_t GetRbgSize(void) const
Definition: lte-phy.cc:186
void DoResetRlfParams()
Reset radio link failure parameters.
Definition: lte-ue-phy.cc:1540
bool m_enableRlfDetection
Flag to enable/disable RLF detection.
Definition: lte-ue-phy.h:811
void DoSynchronizeWithEnb(uint16_t cellId)
Synchronize with ENB function.
Definition: lte-ue-phy.cc:1414
uint8_t rsrpNum
Number of RSRP samples.
Definition: lte-ue-phy.h:726
LteUeCphySapUser * m_ueCphySapUser
UE CPhy SAP user.
Definition: lte-ue-phy.h:669
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: pointer.h:220
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
Definition: simulator.h:1389
void DoDispose()
Destructor implementation.
Definition: lte-phy.cc:78
uint16_t m_numOfSubframes
count the number of subframes for which the downlink radio link quality is estimated ...
Definition: lte-ue-phy.h:806
AttributeValue implementation for Time.
Definition: nstime.h:1124
uint16_t m_rsrpSinrSamplePeriod
The RsrpSinrSamplePeriod attribute.
Definition: lte-ue-phy.h:759
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1086
uint64_t m_imsi
IMSI of the scheduled UE.
Definition: lte-common.h:190
See section 4.3.27 higherLayerSelected.
double GetNoiseFigure() const
Get noise figure.
Definition: lte-ue-phy.cc:409
Service Access Point (SAP) offered by the UE PHY to the UE RRC for control purposes.
void SetLteUePhySapUser(LteUePhySapUser *s)
Set the PHY SAP User.
Definition: lte-ue-phy.cc:373
void RlfDetection(double sinrdB)
Radio link failure detection function.
Definition: lte-ue-phy.cc:1573
Hold an unsigned integer type.
Definition: uinteger.h:44
void DoConfigureReferenceSignalPower(int8_t referenceSignalPower)
Configure reference signal power function.
Definition: lte-ue-phy.cc:1476
void SetTxMode3Gain(double gain)
Set transmit mode 3 gain function.
Definition: lte-ue-phy.cc:1674
static uint8_t TxMode2LayerNum(uint8_t txMode)
Transmit mode 2 layer number.
Definition: lte-common.cc:212
PssElement structure.
Definition: lte-ue-phy.h:708
Ptr< DlCqiLteControlMessage > CreateDlCqiFeedbackMessage(const SpectrumValue &sinr)
Create the DL CQI feedback from SINR values perceived at the physical layer with the signal received ...
Definition: lte-ue-phy.cc:833
void SetTxMode4Gain(double gain)
Set transmit mode 4 gain function.
Definition: lte-ue-phy.cc:1680
void SwitchToState(State s)
Switch the UE PHY to the given state.
Definition: lte-ue-phy.cc:1760
TracedCallback< uint16_t, uint16_t, State, State > m_stateTransitionTrace
The StateTransition trace source.
Definition: lte-ue-phy.h:692
TracedCallback< uint16_t, uint16_t, double, double, uint8_t > m_reportCurrentCellRsrpSinrTrace
The ReportCurrentCellRsrpSinr trace source.
Definition: lte-ue-phy.h:754
uint16_t GetSrsSubframeOffset(uint16_t srcCi) const
Definition: lte-phy.cc:168
void SendSrs()
Send the SRS signal in the last symbols of the frame.
Definition: lte-ue-phy.cc:1329
bool m_rsInterferencePowerUpdated
RS interference power updated?
Definition: lte-ue-phy.h:700
virtual void RecvSystemInformationBlockType1(uint16_t cellId, LteRrcSap::SystemInformationBlockType1 sib1)=0
Relay an SIB1 message from the PHY entity to the RRC layer.
SpectrumValue m_ctrlSinrForRlf
the CTRL SINR used for RLF detection
Definition: lte-ue-phy.h:809
Ptr< LteSpectrumPhy > GetDlSpectrumPhy() const
Get Downlink spectrum phy.
Definition: lte-ue-phy.cc:444
std::vector< uint8_t > m_sbCqi
sb CQI
void SetTxMode7Gain(double gain)
Set transmit mode 7 gain function.
Definition: lte-ue-phy.cc:1698
void DoSetPa(double pa)
Set PA function.
Definition: lte-ue-phy.cc:1515
#define list
double ComputeAvgSinr(const SpectrumValue &sinr)
Compute average SINR among the RBs.
Definition: lte-ue-phy.cc:698
virtual void RecvMasterInformationBlock(uint16_t cellId, LteRrcSap::MasterInformationBlock mib)=0
Relay an MIB message from the PHY entity to the RRC layer.
See section 4.3.23 dlInfoListElement.
void DoReset()
Do Reset function.
Definition: lte-ue-phy.cc:1351
double rsrpSum
Sum of RSRP sample values in linear unit.
Definition: lte-ue-phy.h:725
uint16_t m_numOfQoutEvalSf
the downlink radio link quality is estimated over this period for detecting out-of-syncs ...
Definition: lte-ue-phy.h:802
virtual void DoSendRachPreamble(uint32_t prachId, uint32_t raRnti)
Send RACH preamble function.
Definition: lte-ue-phy.cc:992
void SetNumQoutEvalSf(uint16_t numSubframes)
Set number of Qout evaluation subframes.
Definition: lte-ue-phy.cc:456
uint8_t m_mcs
MCS for transport block.
Definition: lte-common.h:194
virtual void ReportDataInterference(const SpectrumValue &interf)
Create the mixed CQI report.
Definition: lte-ue-phy.cc:799
virtual void ReceiveLteDlHarqFeedback(DlInfoListElement_s mes)
PhySpectrum generated a new DL HARQ feedback.
Definition: lte-ue-phy.cc:1735
uint32_t m_dlEarfcn
The downlink carrier frequency.
Definition: lte-phy.h:281
void SetRsrpFilterCoefficient(uint8_t rsrpFilterCoefficient)
Set RSRP function.
bool m_enableUplinkPowerControl
The EnableUplinkPowerControl attribute.
Definition: lte-ue-phy.h:649
uint8_t m_macChTtiDelay
Delay between MAC and channel layer in terms of TTIs.
Definition: lte-phy.h:301
double GetTxPower() const
Get transmit power.
Definition: lte-ue-phy.cc:424
static const Time UL_DATA_DURATION
Duration of the data portion of a UL subframe.
Definition: lte-ue-phy.cc:61
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< LteHarqPhy > m_harqPhyModule
HARQ phy module.
Definition: lte-ue-phy.h:744
uint16_t GetNumQinEvalSf() const
Get number of Qin evaluation subframes.
Definition: lte-ue-phy.cc:481
Hold objects of type Ptr<T>.
Definition: pointer.h:36
void SetControlMessages(Ptr< LteControlMessage > m)
Definition: lte-phy.cc:217
uint64_t m_imsi
the IMSI of the UE
Definition: lte-ue-phy.h:810
Ptr< const AttributeChecker > MakeBooleanChecker(void)
Definition: boolean.cc:121
virtual void DoNotifyConnectionSuccessful()
Notify PHY about the successful RRC connection establishment.
Definition: lte-ue-phy.cc:1005
uint16_t m_rsrpSinrSampleCounter
The RsrpSinrSampleCounter attribute.
Definition: lte-ue-phy.h:764
virtual void NotifyOutOfSync()=0
Send an out of sync indication to UE RRC.
uint16_t m_numOfFrames
count the number of frames for which the downlink radio link quality is estimated ...
Definition: lte-ue-phy.h:807
bool m_isConnected
set when UE RRC is in CONNECTED_NORMALLY state
Definition: lte-ue-phy.h:787
SpectrumValue m_rsReceivedPower
RS receive power.
Definition: lte-ue-phy.h:698
void DoSetImsi(uint64_t imsi)
Set IMSI.
Definition: lte-ue-phy.cc:1556
double rsrqSum
Sum of RSRQ sample values in linear unit.
Definition: lte-ue-phy.h:727
uint16_t m_srsSubframeOffset
SRS subframe offset.
Definition: lte-ue-phy.h:677
Values::const_iterator ConstValuesEnd() const
Time m_srsStartTime
SRS start time.
Definition: lte-ue-phy.h:679
uint8_t m_dlBandwidth
The DL bandwidth in number of PRBs.
Definition: lte-phy.h:274
uint8_t m_subframeNo
Definition: lte-ue-phy.h:695
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: nstime.h:1125
uint16_t m_size
Size of transport block.
Definition: lte-common.h:195
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:193
Ptr< LteNetDevice > GetDevice() const
Get the device where the phy layer is attached.
Definition: lte-phy.cc:100
uint16_t m_cellId
Cell identifier.
Definition: lte-phy.h:308
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
uint8_t m_ndi
new data indicator flag
Definition: lte-common.h:197
void SubframeIndication(uint32_t frameNo, uint32_t subframeNo)
trigger from eNB the start from a new frame
Definition: lte-ue-phy.cc:1238
virtual void DoInitialize(void)
Initialize() implementation.
Definition: lte-ue-phy.cc:355
void DoSetDlBandwidth(uint8_t dlBandwidth)
Set DL bandwidth function.
Definition: lte-ue-phy.cc:1437
void SetRnti(uint16_t rnti)
Set the RNTI function.
Time m_a30CqiPeriodicity
SubBand Aperiodic CQI.
Definition: lte-ue-phy.h:662
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: double.h:42
void SetTxMode1Gain(double gain)
Set transmit mode 1 gain function.
Definition: lte-ue-phy.cc:1662
std::vector< int > m_subChannelsForTransmission
A list of sub channels to use in TX.
Definition: lte-ue-phy.h:636
void DoStartCellSearch(uint32_t dlEarfcn)
Start the cell search function.
Definition: lte-ue-phy.cc:1397
uint32_t m_raRnti
RA RNTI.
Definition: lte-ue-phy.h:747
virtual void ResetSyncIndicationCounter()=0
Reset the sync indication counter.
static void ScheduleWithContext(uint32_t context, Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event with the given context.
Definition: simulator.h:1483
bool m_dlConfigured
DL configured?
Definition: lte-ue-phy.h:683
virtual void ReceiveLteControlMessageList(std::list< Ptr< LteControlMessage > > msgList)
Receive LTE control message list function.
Definition: lte-ue-phy.cc:1023
Ptr< LteNetDevice > m_netDevice
Pointer to the NetDevice where this PHY layer is attached.
Definition: lte-phy.h:232
std::vector< std::vector< int > > m_subChannelsForTransmissionQueue
subchannels for transmission queue
Definition: lte-ue-phy.h:640
std::list< Ptr< LteControlMessage > > GetControlMessages(void)
Definition: lte-phy.cc:225
static const std::string & ToString(EpcUeNas::State s)
Definition: epc-ue-nas.cc:50
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition: abort.h:108
LteUeCphySapProvider * m_ueCphySapProvider
UE CPhy SAP provider.
Definition: lte-ue-phy.h:668
uint16_t nRB
number of RB
Definition: lte-ue-phy.h:712
std::map< uint16_t, UeMeasurementsElement > m_ueMeasurementsMap
Store measurement results during the last layer-1 filtering period.
Definition: lte-ue-phy.h:735
Ptr< PacketBurst > GetPacketBurst(void)
Definition: lte-phy.cc:198
uint16_t m_cellId
Cell ID of the attached Enb.
Definition: lte-common.h:189
static const std::string g_uePhyStateName[LteUePhy::NUM_STATES]
Map each of UE PHY states to its string representation.
Definition: lte-ue-phy.cc:132
State GetState() const
Get state of the UE physical layer.
Definition: lte-ue-phy.cc:1752
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Definition: log.h:264
virtual void NotifyInSync()=0
Send an in sync indication to UE RRC.
int64_t GetMilliSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:359
std::vector< int > m_subChannelsForReception
A list of sub channels to use in RX.
Definition: lte-ue-phy.h:638
Service Access Point (SAP) offered by the UE-PHY to the UE-MAC.
static const Time UL_SRS_DELAY_FROM_SUBFRAME_START
Delay from subframe start to transmission of SRS.
Definition: lte-ue-phy.cc:67
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:272
uint8_t m_layer
the layer (cw) of the transmission
Definition: lte-common.h:193
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1062
void SetTxPower(double pow)
Set transmit power.
Definition: lte-ue-phy.cc:416
virtual void ReceivePss(uint16_t cellId, Ptr< SpectrumValue > p)
Receive PSS function.
Definition: lte-ue-phy.cc:1177
double GetPucchTxPower(std::vector< int > rb)
Get PUCCH transmit power function.
UeMeasurementsParameters structure.
uint16_t m_srsPeriodicity
SRS periodicity.
Definition: lte-ue-phy.h:676
bool m_downlinkInSync
when set, DL SINR evaluation for out-of-sync indications is conducted.
Definition: lte-ue-phy.h:805
LteUePhySapProvider * GetLteUePhySapProvider()
Get the PHY SAP provider.
Definition: lte-ue-phy.cc:380
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
Definition: event-id.cc:53
virtual void SendRachPreamble(uint32_t prachId, uint32_t raRnti)
Send a preamble on the PRACH.
Definition: lte-ue-phy.cc:115
uint32_t m_raPreambleId
RA preamble ID.
Definition: lte-ue-phy.h:746
uint8_t m_rbgSize
The RB group size according to the bandwidth.
Definition: lte-phy.h:276
void SetLteUeCphySapUser(LteUeCphySapUser *s)
Set the CPHY SAP User.
Definition: lte-ue-phy.cc:388
void SetNumQinEvalSf(uint16_t numSubframes)
Set number of Qin evaluation subframes.
Definition: lte-ue-phy.cc:465
SpectrumValue m_rsInterferencePower
RS interference power.
Definition: lte-ue-phy.h:701
friend class UeMemberLteUePhySapProvider
allow UeMemberLteUePhySapProvider class friend access
Definition: lte-ue-phy.h:58
void InitializeRlfParams()
Initialize radio link failure parameters.
Definition: lte-ue-phy.cc:1563
double GetSrsTxPower(std::vector< int > rb)
Get SRS transmit power function.
virtual void NotifyConnectionSuccessful()
Notify PHY about the successful RRC connection establishment.
Definition: lte-ue-phy.cc:121
void PhyPduReceived(Ptr< Packet > p)
PhySpectrum received a new PHY-PDU.
Definition: lte-ue-phy.cc:497
uint8_t m_ccId
component carrier id
Definition: lte-common.h:198
void SetRsrp(double value)
Set RSRP function.
virtual void DoSendLteControlMessage(Ptr< LteControlMessage > msg)
Send LTE control message function.
Definition: lte-ue-phy.cc:984
std::vector< std::list< Ptr< LteControlMessage > > > m_controlMessagesQueue
A queue of control messages to be sent.
Definition: lte-phy.h:291
bool m_rsReceivedPowerUpdated
RS receive power updated?
Definition: lte-ue-phy.h:697
Ptr< LteUePowerControl > GetUplinkPowerControl() const
Get Uplink power control.
Definition: lte-ue-phy.cc:431
void ConfigureReferenceSignalPower(int8_t referenceSignalPower)
Configure reference signal power (dBm) function.
void GenerateCqiRsrpRsrq(const SpectrumValue &sinr)
Get CQI, RSRP, and RSRQ.
Definition: lte-ue-phy.cc:570
virtual ~LteUePhy()
Definition: lte-ue-phy.cc:186
The LteSpectrumPhy models the physical layer of LTE.
Definition: lte-ue-phy.h:54
uint32_t m_ulEarfcn
The uplink carrier frequency.
Definition: lte-phy.h:286
Ptr< LteSpectrumPhy > m_uplinkSpectrumPhy
The uplink LteSpectrumPhy associated to this LtePhy.
Definition: lte-phy.h:243
virtual void ReportRsReceivedPower(const SpectrumValue &power)
generate a report based on the linear RS power perceived during CTRL frame NOTE: used only by UE for ...
Definition: lte-ue-phy.cc:808
PhyTransmissionStatParameters structure.
Definition: lte-common.h:186
Time m_p10CqiLast
last periodic CQI
Definition: lte-ue-phy.h:655
Parameters of the ReportUeMeasurements primitive: RSRP [dBm] and RSRQ [dB] See section 5...
LteUeCphySapProvider * GetLteUeCphySapProvider()
Get the CPHY SAP provider.
Definition: lte-ue-phy.cc:395
This class can be used to hold variables of floating point type such as &#39;double&#39; or &#39;float&#39;...
Definition: double.h:41
State m_state
The current UE PHY state.
Definition: lte-ue-phy.h:687
int64_t m_timestamp
in millisecond
Definition: lte-common.h:188
Set of values corresponding to a given SpectrumModel.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: uinteger.h:45
void SetMacPdu(Ptr< Packet > p)
Definition: lte-phy.cc:192
std::vector< struct HigherLayerSelected_s > m_higherLayerSelected
higher layer selected
a unique identifier for an interface.
Definition: type-id.h:58
uint16_t m_rnti
the RNTI
Definition: lte-ue-phy.h:671
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:915
double m_sinrDbFrame
the average SINR per radio frame
Definition: lte-ue-phy.h:808
bool m_dataInterferencePowerUpdated
data interference power updated?
Definition: lte-ue-phy.h:703
void SetNoiseFigure(double nf)
Set noise figure.
Definition: lte-ue-phy.cc:402
uint16_t m_numOfQinEvalSf
the downlink radio link quality is estimated over this period for detecting in-syncs ...
Definition: lte-ue-phy.h:803
TracedCallback< PhyTransmissionStatParameters > m_ulPhyTransmission
The UlPhyTransmission trace source.
Definition: lte-ue-phy.h:781
uint16_t m_rnti
C-RNTI scheduled.
Definition: lte-common.h:191
static TypeId GetTypeId(void)
Get the type ID.
Definition: lte-ue-phy.cc:203
Time m_p10CqiPeriodicity
Wideband Periodic CQI. 2, 5, 10, 16, 20, 32, 40, 64, 80 or 160 ms.
Definition: lte-ue-phy.h:654
Ptr< LteAmc > m_amc
AMC.
Definition: lte-ue-phy.h:643
The LtePhy models the physical layer of LTE.
Definition: lte-phy.h:52
void ReportUeMeasurements()
Layer-1 filtering of RSRP and RSRQ measurements and reporting to the RRC entity.
Definition: lte-ue-phy.cc:933
virtual void ReportInterference(const SpectrumValue &interf)
generate a report based on the linear interference and noise power perceived during DATA frame NOTE: ...
Definition: lte-ue-phy.cc:791
virtual void ReceivePhyPdu(Ptr< Packet > p)=0
Receive Phy Pdu funtion.
virtual Ptr< SpectrumValue > CreateTxPowerSpectralDensity()
Create the PSD for the TX.
Definition: lte-ue-phy.cc:539
void ReportTpc(uint8_t tpc)
Set RSRP function.
#define UL_PUSCH_TTIS_DELAY
Definition: lte-common.h:28
Ptr< SpectrumValue > m_noisePsd
Noise power spectral density for the configured bandwidth.
Definition: lte-ue-phy.h:784
void DoSetRnti(uint16_t rnti)
Set RNTI function.
Definition: lte-ue-phy.cc:1483
virtual void SubframeIndication(uint32_t frameNo, uint32_t subframeNo)=0
Trigger the start from a new frame (input from Phy layer)
virtual void ReportUeMeasurements(UeMeasurementsParameters params)=0
Send a report of RSRP and RSRQ values perceived from PSS by the PHY entity (after applying layer-1 fi...
std::vector< HarqProcessInfoElement_t > HarqProcessInfoList_t
HarqProcessInfoList_t typedef.
Definition: lte-harq-phy.h:48
void SetSubChannelsForReception(std::vector< int > mask)
Get a list of sub channels to use in RX.
Definition: lte-ue-phy.cc:515
The LteUeNetDevice class implements the UE net device.
virtual void DoDispose(void)
Destructor implementation.
Definition: lte-ue-phy.cc:192
Time m_ueMeasurementsFilterPeriod
The UeMeasurementsFilterPeriod attribute.
Definition: lte-ue-phy.h:740