A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
test-lte-handover-failure.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2013 Magister Solutions (original test-lte-handover-delay.cc)
3 * Copyright (c) 2021 University of Washington (handover failure cases)
4 *
5 * SPDX-License-Identifier: GPL-2.0-only
6 *
7 * Author: Sachin Nayak <sachinnn@uw.edu>
8 */
9
10#include "ns3/boolean.h"
11#include "ns3/callback.h"
12#include "ns3/config.h"
13#include "ns3/data-rate.h"
14#include "ns3/internet-stack-helper.h"
15#include "ns3/ipv4-address-helper.h"
16#include "ns3/ipv4-interface-container.h"
17#include "ns3/ipv4-static-routing-helper.h"
18#include "ns3/ipv4-static-routing.h"
19#include "ns3/log.h"
20#include "ns3/lte-helper.h"
21#include "ns3/lte-ue-net-device.h"
22#include "ns3/mobility-helper.h"
23#include "ns3/net-device-container.h"
24#include "ns3/node-container.h"
25#include "ns3/nstime.h"
26#include "ns3/point-to-point-epc-helper.h"
27#include "ns3/point-to-point-helper.h"
28#include "ns3/position-allocator.h"
29#include "ns3/rng-seed-manager.h"
30#include "ns3/simulator.h"
31#include "ns3/test.h"
32
33using namespace ns3;
34
35NS_LOG_COMPONENT_DEFINE("LteHandoverFailureTest");
36
37/**
38 * @ingroup lte-test
39 *
40 * @brief Verifying that a handover failure occurs due to various causes
41 *
42 * Handover failure cases dealt with in this test include the below.
43 *
44 * 1. Handover failure due to max random access channel (RACH) attempts from UE to target eNodeB
45 * 2. Handover failure due to non-allocation of non-contention preamble to UE at target eNodeB
46 * 3. Handover failure due to HANDOVER JOINING timeout (3 cases)
47 * 4. Handover failure due to HANDOVER LEAVING timeout (3 cases)
48 *
49 * \sa ns3::LteHandoverFailureTestCase
50 */
52{
53 public:
54 /**
55 * Constructor
56 *
57 * @param name the name of the test case, to be displayed in the test result
58 * @param useIdealRrc if true, use the ideal RRC
59 * @param handoverTime the time of handover
60 * @param simulationDuration duration of the simulation
61 * @param numberOfRaPreambles number of random access preambles available for contention based
62 RACH process
63 * number of non-contention preambles available for handover = (64 -
64 numberRaPreambles)
65 * as numberOfRaPreambles out of the max 64 are reserved contention
66 based RACH process
67 * @param preambleTransMax maximum number of random access preamble transmissions from UE to
68 eNodeB
69 * @param raResponseWindowSize window length for reception of random access response (RAR)
70 * @param handoverJoiningTimeout time before which RRC RECONFIGURATION COMPLETE must be received
71 at target eNodeB after it receives a handover request
72 Else, the UE context is destroyed in the RRC.
73 Timeout can occur before different stages as below.
74 i. Reception of RRC CONNECTION RECONFIGURATION at source eNodeB
75 ii. Non-contention random access procedure from UE to target
76 eNodeB iii. Reception of RRC CONNECTION RECONFIGURATION COMPLETE at target eNodeB
77 * @param handoverLeavingTimeout time before which source eNodeB must receive a UE context
78 release from target eNodeB or RRC CONNECTION RESTABLISHMENT from UE after issuing a handover
79 request Else, the UE context is destroyed in the RRC. Timeout can occur before any of the cases
80 in HANDOVER JOINING TIMEOUT
81 * @param targeteNodeBPosition position of the target eNodeB
82 */
84 bool useIdealRrc,
85 Time handoverTime,
86 Time simulationDuration,
87 uint8_t numberOfRaPreambles,
88 uint8_t preambleTransMax,
89 uint8_t raResponseWindowSize,
90 Time handoverJoiningTimeout,
91 Time handoverLeavingTimeout,
92 uint16_t targeteNodeBPosition)
93 : TestCase(name),
94 m_useIdealRrc(useIdealRrc),
95 m_handoverTime(handoverTime),
96 m_simulationDuration(simulationDuration),
97 m_numberOfRaPreambles(numberOfRaPreambles),
98 m_preambleTransMax(preambleTransMax),
99 m_raResponseWindowSize(raResponseWindowSize),
100 m_handoverJoiningTimeout(handoverJoiningTimeout),
101 m_handoverLeavingTimeout(handoverLeavingTimeout),
102 m_targeteNodeBPosition(targeteNodeBPosition),
104 {
105 }
106
107 private:
108 /**
109 * @brief Run a simulation of a two eNodeB network using the parameters
110 * provided to the constructor function.
111 */
112 void DoRun() override;
113
114 /**
115 * @brief Called at the end of simulation and verifies that a handover
116 * and a handover failure has occurred in the simulation.
117 */
118 void DoTeardown() override;
119
120 /**
121 * UE handover start callback function to indicate start of handover
122 * @param context the context string
123 * @param imsi the IMSI
124 * @param sourceCellId the source cell ID
125 * @param rnti the RNTI
126 * @param targetCellId the target cell ID
127 */
128 void UeHandoverStartCallback(std::string context,
129 uint64_t imsi,
130 uint16_t sourceCellId,
131 uint16_t rnti,
132 uint16_t targetCellId);
133
134 /**
135 * Handover failure callback due to maximum RACH transmissions reached from UE to target eNodeB
136 * @param context the context string
137 * @param imsi the IMSI
138 * @param rnti the RNTI
139 * @param targetCellId the target cell ID
140 */
141 void HandoverFailureMaxRach(std::string context,
142 uint64_t imsi,
143 uint16_t rnti,
144 uint16_t targetCellId);
145
146 /**
147 * Handover failure callback due to non-allocation of non-contention preamble at target eNodeB
148 * @param context the context string
149 * @param imsi the IMSI
150 * @param rnti the RNTI
151 * @param targetCellId the target cell ID
152 */
153 void HandoverFailureNoPreamble(std::string context,
154 uint64_t imsi,
155 uint16_t rnti,
156 uint16_t targetCellId);
157
158 /**
159 * Handover failure callback due to handover joining timeout at target eNodeB
160 * @param context the context string
161 * @param imsi the IMSI
162 * @param rnti the RNTI
163 * @param targetCellId the target cell ID
164 */
165 void HandoverFailureJoining(std::string context,
166 uint64_t imsi,
167 uint16_t rnti,
168 uint16_t targetCellId);
169
170 /**
171 * Handover failure callback due to handover leaving timeout at source eNodeB
172 * @param context the context string
173 * @param imsi the IMSI
174 * @param rnti the RNTI
175 * @param targetCellId the target cell ID
176 */
177 void HandoverFailureLeaving(std::string context,
178 uint64_t imsi,
179 uint16_t rnti,
180 uint16_t targetCellId);
181
182 bool m_useIdealRrc; ///< use ideal RRC?
183 Time m_handoverTime; ///< handover time
184 Time m_simulationDuration; ///< the simulation duration
185 uint8_t m_numberOfRaPreambles; ///< number of random access preambles for contention based RACH
186 ///< process
187 uint8_t m_preambleTransMax; ///< max number of RACH preambles possible from UE to eNodeB
188 uint8_t m_raResponseWindowSize; ///< window length for reception of RAR
189 Time m_handoverJoiningTimeout; ///< handover joining timeout duration at target eNodeB
190 Time m_handoverLeavingTimeout; ///< handover leaving timeout duration at source eNodeB
191 uint16_t m_targeteNodeBPosition; ///< position of the target eNodeB
192 bool m_hasHandoverFailureOccurred; ///< has handover failure occurred in simulation
193
194 // end of class LteHandoverFailureTestCase
195};
196
197void
199{
200 NS_LOG_INFO(this << " " << GetName());
201 uint32_t previousSeed = RngSeedManager::GetSeed();
202 uint64_t previousRun = RngSeedManager::GetRun();
205
206 /*
207 * Helpers.
208 */
209 auto epcHelper = CreateObject<PointToPointEpcHelper>();
210
211 auto lteHelper = CreateObject<LteHelper>();
212 lteHelper->SetEpcHelper(epcHelper);
213
214 // Set parameters for helpers based on the test case parameters.
215 lteHelper->SetAttribute("UseIdealRrc", BooleanValue(m_useIdealRrc));
216 Config::SetDefault("ns3::LteEnbMac::NumberOfRaPreambles", UintegerValue(m_numberOfRaPreambles));
217 Config::SetDefault("ns3::LteEnbMac::PreambleTransMax", UintegerValue(m_preambleTransMax));
218 Config::SetDefault("ns3::LteEnbMac::RaResponseWindowSize",
220 Config::SetDefault("ns3::LteEnbRrc::HandoverJoiningTimeoutDuration",
222 Config::SetDefault("ns3::LteEnbRrc::HandoverLeavingTimeoutDuration",
224
225 // Set PHY model to drastically decrease with distance.
226 lteHelper->SetPathlossModelType(TypeId::LookupByName("ns3::LogDistancePropagationLossModel"));
227 lteHelper->SetPathlossModelAttribute("Exponent", DoubleValue(3.5));
228 lteHelper->SetPathlossModelAttribute("ReferenceLoss", DoubleValue(35));
229 /*
230 * Physical layer.
231 *
232 * eNodeB 0 UE eNodeB 1
233 *
234 * x ----------------------- x -------------------------- x
235 * 200 m m_targeteNodeBPosition
236 * source target
237 */
238 // Create nodes.
239 NodeContainer enbNodes;
240 enbNodes.Create(2);
241 auto ueNode = CreateObject<Node>();
242
243 // Setup mobility
244 auto posAlloc = CreateObject<ListPositionAllocator>();
245 posAlloc->Add(Vector(0, 0, 0));
246 posAlloc->Add(Vector(m_targeteNodeBPosition, 0, 0));
247 posAlloc->Add(Vector(200, 0, 0));
248
249 MobilityHelper mobilityHelper;
250 mobilityHelper.SetMobilityModel("ns3::ConstantPositionMobilityModel");
251 mobilityHelper.SetPositionAllocator(posAlloc);
252 mobilityHelper.Install(enbNodes);
253 mobilityHelper.Install(ueNode);
254
255 /*
256 * Link layer.
257 */
258 auto enbDevs = lteHelper->InstallEnbDevice(enbNodes);
259 auto ueDev = lteHelper->InstallUeDevice(ueNode).Get(0);
260 auto castedUeDev = DynamicCast<LteUeNetDevice>(ueDev);
261 // Working value from before we started resetting g_nextStreamIndex. For more details
262 // see https://gitlab.com/nsnam/ns-3-dev/-/merge_requests/2178#note_2143793903
263 castedUeDev->GetPhy()->GetDlSpectrumPhy()->AssignStreams(175);
264
265 /*
266 * Network layer.
267 */
268 InternetStackHelper inetStackHelper;
269 inetStackHelper.Install(ueNode);
271 ueIfs = epcHelper->AssignUeIpv4Address(ueDev);
272
273 // Setup traces.
274 Config::Connect("/NodeList/*/DeviceList/*/LteUeRrc/HandoverStart",
276 Config::Connect("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverFailureMaxRach",
278 Config::Connect("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverFailureNoPreamble",
280 Config::Connect("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverFailureJoining",
282 Config::Connect("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverFailureLeaving",
284
285 // Prepare handover.
286 lteHelper->AddX2Interface(enbNodes);
287 lteHelper->Attach(ueDev, enbDevs.Get(0));
288 lteHelper->HandoverRequest(m_handoverTime, ueDev, enbDevs.Get(0), enbDevs.Get(1));
289
290 // Run simulation.
294
295 RngSeedManager::SetSeed(previousSeed);
296 RngSeedManager::SetRun(previousRun);
297}
298
299void
301 uint64_t imsi,
302 uint16_t sourceCellId,
303 uint16_t rnti,
304 uint16_t targetCellId)
305{
306 NS_LOG_FUNCTION(this << " " << context << " IMSI-" << imsi << " sourceCellID-" << sourceCellId
307 << " RNTI-" << rnti << " targetCellID-" << targetCellId);
308 NS_LOG_INFO("HANDOVER COMMAND received through at UE "
309 << imsi << " to handover from " << sourceCellId << " to " << targetCellId);
310}
311
312void
314 uint64_t imsi,
315 uint16_t rnti,
316 uint16_t targetCellId)
317{
318 NS_LOG_FUNCTION(this << context << imsi << rnti << targetCellId);
320}
321
322void
324 uint64_t imsi,
325 uint16_t rnti,
326 uint16_t targetCellId)
327{
328 NS_LOG_FUNCTION(this << context << imsi << rnti << targetCellId);
330}
331
332void
334 uint64_t imsi,
335 uint16_t rnti,
336 uint16_t targetCellId)
337{
338 NS_LOG_FUNCTION(this << context << imsi << rnti << targetCellId);
340}
341
342void
344 uint64_t imsi,
345 uint16_t rnti,
346 uint16_t targetCellId)
347{
348 NS_LOG_FUNCTION(this << context << imsi << rnti << targetCellId);
350}
351
352void
354{
355 NS_LOG_FUNCTION(this);
356 NS_TEST_ASSERT_MSG_EQ(m_hasHandoverFailureOccurred, true, "Handover failure did not occur");
357}
358
359/**
360 * @ingroup lte-test
361 *
362 * The following log components can be used to debug this test's behavior:
363 * LteHandoverFailureTest:LteEnbRrc:LteEnbMac:LteUeRrc:EpcX2
364 *
365 * @brief Lte Handover Failure Test Suite
366 */
368{
369 public:
371 : TestSuite("lte-handover-failure", Type::SYSTEM)
372 {
373 // Argument sequence for all test cases: useIdealRrc, handoverTime, simulationDuration,
374 // numberOfRaPreambles, preambleTransMax, raResponseWindowSize,
375 // handoverJoiningTimeout, handoverLeavingTimeout
376
377 // Test cases for REAL RRC protocol
378 AddTestCase(new LteHandoverFailureTestCase("REAL Handover failure due to maximum RACH "
379 "transmissions reached from UE to target eNodeB",
380 false,
381 Seconds(0.200),
382 Seconds(0.300),
383 52,
384 3,
385 3,
386 MilliSeconds(200),
387 MilliSeconds(500),
388 2500),
389 TestCase::Duration::QUICK);
391 "REAL Handover failure due to non-allocation of non-contention preamble at "
392 "target eNodeB due to max number reached",
393 false,
394 Seconds(0.100),
395 Seconds(0.200),
396 64,
397 50,
398 3,
399 MilliSeconds(200),
400 MilliSeconds(500),
401 1500),
402 TestCase::Duration::QUICK);
404 "REAL Handover failure due to HANDOVER JOINING timeout before reception of "
405 "RRC CONNECTION RECONFIGURATION at source eNodeB",
406 false,
407 Seconds(0.100),
408 Seconds(0.200),
409 52,
410 50,
411 3,
412 MilliSeconds(0),
413 MilliSeconds(500),
414 1500),
415 TestCase::Duration::QUICK);
417 "REAL Handover failure due to HANDOVER JOINING timeout before completion "
418 "of non-contention RACH process to target eNodeB",
419 false,
420 Seconds(0.100),
421 Seconds(0.200),
422 52,
423 50,
424 3,
425 MilliSeconds(15),
426 MilliSeconds(500),
427 1500),
428 TestCase::Duration::QUICK);
430 "REAL Handover failure due to HANDOVER JOINING timeout before reception of "
431 "RRC CONNECTION RECONFIGURATION COMPLETE at target eNodeB",
432 false,
433 Seconds(0.100),
434 Seconds(0.200),
435 52,
436 50,
437 3,
438 MilliSeconds(18),
439 MilliSeconds(500),
440 500),
441 TestCase::Duration::QUICK);
443 "REAL Handover failure due to HANDOVER LEAVING timeout before reception of "
444 "RRC CONNECTION RECONFIGURATION at source eNodeB",
445 false,
446 Seconds(0.100),
447 Seconds(0.200),
448 52,
449 50,
450 3,
451 MilliSeconds(200),
452 MilliSeconds(0),
453 1500),
454 TestCase::Duration::QUICK);
456 "REAL Handover failure due to HANDOVER LEAVING timeout before completion "
457 "of non-contention RACH process to target eNodeB",
458 false,
459 Seconds(0.100),
460 Seconds(0.200),
461 52,
462 50,
463 3,
464 MilliSeconds(200),
465 MilliSeconds(15),
466 1500),
467 TestCase::Duration::QUICK);
469 "REAL Handover failure due to HANDOVER LEAVING timeout before reception of "
470 "RRC CONNECTION RECONFIGURATION COMPLETE at target eNodeB",
471 false,
472 Seconds(0.100),
473 Seconds(0.200),
474 52,
475 50,
476 3,
477 MilliSeconds(200),
478 MilliSeconds(18),
479 500),
480 TestCase::Duration::QUICK);
481
482 // Test cases for IDEAL RRC protocol
483 AddTestCase(new LteHandoverFailureTestCase("IDEAL Handover failure due to maximum RACH "
484 "transmissions reached from UE to target eNodeB",
485 true,
486 Seconds(0.100),
487 Seconds(0.200),
488 52,
489 3,
490 3,
491 MilliSeconds(200),
492 MilliSeconds(500),
493 1500),
494 TestCase::Duration::QUICK);
496 "IDEAL Handover failure due to non-allocation of non-contention preamble "
497 "at target eNodeB due to max number reached",
498 true,
499 Seconds(0.100),
500 Seconds(0.200),
501 64,
502 50,
503 3,
504 MilliSeconds(200),
505 MilliSeconds(500),
506 1500),
507 TestCase::Duration::QUICK);
509 "IDEAL Handover failure due to HANDOVER JOINING timeout before reception "
510 "of RRC CONNECTION RECONFIGURATION at source eNodeB",
511 true,
512 Seconds(0.100),
513 Seconds(0.200),
514 52,
515 50,
516 3,
517 MilliSeconds(0),
518 MilliSeconds(500),
519 1500),
520 TestCase::Duration::QUICK);
522 "IDEAL Handover failure due to HANDOVER JOINING timeout before completion "
523 "of non-contention RACH process to target eNodeB",
524 true,
525 Seconds(0.100),
526 Seconds(0.200),
527 52,
528 50,
529 3,
530 MilliSeconds(10),
531 MilliSeconds(500),
532 1500),
533 TestCase::Duration::QUICK);
535 "IDEAL Handover failure due to HANDOVER JOINING timeout before reception "
536 "of RRC CONNECTION RECONFIGURATION COMPLETE at target eNodeB",
537 true,
538 Seconds(0.100),
539 Seconds(0.200),
540 52,
541 50,
542 3,
543 MilliSeconds(4),
544 MilliSeconds(500),
545 500),
546 TestCase::Duration::QUICK);
548 "IDEAL Handover failure due to HANDOVER LEAVING timeout before reception "
549 "of RRC CONNECTION RECONFIGURATION at source eNodeB",
550 true,
551 Seconds(0.100),
552 Seconds(0.200),
553 52,
554 50,
555 3,
556 MilliSeconds(500),
557 MilliSeconds(0),
558 1500),
559 TestCase::Duration::QUICK);
561 "IDEAL Handover failure due to HANDOVER LEAVING timeout before completion "
562 "of non-contention RACH process to target eNodeB",
563 true,
564 Seconds(0.100),
565 Seconds(0.200),
566 52,
567 50,
568 3,
569 MilliSeconds(500),
570 MilliSeconds(10),
571 1500),
572 TestCase::Duration::QUICK);
574 "IDEAL Handover failure due to HANDOVER LEAVING timeout before reception "
575 "of RRC CONNECTION RECONFIGURATION COMPLETE at target eNodeB",
576 true,
577 Seconds(0.100),
578 Seconds(0.200),
579 52,
580 50,
581 3,
582 MilliSeconds(500),
583 MilliSeconds(4),
584 500),
585 TestCase::Duration::QUICK);
586 }
587} g_lteHandoverFailureTestSuite; ///< end of LteHandoverFailureTestSuite ()
Verifying that a handover failure occurs due to various causes.
LteHandoverFailureTestCase(std::string name, bool useIdealRrc, Time handoverTime, Time simulationDuration, uint8_t numberOfRaPreambles, uint8_t preambleTransMax, uint8_t raResponseWindowSize, Time handoverJoiningTimeout, Time handoverLeavingTimeout, uint16_t targeteNodeBPosition)
Constructor.
Time m_handoverJoiningTimeout
handover joining timeout duration at target eNodeB
Time m_handoverLeavingTimeout
handover leaving timeout duration at source eNodeB
uint8_t m_preambleTransMax
max number of RACH preambles possible from UE to eNodeB
uint8_t m_numberOfRaPreambles
number of random access preambles for contention based RACH process
void HandoverFailureMaxRach(std::string context, uint64_t imsi, uint16_t rnti, uint16_t targetCellId)
Handover failure callback due to maximum RACH transmissions reached from UE to target eNodeB.
void DoRun() override
Run a simulation of a two eNodeB network using the parameters provided to the constructor function.
uint16_t m_targeteNodeBPosition
position of the target eNodeB
void HandoverFailureJoining(std::string context, uint64_t imsi, uint16_t rnti, uint16_t targetCellId)
Handover failure callback due to handover joining timeout at target eNodeB.
void HandoverFailureNoPreamble(std::string context, uint64_t imsi, uint16_t rnti, uint16_t targetCellId)
Handover failure callback due to non-allocation of non-contention preamble at target eNodeB.
void HandoverFailureLeaving(std::string context, uint64_t imsi, uint16_t rnti, uint16_t targetCellId)
Handover failure callback due to handover leaving timeout at source eNodeB.
bool m_hasHandoverFailureOccurred
has handover failure occurred in simulation
void UeHandoverStartCallback(std::string context, uint64_t imsi, uint16_t sourceCellId, uint16_t rnti, uint16_t targetCellId)
UE handover start callback function to indicate start of handover.
void DoTeardown() override
Called at the end of simulation and verifies that a handover and a handover failure has occurred in t...
uint8_t m_raResponseWindowSize
window length for reception of RAR
Time m_simulationDuration
the simulation duration
The following log components can be used to debug this test's behavior: LteHandoverFailureTest:LteEnb...
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
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...
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Helper class used to assign positions and mobility models to nodes.
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
void SetMobilityModel(std::string type, Ts &&... args)
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
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 SetRun(uint64_t run)
Set the run number of simulation.
static void SetSeed(uint32_t seed)
Set the seed.
static uint64_t GetRun()
Get the current run number.
static uint32_t GetSeed()
Get the current seed value which will be used by all subsequently instantiated RandomVariableStream o...
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition simulator.cc:131
static void Run()
Run the simulation.
Definition simulator.cc:167
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition simulator.cc:175
encapsulates test code
Definition test.h:1050
void AddTestCase(TestCase *testCase, Duration duration=Duration::QUICK)
Add an individual child TestCase to this test suite.
Definition test.cc:292
std::string GetName() const
Definition test.cc:367
A suite of tests to run.
Definition test.h:1267
Type
Type of test.
Definition test.h:1274
static constexpr auto SYSTEM
Definition test.h:1293
Simulation virtual time values and global simulation resolution.
Definition nstime.h:94
AttributeValue implementation for Time.
Definition nstime.h:1432
static TypeId LookupByName(std::string name)
Get a TypeId by name.
Definition type-id.cc:872
Hold an unsigned integer type.
Definition uinteger.h:34
void SetDefault(std::string name, const AttributeValue &value)
Definition config.cc:886
void Connect(std::string path, const CallbackBase &cb)
Definition config.cc:970
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:191
#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:264
LteHandoverFailureTestSuite g_lteHandoverFailureTestSuite
end of LteHandoverFailureTestSuite ()
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Definition object.h:619
#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:134
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1345
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition nstime.h:1357
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:684
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.
Definition ptr.h:580