23#include <ns3/boolean.h>
24#include <ns3/double.h>
25#include <ns3/friis-spectrum-propagation-loss.h>
26#include <ns3/integer.h>
27#include <ns3/internet-stack-helper.h>
28#include <ns3/ipv4-address-helper.h>
29#include <ns3/ipv4-interface-container.h>
30#include <ns3/ipv4-static-routing-helper.h>
32#include <ns3/lte-enb-net-device.h>
33#include <ns3/lte-helper.h>
34#include <ns3/lte-ue-net-device.h>
35#include <ns3/lte-ue-rrc.h>
36#include <ns3/mobility-helper.h>
37#include <ns3/net-device-container.h>
38#include <ns3/node-container.h>
39#include <ns3/point-to-point-epc-helper.h>
40#include <ns3/point-to-point-helper.h>
41#include <ns3/simulator.h>
52 :
TestSuite(
"lte-primary-cell-change", SYSTEM)
108 uint8_t numberOfComponentCarriers,
109 uint8_t sourceComponentCarrier,
110 uint8_t targetComponentCarrier)
112 m_isIdealRrc{isIdealRrc},
114 m_numberOfComponentCarriers{numberOfComponentCarriers},
115 m_sourceComponentCarrier{sourceComponentCarrier},
116 m_targetComponentCarrier{targetComponentCarrier}
140 auto lteHelper = CreateObject<LteHelper>();
141 lteHelper->SetAttribute(
"PathlossModel",
144 lteHelper->SetAttribute(
"NumberOfComponentCarriers",
147 auto epcHelper = CreateObject<PointToPointEpcHelper>();
148 lteHelper->SetEpcHelper(epcHelper);
153 auto ueNode = CreateObject<Node>();
156 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
161 auto enbDevs = lteHelper->InstallEnbDevice(enbNodes);
162 auto ueDev = DynamicCast<LteUeNetDevice>(lteHelper->InstallUeDevice(ueNode).Get(0));
164 auto sourceEnbDev = DynamicCast<LteEnbNetDevice>(
166 auto targetEnbDev = DynamicCast<LteEnbNetDevice>(
174 std::map<uint8_t, Ptr<ComponentCarrierUe>> ueCcMap = ueDev->GetCcMap();
184 "/NodeList/*/DeviceList/*/LteUeRrc/ConnectionEstablished",
187 uint16_t targetCellId = targetEnbDev->GetCcMap()
191 lteHelper->AddX2Interface(enbNodes);
192 lteHelper->HandoverRequest(
Seconds(1.0), ueDev, sourceEnbDev, targetCellId);
198 uint16_t expectedCellId = targetCellId;
199 uint16_t actualCellId = ueDev->GetRrc()->GetCellId();
202 "IMSI " << ueDev->GetImsi() <<
" has attached to an unexpected cell");
205 LteUeRrc::CONNECTED_NORMALLY,
206 "UE " << ueDev->GetImsi() <<
" is not at CONNECTED_NORMALLY state");
209 Simulator::Destroy();
220 NS_LOG_FUNCTION(
this << imsi << cellId << rnti << oldState << newState);
Testing the handover procedure with multiple component carriers.
LtePrimaryCellChangeTestCase(std::string name, bool isIdealRrc, int64_t rngRun, uint8_t numberOfComponentCarriers, uint8_t sourceComponentCarrier, uint8_t targetComponentCarrier)
Creates an instance of the initial cell selection test case.
void StateTransitionCallback(std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti, LteUeRrc::State oldState, LteUeRrc::State newState)
State transition callback function.
uint8_t m_sourceComponentCarrier
source primary component carrier
void DoRun() override
Setup the simulation according to the configuration set by the class constructor, run it,...
~LtePrimaryCellChangeTestCase() override
void ConnectionEstablishedCallback(std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
Connection established callback function.
std::map< uint64_t, LteUeRrc::State > m_lastState
The current UE RRC state.
uint8_t m_targetComponentCarrier
target primary component carrier
bool m_isIdealRrc
whether the LTE is configured to use ideal RRC
uint8_t m_numberOfComponentCarriers
number of component carriers
Test suite for executing the primary cell change test cases.
LtePrimaryCellChangeTestSuite()
AttributeValue implementation for Boolean.
static TypeId GetTypeId()
Get the type ID.
aggregate IP/TCP/UDP functionality to existing Nodes.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
State
The states of the UE RRC entity.
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
std::string GetName() const
AttributeValue implementation for TypeId.
Hold an unsigned integer type.
void SetGlobal(std::string name, const AttributeValue &value)
void SetDefault(std::string name, const AttributeValue &value)
void Connect(std::string path, const CallbackBase &cb)
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Time Seconds(double value)
Construct a Time in the indicated unit.
static LtePrimaryCellChangeTestSuite g_ltePrimaryCellChangeTestSuite
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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...