A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
lte-helper.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Nicola Baldo <nbaldo@cttc.es> (re-wrote from scratch this helper)
7 * Giuseppe Piro <g.piro@poliba.it> (parts of the PHY & channel creation & configuration
8 * copied from the GSoC 2011 code) Modified by: Danilo Abrignani <danilo.abrignani@unibo.it>
9 * (Carrier Aggregation - GSoC 2015) Biljana Bojovic <biljana.bojovic@cttc.es> (Carrier Aggregation)
10 */
11
12#include "lte-helper.h"
13
14#include "cc-helper.h"
15#include "epc-helper.h"
20
21#include "ns3/abort.h"
22#include "ns3/buildings-propagation-loss-model.h"
23#include "ns3/epc-enb-application.h"
24#include "ns3/epc-enb-s1-sap.h"
25#include "ns3/epc-ue-nas.h"
26#include "ns3/epc-x2.h"
27#include "ns3/ff-mac-scheduler.h"
28#include "ns3/friis-spectrum-propagation-loss.h"
29#include "ns3/isotropic-antenna-model.h"
30#include "ns3/log.h"
31#include "ns3/lte-anr.h"
32#include "ns3/lte-chunk-processor.h"
33#include "ns3/lte-common.h"
34#include "ns3/lte-enb-component-carrier-manager.h"
35#include "ns3/lte-enb-mac.h"
36#include "ns3/lte-enb-net-device.h"
37#include "ns3/lte-enb-phy.h"
38#include "ns3/lte-enb-rrc.h"
39#include "ns3/lte-ffr-algorithm.h"
40#include "ns3/lte-handover-algorithm.h"
41#include "ns3/lte-rlc-am.h"
42#include "ns3/lte-rlc-um.h"
43#include "ns3/lte-rlc.h"
44#include "ns3/lte-rrc-protocol-ideal.h"
45#include "ns3/lte-rrc-protocol-real.h"
46#include "ns3/lte-spectrum-phy.h"
47#include "ns3/lte-spectrum-value-helper.h"
48#include "ns3/lte-ue-component-carrier-manager.h"
49#include "ns3/lte-ue-mac.h"
50#include "ns3/lte-ue-net-device.h"
51#include "ns3/lte-ue-phy.h"
52#include "ns3/lte-ue-rrc.h"
53#include "ns3/multi-model-spectrum-channel.h"
54#include "ns3/object-factory.h"
55#include "ns3/object-map.h"
56#include "ns3/pointer.h"
57#include "ns3/string.h"
58#include "ns3/trace-fading-loss-model.h"
59
60#include <iostream>
61
62namespace ns3
63{
64
65NS_LOG_COMPONENT_DEFINE("LteHelper");
66
68
81
82void
93
98
101{
102 static TypeId tid =
103 TypeId("ns3::LteHelper")
104 .SetParent<Object>()
105 .AddConstructor<LteHelper>()
106 .AddAttribute(
107 "Scheduler",
108 "The type of scheduler to be used for eNBs. "
109 "The allowed values for this attributes are the type names "
110 "of any class inheriting from ns3::FfMacScheduler.",
111 StringValue("ns3::PfFfMacScheduler"),
114 .AddAttribute("FfrAlgorithm",
115 "The type of FFR algorithm to be used for eNBs. "
116 "The allowed values for this attributes are the type names "
117 "of any class inheriting from ns3::LteFfrAlgorithm.",
118 StringValue("ns3::LteFrNoOpAlgorithm"),
122 .AddAttribute("HandoverAlgorithm",
123 "The type of handover algorithm to be used for eNBs. "
124 "The allowed values for this attributes are the type names "
125 "of any class inheriting from ns3::LteHandoverAlgorithm.",
126 StringValue("ns3::NoOpHandoverAlgorithm"),
130 .AddAttribute("PathlossModel",
131 "The type of pathloss model to be used. "
132 "The allowed values for this attributes are the type names "
133 "of any class inheriting from ns3::PropagationLossModel.",
137 .AddAttribute("FadingModel",
138 "The type of fading model to be used."
139 "The allowed values for this attributes are the type names "
140 "of any class inheriting from ns3::SpectrumPropagationLossModel."
141 "If the type is set to an empty string, no fading model is used.",
142 StringValue(""),
145 .AddAttribute("UseIdealRrc",
146 "If true, LteRrcProtocolIdeal will be used for RRC signaling. "
147 "If false, LteRrcProtocolReal will be used.",
148 BooleanValue(true),
151 .AddAttribute("AnrEnabled",
152 "Activate or deactivate Automatic Neighbour Relation function",
153 BooleanValue(true),
156 .AddAttribute("UsePdschForCqiGeneration",
157 "If true, DL-CQI will be calculated from PDCCH as signal and PDSCH as "
158 "interference. "
159 "If false, DL-CQI will be calculated from PDCCH as signal and PDCCH as "
160 "interference.",
161 BooleanValue(true),
164 .AddAttribute("EnbComponentCarrierManager",
165 "The type of Component Carrier Manager to be used for eNBs. "
166 "The allowed values for this attributes are the type names "
167 "of any class inheriting ns3::LteEnbComponentCarrierManager.",
168 StringValue("ns3::NoOpComponentCarrierManager"),
172 .AddAttribute("UeComponentCarrierManager",
173 "The type of Component Carrier Manager to be used for UEs. "
174 "The allowed values for this attributes are the type names "
175 "of any class inheriting ns3::LteUeComponentCarrierManager.",
176 StringValue("ns3::SimpleUeComponentCarrierManager"),
180 .AddAttribute("UseCa",
181 "If true, Carrier Aggregation feature is enabled and a valid Component "
182 "Carrier Map is expected. "
183 "If false, single carrier simulation.",
184 BooleanValue(false),
187 .AddAttribute("NumberOfComponentCarriers",
188 "Set the number of Component carrier to use. "
189 "If it is more than one and m_useCa is false, it will raise an error.",
190 UintegerValue(1),
193 return tid;
194}
195
196void
198{
199 NS_LOG_FUNCTION(this);
200 m_downlinkChannel = nullptr;
201 m_uplinkChannel = nullptr;
204}
205
211
217
220{
221 return m_epcHelper;
222}
223
224void
226{
227 // Channel Object (i.e. Ptr<SpectrumChannel>) are within a vector
228 // PathLossModel Objects are vectors --> in InstallSingleEnb we will set the frequency
229 NS_LOG_FUNCTION(this << m_noOfCcs);
230
233
237 if (dlSplm)
238 {
239 NS_LOG_LOGIC(this << " using a SpectrumPropagationLossModel in DL");
240 m_downlinkChannel->AddSpectrumPropagationLossModel(dlSplm);
241 }
242 else
243 {
244 NS_LOG_LOGIC(this << " using a PropagationLossModel in DL");
247 NS_ASSERT_MSG(dlPlm,
249 << " is neither PropagationLossModel nor SpectrumPropagationLossModel");
250 m_downlinkChannel->AddPropagationLossModel(dlPlm);
251 }
252
256 if (ulSplm)
257 {
258 NS_LOG_LOGIC(this << " using a SpectrumPropagationLossModel in UL");
259 m_uplinkChannel->AddSpectrumPropagationLossModel(ulSplm);
260 }
261 else
262 {
263 NS_LOG_LOGIC(this << " using a PropagationLossModel in UL");
265 NS_ASSERT_MSG(ulPlm,
267 << " is neither PropagationLossModel nor SpectrumPropagationLossModel");
268 m_uplinkChannel->AddPropagationLossModel(ulPlm);
269 }
270 if (!m_fadingModelType.empty())
271 {
273 m_fadingModel->Initialize();
274 m_downlinkChannel->AddSpectrumPropagationLossModel(m_fadingModel);
275 m_uplinkChannel->AddSpectrumPropagationLossModel(m_fadingModel);
276 }
277}
278
279void
285
286void
288{
289 NS_LOG_FUNCTION(this << type);
291 m_schedulerFactory.SetTypeId(type);
292}
293
294std::string
296{
297 return m_schedulerFactory.GetTypeId().GetName();
298}
299
300void
302{
303 NS_LOG_FUNCTION(this << n);
304 m_schedulerFactory.Set(n, v);
305}
306
307std::string
309{
310 return m_ffrAlgorithmFactory.GetTypeId().GetName();
311}
312
313void
315{
316 NS_LOG_FUNCTION(this << type);
318 m_ffrAlgorithmFactory.SetTypeId(type);
319}
320
321void
323{
324 NS_LOG_FUNCTION(this << n);
325 m_ffrAlgorithmFactory.Set(n, v);
326}
327
328std::string
330{
331 return m_handoverAlgorithmFactory.GetTypeId().GetName();
332}
333
334void
336{
337 NS_LOG_FUNCTION(this << type);
339 m_handoverAlgorithmFactory.SetTypeId(type);
340}
341
342void
344{
345 NS_LOG_FUNCTION(this << n);
347}
348
349std::string
354
355void
362
363void
369
370std::string
372{
373 return m_ueComponentCarrierManagerFactory.GetTypeId().GetName();
374}
375
376void
383
384void
390
391void
398
399void
401{
402 NS_LOG_FUNCTION(this << n);
404}
405
406void
408{
409 NS_LOG_FUNCTION(this);
410 m_enbNetDeviceFactory.Set(n, v);
411}
412
413void
415{
416 NS_LOG_FUNCTION(this);
417 m_enbAntennaModelFactory.SetTypeId(type);
418}
419
420void
426
427void
429{
430 NS_LOG_FUNCTION(this);
431 m_ueNetDeviceFactory.Set(n, v);
432}
433
434void
436{
437 NS_LOG_FUNCTION(this);
438 m_ueAntennaModelFactory.SetTypeId(type);
439}
440
441void
447
448void
450{
451 NS_LOG_FUNCTION(this << type);
452 m_fadingModelType = type;
453 if (!type.empty())
454 {
456 m_fadingModelFactory.SetTypeId(type);
457 }
458}
459
460void
462{
463 m_fadingModelFactory.Set(n, v);
464}
465
466void
468{
469 NS_LOG_FUNCTION(this << type);
470 m_channelFactory.SetTypeId(type);
471}
472
473void
475{
476 m_channelFactory.Set(n, v);
477}
478
481{
482 NS_LOG_FUNCTION(this);
483 Initialize(); // will run DoInitialize () if necessary
484 NetDeviceContainer devices;
485 for (auto i = c.Begin(); i != c.End(); ++i)
486 {
487 Ptr<Node> node = *i;
489 devices.Add(device);
490 }
491 return devices;
492}
493
496{
497 NS_LOG_FUNCTION(this);
498 NetDeviceContainer devices;
499 for (auto i = c.Begin(); i != c.End(); ++i)
500 {
501 Ptr<Node> node = *i;
503 devices.Add(device);
504 }
505 return devices;
506}
507
510{
511 NS_LOG_FUNCTION(this << n);
512 uint16_t cellId = m_cellIdCounter; // \todo Remove, eNB has no cell ID
513
515 Ptr<LteHandoverAlgorithm> handoverAlgorithm =
517
518 NS_ABORT_MSG_IF(!m_componentCarrierPhyParams.empty(), "CC map is not clean");
519 DoComponentCarrierConfigure(dev->GetUlEarfcn(),
520 dev->GetDlEarfcn(),
521 dev->GetUlBandwidth(),
522 dev->GetDlBandwidth());
524 "CC map size (" << m_componentCarrierPhyParams.size()
525 << ") must be equal to number of carriers (" << m_noOfCcs
526 << ")");
527 // create component carrier map for this eNb device
528 std::map<uint8_t, Ptr<ComponentCarrierBaseStation>> ccMap;
529 for (auto it = m_componentCarrierPhyParams.begin(); it != m_componentCarrierPhyParams.end();
530 ++it)
531 {
533 cc->SetUlBandwidth(it->second.GetUlBandwidth());
534 cc->SetDlBandwidth(it->second.GetDlBandwidth());
535 cc->SetDlEarfcn(it->second.GetDlEarfcn());
536 cc->SetUlEarfcn(it->second.GetUlEarfcn());
537 cc->SetAsPrimary(it->second.IsPrimary());
538 NS_ABORT_MSG_IF(m_cellIdCounter == 65535, "max num cells exceeded");
539 cc->SetCellId(m_cellIdCounter++);
540 ccMap[it->first] = cc;
541 }
542 // CC map is not needed anymore
544
545 NS_ABORT_MSG_IF(m_useCa && ccMap.size() < 2,
546 "You have to either specify carriers or disable carrier aggregation");
547 NS_ASSERT(ccMap.size() == m_noOfCcs);
548
549 for (auto it = ccMap.begin(); it != ccMap.end(); ++it)
550 {
551 NS_LOG_DEBUG(this << "component carrier map size " << (uint16_t)ccMap.size());
554 Ptr<LteEnbPhy> phy = CreateObject<LteEnbPhy>(dlPhy, ulPhy);
555
557 dlPhy->SetHarqPhyModule(harq);
558 ulPhy->SetHarqPhyModule(harq);
559 phy->SetHarqPhyModule(harq);
560
562 pCtrl->AddCallback(MakeCallback(&LteEnbPhy::GenerateCtrlCqiReport, phy));
563 ulPhy->AddCtrlSinrChunkProcessor(pCtrl); // for evaluating SRS UL-CQI
564
566 pData->AddCallback(MakeCallback(&LteEnbPhy::GenerateDataCqiReport, phy));
567 pData->AddCallback(MakeCallback(&LteSpectrumPhy::UpdateSinrPerceived, ulPhy));
568 ulPhy->AddDataSinrChunkProcessor(pData); // for evaluating PUSCH UL-CQI
569
571 pInterf->AddCallback(MakeCallback(&LteEnbPhy::ReportInterference, phy));
572 ulPhy->AddInterferenceDataChunkProcessor(pInterf); // for interference power tracing
573
574 dlPhy->SetChannel(m_downlinkChannel);
575 ulPhy->SetChannel(m_uplinkChannel);
576
577 Ptr<MobilityModel> mm = n->GetObject<MobilityModel>();
579 mm,
580 "MobilityModel needs to be set on node before calling LteHelper::InstallEnbDevice ()");
581 dlPhy->SetMobility(mm);
582 ulPhy->SetMobility(mm);
583
584 Ptr<AntennaModel> antenna = (m_enbAntennaModelFactory.Create())->GetObject<AntennaModel>();
585 NS_ASSERT_MSG(antenna, "error in creating the AntennaModel object");
586 dlPhy->SetAntenna(antenna);
587 ulPhy->SetAntenna(antenna);
588
592 DynamicCast<ComponentCarrierEnb>(it->second)->SetMac(mac);
593 DynamicCast<ComponentCarrierEnb>(it->second)->SetFfMacScheduler(sched);
594 DynamicCast<ComponentCarrierEnb>(it->second)->SetFfrAlgorithm(ffrAlgorithm);
595 DynamicCast<ComponentCarrierEnb>(it->second)->SetPhy(phy);
596 }
597
601
602 // ComponentCarrierManager SAP
603 rrc->SetLteCcmRrcSapProvider(ccmEnbManager->GetLteCcmRrcSapProvider());
604 ccmEnbManager->SetLteCcmRrcSapUser(rrc->GetLteCcmRrcSapUser());
605 // Set number of component carriers. Note: eNB CCM would also set the
606 // number of component carriers in eNB RRC
607 ccmEnbManager->SetNumberOfComponentCarriers(m_noOfCcs);
608
609 rrc->ConfigureCarriers(ccMap);
610
611 if (m_useIdealRrc)
612 {
614 rrcProtocol->SetLteEnbRrcSapProvider(rrc->GetLteEnbRrcSapProvider());
615 rrc->SetLteEnbRrcSapUser(rrcProtocol->GetLteEnbRrcSapUser());
616 rrc->AggregateObject(rrcProtocol);
617 rrcProtocol->SetCellId(cellId);
618 }
619 else
620 {
622 rrcProtocol->SetLteEnbRrcSapProvider(rrc->GetLteEnbRrcSapProvider());
623 rrc->SetLteEnbRrcSapUser(rrcProtocol->GetLteEnbRrcSapUser());
624 rrc->AggregateObject(rrcProtocol);
625 rrcProtocol->SetCellId(cellId);
626 }
627
628 if (m_epcHelper)
629 {
631 rrc->GetAttribute("EpsBearerToRlcMapping", epsBearerToRlcMapping);
632 // it does not make sense to use RLC/SM when also using the EPC
633 if (epsBearerToRlcMapping.Get() == LteEnbRrc::RLC_SM_ALWAYS)
634 {
635 rrc->SetAttribute("EpsBearerToRlcMapping", EnumValue(LteEnbRrc::RLC_UM_ALWAYS));
636 }
637 }
638
639 rrc->SetLteHandoverManagementSapProvider(
640 handoverAlgorithm->GetLteHandoverManagementSapProvider());
641 handoverAlgorithm->SetLteHandoverManagementSapUser(rrc->GetLteHandoverManagementSapUser());
642
643 // This RRC attribute is used to connect each new RLC instance with the MAC layer
644 // (for function such as TransmitPdu, ReportBufferStatusReport).
645 // Since in this new architecture, the component carrier manager acts a proxy, it
646 // will have its own LteMacSapProvider interface, RLC will see it as through original MAC
647 // interface LteMacSapProvider, but the function call will go now through
648 // LteEnbComponentCarrierManager instance that needs to implement functions of this interface,
649 // and its task will be to forward these calls to the specific MAC of some of the instances of
650 // component carriers. This decision will depend on the specific implementation of the component
651 // carrier manager.
652 rrc->SetLteMacSapProvider(ccmEnbManager->GetLteMacSapProvider());
653
654 bool ccmTest;
655 for (auto it = ccMap.begin(); it != ccMap.end(); ++it)
656 {
658 ->GetPhy()
659 ->SetLteEnbCphySapUser(rrc->GetLteEnbCphySapUser(it->first));
660 rrc->SetLteEnbCphySapProvider(
661 DynamicCast<ComponentCarrierEnb>(it->second)->GetPhy()->GetLteEnbCphySapProvider(),
662 it->first);
663
664 rrc->SetLteEnbCmacSapProvider(
665 DynamicCast<ComponentCarrierEnb>(it->second)->GetMac()->GetLteEnbCmacSapProvider(),
666 it->first);
668 ->GetMac()
669 ->SetLteEnbCmacSapUser(rrc->GetLteEnbCmacSapUser(it->first));
670
671 DynamicCast<ComponentCarrierEnb>(it->second)->GetPhy()->SetComponentCarrierId(it->first);
672 DynamicCast<ComponentCarrierEnb>(it->second)->GetMac()->SetComponentCarrierId(it->first);
673 // FFR SAP
675 ->GetFfMacScheduler()
676 ->SetLteFfrSapProvider(DynamicCast<ComponentCarrierEnb>(it->second)
677 ->GetFfrAlgorithm()
678 ->GetLteFfrSapProvider());
680 ->GetFfrAlgorithm()
681 ->SetLteFfrSapUser(DynamicCast<ComponentCarrierEnb>(it->second)
682 ->GetFfMacScheduler()
683 ->GetLteFfrSapUser());
684 rrc->SetLteFfrRrcSapProvider(DynamicCast<ComponentCarrierEnb>(it->second)
685 ->GetFfrAlgorithm()
686 ->GetLteFfrRrcSapProvider(),
687 it->first);
689 ->GetFfrAlgorithm()
690 ->SetLteFfrRrcSapUser(rrc->GetLteFfrRrcSapUser(it->first));
691 // FFR SAP END
692
693 // PHY <--> MAC SAP
695 ->GetPhy()
696 ->SetLteEnbPhySapUser(
697 DynamicCast<ComponentCarrierEnb>(it->second)->GetMac()->GetLteEnbPhySapUser());
699 ->GetMac()
700 ->SetLteEnbPhySapProvider(
701 DynamicCast<ComponentCarrierEnb>(it->second)->GetPhy()->GetLteEnbPhySapProvider());
702 // PHY <--> MAC SAP END
703
704 // Scheduler SAP
706 ->GetMac()
707 ->SetFfMacSchedSapProvider(DynamicCast<ComponentCarrierEnb>(it->second)
708 ->GetFfMacScheduler()
709 ->GetFfMacSchedSapProvider());
711 ->GetMac()
712 ->SetFfMacCschedSapProvider(DynamicCast<ComponentCarrierEnb>(it->second)
713 ->GetFfMacScheduler()
714 ->GetFfMacCschedSapProvider());
715
717 ->GetFfMacScheduler()
718 ->SetFfMacSchedSapUser(
719 DynamicCast<ComponentCarrierEnb>(it->second)->GetMac()->GetFfMacSchedSapUser());
721 ->GetFfMacScheduler()
722 ->SetFfMacCschedSapUser(
723 DynamicCast<ComponentCarrierEnb>(it->second)->GetMac()->GetFfMacCschedSapUser());
724 // Scheduler SAP END
725
727 ->GetMac()
728 ->SetLteCcmMacSapUser(ccmEnbManager->GetLteCcmMacSapUser());
729 ccmEnbManager->SetCcmMacSapProviders(
730 it->first,
731 DynamicCast<ComponentCarrierEnb>(it->second)->GetMac()->GetLteCcmMacSapProvider());
732
733 // insert the pointer to the LteMacSapProvider interface of the MAC layer of the specific
734 // component carrier
735 ccmTest = ccmEnbManager->SetMacSapProvider(
736 it->first,
737 DynamicCast<ComponentCarrierEnb>(it->second)->GetMac()->GetLteMacSapProvider());
738
739 if (!ccmTest)
740 {
741 NS_FATAL_ERROR("Error in SetComponentCarrierMacSapProviders");
742 }
743 }
744
745 dev->SetNode(n);
746 dev->SetAttribute("CellId", UintegerValue(cellId));
747 dev->SetAttribute("LteEnbComponentCarrierManager", PointerValue(ccmEnbManager));
748 dev->SetCcMap(ccMap);
749 auto it = ccMap.begin();
750 dev->SetAttribute("LteEnbRrc", PointerValue(rrc));
751 dev->SetAttribute("LteHandoverAlgorithm", PointerValue(handoverAlgorithm));
752 dev->SetAttribute(
753 "LteFfrAlgorithm",
754 PointerValue(DynamicCast<ComponentCarrierEnb>(it->second)->GetFfrAlgorithm()));
755
756 if (m_isAnrEnabled)
757 {
758 Ptr<LteAnr> anr = CreateObject<LteAnr>(cellId);
759 rrc->SetLteAnrSapProvider(anr->GetLteAnrSapProvider());
760 anr->SetLteAnrSapUser(rrc->GetLteAnrSapUser());
761 dev->SetAttribute("LteAnr", PointerValue(anr));
762 }
763
764 for (it = ccMap.begin(); it != ccMap.end(); ++it)
765 {
766 Ptr<LteEnbPhy> ccPhy = DynamicCast<ComponentCarrierEnb>(it->second)->GetPhy();
767 ccPhy->SetDevice(dev);
768 ccPhy->GetUlSpectrumPhy()->SetDevice(dev);
769 ccPhy->GetDlSpectrumPhy()->SetDevice(dev);
770 ccPhy->GetUlSpectrumPhy()->SetLtePhyRxDataEndOkCallback(
772 ccPhy->GetUlSpectrumPhy()->SetLtePhyRxCtrlEndOkCallback(
774 ccPhy->GetUlSpectrumPhy()->SetLtePhyUlHarqFeedbackCallback(
776 NS_LOG_LOGIC("set the propagation model frequencies");
777 double dlFreq = LteSpectrumValueHelper::GetCarrierFrequency(it->second->GetDlEarfcn());
778 NS_LOG_LOGIC("DL freq: " << dlFreq);
779 bool dlFreqOk =
780 m_downlinkPathlossModel->SetAttributeFailSafe("Frequency", DoubleValue(dlFreq));
781 if (!dlFreqOk)
782 {
783 NS_LOG_WARN("DL propagation model does not have a Frequency attribute");
784 }
785
786 double ulFreq = LteSpectrumValueHelper::GetCarrierFrequency(it->second->GetUlEarfcn());
787
788 NS_LOG_LOGIC("UL freq: " << ulFreq);
789 bool ulFreqOk =
790 m_uplinkPathlossModel->SetAttributeFailSafe("Frequency", DoubleValue(ulFreq));
791 if (!ulFreqOk)
792 {
793 NS_LOG_WARN("UL propagation model does not have a Frequency attribute");
794 }
795 }
796 rrc->SetForwardUpCallback(MakeCallback(&LteEnbNetDevice::Receive, dev));
797 dev->Initialize();
798 n->AddDevice(dev);
799
800 for (it = ccMap.begin(); it != ccMap.end(); ++it)
801 {
802 m_uplinkChannel->AddRx(
803 DynamicCast<ComponentCarrierEnb>(it->second)->GetPhy()->GetUlSpectrumPhy());
804 }
805
806 if (m_epcHelper)
807 {
808 NS_LOG_INFO("adding this eNB to the EPC");
809 m_epcHelper->AddEnb(n, dev, dev->GetCellIds());
810 Ptr<EpcEnbApplication> enbApp = n->GetApplication(0)->GetObject<EpcEnbApplication>();
811 NS_ASSERT_MSG(enbApp, "cannot retrieve EpcEnbApplication");
812
813 // S1 SAPs
814 rrc->SetS1SapProvider(enbApp->GetS1SapProvider());
815 enbApp->SetS1SapUser(rrc->GetS1SapUser());
816
817 // X2 SAPs
818 Ptr<EpcX2> x2 = n->GetObject<EpcX2>();
819 x2->SetEpcX2SapUser(rrc->GetEpcX2SapUser());
820 rrc->SetEpcX2SapProvider(x2->GetEpcX2SapProvider());
821 }
822
823 return dev;
824}
825
828{
829 NS_LOG_FUNCTION(this);
830
832
833 // Initialize the component carriers with default values in order to initialize MACs and PHYs
834 // of each component carrier. These values must be updated once the UE is attached to the
835 // eNB and receives RRC Connection Reconfiguration message. In case of primary carrier or
836 // a single carrier, these values will be updated once the UE will receive SIB2 and MIB.
837 NS_ABORT_MSG_IF(!m_componentCarrierPhyParams.empty(), "CC map is not clean");
838 DoComponentCarrierConfigure(dev->GetDlEarfcn() + 18000, dev->GetDlEarfcn(), 25, 25);
840 "CC map size (" << m_componentCarrierPhyParams.size()
841 << ") must be equal to number of carriers (" << m_noOfCcs
842 << ")");
843 std::map<uint8_t, Ptr<ComponentCarrierUe>> ueCcMap;
844
845 for (auto it = m_componentCarrierPhyParams.begin(); it != m_componentCarrierPhyParams.end();
846 ++it)
847 {
849 cc->SetUlBandwidth(it->second.GetUlBandwidth());
850 cc->SetDlBandwidth(it->second.GetDlBandwidth());
851 cc->SetDlEarfcn(it->second.GetDlEarfcn());
852 cc->SetUlEarfcn(it->second.GetUlEarfcn());
853 cc->SetAsPrimary(it->second.IsPrimary());
855 cc->SetMac(mac);
856 // cc->GetPhy ()->Initialize (); // it is initialized within the
857 // LteUeNetDevice::DoInitialize ()
858 ueCcMap.insert(std::pair<uint8_t, Ptr<ComponentCarrierUe>>(it->first, cc));
859 }
860 // CC map is not needed anymore
862
863 for (auto it = ueCcMap.begin(); it != ueCcMap.end(); ++it)
864 {
867
868 Ptr<LteUePhy> phy = CreateObject<LteUePhy>(dlPhy, ulPhy);
869
871 dlPhy->SetHarqPhyModule(harq);
872 ulPhy->SetHarqPhyModule(harq);
873 phy->SetHarqPhyModule(harq);
874
876 pRs->AddCallback(MakeCallback(&LteUePhy::ReportRsReceivedPower, phy));
877 dlPhy->AddRsPowerChunkProcessor(pRs);
878
880 pInterf->AddCallback(MakeCallback(&LteUePhy::ReportInterference, phy));
881 dlPhy->AddInterferenceCtrlChunkProcessor(pInterf); // for RSRQ evaluation of UE Measurements
882
884 pCtrl->AddCallback(MakeCallback(&LteSpectrumPhy::UpdateSinrPerceived, dlPhy));
885 dlPhy->AddCtrlSinrChunkProcessor(pCtrl);
886
888 pData->AddCallback(MakeCallback(&LteSpectrumPhy::UpdateSinrPerceived, dlPhy));
889 dlPhy->AddDataSinrChunkProcessor(pData);
890
892 {
893 // CQI calculation based on PDCCH for signal and PDSCH for interference
894 // NOTE: Change in pCtrl chunk processor could impact the RLF detection
895 // since it is based on CTRL SINR.
896 pCtrl->AddCallback(MakeCallback(&LteUePhy::GenerateMixedCqiReport, phy));
898 pDataInterf->AddCallback(MakeCallback(&LteUePhy::ReportDataInterference, phy));
899 dlPhy->AddInterferenceDataChunkProcessor(pDataInterf);
900 }
901 else
902 {
903 // CQI calculation based on PDCCH for both signal and interference
904 pCtrl->AddCallback(MakeCallback(&LteUePhy::GenerateCtrlCqiReport, phy));
905 }
906
907 dlPhy->SetChannel(m_downlinkChannel);
908 ulPhy->SetChannel(m_uplinkChannel);
909
910 Ptr<MobilityModel> mm = n->GetObject<MobilityModel>();
912 mm,
913 "MobilityModel needs to be set on node before calling LteHelper::InstallUeDevice ()");
914 dlPhy->SetMobility(mm);
915 ulPhy->SetMobility(mm);
916
917 Ptr<AntennaModel> antenna = (m_ueAntennaModelFactory.Create())->GetObject<AntennaModel>();
918 NS_ASSERT_MSG(antenna, "error in creating the AntennaModel object");
919 dlPhy->SetAntenna(antenna);
920 ulPhy->SetAntenna(antenna);
921
922 it->second->SetPhy(phy);
923 }
926
928 rrc->SetLteMacSapProvider(ccmUe->GetLteMacSapProvider());
929 // setting ComponentCarrierManager SAP
930 rrc->SetLteCcmRrcSapProvider(ccmUe->GetLteCcmRrcSapProvider());
931 ccmUe->SetLteCcmRrcSapUser(rrc->GetLteCcmRrcSapUser());
932 // Set number of component carriers. Note: UE CCM would also set the
933 // number of component carriers in UE RRC
934 ccmUe->SetNumberOfComponentCarriers(m_noOfCcs);
935
936 // run initializeSap to create the proper number of MAC and PHY control sap provider/users
937 rrc->InitializeSap();
938
939 if (m_useIdealRrc)
940 {
942 rrcProtocol->SetUeRrc(rrc);
943 rrc->AggregateObject(rrcProtocol);
944 rrcProtocol->SetLteUeRrcSapProvider(rrc->GetLteUeRrcSapProvider());
945 rrc->SetLteUeRrcSapUser(rrcProtocol->GetLteUeRrcSapUser());
946 }
947 else
948 {
950 rrcProtocol->SetUeRrc(rrc);
951 rrc->AggregateObject(rrcProtocol);
952 rrcProtocol->SetLteUeRrcSapProvider(rrc->GetLteUeRrcSapProvider());
953 rrc->SetLteUeRrcSapUser(rrcProtocol->GetLteUeRrcSapUser());
954 }
955
956 if (m_epcHelper)
957 {
958 rrc->SetUseRlcSm(false);
959 }
961
962 nas->SetAsSapProvider(rrc->GetAsSapProvider());
963 rrc->SetAsSapUser(nas->GetAsSapUser());
964
965 for (auto it = ueCcMap.begin(); it != ueCcMap.end(); ++it)
966 {
967 rrc->SetLteUeCmacSapProvider(it->second->GetMac()->GetLteUeCmacSapProvider(), it->first);
968 it->second->GetMac()->SetLteUeCmacSapUser(rrc->GetLteUeCmacSapUser(it->first));
969 it->second->GetMac()->SetComponentCarrierId(it->first);
970
971 it->second->GetPhy()->SetLteUeCphySapUser(rrc->GetLteUeCphySapUser(it->first));
972 rrc->SetLteUeCphySapProvider(it->second->GetPhy()->GetLteUeCphySapProvider(), it->first);
973 it->second->GetPhy()->SetComponentCarrierId(it->first);
974 it->second->GetPhy()->SetLteUePhySapUser(it->second->GetMac()->GetLteUePhySapUser());
975 it->second->GetMac()->SetLteUePhySapProvider(
976 it->second->GetPhy()->GetLteUePhySapProvider());
977
978 bool ccmTest =
979 ccmUe->SetComponentCarrierMacSapProviders(it->first,
980 it->second->GetMac()->GetLteMacSapProvider());
981
982 if (!ccmTest)
983 {
984 NS_FATAL_ERROR("Error in SetComponentCarrierMacSapProviders");
985 }
986 }
987
988 NS_ABORT_MSG_IF(m_imsiCounter >= 0xFFFFFFFF, "max num UEs exceeded");
989 uint64_t imsi = ++m_imsiCounter;
990
991 dev->SetNode(n);
992 dev->SetAttribute("Imsi", UintegerValue(imsi));
993 dev->SetCcMap(ueCcMap);
994 dev->SetAttribute("LteUeRrc", PointerValue(rrc));
995 dev->SetAttribute("EpcUeNas", PointerValue(nas));
996 dev->SetAttribute("LteUeComponentCarrierManager", PointerValue(ccmUe));
997 // \todo The UE identifier should be dynamically set by the EPC
998 // when the default PDP context is created. This is a simplification.
999 dev->SetAddress(Mac64Address::Allocate());
1000
1001 for (auto it = ueCcMap.begin(); it != ueCcMap.end(); ++it)
1002 {
1003 Ptr<LteUePhy> ccPhy = it->second->GetPhy();
1004 ccPhy->SetDevice(dev);
1005 ccPhy->GetUlSpectrumPhy()->SetDevice(dev);
1006 ccPhy->GetDlSpectrumPhy()->SetDevice(dev);
1007 ccPhy->GetDlSpectrumPhy()->SetLtePhyRxDataEndOkCallback(
1009 ccPhy->GetDlSpectrumPhy()->SetLtePhyRxCtrlEndOkCallback(
1011 ccPhy->GetDlSpectrumPhy()->SetLtePhyRxPssCallback(
1013 ccPhy->GetDlSpectrumPhy()->SetLtePhyDlHarqFeedbackCallback(
1015 }
1016
1017 nas->SetDevice(dev);
1018
1019 n->AddDevice(dev);
1020
1021 nas->SetForwardUpCallback(MakeCallback(&LteUeNetDevice::Receive, dev));
1022
1023 if (m_epcHelper)
1024 {
1025 m_epcHelper->AddUe(dev, dev->GetImsi());
1026 }
1027
1028 dev->Initialize();
1029
1030 return dev;
1031}
1032
1033void
1035{
1036 NS_LOG_FUNCTION(this);
1037 for (auto i = ueDevices.Begin(); i != ueDevices.End(); ++i)
1038 {
1039 Attach(*i);
1040 }
1041}
1042
1043void
1045{
1046 NS_LOG_FUNCTION(this);
1047
1048 if (!m_epcHelper)
1049 {
1050 NS_FATAL_ERROR("This function is not valid without properly configured EPC");
1051 }
1052
1053 Ptr<LteUeNetDevice> ueLteDevice = ueDevice->GetObject<LteUeNetDevice>();
1054 if (!ueLteDevice)
1055 {
1056 NS_FATAL_ERROR("The passed NetDevice must be an LteUeNetDevice");
1057 }
1058
1059 // initiate cell selection
1060 Ptr<EpcUeNas> ueNas = ueLteDevice->GetNas();
1061 NS_ASSERT(ueNas);
1062 uint32_t dlEarfcn = ueLteDevice->GetDlEarfcn();
1063 ueNas->StartCellSelection(dlEarfcn);
1064
1065 // instruct UE to immediately enter CONNECTED mode after camping
1066 ueNas->Connect();
1067
1068 // activate default EPS bearer
1069 m_epcHelper->ActivateEpsBearer(ueDevice,
1070 ueLteDevice->GetImsi(),
1073}
1074
1075void
1077{
1078 NS_LOG_FUNCTION(this);
1079 for (auto i = ueDevices.Begin(); i != ueDevices.End(); ++i)
1080 {
1081 Attach(*i, enbDevice);
1082 }
1083}
1084
1085void
1086LteHelper::Attach(Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice, uint8_t componentCarrierId)
1087{
1088 NS_LOG_FUNCTION(this);
1089 // enbRrc->SetCellId (enbDevice->GetObject<LteEnbNetDevice> ()->GetCellId ());
1090
1091 Ptr<LteUeNetDevice> ueLteDevice = ueDevice->GetObject<LteUeNetDevice>();
1092 Ptr<LteEnbNetDevice> enbLteDevice = enbDevice->GetObject<LteEnbNetDevice>();
1093
1094 Ptr<EpcUeNas> ueNas = ueLteDevice->GetNas();
1095 Ptr<ComponentCarrierEnb> componentCarrier =
1096 DynamicCast<ComponentCarrierEnb>(enbLteDevice->GetCcMap().at(componentCarrierId));
1097 ueNas->Connect(componentCarrier->GetCellId(), componentCarrier->GetDlEarfcn());
1098
1099 if (m_epcHelper)
1100 {
1101 // activate default EPS bearer
1102 m_epcHelper->ActivateEpsBearer(ueDevice,
1103 ueLteDevice->GetImsi(),
1106 }
1107
1108 // tricks needed for the simplified LTE-only simulations
1109 if (!m_epcHelper)
1110 {
1111 ueDevice->GetObject<LteUeNetDevice>()->SetTargetEnb(
1112 enbDevice->GetObject<LteEnbNetDevice>());
1113 }
1114}
1115
1116void
1118{
1119 NS_LOG_FUNCTION(this);
1120 for (auto i = ueDevices.Begin(); i != ueDevices.End(); ++i)
1121 {
1122 AttachToClosestEnb(*i, enbDevices);
1123 }
1124}
1125
1126void
1128{
1129 NS_LOG_FUNCTION(this);
1130 NS_ASSERT_MSG(enbDevices.GetN() > 0, "empty enb device container");
1131 Vector uepos = ueDevice->GetNode()->GetObject<MobilityModel>()->GetPosition();
1132 double minDistance = std::numeric_limits<double>::infinity();
1133 Ptr<NetDevice> closestEnbDevice;
1134 for (auto i = enbDevices.Begin(); i != enbDevices.End(); ++i)
1135 {
1136 Vector enbpos = (*i)->GetNode()->GetObject<MobilityModel>()->GetPosition();
1137 double distance = CalculateDistance(uepos, enbpos);
1138 if (distance < minDistance)
1139 {
1140 minDistance = distance;
1141 closestEnbDevice = *i;
1142 }
1143 }
1144 NS_ASSERT(closestEnbDevice);
1145 Attach(ueDevice, closestEnbDevice);
1146}
1147
1148uint8_t
1150 EpsBearer bearer,
1151 Ptr<EpcTft> tft)
1152{
1153 NS_LOG_FUNCTION(this);
1154 for (auto i = ueDevices.Begin(); i != ueDevices.End(); ++i)
1155 {
1156 uint8_t bearerId = ActivateDedicatedEpsBearer(*i, bearer, tft);
1157 return bearerId;
1158 }
1159 return 0;
1160}
1161
1162uint8_t
1164{
1165 NS_LOG_FUNCTION(this);
1166
1167 NS_ASSERT_MSG(m_epcHelper, "dedicated EPS bearers cannot be set up when the EPC is not used");
1168
1169 uint64_t imsi = ueDevice->GetObject<LteUeNetDevice>()->GetImsi();
1170 uint8_t bearerId = m_epcHelper->ActivateEpsBearer(ueDevice, imsi, tft, bearer);
1171 return bearerId;
1172}
1173
1174/**
1175 * @ingroup lte
1176 *
1177 * DrbActivatior allows user to activate bearers for UEs
1178 * when EPC is not used. Activation function is hooked to
1179 * the Enb RRC Connection Established trace source. When
1180 * UE change its RRC state to CONNECTED_NORMALLY, activation
1181 * function is called and bearer is activated.
1182 */
1184{
1185 public:
1186 /**
1187 * DrbActivator Constructor
1188 *
1189 * @param ueDevice the UeNetDevice for which bearer will be activated
1190 * @param bearer the bearer configuration
1191 */
1192 DrbActivator(Ptr<NetDevice> ueDevice, EpsBearer bearer);
1193
1194 /**
1195 * Function hooked to the Enb RRC Connection Established trace source
1196 * Fired upon successful RRC connection establishment.
1197 *
1198 * @param a DrbActivator object
1199 * @param context
1200 * @param imsi
1201 * @param cellId
1202 * @param rnti
1203 */
1204 static void ActivateCallback(std::shared_ptr<DrbActivator> a,
1205 std::string context,
1206 uint64_t imsi,
1207 uint16_t cellId,
1208 uint16_t rnti);
1209
1210 /**
1211 * Procedure firstly checks if bearer was not activated, if IMSI
1212 * from trace source equals configured one and if UE is really
1213 * in RRC connected state. If all requirements are met, it performs
1214 * bearer activation.
1215 *
1216 * @param imsi
1217 * @param cellId
1218 * @param rnti
1219 */
1220 void ActivateDrb(uint64_t imsi, uint16_t cellId, uint16_t rnti);
1221
1222 private:
1223 /**
1224 * Bearer can be activated only once. This value stores state of
1225 * bearer. Initially is set to false and changed to true during
1226 * bearer activation.
1227 */
1229 /**
1230 * UeNetDevice for which bearer will be activated
1231 */
1233 /**
1234 * Configuration of bearer which will be activated
1235 */
1237 /**
1238 * imsi the unique UE identifier
1239 */
1240 uint64_t m_imsi;
1241};
1242
1244 : m_active(false),
1245 m_ueDevice(ueDevice),
1246 m_bearer(bearer),
1247 m_imsi(m_ueDevice->GetObject<LteUeNetDevice>()->GetImsi())
1248{
1249}
1250
1251void
1252DrbActivator::ActivateCallback(std::shared_ptr<DrbActivator> a,
1253 std::string context,
1254 uint64_t imsi,
1255 uint16_t cellId,
1256 uint16_t rnti)
1257{
1258 NS_LOG_FUNCTION(a << context << imsi << cellId << rnti);
1259 a->ActivateDrb(imsi, cellId, rnti);
1260}
1261
1262void
1263DrbActivator::ActivateDrb(uint64_t imsi, uint16_t cellId, uint16_t rnti)
1264{
1265 NS_LOG_FUNCTION(this << imsi << cellId << rnti << m_active);
1266 if ((!m_active) && (imsi == m_imsi))
1267 {
1268 Ptr<LteUeRrc> ueRrc = m_ueDevice->GetObject<LteUeNetDevice>()->GetRrc();
1269 NS_ASSERT(ueRrc->GetState() == LteUeRrc::CONNECTED_NORMALLY);
1270 uint16_t rnti = ueRrc->GetRnti();
1271 Ptr<LteEnbNetDevice> enbLteDevice = m_ueDevice->GetObject<LteUeNetDevice>()->GetTargetEnb();
1272 Ptr<LteEnbRrc> enbRrc = enbLteDevice->GetObject<LteEnbNetDevice>()->GetRrc();
1273 NS_ASSERT(ueRrc->GetCellId() == enbLteDevice->GetCellId());
1274 Ptr<UeManager> ueManager = enbRrc->GetUeManager(rnti);
1275 NS_ASSERT(ueManager->GetState() == UeManager::CONNECTED_NORMALLY ||
1276 ueManager->GetState() == UeManager::CONNECTION_RECONFIGURATION);
1278 params.rnti = rnti;
1279 params.bearer = m_bearer;
1280 params.bearerId = 0;
1281 params.gtpTeid = 0; // don't care
1282 enbRrc->GetS1SapUser()->DataRadioBearerSetupRequest(params);
1283 m_active = true;
1284 }
1285}
1286
1287void
1289{
1290 NS_LOG_FUNCTION(this << ueDevice);
1291 NS_ASSERT_MSG(!m_epcHelper, "this method must not be used when the EPC is being used");
1292
1293 // Normally it is the EPC that takes care of activating DRBs
1294 // when the UE gets connected. When the EPC is not used, we achieve
1295 // the same behavior by hooking a dedicated DRB activation function
1296 // to the Enb RRC Connection Established trace source
1297
1298 Ptr<LteEnbNetDevice> enbLteDevice = ueDevice->GetObject<LteUeNetDevice>()->GetTargetEnb();
1299
1300 std::ostringstream path;
1301 path << "/NodeList/" << enbLteDevice->GetNode()->GetId() << "/DeviceList/"
1302 << enbLteDevice->GetIfIndex() << "/LteEnbRrc/ConnectionEstablished";
1303 auto arg = std::make_shared<DrbActivator>(ueDevice, bearer);
1305}
1306
1307void
1309{
1310 NS_LOG_FUNCTION(this);
1311
1312 NS_ASSERT_MSG(m_epcHelper, "X2 interfaces cannot be set up when the EPC is not used");
1313
1314 for (auto i = enbNodes.Begin(); i != enbNodes.End(); ++i)
1315 {
1316 for (auto j = i + 1; j != enbNodes.End(); ++j)
1317 {
1318 AddX2Interface(*i, *j);
1319 }
1320 }
1321}
1322
1323void
1325{
1326 NS_LOG_FUNCTION(this);
1327 NS_LOG_INFO("setting up the X2 interface");
1328
1329 m_epcHelper->AddX2Interface(enbNode1, enbNode2);
1330}
1331
1332void
1334 Ptr<NetDevice> ueDev,
1335 Ptr<NetDevice> sourceEnbDev,
1336 Ptr<NetDevice> targetEnbDev)
1337{
1338 NS_LOG_FUNCTION(this << ueDev << sourceEnbDev << targetEnbDev);
1340 "Handover requires the use of the EPC - did you forget to call "
1341 "LteHelper::SetEpcHelper () ?");
1342 uint16_t targetCellId = targetEnbDev->GetObject<LteEnbNetDevice>()->GetCellId();
1343 Simulator::Schedule(hoTime,
1345 this,
1346 ueDev,
1347 sourceEnbDev,
1348 targetCellId);
1349}
1350
1351void
1353 Ptr<NetDevice> ueDev,
1354 Ptr<NetDevice> sourceEnbDev,
1355 uint16_t targetCellId)
1356{
1357 NS_LOG_FUNCTION(this << ueDev << sourceEnbDev << targetCellId);
1359 "Handover requires the use of the EPC - did you forget to call "
1360 "LteHelper::SetEpcHelper () ?");
1361 Simulator::Schedule(hoTime,
1363 this,
1364 ueDev,
1365 sourceEnbDev,
1366 targetCellId);
1367}
1368
1369void
1371 Ptr<NetDevice> sourceEnbDev,
1372 uint16_t targetCellId)
1373{
1374 NS_LOG_FUNCTION(this << ueDev << sourceEnbDev << targetCellId);
1375
1376 Ptr<LteEnbRrc> sourceRrc = sourceEnbDev->GetObject<LteEnbNetDevice>()->GetRrc();
1377 uint16_t rnti = ueDev->GetObject<LteUeNetDevice>()->GetRrc()->GetRnti();
1378 sourceRrc->SendHandoverRequest(rnti, targetCellId);
1379}
1380
1381void
1383 Ptr<NetDevice> enbDevice,
1384 uint8_t bearerId)
1385{
1386 NS_LOG_FUNCTION(this << ueDevice << bearerId);
1388 "Dedicated EPS bearers cannot be de-activated when the EPC is not used");
1389 NS_ASSERT_MSG(bearerId != 1,
1390 "Default bearer cannot be de-activated until and unless and UE is released");
1391
1392 DoDeActivateDedicatedEpsBearer(ueDevice, enbDevice, bearerId);
1393}
1394
1395void
1397 Ptr<NetDevice> enbDevice,
1398 uint8_t bearerId)
1399{
1400 NS_LOG_FUNCTION(this << ueDevice << bearerId);
1401
1402 // Extract IMSI and rnti
1403 uint64_t imsi = ueDevice->GetObject<LteUeNetDevice>()->GetImsi();
1404 uint16_t rnti = ueDevice->GetObject<LteUeNetDevice>()->GetRrc()->GetRnti();
1405
1406 Ptr<LteEnbRrc> enbRrc = enbDevice->GetObject<LteEnbNetDevice>()->GetRrc();
1407
1408 enbRrc->DoSendReleaseDataRadioBearer(imsi, rnti, bearerId);
1409}
1410
1411void
1413 uint32_t dlEarfcn,
1414 uint16_t ulbw,
1415 uint16_t dlbw)
1416{
1417 NS_LOG_FUNCTION(this << ulEarfcn << dlEarfcn << ulbw << dlbw);
1418
1419 NS_ABORT_MSG_IF(!m_componentCarrierPhyParams.empty(), "CC map is not clean");
1421 ccHelper->SetNumberOfComponentCarriers(m_noOfCcs);
1422 ccHelper->SetUlEarfcn(ulEarfcn);
1423 ccHelper->SetDlEarfcn(dlEarfcn);
1424 ccHelper->SetDlBandwidth(dlbw);
1425 ccHelper->SetUlBandwidth(ulbw);
1426 m_componentCarrierPhyParams = ccHelper->EquallySpacedCcs();
1427 m_componentCarrierPhyParams.at(0).SetAsPrimary(true);
1428}
1429
1430void
1432{
1433 NS_LOG_FUNCTION(this);
1434 for (auto i = ueDevices.Begin(); i != ueDevices.End(); ++i)
1435 {
1436 ActivateDataRadioBearer(*i, bearer);
1437 }
1438}
1439
1440void
1442{
1446 // Model directory
1447 LogComponentEnable("A2A4RsrqHandoverAlgorithm", LOG_LEVEL_ALL);
1448 LogComponentEnable("A3RsrpHandoverAlgorithm", LOG_LEVEL_ALL);
1449 LogComponentEnable("Asn1Header", LOG_LEVEL_ALL);
1450 LogComponentEnable("ComponentCarrier", LOG_LEVEL_ALL);
1451 LogComponentEnable("ComponentCarrierEnb", LOG_LEVEL_ALL);
1452 LogComponentEnable("ComponentCarrierUe", LOG_LEVEL_ALL);
1453 LogComponentEnable("CqaFfMacScheduler", LOG_LEVEL_ALL);
1454 LogComponentEnable("EpcEnbApplication", LOG_LEVEL_ALL);
1455 LogComponentEnable("EpcMmeApplication", LOG_LEVEL_ALL);
1456 LogComponentEnable("EpcPgwApplication", LOG_LEVEL_ALL);
1457 LogComponentEnable("EpcSgwApplication", LOG_LEVEL_ALL);
1459 LogComponentEnable("EpcTftClassifier", LOG_LEVEL_ALL);
1460 LogComponentEnable("EpcUeNas", LOG_LEVEL_ALL);
1462 LogComponentEnable("EpcX2Header", LOG_LEVEL_ALL);
1463 LogComponentEnable("FdBetFfMacScheduler", LOG_LEVEL_ALL);
1464 LogComponentEnable("FdMtFfMacScheduler", LOG_LEVEL_ALL);
1465 LogComponentEnable("FdTbfqFfMacScheduler", LOG_LEVEL_ALL);
1466 LogComponentEnable("FfMacScheduler", LOG_LEVEL_ALL);
1467 LogComponentEnable("GtpuHeader", LOG_LEVEL_ALL);
1470 LogComponentEnable("LteChunkProcessor", LOG_LEVEL_ALL);
1471 LogComponentEnable("LteCommon", LOG_LEVEL_ALL);
1472 LogComponentEnable("LteControlMessage", LOG_LEVEL_ALL);
1473 LogComponentEnable("LteEnbComponentCarrierManager", LOG_LEVEL_ALL);
1474 LogComponentEnable("LteEnbMac", LOG_LEVEL_ALL);
1475 LogComponentEnable("LteEnbNetDevice", LOG_LEVEL_ALL);
1476 LogComponentEnable("LteEnbPhy", LOG_LEVEL_ALL);
1477 LogComponentEnable("LteEnbRrc", LOG_LEVEL_ALL);
1478 LogComponentEnable("LteFfrAlgorithm", LOG_LEVEL_ALL);
1479 LogComponentEnable("LteFfrDistributedAlgorithm", LOG_LEVEL_ALL);
1480 LogComponentEnable("LteFfrEnhancedAlgorithm", LOG_LEVEL_ALL);
1481 LogComponentEnable("LteFfrSoftAlgorithm", LOG_LEVEL_ALL);
1482 LogComponentEnable("LteFrHardAlgorithm", LOG_LEVEL_ALL);
1483 LogComponentEnable("LteFrNoOpAlgorithm", LOG_LEVEL_ALL);
1484 LogComponentEnable("LteFrSoftAlgorithm", LOG_LEVEL_ALL);
1485 LogComponentEnable("LteFrStrictAlgorithm", LOG_LEVEL_ALL);
1486 LogComponentEnable("LteHandoverAlgorithm", LOG_LEVEL_ALL);
1487 LogComponentEnable("LteHarqPhy", LOG_LEVEL_ALL);
1488 LogComponentEnable("LteInterference", LOG_LEVEL_ALL);
1489 LogComponentEnable("LteMiErrorModel", LOG_LEVEL_ALL);
1490 LogComponentEnable("LteNetDevice", LOG_LEVEL_ALL);
1492 LogComponentEnable("LtePdcpHeader", LOG_LEVEL_ALL);
1495 LogComponentEnable("LteRlcAm", LOG_LEVEL_ALL);
1496 LogComponentEnable("LteRlcAmHeader", LOG_LEVEL_ALL);
1497 LogComponentEnable("LteRlcHeader", LOG_LEVEL_ALL);
1498 LogComponentEnable("LteRlcTm", LOG_LEVEL_ALL);
1499 LogComponentEnable("LteRlcUm", LOG_LEVEL_ALL);
1500 LogComponentEnable("LteRrcProtocolIdeal", LOG_LEVEL_ALL);
1501 LogComponentEnable("LteRrcProtocolReal", LOG_LEVEL_ALL);
1502 LogComponentEnable("LteSpectrumPhy", LOG_LEVEL_ALL);
1503 LogComponentEnable("LteSpectrumSignalParameters", LOG_LEVEL_ALL);
1504 LogComponentEnable("LteSpectrumValueHelper", LOG_LEVEL_ALL);
1505 LogComponentEnable("LteUeComponentCarrierManager", LOG_LEVEL_ALL);
1506 LogComponentEnable("LteUeMac", LOG_LEVEL_ALL);
1507 LogComponentEnable("LteUeNetDevice", LOG_LEVEL_ALL);
1508 LogComponentEnable("LteUePhy", LOG_LEVEL_ALL);
1509 LogComponentEnable("LteUePowerControl", LOG_LEVEL_ALL);
1510 LogComponentEnable("LteUeRrc", LOG_LEVEL_ALL);
1511 LogComponentEnable("LteVendorSpecificParameters", LOG_LEVEL_ALL);
1512 LogComponentEnable("NoOpComponentCarrierManager", LOG_LEVEL_ALL);
1513 LogComponentEnable("NoOpHandoverAlgorithm", LOG_LEVEL_ALL);
1514 LogComponentEnable("PfFfMacScheduler", LOG_LEVEL_ALL);
1515 LogComponentEnable("PssFfMacScheduler", LOG_LEVEL_ALL);
1516 LogComponentEnable("RemSpectrumPhy", LOG_LEVEL_ALL);
1517 LogComponentEnable("RrcHeader", LOG_LEVEL_ALL);
1518 LogComponentEnable("RrFfMacScheduler", LOG_LEVEL_ALL);
1519 LogComponentEnable("SimpleUeComponentCarrierManager", LOG_LEVEL_ALL);
1520 LogComponentEnable("TdBetFfMacScheduler", LOG_LEVEL_ALL);
1521 LogComponentEnable("TdMtFfMacScheduler", LOG_LEVEL_ALL);
1522 LogComponentEnable("TdTbfqFfMacScheduler", LOG_LEVEL_ALL);
1523 LogComponentEnable("TraceFadingLossModel", LOG_LEVEL_ALL);
1524 LogComponentEnable("TtaFfMacScheduler", LOG_LEVEL_ALL);
1525 // Helper directory
1526 LogComponentEnable("CcHelper", LOG_LEVEL_ALL);
1527 LogComponentEnable("EmuEpcHelper", LOG_LEVEL_ALL);
1528 LogComponentEnable("EpcHelper", LOG_LEVEL_ALL);
1529 LogComponentEnable("LteGlobalPathlossDatabase", LOG_LEVEL_ALL);
1530 LogComponentEnable("LteHelper", LOG_LEVEL_ALL);
1531 LogComponentEnable("LteHexGridEnbTopologyHelper", LOG_LEVEL_ALL);
1532 LogComponentEnable("LteStatsCalculator", LOG_LEVEL_ALL);
1533 LogComponentEnable("MacStatsCalculator", LOG_LEVEL_ALL);
1534 LogComponentEnable("PhyRxStatsCalculator", LOG_LEVEL_ALL);
1535 LogComponentEnable("PhyStatsCalculator", LOG_LEVEL_ALL);
1536 LogComponentEnable("PhyTxStatsCalculator", LOG_LEVEL_ALL);
1537 LogComponentEnable("PointToPointEpcHelper", LOG_LEVEL_ALL);
1538 LogComponentEnable("RadioBearerStatsCalculator", LOG_LEVEL_ALL);
1539 LogComponentEnable("RadioBearerStatsConnector", LOG_LEVEL_ALL);
1540 LogComponentEnable("RadioEnvironmentMapHelper", LOG_LEVEL_ALL);
1541}
1542
1543void
1551
1552void
1554{
1556 "please make sure that LteHelper::EnableRlcTraces is called at most once");
1559}
1560
1561int64_t
1562LteHelper::AssignStreams(NetDeviceContainer c, int64_t stream, bool assignEpcStreams)
1563{
1564 NS_LOG_FUNCTION(this << stream << assignEpcStreams);
1565 int64_t currentStream = stream;
1567 {
1569 if (tflm)
1570 {
1571 currentStream += tflm->AssignStreams(currentStream);
1573 }
1574 }
1575 Ptr<NetDevice> netDevice;
1576 for (auto i = c.Begin(); i != c.End(); ++i)
1577 {
1578 netDevice = (*i);
1580 if (lteEnb)
1581 {
1582 std::map<uint8_t, Ptr<ComponentCarrierBaseStation>> tmpMap = lteEnb->GetCcMap();
1583 auto it = tmpMap.begin();
1584 Ptr<LteSpectrumPhy> dlPhy =
1585 DynamicCast<ComponentCarrierEnb>(it->second)->GetPhy()->GetDownlinkSpectrumPhy();
1586 Ptr<LteSpectrumPhy> ulPhy =
1587 DynamicCast<ComponentCarrierEnb>(it->second)->GetPhy()->GetUplinkSpectrumPhy();
1588 currentStream += dlPhy->AssignStreams(currentStream);
1589 currentStream += ulPhy->AssignStreams(currentStream);
1590 }
1592 if (lteUe)
1593 {
1594 std::map<uint8_t, Ptr<ComponentCarrierUe>> tmpMap = lteUe->GetCcMap();
1595 auto it = tmpMap.begin();
1596 Ptr<LteSpectrumPhy> dlPhy = it->second->GetPhy()->GetDownlinkSpectrumPhy();
1597 Ptr<LteSpectrumPhy> ulPhy = it->second->GetPhy()->GetUplinkSpectrumPhy();
1598 Ptr<LteUeMac> ueMac = lteUe->GetMac();
1599 currentStream += dlPhy->AssignStreams(currentStream);
1600 currentStream += ulPhy->AssignStreams(currentStream);
1601 currentStream += ueMac->AssignStreams(currentStream);
1602 }
1603 }
1604 if (m_epcHelper && assignEpcStreams)
1605 {
1606 currentStream += m_epcHelper->AssignStreams(currentStream);
1607 }
1608 return (currentStream - stream);
1609}
1610
1611void
1621
1622void
1624{
1626 "/NodeList/*/DeviceList/*/ComponentCarrierMap/*/LteEnbPhy/DlPhyTransmission",
1628}
1629
1630void
1632{
1634 "/NodeList/*/DeviceList/*/ComponentCarrierMapUe/*/LteUePhy/UlPhyTransmission",
1636}
1637
1638void
1640{
1642 "/NodeList/*/DeviceList/*/ComponentCarrierMapUe/*/LteUePhy/DlSpectrumPhy/DlPhyReception",
1644}
1645
1646void
1648{
1650 "/NodeList/*/DeviceList/*/ComponentCarrierMap/*/LteEnbPhy/UlSpectrumPhy/UlPhyReception",
1652}
1653
1654void
1660
1661void
1663{
1665 Config::Connect("/NodeList/*/DeviceList/*/ComponentCarrierMap/*/LteEnbMac/DlScheduling",
1667}
1668
1669void
1671{
1673 Config::Connect("/NodeList/*/DeviceList/*/ComponentCarrierMap/*/LteEnbMac/UlScheduling",
1675}
1676
1677void
1679{
1682 "/NodeList/*/DeviceList/*/ComponentCarrierMapUe/*/LteUePhy/ReportCurrentCellRsrpSinr",
1684}
1685
1686void
1688{
1690 Config::Connect("/NodeList/*/DeviceList/*/ComponentCarrierMap/*/LteEnbPhy/ReportUeSinr",
1692 Config::Connect("/NodeList/*/DeviceList/*/ComponentCarrierMap/*/LteEnbPhy/ReportInterference",
1694}
1695
1698{
1699 return m_rlcStats;
1700}
1701
1702void
1704{
1706 "please make sure that LteHelper::EnablePdcpTraces is called at most once");
1709}
1710
1713{
1714 return m_pdcpStats;
1715}
1716
1717} // namespace ns3
uint32_t v
interface for antenna radiation pattern models
Hold a value for an Attribute.
Definition attribute.h:59
AttributeValue implementation for Boolean.
Definition boolean.h:26
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition double.h:31
EpsBearer m_bearer
Configuration of bearer which will be activated.
uint64_t m_imsi
imsi the unique UE identifier
DrbActivator(Ptr< NetDevice > ueDevice, EpsBearer bearer)
DrbActivator Constructor.
static void ActivateCallback(std::shared_ptr< DrbActivator > a, std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
Function hooked to the Enb RRC Connection Established trace source Fired upon successful RRC connecti...
Ptr< NetDevice > m_ueDevice
UeNetDevice for which bearer will be activated.
void ActivateDrb(uint64_t imsi, uint16_t cellId, uint16_t rnti)
Procedure firstly checks if bearer was not activated, if IMSI from trace source equals configured one...
bool m_active
Bearer can be activated only once.
Hold variables of type enum.
Definition enum.h:52
T Get() const
Definition enum.h:87
This application is installed inside eNBs and provides the bridge functionality for user data plane p...
static Ptr< EpcTft > Default()
creates a TFT matching any traffic
Definition epc-tft.cc:218
This entity is installed inside an eNB and provides the functionality for the X2 interface.
Definition epc-x2.h:88
This class contains the specification of EPS Bearers.
Definition eps-bearer.h:80
@ NGBR_VIDEO_TCP_DEFAULT
Non-GBR TCP-based Video (Buffered Streaming, e.g., www, e-mail...).
Definition eps-bearer.h:115
This abstract base class identifies the interface by means of which the helper object can plug on the...
static TypeId GetTypeId()
Get the type ID.
static TypeId GetTypeId()
Get the type ID.
The class implements Component Carrier Manager (CCM) that operates using the Component Carrier Manage...
The eNodeB device implementation.
static TypeId GetTypeId()
Get the type ID.
virtual void ReportUlHarqFeedback(UlInfoListElement_s mes)
Report the uplink HARQ feedback generated by LteSpectrumPhy to MAC.
void GenerateCtrlCqiReport(const SpectrumValue &sinr) override
generate a CQI report based on the given SINR of Ctrl frame
void GenerateDataCqiReport(const SpectrumValue &sinr) override
generate a CQI report based on the given SINR of Data frame (used for PUSCH CQIs)
void PhyPduReceived(Ptr< Packet > p)
PhySpectrum received a new PHY-PDU.
virtual void ReceiveLteControlMessageList(std::list< Ptr< LteControlMessage > > msgList)
PhySpectrum received a new list of LteControlMessage.
void ReportInterference(const SpectrumValue &interf) override
generate a report based on the linear interference and noise power perceived during DATA frame NOTE: ...
The abstract base class of a Frequency Reuse algorithm.
The abstract base class of a handover algorithm that operates using the Handover Management SAP inter...
Creation and configuration of LTE entities.
Definition lte-helper.h:92
void SetFfrAlgorithmType(std::string type)
Set the type of FFR algorithm to be used by eNodeB devices.
Ptr< SpectrumPropagationLossModel > m_fadingModel
The fading model used in both the downlink and uplink channels.
Definition lte-helper.h:780
Ptr< Object > m_uplinkPathlossModel
The path loss model used in the uplink channel.
Definition lte-helper.h:750
void EnableLogComponents()
Enables full-blown logging for major components of the LENA architecture.
Ptr< SpectrumChannel > GetUplinkSpectrumChannel() const
void SetEnbComponentCarrierManagerType(std::string type)
Set the type of carrier component algorithm to be used by eNodeB devices.
void EnableUlRxPhyTraces()
Enable trace sinks for UL reception PHY layer.
ObjectFactory m_schedulerFactory
Factory of MAC scheduler object.
Definition lte-helper.h:753
void SetUeAntennaModelType(std::string type)
Set the type of antenna model to be used by UE devices.
ObjectFactory m_ffrAlgorithmFactory
Factory of FFR (frequency reuse) algorithm object.
Definition lte-helper.h:755
ObjectFactory m_channelFactory
Factory of both the downlink and uplink LTE channels.
Definition lte-helper.h:773
void SetEpcHelper(Ptr< EpcHelper > h)
Set the EpcHelper to be used to setup the EPC network in conjunction with the setup of the LTE radio ...
Ptr< RadioBearerStatsCalculator > GetRlcStats()
ObjectFactory m_handoverAlgorithmFactory
Factory of handover algorithm object.
Definition lte-helper.h:757
std::string m_fadingModelType
Name of fading model type, e.g., "ns3::TraceFadingLossModel".
Definition lte-helper.h:776
Ptr< EpcHelper > GetEpcHelper() const
Ptr< RadioBearerStatsCalculator > GetPdcpStats()
void EnableDlMacTraces()
Enable trace sinks for DL MAC layer.
ObjectFactory m_enbComponentCarrierManagerFactory
Factory of enb component carrier manager object.
Definition lte-helper.h:759
void SetFadingModel(std::string type)
Set the type of fading model to be used in both DL and UL.
void DoDeActivateDedicatedEpsBearer(Ptr< NetDevice > ueDevice, Ptr< NetDevice > enbDevice, uint8_t bearerId)
The actual function to trigger a manual bearer de-activation.
std::string GetEnbComponentCarrierManagerType() const
void SetSchedulerAttribute(std::string n, const AttributeValue &v)
Set an attribute for the scheduler to be created.
int64_t AssignStreams(NetDeviceContainer c, int64_t stream, bool assignEpcStreams=true)
Assign a fixed random variable stream number to the random variables used.
Ptr< SpectrumChannel > GetDownlinkSpectrumChannel() const
~LteHelper() override
Definition lte-helper.cc:94
std::map< uint8_t, ComponentCarrier > m_componentCarrierPhyParams
This contains all the information about each component carrier.
Definition lte-helper.h:850
Ptr< MacStatsCalculator > m_macStats
Container of MAC layer statistics.
Definition lte-helper.h:794
void SetHandoverAlgorithmAttribute(std::string n, const AttributeValue &v)
Set an attribute for the handover algorithm to be created.
void EnablePhyTraces()
Enable trace sinks for PHY layer.
void DeActivateDedicatedEpsBearer(Ptr< NetDevice > ueDevice, Ptr< NetDevice > enbDevice, uint8_t bearerId)
Manually trigger dedicated bearer de-activation at specific simulation time.
void HandoverRequest(Time hoTime, Ptr< NetDevice > ueDev, Ptr< NetDevice > sourceEnbDev, Ptr< NetDevice > targetEnbDev)
Manually trigger an X2-based handover.
Ptr< SpectrumChannel > m_downlinkChannel
This function create the component carrier based on provided configuration parameters.
Definition lte-helper.h:744
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
void SetUeComponentCarrierManagerAttribute(std::string n, const AttributeValue &v)
Set an attribute for the ue component carrier manager to be created.
uint16_t m_cellIdCounter
Keep track of the number of cell ID allocated.
Definition lte-helper.h:820
std::string GetFfrAlgorithmType() const
void SetHandoverAlgorithmType(std::string type)
Set the type of handover algorithm to be used by eNodeB devices.
void SetPathlossModelType(TypeId type)
Set the type of path loss model to be used for both DL and UL channels.
void EnablePdcpTraces()
Enable trace sinks for PDCP layer.
Ptr< PhyTxStatsCalculator > m_phyTxStats
Container of PHY layer statistics related to transmission.
Definition lte-helper.h:790
void SetEnbAntennaModelType(std::string type)
Set the type of antenna model to be used by eNodeB devices.
void EnableTraces()
Enables trace sinks for PHY, MAC, RLC and PDCP.
void SetFfrAlgorithmAttribute(std::string n, const AttributeValue &v)
Set an attribute for the FFR algorithm to be created.
void DoHandoverRequest(Ptr< NetDevice > ueDev, Ptr< NetDevice > sourceEnbDev, uint16_t targetCellId)
The actual function to trigger a manual handover.
bool m_isAnrEnabled
The AnrEnabled attribute.
Definition lte-helper.h:831
void SetEnbComponentCarrierManagerAttribute(std::string n, const AttributeValue &v)
Set an attribute for the enb component carrier manager to be created.
void DoInitialize() override
Initialize() implementation.
Definition lte-helper.cc:83
Ptr< PhyRxStatsCalculator > m_phyRxStats
Container of PHY layer statistics related to reception.
Definition lte-helper.h:792
void SetSpectrumChannelType(std::string type)
Set the type of spectrum channel to be used in both DL and UL.
void EnableDlRxPhyTraces()
Enable trace sinks for DL reception PHY layer.
ObjectFactory m_pathlossModelFactory
Factory of path loss model object.
Definition lte-helper.h:771
bool m_fadingStreamsAssigned
True if a random variable stream number has been assigned for the fading model.
Definition lte-helper.h:785
std::string GetUeComponentCarrierManagerType() const
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
RadioBearerStatsConnector m_radioBearerStatsConnector
Connects RLC and PDCP statistics containers to appropriate trace sources.
Definition lte-helper.h:800
void Attach(NetDeviceContainer ueDevices)
Enables automatic attachment of a set of UE devices to a suitable cell using Idle mode initial cell s...
void DoDispose() override
Destructor implementation.
ObjectFactory m_enbNetDeviceFactory
Factory of LteEnbNetDevice objects.
Definition lte-helper.h:763
void EnableUlMacTraces()
Enable trace sinks for UL MAC layer.
std::string GetHandoverAlgorithmType() const
Ptr< PhyStatsCalculator > m_phyStats
Container of PHY layer statistics.
Definition lte-helper.h:788
void EnableUlPhyTraces()
Enable trace sinks for UL PHY layer.
void EnableDlTxPhyTraces()
Enable trace sinks for DL transmission PHY layer.
void SetPathlossModelAttribute(std::string n, const AttributeValue &v)
Set an attribute for the path loss models to be created.
void EnableRlcTraces()
Enable trace sinks for RLC layer.
bool m_useIdealRrc
The UseIdealRrc attribute.
Definition lte-helper.h:826
ObjectFactory m_ueComponentCarrierManagerFactory
Factory of ue component carrier manager object.
Definition lte-helper.h:761
void DoComponentCarrierConfigure(uint32_t ulEarfcn, uint32_t dlEarfcn, uint16_t ulbw, uint16_t dlbw)
Configure the component carriers.
Ptr< Object > m_downlinkPathlossModel
The path loss model used in the downlink channel.
Definition lte-helper.h:748
Ptr< RadioBearerStatsCalculator > m_pdcpStats
Container of PDCP layer statistics.
Definition lte-helper.h:798
void ChannelModelInitialization()
Function that performs a channel model initialization of all component carriers.
void EnableUlTxPhyTraces()
Enable trace sinks for UL transmission PHY layer.
bool m_usePdschForCqiGeneration
The UsePdschForCqiGeneration attribute.
Definition lte-helper.h:837
void SetUeAntennaModelAttribute(std::string n, const AttributeValue &v)
Set an attribute for the UE antenna model to be created.
void SetEnbAntennaModelAttribute(std::string n, const AttributeValue &v)
Set an attribute for the eNodeB antenna model to be created.
static TypeId GetTypeId()
Register this type.
void SetEnbDeviceAttribute(std::string n, const AttributeValue &v)
Set an attribute for the eNodeB devices (LteEnbNetDevice) to be created.
bool m_useCa
The UseCa attribute.
Definition lte-helper.h:845
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
uint64_t m_imsiCounter
Keep track of the number of IMSI allocated.
Definition lte-helper.h:814
ObjectFactory m_ueNetDeviceFactory
Factory for LteUeNetDevice objects.
Definition lte-helper.h:767
ObjectFactory m_ueAntennaModelFactory
Factory of antenna object for UE.
Definition lte-helper.h:769
Ptr< SpectrumChannel > m_uplinkChannel
The uplink LTE channel used in the simulation.
Definition lte-helper.h:746
void EnableMacTraces()
Enable trace sinks for MAC layer.
void SetSpectrumChannelAttribute(std::string n, const AttributeValue &v)
Set an attribute for the spectrum channel to be created (both DL and UL).
void EnableDlPhyTraces()
Enable trace sinks for DL PHY layer.
void AddX2Interface(NodeContainer enbNodes)
Create an X2 interface between all the eNBs in a given set.
void SetUeDeviceAttribute(std::string n, const AttributeValue &v)
Set an attribute for the UE devices (LteUeNetDevice) to be created.
uint16_t m_noOfCcs
Number of component carriers that will be installed by default at eNodeB and UE devices.
Definition lte-helper.h:855
void SetFadingModelAttribute(std::string n, const AttributeValue &v)
Set an attribute for the fading model to be created (both DL and UL).
Ptr< EpcHelper > m_epcHelper
Helper which provides implementation of core network.
Definition lte-helper.h:807
void AttachToClosestEnb(NetDeviceContainer ueDevices, NetDeviceContainer enbDevices)
Manual attachment of a set of UE devices to the network via the closest eNodeB (with respect to dista...
uint8_t ActivateDedicatedEpsBearer(NetDeviceContainer ueDevices, EpsBearer bearer, Ptr< EpcTft > tft)
Activate a dedicated EPS bearer on a given set of UE devices.
ObjectFactory m_enbAntennaModelFactory
Factory of antenna object for eNodeB.
Definition lte-helper.h:765
Ptr< RadioBearerStatsCalculator > m_rlcStats
Container of RLC layer statistics.
Definition lte-helper.h:796
std::string GetSchedulerType() const
Ptr< NetDevice > InstallSingleUeDevice(Ptr< Node > n)
Create a UE device (LteUeNetDevice) on the given node.
Ptr< NetDevice > InstallSingleEnbDevice(Ptr< Node > n)
Create an eNodeB device (LteEnbNetDevice) on the given node.
void SetUeComponentCarrierManagerType(std::string type)
Set the type of Component Carrier Manager to be used by Ue devices.
ObjectFactory m_fadingModelFactory
Factory of fading model object for both the downlink and uplink channels.
Definition lte-helper.h:778
void Receive(Ptr< Packet > p)
receive a packet from the lower layers in order to forward it to the upper layers
void UpdateSinrPerceived(const SpectrumValue &sinr)
static double GetCarrierFrequency(uint32_t earfcn)
Calculates the carrier frequency from the E-UTRA Absolute Radio Frequency Channel Number (EARFCN) acc...
The abstract base class of a Component Carrier Manager* for UE that operates using the component carr...
The LteUeNetDevice class implements the UE net device.
static TypeId GetTypeId()
Get the type ID.
virtual void ReportDataInterference(const SpectrumValue &interf)
Create the mixed CQI report.
virtual void ReceivePss(uint16_t cellId, Ptr< SpectrumValue > p)
Receive PSS function.
void ReportRsReceivedPower(const SpectrumValue &power) override
generate a report based on the linear RS power perceived during CTRL frame NOTE: used only by UE for ...
virtual void ReceiveLteControlMessageList(std::list< Ptr< LteControlMessage > > msgList)
Receive LTE control message list function.
void GenerateCtrlCqiReport(const SpectrumValue &sinr) override
generate a CQI report based on the given SINR of Ctrl frame
void PhyPduReceived(Ptr< Packet > p)
PhySpectrum received a new PHY-PDU.
virtual void EnqueueDlHarqFeedback(DlInfoListElement_s mes)
Enqueue the downlink HARQ feedback generated by LteSpectrumPhy.
void ReportInterference(const SpectrumValue &interf) override
generate a report based on the linear interference and noise power perceived during DATA frame NOTE: ...
virtual void GenerateMixedCqiReport(const SpectrumValue &sinr)
Create the mixed CQI report.
static Mac64Address Allocate()
Allocate a new Mac64Address.
static void DlSchedulingCallback(Ptr< MacStatsCalculator > macStats, std::string path, DlSchedulingCallbackInfo dlSchedulingCallbackInfo)
Trace sink for the ns3::LteEnbMac::DlScheduling trace source.
static void UlSchedulingCallback(Ptr< MacStatsCalculator > macStats, std::string path, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcs, uint16_t size, uint8_t componentCarrierId)
Trace sink for the ns3::LteEnbMac::UlScheduling trace source.
Keep track of the current position and velocity of an object.
static TypeId GetTypeId()
Get the type ID.
holds a vector of ns3::NetDevice pointers
uint32_t GetN() const
Get the number of Ptr<NetDevice> stored in this container.
Iterator Begin() const
Get an iterator which refers to the first NetDevice in the container.
Iterator End() const
Get an iterator which indicates past-the-last NetDevice in the container.
keep track of a set of node pointers.
Iterator End() const
Get an iterator which indicates past-the-last Node in the container.
Iterator Begin() const
Get an iterator which refers to the first Node in the container.
void Initialize()
Invoke DoInitialize on all Objects aggregated to this one.
Definition object.cc:200
friend class ObjectFactory
Friends.
Definition object.h:364
virtual void DoInitialize()
Initialize() implementation.
Definition object.cc:437
Object()
Caller graph was not generated because of its size.
Definition object.cc:93
virtual void DoDispose()
Destructor implementation.
Definition object.cc:430
static void UlPhyReceptionCallback(Ptr< PhyRxStatsCalculator > phyRxStats, std::string path, PhyReceptionStatParameters params)
trace sink
static void DlPhyReceptionCallback(Ptr< PhyRxStatsCalculator > phyRxStats, std::string path, PhyReceptionStatParameters params)
trace sink
void ReportUeSinr(uint16_t cellId, uint64_t imsi, uint16_t rnti, double sinrLinear, uint8_t componentCarrierId)
Notifies the stats calculator that an UE SINR report has occurred.
void ReportInterference(uint16_t cellId, Ptr< SpectrumValue > interference)
Notifies the stats calculator that an interference report has occurred.
static void ReportCurrentCellRsrpSinrCallback(Ptr< PhyStatsCalculator > phyStats, std::string path, uint16_t cellId, uint16_t rnti, double rsrp, double sinr, uint8_t componentCarrierId)
trace sink
static void DlPhyTransmissionCallback(Ptr< PhyTxStatsCalculator > phyTxStats, std::string path, PhyTransmissionStatParameters params)
trace sink
static void UlPhyTransmissionCallback(Ptr< PhyTxStatsCalculator > phyTxStats, std::string path, PhyTransmissionStatParameters params)
trace sink
AttributeValue implementation for Pointer.
Definition pointer.h:37
Models the propagation loss through a transmission medium.
Smart pointer class similar to boost::intrusive_ptr.
Definition ptr.h:70
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition simulator.h:580
Defines the interface for spectrum-aware channel implementations.
spectrum-aware propagation loss model
Hold variables of type string.
Definition string.h:45
Simulation virtual time values and global simulation resolution.
Definition nstime.h:95
fading loss model based on precalculated fading traces
a unique identifier for an interface.
Definition type-id.h:50
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition type-id.cc:999
AttributeValue implementation for TypeId.
Definition type-id.h:649
@ CONNECTION_RECONFIGURATION
Definition lte-enb-rrc.h:73
Hold an unsigned integer type.
Definition uinteger.h:34
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition assert.h:55
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition assert.h:75
Ptr< const AttributeChecker > MakeBooleanChecker()
Definition boolean.cc:113
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:70
Ptr< const AttributeChecker > MakeStringChecker()
Definition string.cc:19
Ptr< const AttributeAccessor > MakeStringAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Definition string.h:46
Ptr< const AttributeChecker > MakeTypeIdChecker()
Definition type-id.cc:1333
Ptr< const AttributeAccessor > MakeTypeIdAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Definition type-id.h:649
Ptr< const AttributeChecker > MakeUintegerChecker()
Definition uinteger.h:85
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:35
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition callback.h:690
void Connect(std::string path, const CallbackBase &cb)
Definition config.cc:970
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition abort.h:97
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:194
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition log.h:260
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition log.h:274
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Definition log.h:253
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition log.h:267
auto MakeBoundCallback(R(*fnPtr)(Args...), BArgs &&... bargs)
Make Callbacks with varying number of bound arguments.
Definition callback.h:753
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Definition object.h:627
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition object-base.h:35
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Definition ptr.h:454
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void LogComponentEnable(const std::string &name, LogLevel level)
Enable the logging output associated with that log component.
Definition log.cc:279
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.
Definition ptr.h:605
constexpr uint32_t MIN_NO_CC
Minimum number of carrier components allowed by 3GPP up to R13.
Definition lte-common.h:25
constexpr uint32_t MAX_NO_CC
Maximum number of carrier components allowed by 3GPP up to R13.
Definition lte-common.h:28
@ LOG_LEVEL_ALL
Print everything.
Definition log.h:108
@ LOG_PREFIX_FUNC
Prefix all trace prints with function.
Definition log.h:110
@ LOG_PREFIX_TIME
Prefix all trace prints with simulation time.
Definition log.h:111
@ LOG_PREFIX_NODE
Prefix all trace prints with simulation node.
Definition log.h:112
double CalculateDistance(const Vector3D &a, const Vector3D &b)
Definition vector.cc:96
void LogComponentEnableAll(LogLevel level)
Enable the logging output for all registered log components.
Definition log.cc:297
Parameters passed to DataRadioBearerSetupRequest ().