A Discrete-Event Network Simulator
API
lte-test-aggregation-throughput-scale.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2017 Alexander Krotov
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: Alexander Krotov <krotov@iitp.ru>
19  *
20  */
21 
23 
24 #include <algorithm>
25 #include <numeric>
26 
27 #include <ns3/application-container.h>
28 #include <ns3/friis-spectrum-propagation-loss.h>
29 #include <ns3/internet-stack-helper.h>
30 #include <ns3/ipv4-address-helper.h>
31 #include <ns3/ipv4-interface-container.h>
32 #include <ns3/ipv4-static-routing-helper.h>
33 #include <ns3/log.h>
34 #include <ns3/lte-enb-net-device.h>
35 #include <ns3/lte-helper.h>
36 #include <ns3/lte-ue-net-device.h>
37 #include <ns3/lte-ue-rrc.h>
38 #include <ns3/mobility-helper.h>
39 #include <ns3/net-device-container.h>
40 #include <ns3/node-container.h>
41 #include <ns3/packet-sink.h>
42 #include <ns3/point-to-point-epc-helper.h>
43 #include <ns3/point-to-point-helper.h>
44 #include <ns3/simulator.h>
45 #include <ns3/udp-client.h>
46 
47 using namespace ns3;
48 
49 NS_LOG_COMPONENT_DEFINE ("LteAggregationThroughputScaleTest");
50 
52  : TestSuite ("lte-aggregation-throughput-scale", SYSTEM)
53 {
54  AddTestCase (new LteAggregationThroughputScaleTestCase ("Carrier aggregation throughput scale"), TestCase::QUICK);
55 }
56 
58 
60  : TestCase (name)
61 {
62  NS_LOG_FUNCTION (this << GetName ());
63 }
64 
65 
67 {
68  NS_LOG_FUNCTION (this << GetName ());
69 }
70 
71 double
72 LteAggregationThroughputScaleTestCase::GetThroughput (uint8_t numberOfComponentCarriers)
73 {
74  NS_LOG_FUNCTION (this << GetName ());
75 
76  auto lteHelper = CreateObject<LteHelper> ();
77  lteHelper->SetAttribute ("PathlossModel", TypeIdValue (ns3::FriisSpectrumPropagationLossModel::GetTypeId ()));
78  lteHelper->SetAttribute ("NumberOfComponentCarriers", UintegerValue (numberOfComponentCarriers));
79  lteHelper->SetAttribute ("EnbComponentCarrierManager", StringValue ("ns3::RrComponentCarrierManager"));
80 
81  auto epcHelper = CreateObject<PointToPointEpcHelper> ();
82  lteHelper->SetEpcHelper (epcHelper);
83 
84  auto cch = CreateObject<CcHelper> ();
85  cch->SetUlEarfcn (100 + 18000);
86  cch->SetDlEarfcn (100);
87  cch->SetUlBandwidth (25);
88  cch->SetDlBandwidth (25);
89  cch->SetNumberOfComponentCarriers (numberOfComponentCarriers);
90 
91  const auto ccm = cch->EquallySpacedCcs ();
92  lteHelper->SetCcPhyParams (ccm);
93 
94  auto enbNode = CreateObject<Node> ();
95  auto ueNode = CreateObject<Node> ();
96  auto pgwNode = epcHelper->GetPgwNode ();
97 
99  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
100  mobility.Install (enbNode);
101  mobility.Install (ueNode);
102 
103  InternetStackHelper internet;
104  internet.Install (ueNode);
105 
106  Ipv4AddressHelper ipv4h;
107  ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
108 
109  Ipv4StaticRoutingHelper ipv4RoutingHelper;
110  auto ueStaticRouting = ipv4RoutingHelper.GetStaticRouting (ueNode->GetObject<Ipv4> ());
111  ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1);
112 
113  auto enbDev = DynamicCast<LteEnbNetDevice> (lteHelper->InstallEnbDevice (enbNode).Get (0));
114  auto ueDevs = lteHelper->InstallUeDevice (ueNode);
115  auto ueDev = DynamicCast<LteUeNetDevice> (ueDevs.Get (0));
116 
117  Ipv4InterfaceContainer ueIpIface = epcHelper->AssignUeIpv4Address (ueDevs);
118 
119  // Attach to last CC as primary
120  ueDev->SetDlEarfcn (ccm.at (numberOfComponentCarriers - 1).GetDlEarfcn ());
121  lteHelper->Attach (ueDevs);
122  m_expectedCellId = enbDev->GetCcMap ().at (numberOfComponentCarriers - 1)->GetCellId ();
123 
124  // Applications
125  const uint16_t port = 21;
126 
128 
129  auto sink = CreateObject<PacketSink> ();
130  sink->SetAttribute ("Protocol", StringValue ("ns3::UdpSocketFactory"));
131  sink->SetAttribute ("Local", AddressValue (InetSocketAddress (ueIpIface.GetAddress (0), port)));
132  ueNode->AddApplication (sink);
133  apps.Add (sink);
134 
135  auto client = CreateObject<UdpClient> ();
136  client->SetAttribute ("RemotePort", UintegerValue (port));
137  client->SetAttribute ("MaxPackets", UintegerValue (1000000));
138  client->SetAttribute ("Interval", TimeValue (Seconds (0.0001)));
139  client->SetAttribute ("PacketSize", UintegerValue (1000));
140  client->SetAttribute ("RemoteAddress", AddressValue (ueIpIface.GetAddress (0)));
141  pgwNode->AddApplication (client);
142 
143  apps.Add (client);
144  apps.Start (Seconds (1.0));
145 
146  Simulator::Stop (Seconds (2.0));
147  Simulator::Run ();
148 
149  m_actualCellId = ueDev->GetRrc ()->GetCellId ();
150 
151  Simulator::Destroy ();
152  return 8e-6 * sink->GetTotalRx ();
153 }
154 
155 void
157 {
158  std::vector<double> throughputs;
159  for (uint8_t i = 1; i <= 4; i++)
160  {
161  throughputs.push_back (GetThroughput (i) / i);
162  NS_TEST_ASSERT_MSG_EQ (m_expectedCellId, m_actualCellId, "UE has attached to an unexpected cell");
163  }
164  double average = std::accumulate(begin (throughputs), end (throughputs), 0.0) / throughputs.size ();
165  for (double throughput: throughputs)
166  {
167  NS_TEST_ASSERT_MSG_EQ_TOL (throughput, average, average * 0.01, "Throughput does not scale with number of component carriers");
168  }
169 }
Ptr< PacketSink > sink
Definition: wifi-tcp.cc:45
holds a vector of ns3::Application pointers.
an Inet address class
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
holds a vector of std::pair of Ptr and interface index.
Hold variables of type string.
Definition: string.h:41
void Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container. ...
A suite of tests to run.
Definition: test.h:1342
static LteAggregationThroughputScaleTestSuite g_lteAggregationThroughputScaleTestSuite
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
aggregate IP/TCP/UDP functionality to existing Nodes.
encapsulates test code
Definition: test.h:1155
uint16_t port
Definition: dsdv-manet.cc:44
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
tuple mobility
Definition: third.py:101
AttributeValue implementation for Time.
Definition: nstime.h:1055
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
LteAggregationThroughputScaleTestCase(std::string name)
Creates an instance of the carrier aggregation throughput scaling test case.
Hold an unsigned integer type.
Definition: uinteger.h:44
#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:168
AttributeValue implementation for TypeId.
Definition: type-id.h:608
virtual void DoRun()
Setup the simulation, run it, and verify the result.
Test suite for executing carrier aggregation throughput scaling test case.
Testing that UE throughput scales linearly with number of component carriers.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
#define NS_TEST_ASSERT_MSG_EQ_TOL(actual, limit, tol, msg)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report and...
Definition: test.h:380
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition: ipv4.h:76
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
Helper class used to assign positions and mobility models to nodes.
AttributeValue implementation for Address.
Definition: address.h:278
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 that adds ns3::Ipv4StaticRouting objects.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:993
double GetThroughput(uint8_t numberOfComponentCarriers)
std::string GetName(void) const
Definition: test.cc:370
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
uint64_t GetTotalRx() const
Definition: packet-sink.cc:78
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:185
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.