A Discrete-Event Network Simulator
API
test-lte-handover-delay.cc
Go to the documentation of this file.
1/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2013 Magister Solutions
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Budiarto Herman <budiarto.herman@magister.fi>
19 * Alexander Krotov <krotov@iitp.ru>
20 */
21
22#include <ns3/test.h>
23
24#include <ns3/log.h>
25#include <ns3/nstime.h>
26#include <ns3/callback.h>
27#include <ns3/config.h>
28#include <ns3/boolean.h>
29#include <ns3/simulator.h>
30
31#include <ns3/node-container.h>
32#include <ns3/net-device-container.h>
33#include <ns3/ipv4-interface-container.h>
34
35#include <ns3/lte-helper.h>
36#include <ns3/point-to-point-epc-helper.h>
37#include <ns3/internet-stack-helper.h>
38#include <ns3/point-to-point-helper.h>
39#include <ns3/ipv4-address-helper.h>
40#include <ns3/ipv4-static-routing-helper.h>
41#include <ns3/mobility-helper.h>
42
43#include <ns3/data-rate.h>
44#include <ns3/ipv4-static-routing.h>
45#include <ns3/position-allocator.h>
46
47
48using namespace ns3;
49
50NS_LOG_COMPONENT_DEFINE ("LteHandoverDelayTest");
51
60{
61public:
71 LteHandoverDelayTestCase (uint8_t numberOfComponentCarriers, bool useIdealRrc, Time handoverTime,
72 Time delayThreshold, Time simulationDuration)
73 : TestCase ("Verifying that the time needed for handover is under a specified threshold"),
74 m_numberOfComponentCarriers (numberOfComponentCarriers),
75 m_useIdealRrc (useIdealRrc),
76 m_handoverTime (handoverTime),
77 m_delayThreshold (delayThreshold),
78 m_simulationDuration (simulationDuration),
81 {}
82
83private:
84 virtual void DoRun (void);
85
94 void UeHandoverStartCallback (std::string context, uint64_t imsi,
95 uint16_t cellid, uint16_t rnti, uint16_t targetCellId);
103 void UeHandoverEndOkCallback (std::string context, uint64_t imsi,
104 uint16_t cellid, uint16_t rnti);
113 void EnbHandoverStartCallback (std::string context, uint64_t imsi,
114 uint16_t cellid, uint16_t rnti, uint16_t targetCellId);
122 void EnbHandoverEndOkCallback (std::string context, uint64_t imsi,
123 uint16_t cellid, uint16_t rnti);
124
130
133};
134
135
136void
138{
139 NS_LOG_INFO ("-----test case: ideal RRC = " << m_useIdealRrc << " handover time = "
140 << m_handoverTime.As (Time::S) << "-----");
141
142 /*
143 * Helpers.
144 */
145 auto epcHelper = CreateObject<PointToPointEpcHelper> ();
146
147 auto lteHelper = CreateObject<LteHelper> ();
148 lteHelper->SetEpcHelper (epcHelper);
149 lteHelper->SetAttribute ("UseIdealRrc", BooleanValue (m_useIdealRrc));
150 lteHelper->SetAttribute ("NumberOfComponentCarriers", UintegerValue (m_numberOfComponentCarriers));
151
152 auto ccHelper = CreateObject<CcHelper> ();
153 ccHelper->SetUlEarfcn (100 + 18000);
154 ccHelper->SetDlEarfcn (100);
155 ccHelper->SetUlBandwidth (25);
156 ccHelper->SetDlBandwidth (25);
157 ccHelper->SetNumberOfComponentCarriers (m_numberOfComponentCarriers);
158
159 /*
160 * Physical layer.
161 *
162 * eNodeB 0 UE eNodeB 1
163 *
164 * x ----------------------- x ----------------------- x
165 * 500 m 500 m
166 */
167 // Create nodes.
168 NodeContainer enbNodes;
169 enbNodes.Create (2);
170 auto ueNode = CreateObject<Node> ();
171
172 // Setup mobility
173 auto posAlloc = CreateObject<ListPositionAllocator> ();
174 posAlloc->Add (Vector (0, 0, 0));
175 posAlloc->Add (Vector (1000, 0, 0));
176 posAlloc->Add (Vector (500, 0, 0));
177
178 MobilityHelper mobilityHelper;
179 mobilityHelper.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
180 mobilityHelper.SetPositionAllocator (posAlloc);
181 mobilityHelper.Install (enbNodes);
182 mobilityHelper.Install (ueNode);
183
184 /*
185 * Link layer.
186 */
187 auto enbDevs = lteHelper->InstallEnbDevice (enbNodes);
188 auto ueDev = lteHelper->InstallUeDevice (ueNode).Get (0);
189
190 /*
191 * Network layer.
192 */
193 InternetStackHelper inetStackHelper;
194 inetStackHelper.Install (ueNode);
196 ueIfs = epcHelper->AssignUeIpv4Address (ueDev);
197
198 // Setup traces.
199 Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/HandoverStart",
201 Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/HandoverEndOk",
203
204 Config::Connect ("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverStart",
206 Config::Connect ("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverEndOk",
208
209 // Prepare handover.
210 lteHelper->AddX2Interface (enbNodes);
211 lteHelper->Attach (ueDev, enbDevs.Get (0));
212 lteHelper->HandoverRequest (m_handoverTime, ueDev, enbDevs.Get (0), enbDevs.Get (1));
213
214 // Run simulation.
215 Simulator::Stop (m_simulationDuration);
216 Simulator::Run ();
217 Simulator::Destroy ();
218
219} // end of void LteHandoverDelayTestCase::DoRun ()
220
221
222void
224 uint64_t imsi, uint16_t cellid, uint16_t rnti, uint16_t targetCellId)
225{
226 NS_LOG_FUNCTION (this << context);
228}
229
230void
232 uint64_t imsi, uint16_t cellid, uint16_t rnti)
233{
234 NS_LOG_FUNCTION (this << context);
237
238 NS_LOG_DEBUG (this << " UE delay = " << delay.As (Time::S));
240 "UE handover delay is higher than the allowed threshold "
241 << "(ideal RRC = " << m_useIdealRrc
242 << " handover time = " << m_handoverTime.As (Time::S) << ")");
243}
244
245
246void
248 uint64_t imsi, uint16_t cellid, uint16_t rnti, uint16_t targetCellId)
249{
250 NS_LOG_FUNCTION (this << context);
252}
253
254void
256 uint64_t imsi, uint16_t cellid, uint16_t rnti)
257{
258 NS_LOG_FUNCTION (this << context);
261
262 NS_LOG_DEBUG (this << " eNodeB delay = " << delay.As (Time::S));
264 "eNodeB handover delay is higher than the allowed threshold "
265 << "(ideal RRC = " << m_useIdealRrc
266 << " handover time = " << m_handoverTime.As (Time::S) << ")");
267}
268
269
270
279{
280public:
282 : TestSuite ("lte-handover-delay", TestSuite::SYSTEM)
283 {
284 //LogComponentEnable ("LteHandoverDelayTest", LOG_PREFIX_TIME);
285 //LogComponentEnable ("LteHandoverDelayTest", LOG_DEBUG);
286 //LogComponentEnable ("LteHandoverDelayTest", LOG_INFO);
287
288 // HANDOVER DELAY TEST CASES WITH IDEAL RRC (THRESHOLD = 0.005 sec)
289
290 for (Time handoverTime = Seconds (0.100); handoverTime < Seconds (0.110);
291 handoverTime += Seconds (0.001))
292 {
293 // arguments: useIdealRrc, handoverTime, delayThreshold, simulationDuration
295 new LteHandoverDelayTestCase (1, true, handoverTime, Seconds (0.005),
296 Seconds (0.200)), TestCase::QUICK);
298 new LteHandoverDelayTestCase (2, true, handoverTime, Seconds (0.005),
299 Seconds (0.200)), TestCase::QUICK);
301 new LteHandoverDelayTestCase (4, true, handoverTime, Seconds (0.005),
302 Seconds (0.200)), TestCase::QUICK);
303 }
304
305 // HANDOVER DELAY TEST CASES WITH REAL RRC (THRESHOLD = 0.020 sec)
306
307 for (Time handoverTime = Seconds (0.100); handoverTime < Seconds (0.110);
308 handoverTime += Seconds (0.001))
309 {
310 // arguments: useIdealRrc, handoverTime, delayThreshold, simulationDuration
312 new LteHandoverDelayTestCase (1, false, handoverTime, Seconds (0.020),
313 Seconds (0.200)), TestCase::QUICK);
315 new LteHandoverDelayTestCase (2, false, handoverTime, Seconds (0.020),
316 Seconds (0.200)), TestCase::QUICK);
318 new LteHandoverDelayTestCase (4, false, handoverTime, Seconds (0.020),
319 Seconds (0.200)), TestCase::QUICK);
320 }
321 }
Verifying that the time needed for handover is under a specified threshold.
void EnbHandoverStartCallback(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti, uint16_t targetCellId)
ENB handover start callback function.
Time m_simulationDuration
the simulation duration
virtual void DoRun(void)
Implementation to actually run this TestCase.
uint8_t m_numberOfComponentCarriers
Number of component carriers.
void UeHandoverEndOkCallback(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
UE handover end OK callback function.
void UeHandoverStartCallback(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti, uint16_t targetCellId)
UE handover start callback function.
Time m_delayThreshold
the delay threshold
void EnbHandoverEndOkCallback(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
ENB handover end OK callback function.
Time m_ueHandoverStart
UE handover start time.
LteHandoverDelayTestCase(uint8_t numberOfComponentCarriers, bool useIdealRrc, Time handoverTime, Time delayThreshold, Time simulationDuration)
Constructor.
Time m_enbHandoverStart
ENB handover start time.
Lte Handover Delay Test Suite.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
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 SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
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.
encapsulates test code
Definition: test.h:994
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
A suite of tests to run.
Definition: test.h:1188
@ SYSTEM
This test suite implements a System Test.
Definition: test.h:1198
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
TimeWithUnit As(const enum Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
Definition: time.cc:432
Hold an unsigned integer type.
Definition: uinteger.h:44
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:920
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#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:281
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
#define NS_TEST_ASSERT_MSG_LT(actual, limit, msg)
Test that an actual value is less than a limit and report and abort if not.
Definition: test.h:675
LteHandoverDelayTestSuite g_lteHandoverDelayTestSuite
the test suite
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
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...
Definition: callback.h:1648