A Discrete-Event Network Simulator
API
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 
29 using namespace ns3;
30 
31 NS_LOG_COMPONENT_DEFINE("LenaX2HandoverMeasures");
32 
33 void
34 NotifyConnectionEstablishedUe(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 
40 void
41 NotifyHandoverStartUe(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 
52 void
53 NotifyHandoverEndOkUe(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 
59 void
60 NotifyConnectionEstablishedEnb(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 
66 void
67 NotifyHandoverStartEnb(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 
77 void
78 NotifyHandoverEndOkEnb(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 
91 int
92 main(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
160  PointToPointHelper p2ph;
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));
328  Simulator::Run();
329 
330  // GtkConfigStore config;
331  // config.ConfigureAttributes ();
332 
334  return 0;
335 }
holds a vector of ns3::Application pointers.
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...
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...
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
Ptr< RadioBearerStatsCalculator > GetRlcStats()
Definition: lte-helper.cc:1701
Ptr< RadioBearerStatsCalculator > GetPdcpStats()
Definition: lte-helper.cc:1716
void SetHandoverAlgorithmAttribute(std::string n, const AttributeValue &v)
Set an attribute for the handover algorithm to be created.
Definition: lte-helper.cc:348
void EnablePhyTraces()
Enable trace sinks for PHY layer.
Definition: lte-helper.cc:1616
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:485
void SetHandoverAlgorithmType(std::string type)
Set the type of handover algorithm to be used by eNodeB devices.
Definition: lte-helper.cc:340
void EnablePdcpTraces()
Enable trace sinks for PDCP layer.
Definition: lte-helper.cc:1707
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
Definition: lte-helper.cc:292
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 EnableRlcTraces()
Enable trace sinks for RLC layer.
Definition: lte-helper.cc:1558
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:500
void EnableMacTraces()
Enable trace sinks for MAC layer.
Definition: lte-helper.cc:1659
void AddX2Interface(NodeContainer enbNodes)
Create an X2 interface between all the eNBs in a given set.
Definition: lte-helper.cc:1313
uint8_t ActivateDedicatedEpsBearer(NetDeviceContainer ueDevices, EpsBearer bearer, Ptr< EpcTft > tft)
Activate a dedicated EPS bearer on a given set of UE devices.
Definition: lte-helper.cc:1154
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.
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.
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.
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
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)
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
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
double GetValue(double min, double max)
Get the next random value drawn from the distribution.
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:890
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:974
#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
void(* DataRate)(DataRate oldValue, DataRate newValue)
TracedValue callback signature for DataRate.
Definition: data-rate.h:327
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
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:54
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:704
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