A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
lena-x2-handover-measures.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2013 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Manuel Requena <manuel.requena@cttc.es>
7 */
8
9#include "ns3/applications-module.h"
10#include "ns3/core-module.h"
11#include "ns3/internet-module.h"
12#include "ns3/lte-module.h"
13#include "ns3/mobility-module.h"
14#include "ns3/network-module.h"
15#include "ns3/point-to-point-module.h"
16// #include "ns3/config-store.h"
17
18using namespace ns3;
19
20NS_LOG_COMPONENT_DEFINE("LenaX2HandoverMeasures");
21
22void
23NotifyConnectionEstablishedUe(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
24{
25 std::cout << context << " UE IMSI " << imsi << ": connected to CellId " << cellid
26 << " with RNTI " << rnti << std::endl;
27}
28
29void
30NotifyHandoverStartUe(std::string context,
31 uint64_t imsi,
32 uint16_t cellid,
33 uint16_t rnti,
34 uint16_t targetCellId)
35{
36 std::cout << context << " UE IMSI " << imsi << ": previously connected to CellId " << cellid
37 << " with RNTI " << rnti << ", doing handover to CellId " << targetCellId
38 << std::endl;
39}
40
41void
42NotifyHandoverEndOkUe(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
43{
44 std::cout << context << " UE IMSI " << imsi << ": successful handover to CellId " << cellid
45 << " with RNTI " << rnti << std::endl;
46}
47
48void
49NotifyConnectionEstablishedEnb(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
50{
51 std::cout << context << " eNB CellId " << cellid << ": successful connection of UE with IMSI "
52 << imsi << " RNTI " << rnti << std::endl;
53}
54
55void
56NotifyHandoverStartEnb(std::string context,
57 uint64_t imsi,
58 uint16_t cellid,
59 uint16_t rnti,
60 uint16_t targetCellId)
61{
62 std::cout << context << " eNB CellId " << cellid << ": start handover of UE with IMSI " << imsi
63 << " RNTI " << rnti << " to CellId " << targetCellId << std::endl;
64}
65
66void
67NotifyHandoverEndOkEnb(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
68{
69 std::cout << context << " eNB CellId " << cellid << ": completed handover of UE with IMSI "
70 << imsi << " RNTI " << rnti << std::endl;
71}
72
73/**
74 * Sample simulation script for an automatic X2-based handover based on the RSRQ measures.
75 * It instantiates two eNodeB, attaches one UE to the 'source' eNB.
76 * The UE moves between both eNBs, it reports measures to the serving eNB and
77 * the 'source' (serving) eNB triggers the handover of the UE towards
78 * the 'target' eNB when it considers it is a better eNB.
79 */
80int
81main(int argc, char* argv[])
82{
83 // LogLevel logLevel = (LogLevel)(LOG_PREFIX_ALL | LOG_LEVEL_ALL);
84
85 // LogComponentEnable ("LteHelper", logLevel);
86 // LogComponentEnable ("EpcHelper", logLevel);
87 // LogComponentEnable ("EpcEnbApplication", logLevel);
88 // LogComponentEnable ("EpcMmeApplication", logLevel);
89 // LogComponentEnable ("EpcPgwApplication", logLevel);
90 // LogComponentEnable ("EpcSgwApplication", logLevel);
91 // LogComponentEnable ("EpcX2", logLevel);
92
93 // LogComponentEnable ("LteEnbRrc", logLevel);
94 // LogComponentEnable ("LteEnbNetDevice", logLevel);
95 // LogComponentEnable ("LteUeRrc", logLevel);
96 // LogComponentEnable ("LteUeNetDevice", logLevel);
97 // LogComponentEnable ("A2A4RsrqHandoverAlgorithm", logLevel);
98 // LogComponentEnable ("A3RsrpHandoverAlgorithm", logLevel);
99
100 uint16_t numberOfUes = 1;
101 uint16_t numberOfEnbs = 2;
102 uint16_t numBearersPerUe = 0;
103 double distance = 500.0; // m
104 double yForUe = 500.0; // m
105 double speed = 20; // m/s
106 double simTime = (double)(numberOfEnbs + 1) * distance / speed; // 1500 m / 20 m/s = 75 secs
107 double enbTxPowerDbm = 46.0;
108
109 // change some default attributes so that they are reasonable for
110 // this scenario, but do this before processing command line
111 // arguments, so that the user is allowed to override these settings
112 Config::SetDefault("ns3::UdpClient::Interval", TimeValue(MilliSeconds(10)));
113 Config::SetDefault("ns3::UdpClient::MaxPackets", UintegerValue(1000000));
114 Config::SetDefault("ns3::LteHelper::UseIdealRrc", BooleanValue(true));
115
116 // Command line arguments
117 CommandLine cmd(__FILE__);
118 cmd.AddValue("simTime", "Total duration of the simulation (in seconds)", simTime);
119 cmd.AddValue("speed", "Speed of the UE (default = 20 m/s)", speed);
120 cmd.AddValue("enbTxPowerDbm", "TX power [dBm] used by HeNBs (default = 46.0)", enbTxPowerDbm);
121
122 cmd.Parse(argc, argv);
123
126 lteHelper->SetEpcHelper(epcHelper);
127 lteHelper->SetSchedulerType("ns3::RrFfMacScheduler");
128
129 lteHelper->SetHandoverAlgorithmType("ns3::A2A4RsrqHandoverAlgorithm");
130 lteHelper->SetHandoverAlgorithmAttribute("ServingCellThreshold", UintegerValue(30));
131 lteHelper->SetHandoverAlgorithmAttribute("NeighbourCellOffset", UintegerValue(1));
132
133 // lteHelper->SetHandoverAlgorithmType ("ns3::A3RsrpHandoverAlgorithm");
134 // lteHelper->SetHandoverAlgorithmAttribute ("Hysteresis",
135 // DoubleValue (3.0));
136 // lteHelper->SetHandoverAlgorithmAttribute ("TimeToTrigger",
137 // TimeValue (MilliSeconds (256)));
138
139 Ptr<Node> pgw = epcHelper->GetPgwNode();
140
141 // Create a single RemoteHost
142 NodeContainer remoteHostContainer;
143 remoteHostContainer.Create(1);
144 Ptr<Node> remoteHost = remoteHostContainer.Get(0);
146 internet.Install(remoteHostContainer);
147
148 // Create the Internet
150 p2ph.SetDeviceAttribute("DataRate", DataRateValue(DataRate("100Gb/s")));
151 p2ph.SetDeviceAttribute("Mtu", UintegerValue(1500));
152 p2ph.SetChannelAttribute("Delay", TimeValue(Seconds(0.010)));
153 NetDeviceContainer internetDevices = p2ph.Install(pgw, remoteHost);
154 Ipv4AddressHelper ipv4h;
155 ipv4h.SetBase("1.0.0.0", "255.0.0.0");
156 Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign(internetDevices);
157 Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress(1);
158
159 // Routing of the Internet Host (towards the LTE network)
160 Ipv4StaticRoutingHelper ipv4RoutingHelper;
161 Ptr<Ipv4StaticRouting> remoteHostStaticRouting =
162 ipv4RoutingHelper.GetStaticRouting(remoteHost->GetObject<Ipv4>());
163 // interface 0 is localhost, 1 is the p2p device
164 remoteHostStaticRouting->AddNetworkRouteTo(Ipv4Address("7.0.0.0"), Ipv4Mask("255.0.0.0"), 1);
165
166 /*
167 * Network topology:
168 *
169 * | + --------------------------------------------------------->
170 * | UE
171 * |
172 * | d d d
173 * y | |-------------------x-------------------x-------------------
174 * | | eNodeB eNodeB
175 * | d |
176 * | |
177 * | | d = distance
178 * o (0, 0, 0) y = yForUe
179 */
180
181 NodeContainer ueNodes;
182 NodeContainer enbNodes;
183 enbNodes.Create(numberOfEnbs);
184 ueNodes.Create(numberOfUes);
185
186 // Install Mobility Model in eNB
188 for (uint16_t i = 0; i < numberOfEnbs; i++)
189 {
190 Vector enbPosition(distance * (i + 1), distance, 0);
191 enbPositionAlloc->Add(enbPosition);
192 }
193 MobilityHelper enbMobility;
194 enbMobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
195 enbMobility.SetPositionAllocator(enbPositionAlloc);
196 enbMobility.Install(enbNodes);
197
198 // Install Mobility Model in UE
199 MobilityHelper ueMobility;
200 ueMobility.SetMobilityModel("ns3::ConstantVelocityMobilityModel");
201 ueMobility.Install(ueNodes);
202 ueNodes.Get(0)->GetObject<MobilityModel>()->SetPosition(Vector(0, yForUe, 0));
203 ueNodes.Get(0)->GetObject<ConstantVelocityMobilityModel>()->SetVelocity(Vector(speed, 0, 0));
204
205 // Install LTE Devices in eNB and UEs
206 Config::SetDefault("ns3::LteEnbPhy::TxPower", DoubleValue(enbTxPowerDbm));
207 NetDeviceContainer enbLteDevs = lteHelper->InstallEnbDevice(enbNodes);
208 NetDeviceContainer ueLteDevs = lteHelper->InstallUeDevice(ueNodes);
209
210 // Install the IP stack on the UEs
211 internet.Install(ueNodes);
212 Ipv4InterfaceContainer ueIpIfaces;
213 ueIpIfaces = epcHelper->AssignUeIpv4Address(NetDeviceContainer(ueLteDevs));
214
215 // Attach all UEs to the first eNodeB
216 for (uint16_t i = 0; i < numberOfUes; i++)
217 {
218 lteHelper->Attach(ueLteDevs.Get(i), enbLteDevs.Get(0));
219 }
220
221 NS_LOG_LOGIC("setting up applications");
222
223 // Install and start applications on UEs and remote host
224 uint16_t dlPort = 10000;
225 uint16_t ulPort = 20000;
226
227 // randomize a bit start times to avoid simulation artifacts
228 // (e.g., buffer overflows due to packet transmissions happening
229 // exactly at the same time)
231 startTimeSeconds->SetAttribute("Min", DoubleValue(0));
232 startTimeSeconds->SetAttribute("Max", DoubleValue(0.010));
233
234 for (uint32_t u = 0; u < numberOfUes; ++u)
235 {
236 Ptr<Node> ue = ueNodes.Get(u);
237 // Set the default gateway for the UE
238 Ptr<Ipv4StaticRouting> ueStaticRouting =
239 ipv4RoutingHelper.GetStaticRouting(ue->GetObject<Ipv4>());
240 ueStaticRouting->SetDefaultRoute(epcHelper->GetUeDefaultGatewayAddress(), 1);
241
242 for (uint32_t b = 0; b < numBearersPerUe; ++b)
243 {
244 ++dlPort;
245 ++ulPort;
246
249
250 NS_LOG_LOGIC("installing UDP DL app for UE " << u);
251 UdpClientHelper dlClientHelper(ueIpIfaces.GetAddress(u), dlPort);
252 clientApps.Add(dlClientHelper.Install(remoteHost));
253 PacketSinkHelper dlPacketSinkHelper("ns3::UdpSocketFactory",
255 serverApps.Add(dlPacketSinkHelper.Install(ue));
256
257 NS_LOG_LOGIC("installing UDP UL app for UE " << u);
258 UdpClientHelper ulClientHelper(remoteHostAddr, ulPort);
259 clientApps.Add(ulClientHelper.Install(ue));
260 PacketSinkHelper ulPacketSinkHelper("ns3::UdpSocketFactory",
262 serverApps.Add(ulPacketSinkHelper.Install(remoteHost));
263
266 dlpf.localPortStart = dlPort;
267 dlpf.localPortEnd = dlPort;
268 tft->Add(dlpf);
270 ulpf.remotePortStart = ulPort;
271 ulpf.remotePortEnd = ulPort;
272 tft->Add(ulpf);
274 lteHelper->ActivateDedicatedEpsBearer(ueLteDevs.Get(u), bearer, tft);
275
276 Time startTime = Seconds(startTimeSeconds->GetValue());
277 serverApps.Start(startTime);
278 clientApps.Start(startTime);
279
280 } // end for b
281 }
282
283 // Add X2 interface
284 lteHelper->AddX2Interface(enbNodes);
285
286 // X2-based Handover
287 // lteHelper->HandoverRequest (Seconds (0.100), ueLteDevs.Get (0), enbLteDevs.Get (0),
288 // enbLteDevs.Get (1));
289
290 // Uncomment to enable PCAP tracing
291 // p2ph.EnablePcapAll("lena-x2-handover-measures");
292
293 lteHelper->EnablePhyTraces();
294 lteHelper->EnableMacTraces();
295 lteHelper->EnableRlcTraces();
296 lteHelper->EnablePdcpTraces();
297 Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats();
298 rlcStats->SetAttribute("EpochDuration", TimeValue(Seconds(1.0)));
299 Ptr<RadioBearerStatsCalculator> pdcpStats = lteHelper->GetPdcpStats();
300 pdcpStats->SetAttribute("EpochDuration", TimeValue(Seconds(1.0)));
301
302 // connect custom trace sinks for RRC connection establishment and handover notification
303 Config::Connect("/NodeList/*/DeviceList/*/LteEnbRrc/ConnectionEstablished",
305 Config::Connect("/NodeList/*/DeviceList/*/LteUeRrc/ConnectionEstablished",
307 Config::Connect("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverStart",
309 Config::Connect("/NodeList/*/DeviceList/*/LteUeRrc/HandoverStart",
311 Config::Connect("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverEndOk",
313 Config::Connect("/NodeList/*/DeviceList/*/LteUeRrc/HandoverEndOk",
315
316 Simulator::Stop(Seconds(simTime));
318
319 // GtkConfigStore config;
320 // config.ConfigureAttributes ();
321
323 return 0;
324}
holds a vector of ns3::Application pointers.
Parse command-line arguments.
Mobility model for which the current speed does not change once it has been set and until it is set a...
Class for representing data rates.
Definition data-rate.h:78
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition double.h:31
This class contains the specification of EPS Bearers.
Definition eps-bearer.h:80
@ NGBR_VIDEO_TCP_DEFAULT
Non-GBR TCP-based Video (Buffered Streaming, e.g., www, e-mail...)
Definition eps-bearer.h:115
an Inet address class
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.
static Ipv4Address GetAny()
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition ipv4.h:69
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
a class to represent an Ipv4 address mask
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...
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 the current position and velocity of an object.
holds a vector of ns3::NetDevice pointers
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
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.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition object.h:511
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
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)
Smart pointer class similar to boost::intrusive_ptr.
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
Simulation virtual time values and global simulation resolution.
Definition nstime.h:94
Create a client application which sends UDP packets carrying a 32bit sequence number and a 64 bit tim...
Hold an unsigned integer type.
Definition uinteger.h:34
void SetDefault(std::string name, const AttributeValue &value)
Definition config.cc:883
void Connect(std::string path, const CallbackBase &cb)
Definition config.cc:967
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:191
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition log.h:271
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Definition object.h:619
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Definition ptr.h:436
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1308
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition nstime.h:1320
void NotifyHandoverEndOkUe(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
void NotifyConnectionEstablishedUe(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
void NotifyHandoverStartUe(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti, uint16_t targetCellId)
void NotifyHandoverStartEnb(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti, uint16_t targetCellId)
void NotifyConnectionEstablishedEnb(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
void NotifyHandoverEndOkEnb(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
serverApps
Definition first.py:43
clientApps
Definition first.py:53
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
Implement the data structure representing a TrafficFlowTemplate Packet Filter.
Definition epc-tft.h:60
uint16_t localPortEnd
end of the port number range of the UE
Definition epc-tft.h:121
uint16_t remotePortEnd
end of the port number range of the remote host
Definition epc-tft.h:119
uint16_t remotePortStart
start of the port number range of the remote host
Definition epc-tft.h:118
uint16_t localPortStart
start of the port number range of the UE
Definition epc-tft.h:120