24 #include <ns3/boolean.h>
25 #include <ns3/double.h>
26 #include <ns3/integer.h>
28 #include <ns3/simulator.h>
30 #include <ns3/internet-stack-helper.h>
31 #include <ns3/ipv4-address-helper.h>
32 #include <ns3/ipv4-interface-container.h>
33 #include <ns3/friis-spectrum-propagation-loss.h>
34 #include <ns3/ipv4-static-routing-helper.h>
35 #include <ns3/lte-enb-net-device.h>
36 #include <ns3/lte-helper.h>
37 #include <ns3/lte-ue-net-device.h>
38 #include <ns3/lte-ue-rrc.h>
39 #include <ns3/mobility-helper.h>
40 #include <ns3/net-device-container.h>
41 #include <ns3/node-container.h>
42 #include <ns3/point-to-point-epc-helper.h>
43 #include <ns3/point-to-point-helper.h>
54 :
TestSuite (
"lte-secondary-cell-selection", SYSTEM)
75 std::string name,
bool isIdealRrc, uint64_t rngRun, uint8_t numberOfComponentCarriers)
77 m_isIdealRrc (isIdealRrc),
79 m_numberOfComponentCarriers (numberOfComponentCarriers)
98 auto lteHelper = CreateObject<LteHelper> ();
103 auto epcHelper = CreateObject<PointToPointEpcHelper> ();
104 lteHelper->SetEpcHelper (epcHelper);
107 auto enbNode = CreateObject<Node> ();
112 mobility.SetMobilityModel (
"ns3::ConstantPositionMobilityModel");
117 auto enbDev = DynamicCast<LteEnbNetDevice> (lteHelper->InstallEnbDevice (enbNode).Get (0));
118 auto ueDevs = lteHelper->InstallUeDevice (ueNodes);
123 epcHelper->AssignUeIpv4Address (ueDevs);
125 auto ueDev = DynamicCast<LteUeNetDevice> (ueDevs.Get (0));
126 std::map< uint8_t, Ptr<ComponentCarrierUe> > ueCcMap = ueDev->GetCcMap ();
127 for (
auto it: ueCcMap)
129 NS_LOG_DEBUG (
"Assign DL EARFCN " << it.second->GetDlEarfcn() <<
" to UE " << ueDevs.Get (it.first)->GetNode ()->GetId ());
130 DynamicCast<LteUeNetDevice> (ueDevs.Get (it.first))->SetDlEarfcn (it.second->GetDlEarfcn());
134 lteHelper->Attach (ueDevs);
140 Config::Connect (
"/NodeList/*/DeviceList/*/LteUeRrc/ConnectionEstablished",
145 Simulator::Stop (
Seconds (2.0));
148 for (
auto &it: enbDev->GetCcMap ())
150 ueDev = DynamicCast<LteUeNetDevice> (ueDevs.Get (it.first));
151 uint16_t expectedCellId = it.second->GetCellId ();
152 uint16_t actualCellId = ueDev->GetRrc ()->GetCellId ();
153 NS_LOG_DEBUG (
"RNTI " << ueDev->GetRrc ()->GetRnti () <<
" attached to cell ID: " << actualCellId);
154 NS_TEST_ASSERT_MSG_EQ (expectedCellId, actualCellId,
"IMSI " << ueDev->GetImsi () <<
" has attached to an unexpected cell");
157 LteUeRrc::CONNECTED_NORMALLY,
158 "UE " << ueDev->GetImsi ()
159 <<
" is not at CONNECTED_NORMALLY state");
163 Simulator::Destroy ();
169 std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti,
179 std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
Testing the initial cell selection procedure by UE at IDLE state in the beginning of simulation with ...
void StateTransitionCallback(std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti, LteUeRrc::State oldState, LteUeRrc::State newState)
State transition callback function.
bool m_isIdealRrc
whether the LTE is configured to use ideal RRC
uint8_t m_numberOfComponentCarriers
number of component carriers
std::map< uint64_t, LteUeRrc::State > m_lastState
The current UE RRC state.
void ConnectionEstablishedCallback(std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
Connection established callback function.
virtual void DoRun()
Setup the simulation according to the configuration set by the class constructor, run it,...
LteSecondaryCellSelectionTestCase(std::string name, bool isIdealRrc, uint64_t rngRun, uint8_t numberOfComponentCarriers)
Creates an instance of the initial cell selection test case.
virtual ~LteSecondaryCellSelectionTestCase()
Test suite for executing the secondary cell selection test cases.
LteSecondaryCellSelectionTestSuite()
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.
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(void) const
AttributeValue implementation for TypeId.
Hold an unsigned integer type.
void SetGlobal(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_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#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 const std::string & ToString(LteUeRrc::State s)
static LteSecondaryCellSelectionTestSuite g_lteSecondaryCellSelectionTestSuite
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...