A Discrete-Event Network Simulator
API
lte-test-cell-selection.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Budiarto Herman
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Author: Budiarto Herman <budiarto.herman@magister.fi>
18  *
19  */
20 
22 
23 #include <ns3/boolean.h>
24 #include <ns3/double.h>
25 #include <ns3/integer.h>
26 #include <ns3/internet-stack-helper.h>
27 #include <ns3/ipv4-address-helper.h>
28 #include <ns3/ipv4-interface-container.h>
29 #include <ns3/ipv4-static-routing-helper.h>
30 #include <ns3/log.h>
31 #include <ns3/lte-enb-net-device.h>
32 #include <ns3/lte-helper.h>
33 #include <ns3/lte-ue-net-device.h>
34 #include <ns3/lte-ue-rrc.h>
35 #include <ns3/mobility-helper.h>
36 #include <ns3/net-device-container.h>
37 #include <ns3/node-container.h>
38 #include <ns3/point-to-point-epc-helper.h>
39 #include <ns3/point-to-point-helper.h>
40 #include <ns3/rng-seed-manager.h>
41 #include <ns3/simulator.h>
42 
43 using namespace ns3;
44 
45 NS_LOG_COMPONENT_DEFINE("LteCellSelectionTest");
46 
47 /*
48  * This test suite sets up four cells (four eNBs) and six UEs. Two of the
49  * cells are CSG and two are non-CSG. The six UEs associate with cells
50  * based on their positions and random access procedures. The test checks
51  * that the UEs, at specirfic simulation times, are associated to expected
52  * cells. See the header Doxygen for more specific descriptions.
53  *
54  * The test conditions that are checked rely on the RA preamble values
55  * (randomly selected) being unique for the six UEs. For most values of
56  * random seed and run number, this will be the case, but certain values
57  * will cause a collision (same RA preamble drawn for two UEs). Therefore,
58  * this test fixes the RngSeed and RngRun values, and uses AssignStreams,
59  * to ensure that an RA preamble collision does not occur.
60  */
61 
63  : TestSuite("lte-cell-selection", SYSTEM)
64 {
65  std::vector<LteCellSelectionTestCase::UeSetup_t> w;
66 
67  // REAL RRC PROTOCOL
68 
69  w = {
70  // x, y, csgMember, checkPoint, cell1, cell2
71  LteCellSelectionTestCase::UeSetup_t(0.0, 0.55, false, MilliSeconds(283), 1, 0),
72  LteCellSelectionTestCase::UeSetup_t(0.0, 0.45, false, MilliSeconds(283), 1, 0),
73  LteCellSelectionTestCase::UeSetup_t(0.5, 0.45, false, MilliSeconds(363), 1, 3),
74  LteCellSelectionTestCase::UeSetup_t(0.5, 0.0, true, MilliSeconds(283), 2, 4),
75  LteCellSelectionTestCase::UeSetup_t(1.0, 0.55, true, MilliSeconds(283), 3, 0),
76  LteCellSelectionTestCase::UeSetup_t(1.0, 0.45, true, MilliSeconds(283), 4, 0),
77  };
78 
79  AddTestCase(new LteCellSelectionTestCase("EPC, real RRC", true, false, 60.0 /* isd */, w),
80  TestCase::QUICK);
81 
82  // IDEAL RRC PROTOCOL
83 
84  w = {
85  // x, y, csgMember, checkPoint, cell1, cell2
86  LteCellSelectionTestCase::UeSetup_t(0.0, 0.55, false, MilliSeconds(266), 1, 0),
87  LteCellSelectionTestCase::UeSetup_t(0.0, 0.45, false, MilliSeconds(266), 1, 0),
88  LteCellSelectionTestCase::UeSetup_t(0.5, 0.45, false, MilliSeconds(346), 1, 3),
89  LteCellSelectionTestCase::UeSetup_t(0.5, 0.0, true, MilliSeconds(266), 2, 4),
90  LteCellSelectionTestCase::UeSetup_t(1.0, 0.55, true, MilliSeconds(266), 3, 0),
91  LteCellSelectionTestCase::UeSetup_t(1.0, 0.45, true, MilliSeconds(266), 4, 0),
92  };
93 
94  AddTestCase(new LteCellSelectionTestCase("EPC, ideal RRC", true, true, 60.0 /* isd */, w),
95  TestCase::QUICK);
96 
97 } // end of LteCellSelectionTestSuite::LteCellSelectionTestSuite ()
98 
104 
105 /*
106  * Test Case
107  */
108 
110  double relPosY,
111  bool isCsgMember,
112  Time checkPoint,
113  uint16_t expectedCellId1,
114  uint16_t expectedCellId2)
115  : position(Vector(relPosX, relPosY, 0.0)),
116  isCsgMember(isCsgMember),
117  checkPoint(checkPoint),
118  expectedCellId1(expectedCellId1),
119  expectedCellId2(expectedCellId2)
120 {
121 }
122 
124  bool isEpcMode,
125  bool isIdealRrc,
126  double interSiteDistance,
127  std::vector<UeSetup_t> ueSetupList)
128  : TestCase(name),
129  m_isEpcMode(isEpcMode),
130  m_isIdealRrc(isIdealRrc),
131  m_interSiteDistance(interSiteDistance),
132  m_ueSetupList(ueSetupList)
133 {
134  NS_LOG_FUNCTION(this << GetName());
135  m_lastState.resize(m_ueSetupList.size(), LteUeRrc::NUM_STATES);
136 }
137 
139 {
140  NS_LOG_FUNCTION(this << GetName());
141 }
142 
143 void
145 {
146  NS_LOG_FUNCTION(this << GetName());
147 
148  // In ns-3 test suite operation, static variables persist across all
149  // tests (all test suites execute within a single ns-3 process).
150  // Therefore, to fix a seed and run number for a specific test, the
151  // current values of seed and run number should be saved and restored
152  // after the test is run.
153  uint32_t previousSeed = RngSeedManager::GetSeed();
154  uint64_t previousRun = RngSeedManager::GetRun();
155  // Values of 1 and 2 here will prevent RA preamble collisions
156  Config::SetGlobal("RngSeed", UintegerValue(1));
157  Config::SetGlobal("RngRun", UintegerValue(2));
158 
159  Ptr<LteHelper> lteHelper = CreateObject<LteHelper>();
160  lteHelper->SetAttribute("PathlossModel", StringValue("ns3::FriisSpectrumPropagationLossModel"));
161  lteHelper->SetAttribute("UseIdealRrc", BooleanValue(m_isIdealRrc));
162 
163  Ptr<PointToPointEpcHelper> epcHelper;
164 
165  if (m_isEpcMode)
166  {
167  epcHelper = CreateObject<PointToPointEpcHelper>();
168  lteHelper->SetEpcHelper(epcHelper);
169  }
170 
171  /*
172  * The topology is the following (the number on the node indicate the cell ID)
173  *
174  * [1] [3]
175  * non-CSG -- non-CSG
176  * | |
177  * | | 60 m
178  * | |
179  * [2] [4]
180  * CSG ------ CSG
181  * 60 m
182  */
183 
184  // Create Nodes
185  NodeContainer enbNodes;
186  enbNodes.Create(4);
187  NodeContainer ueNodes;
188  auto nUe = static_cast<uint16_t>(m_ueSetupList.size());
189  ueNodes.Create(nUe);
190 
191  // Assign nodes to position
192  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();
193  // eNodeB
194  positionAlloc->Add(Vector(0.0, m_interSiteDistance, 0.0));
195  positionAlloc->Add(Vector(0.0, 0.0, 0.0));
196  positionAlloc->Add(Vector(m_interSiteDistance, m_interSiteDistance, 0.0));
197  positionAlloc->Add(Vector(m_interSiteDistance, 0.0, 0.0));
198  // UE
199  std::vector<UeSetup_t>::const_iterator itSetup;
200  for (itSetup = m_ueSetupList.begin(); itSetup != m_ueSetupList.end(); itSetup++)
201  {
202  Vector uePos(m_interSiteDistance * itSetup->position.x,
203  m_interSiteDistance * itSetup->position.y,
204  m_interSiteDistance * itSetup->position.z);
205  NS_LOG_INFO("UE position " << uePos);
206  positionAlloc->Add(uePos);
207  }
208 
210  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
211  mobility.SetPositionAllocator(positionAlloc);
212  mobility.Install(enbNodes);
213  mobility.Install(ueNodes);
214 
215  // Create Devices and install them in the Nodes (eNB and UE)
216  int64_t stream = 1;
217  NetDeviceContainer enbDevs;
218 
219  // cell ID 1 is a non-CSG cell
220  lteHelper->SetEnbDeviceAttribute("CsgId", UintegerValue(0));
221  lteHelper->SetEnbDeviceAttribute("CsgIndication", BooleanValue(false));
222  enbDevs.Add(lteHelper->InstallEnbDevice(enbNodes.Get(0)));
223 
224  // cell ID 2 is a CSG cell
225  lteHelper->SetEnbDeviceAttribute("CsgId", UintegerValue(1));
226  lteHelper->SetEnbDeviceAttribute("CsgIndication", BooleanValue(true));
227  enbDevs.Add(lteHelper->InstallEnbDevice(enbNodes.Get(1)));
228 
229  // cell ID 3 is a non-CSG cell
230  lteHelper->SetEnbDeviceAttribute("CsgId", UintegerValue(0));
231  lteHelper->SetEnbDeviceAttribute("CsgIndication", BooleanValue(false));
232  enbDevs.Add(lteHelper->InstallEnbDevice(enbNodes.Get(2)));
233 
234  // cell ID 4 is a CSG cell
235  lteHelper->SetEnbDeviceAttribute("CsgId", UintegerValue(1));
236  lteHelper->SetEnbDeviceAttribute("CsgIndication", BooleanValue(true));
237  enbDevs.Add(lteHelper->InstallEnbDevice(enbNodes.Get(3)));
238 
239  NetDeviceContainer ueDevs;
240  Time lastCheckPoint = MilliSeconds(0);
241  NS_ASSERT(m_ueSetupList.size() == ueNodes.GetN());
243  for (itSetup = m_ueSetupList.begin(), itNode = ueNodes.Begin();
244  itSetup != m_ueSetupList.end() || itNode != ueNodes.End();
245  itSetup++, itNode++)
246  {
247  if (itSetup->isCsgMember)
248  {
249  lteHelper->SetUeDeviceAttribute("CsgId", UintegerValue(1));
250  }
251  else
252  {
253  lteHelper->SetUeDeviceAttribute("CsgId", UintegerValue(0));
254  }
255 
256  NetDeviceContainer devs = lteHelper->InstallUeDevice(*itNode);
257  Ptr<LteUeNetDevice> ueDev = devs.Get(0)->GetObject<LteUeNetDevice>();
258  NS_ASSERT(ueDev);
259  ueDevs.Add(devs);
260  Simulator::Schedule(itSetup->checkPoint,
262  this,
263  ueDev,
264  itSetup->expectedCellId1,
265  itSetup->expectedCellId2);
266 
267  if (lastCheckPoint < itSetup->checkPoint)
268  {
269  lastCheckPoint = itSetup->checkPoint;
270  }
271  }
272 
273  stream += lteHelper->AssignStreams(enbDevs, stream);
274  stream += lteHelper->AssignStreams(ueDevs, stream);
275 
276  // Tests
277  NS_ASSERT(m_ueSetupList.size() == ueDevs.GetN());
279  for (itSetup = m_ueSetupList.begin(), itDev = ueDevs.Begin();
280  itSetup != m_ueSetupList.end() || itDev != ueDevs.End();
281  itSetup++, itDev++)
282  {
283  Ptr<LteUeNetDevice> ueDev = (*itDev)->GetObject<LteUeNetDevice>();
284  }
285 
286  if (m_isEpcMode)
287  {
288  // Create P-GW node
289  Ptr<Node> pgw = epcHelper->GetPgwNode();
290 
291  // Create a single RemoteHost
292  NodeContainer remoteHostContainer;
293  remoteHostContainer.Create(1);
294  Ptr<Node> remoteHost = remoteHostContainer.Get(0);
296  internet.Install(remoteHostContainer);
297 
298  // Create the Internet
299  PointToPointHelper p2ph;
300  p2ph.SetDeviceAttribute("DataRate", DataRateValue(DataRate("100Gb/s")));
301  p2ph.SetDeviceAttribute("Mtu", UintegerValue(1500));
302  p2ph.SetChannelAttribute("Delay", TimeValue(Seconds(0.010)));
303  NetDeviceContainer internetDevices = p2ph.Install(pgw, remoteHost);
304  Ipv4AddressHelper ipv4h;
305  ipv4h.SetBase("1.0.0.0", "255.0.0.0");
306  Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign(internetDevices);
307 
308  // Routing of the Internet Host (towards the LTE network)
309  Ipv4StaticRoutingHelper ipv4RoutingHelper;
310  Ptr<Ipv4StaticRouting> remoteHostStaticRouting =
311  ipv4RoutingHelper.GetStaticRouting(remoteHost->GetObject<Ipv4>());
312  remoteHostStaticRouting->AddNetworkRouteTo(Ipv4Address("7.0.0.0"),
313  Ipv4Mask("255.0.0.0"),
314  1);
315 
316  // Install the IP stack on the UEs
317  internet.Install(ueNodes);
318  Ipv4InterfaceContainer ueIpIfaces;
319  ueIpIfaces = epcHelper->AssignUeIpv4Address(NetDeviceContainer(ueDevs));
320 
321  // Assign IP address to UEs
322  for (uint32_t u = 0; u < ueNodes.GetN(); ++u)
323  {
324  Ptr<Node> ueNode = ueNodes.Get(u);
325  // Set the default gateway for the UE
326  Ptr<Ipv4StaticRouting> ueStaticRouting =
327  ipv4RoutingHelper.GetStaticRouting(ueNode->GetObject<Ipv4>());
328  ueStaticRouting->SetDefaultRoute(epcHelper->GetUeDefaultGatewayAddress(), 1);
329  }
330 
331  } // end of if (m_isEpcMode)
332  else
333  {
334  NS_FATAL_ERROR("No support yet for LTE-only simulations");
335  }
336 
337  // Connect to trace sources in UEs
338  Config::Connect("/NodeList/*/DeviceList/*/LteUeRrc/StateTransition",
341  "/NodeList/*/DeviceList/*/LteUeRrc/InitialCellSelectionEndOk",
344  "/NodeList/*/DeviceList/*/LteUeRrc/InitialCellSelectionEndError",
346  Config::Connect("/NodeList/*/DeviceList/*/LteUeRrc/ConnectionEstablished",
348 
349  // Enable Idle mode cell selection
350  lteHelper->Attach(ueDevs);
351 
352  // Run simulation
353  Simulator::Stop(lastCheckPoint);
354  Simulator::Run();
355 
356  NS_LOG_INFO("Simulation ends");
357  Simulator::Destroy();
358 
359  // Restore the seed and run number that were in effect before this test
360  Config::SetGlobal("RngSeed", UintegerValue(previousSeed));
361  Config::SetGlobal("RngRun", UintegerValue(previousRun));
362 
363 } // end of void LteCellSelectionTestCase::DoRun ()
364 
365 void
367  uint16_t expectedCellId1,
368  uint16_t expectedCellId2)
369 {
370  uint16_t actualCellId = ueDev->GetRrc()->GetCellId();
371 
372  if (expectedCellId2 == 0)
373  {
374  NS_TEST_ASSERT_MSG_EQ(actualCellId,
375  expectedCellId1,
376  "IMSI " << ueDev->GetImsi() << " has attached to an unexpected cell");
377  }
378  else
379  {
380  bool pass = (actualCellId == expectedCellId1) || (actualCellId == expectedCellId2);
382  true,
383  "IMSI " << ueDev->GetImsi() << " has attached to an unexpected cell"
384  << " (actual: " << actualCellId << ","
385  << " expected: " << expectedCellId1 << " or "
386  << expectedCellId2 << ")");
387  }
388 
389  if (expectedCellId1 > 0)
390  {
391  NS_TEST_ASSERT_MSG_EQ(m_lastState.at(static_cast<unsigned int>(ueDev->GetImsi() - 1)),
392  LteUeRrc::CONNECTED_NORMALLY,
393  "UE " << ueDev->GetImsi() << " is not at CONNECTED_NORMALLY state");
394  }
395 }
396 
397 void
399  uint64_t imsi,
400  uint16_t cellId,
401  uint16_t rnti,
402  LteUeRrc::State oldState,
403  LteUeRrc::State newState)
404 {
405  NS_LOG_FUNCTION(this << imsi << cellId << rnti << oldState << newState);
406  m_lastState.at(static_cast<unsigned int>(imsi - 1)) = newState;
407 }
408 
409 void
411  uint64_t imsi,
412  uint16_t cellId)
413 {
414  NS_LOG_FUNCTION(this << imsi << cellId);
415 }
416 
417 void
419  uint64_t imsi,
420  uint16_t cellId)
421 {
422  NS_LOG_FUNCTION(this << imsi << cellId);
423 }
424 
425 void
427  uint64_t imsi,
428  uint16_t cellId,
429  uint16_t rnti)
430 {
431  NS_LOG_FUNCTION(this << imsi << cellId << rnti);
432 }
Testing the initial cell selection procedure by UE at IDLE state in the beginning of simulation.
std::vector< UeSetup_t > m_ueSetupList
UE setup list.
void CheckPoint(Ptr< LteUeNetDevice > ueDev, uint16_t expectedCellId1, uint16_t expectedCellId2)
Verifies if the given UE is attached to either of the given two cells and in a CONNECTED_NORMALLY sta...
void InitialCellSelectionEndOkCallback(std::string context, uint64_t imsi, uint16_t cellId)
Initial cell selection end ok callback function.
std::vector< LteUeRrc::State > m_lastState
The current UE RRC state.
LteCellSelectionTestCase(std::string name, bool isEpcMode, bool isIdealRrc, double interSiteDistance, std::vector< UeSetup_t > ueSetupList)
Creates an instance of the initial cell selection test case.
void DoRun() override
Setup the simulation according to the configuration set by the class constructor, run it,...
bool m_isEpcMode
whether the LTE configuration in test is using EPC
double m_interSiteDistance
inter site distance
void ConnectionEstablishedCallback(std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
Connection established callback function.
void InitialCellSelectionEndErrorCallback(std::string context, uint64_t imsi, uint16_t cellId)
Initial cell selection end error callback function.
bool m_isIdealRrc
whether the LTE is configured to use ideal RRC
void StateTransitionCallback(std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti, LteUeRrc::State oldState, LteUeRrc::State newState)
State transition callback function.
Test suite for executing the cell selection test cases in without-EPC and with-EPC scenarios.
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:42
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition: ipv4.h:80
holds a vector of std::pair of Ptr<Ipv4> and interface index.
a class to represent an Ipv4 address mask
Definition: ipv4-address.h:257
Helper class that adds ns3::Ipv4StaticRouting objects.
Ptr< Ipv4StaticRouting > GetStaticRouting(Ptr< Ipv4 > ipv4) const
Try and find the static routing protocol as either the main routing protocol or in the list of routin...
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 ...
Definition: lte-helper.cc:285
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:485
void Attach(NetDeviceContainer ueDevices)
Enables automatic attachment of a set of UE devices to a suitable cell using Idle mode initial cell s...
Definition: lte-helper.cc:1039
void SetEnbDeviceAttribute(std::string n, const AttributeValue &v)
Set an attribute for the eNodeB devices (LteEnbNetDevice) to be created.
Definition: lte-helper.cc:412
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:500
void SetUeDeviceAttribute(std::string n, const AttributeValue &v)
Set an attribute for the UE devices (LteUeNetDevice) to be created.
Definition: lte-helper.cc:433
int64_t AssignStreams(NetDeviceContainer c, int64_t stream)
Assign a fixed random variable stream number to the random variables used.
Definition: lte-helper.cc:1567
The LteUeNetDevice class implements the UE net device.
State
The states of the UE RRC entity.
Definition: lte-ue-rrc.h:99
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
uint32_t GetN() const
Get the number of Ptr<NetDevice> stored in this container.
std::vector< Ptr< NetDevice > >::const_iterator Iterator
NetDevice container iterator.
Iterator Begin() const
Get an iterator which refers to the first NetDevice in the container.
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
Iterator End() const
Get an iterator which indicates past-the-last NetDevice in the container.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
Ptr< Node > GetPgwNode() const override
Get the PGW node.
Ipv4Address GetUeDefaultGatewayAddress() override
Ipv4InterfaceContainer AssignUeIpv4Address(NetDeviceContainer ueDevices) override
Assign IPv4 addresses to UE devices.
keep track of a set of node pointers.
Iterator End() const
Get an iterator which indicates past-the-last Node in the container.
uint32_t GetN() const
Get the number of Ptr<Node> stored in this container.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
Iterator Begin() const
Get an iterator which refers to the first Node in the container.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:204
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition: object.h:471
Build a set of PointToPointNetDevice objects.
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
NetDeviceContainer Install(NodeContainer c)
Hold variables of type string.
Definition: string.h:56
encapsulates test code
Definition: test.h:1060
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:301
std::string GetName() const
Definition: test.cc:373
A suite of tests to run.
Definition: test.h:1256
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
Hold an unsigned integer type.
Definition: uinteger.h:45
Vector3D Vector
Vector alias typedef for compatibility with mobility models.
Definition: vector.h:324
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:66
void SetGlobal(std::string name, const AttributeValue &value)
Definition: config.cc:936
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:974
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:179
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:275
static LteCellSelectionTestSuite g_lteCellSelectionTestSuite
Static variable for test initialization.
void(* DataRate)(DataRate oldValue, DataRate newValue)
TracedValue callback signature for DataRate.
Definition: data-rate.h:327
#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.
Definition: test.h:144
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1326
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1338
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...
Definition: callback.h:704
mobility
Definition: third.py:105
A set of input parameters for setting up a UE in the simulation.
UeSetup_t(double relPosX, double relPosY, bool isCsgMember, Time checkPoint, uint16_t expectedCellId1, uint16_t expectedCellId2)
UE test setup function.