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