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)
112 uint8_t numberOfComponentCarriers,
113 uint8_t sourceComponentCarrier,
114 uint8_t targetComponentCarrier)
116 m_isIdealRrc{isIdealRrc},
118 m_numberOfComponentCarriers{numberOfComponentCarriers},
119 m_sourceComponentCarrier{sourceComponentCarrier},
120 m_targetComponentCarrier{targetComponentCarrier}
144 auto lteHelper = CreateObject<LteHelper>();
145 lteHelper->SetAttribute(
"PathlossModel",
148 lteHelper->SetAttribute(
"NumberOfComponentCarriers",
151 auto epcHelper = CreateObject<PointToPointEpcHelper>();
152 lteHelper->SetEpcHelper(epcHelper);
157 auto ueNode = CreateObject<Node>();
160 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
161 mobility.Install(enbNodes);
162 mobility.Install(ueNode);
165 auto enbDevs = lteHelper->InstallEnbDevice(enbNodes);
166 auto ueDev = DynamicCast<LteUeNetDevice>(lteHelper->InstallUeDevice(ueNode).Get(0));
168 auto sourceEnbDev = DynamicCast<LteEnbNetDevice>(
170 auto targetEnbDev = DynamicCast<LteEnbNetDevice>(
175 internet.Install(ueNode);
178 std::map<uint8_t, Ptr<ComponentCarrierUe>> ueCcMap = ueDev->GetCcMap();
188 "/NodeList/*/DeviceList/*/LteUeRrc/ConnectionEstablished",
191 uint16_t targetCellId = targetEnbDev->GetCcMap()
195 lteHelper->AddX2Interface(enbNodes);
196 lteHelper->HandoverRequest(
Seconds(1.0), ueDev, sourceEnbDev, targetCellId);
202 uint16_t expectedCellId = targetCellId;
203 uint16_t actualCellId = ueDev->GetRrc()->GetCellId();
206 "IMSI " << ueDev->GetImsi() <<
" has attached to an unexpected cell");
210 "UE " << ueDev->GetImsi() <<
" is not at CONNECTED_NORMALLY state");
224 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.
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.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
static void Run()
Run the simulation.
static void Stop()
Tell the Simulator the calling event should be the last one executed.
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 ",...
static LtePrimaryCellChangeTestSuite g_ltePrimaryCellChangeTestSuite
Static variable for test initialization.
#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.
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...