1 /* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2011, 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
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:Gaurav Sathe <gaurav.sathe@tcs.com>
19  */
20 
21 #include <iostream>
22 #include <sstream>
23 #include <string>
24 
25 #include <ns3/object.h>
26 #include <ns3/spectrum-interference.h>
27 #include <ns3/spectrum-error-model.h>
28 #include <ns3/log.h>
29 #include <ns3/test.h>
30 #include <ns3/simulator.h>
31 #include <ns3/packet.h>
32 #include <ns3/ptr.h>
33 #include "ns3/radio-bearer-stats-calculator.h"
34 #include <ns3/constant-position-mobility-model.h>
35 #include <ns3/eps-bearer.h>
36 #include <ns3/node-container.h>
37 #include <ns3/mobility-helper.h>
38 #include <ns3/net-device-container.h>
39 #include <ns3/lte-ue-net-device.h>
40 #include <ns3/lte-enb-net-device.h>
41 #include <ns3/lte-ue-rrc.h>
42 #include <ns3/lte-helper.h>
43 #include "ns3/string.h"
44 #include "ns3/double.h"
45 #include <ns3/lte-enb-phy.h>
46 #include <ns3/lte-ue-phy.h>
47 #include <ns3/boolean.h>
48 #include <ns3/enum.h>
49 
50 #include "ns3/point-to-point-epc-helper.h"
51 #include "ns3/network-module.h"
52 #include "ns3/ipv4-global-routing-helper.h"
53 #include "ns3/internet-module.h"
54 #include "ns3/applications-module.h"
55 #include "ns3/point-to-point-helper.h"
56 
57 #include "lte-test-deactivate-bearer.h"
58 
59 NS_LOG_COMPONENT_DEFINE ("LenaTestDeactivateBearer");
60 
61 namespace ns3 {
62 
LenaTestBearerDeactivateSuite()63 LenaTestBearerDeactivateSuite::LenaTestBearerDeactivateSuite ()
64   : TestSuite ("lte-test-deactivate-bearer", SYSTEM)
65 {
66   NS_LOG_INFO ("creating LenaTestPssFfMacSchedulerSuite");
67 
68   bool errorModel = false;
69 
70   // Test Case: homogeneous flow test in PSS (different distance)
71   // Traffic1 info
72   //   UDP traffic: payload size = 100 bytes, interval = 1 ms
73   //   UDP rate in scheduler: (payload + RLC header + PDCP header + IP header + UDP header) * 1000 byte/sec -> 132000 byte/rate
74   // Maximum throughput = 3 / ( 1/2196000 + 1/1191000 + 1/1383000) = 1486569 byte/s
75   // 132000 * 3 = 396000 < 1209046 -> estimated throughput in downlink = 132000 byte/sec
76   std::vector<uint16_t> dist_1;
77 
78   dist_1.push_back (0);       // User 0 distance --> MCS 28
79   dist_1.push_back (0);    // User 1 distance --> MCS 22
80   dist_1.push_back (0);    // User 2 distance --> MCS 20
81 
82   std::vector<uint16_t> packetSize_1;
83 
84   packetSize_1.push_back (100); //1
85   packetSize_1.push_back (100); //2
86   packetSize_1.push_back (100); //3
87 
88   std::vector<uint32_t> estThrPssDl_1;
89 
90   estThrPssDl_1.push_back (132000); // User 0 estimated TTI throughput from PSS
91   estThrPssDl_1.push_back (132000); // User 1 estimated TTI throughput from PSS
92   estThrPssDl_1.push_back (132000); // User 2 estimated TTI throughput from PSS
93 
94   AddTestCase (new LenaDeactivateBearerTestCase (dist_1,estThrPssDl_1,packetSize_1,1,errorModel,true), TestCase::QUICK);
95 }
96 
97 static LenaTestBearerDeactivateSuite lenaTestBearerDeactivateSuite; ///< the test suite
98 
99 
100 std::string
BuildNameString(uint16_t nUser,std::vector<uint16_t> dist)101 LenaDeactivateBearerTestCase::BuildNameString (uint16_t nUser, std::vector<uint16_t> dist)
102 {
103   std::ostringstream oss;
104   oss << "distances (m) = [ ";
105   for (std::vector<uint16_t>::iterator it = dist.begin (); it != dist.end (); ++it)
106     {
107       oss << *it << " ";
108     }
109   oss << "]";
110   return oss.str ();
111 }
112 
LenaDeactivateBearerTestCase(std::vector<uint16_t> dist,std::vector<uint32_t> estThrPssDl,std::vector<uint16_t> packetSize,uint16_t interval,bool errorModelEnabled,bool useIdealRrc)113 LenaDeactivateBearerTestCase::LenaDeactivateBearerTestCase (std::vector<uint16_t> dist, std::vector<uint32_t> estThrPssDl, std::vector<uint16_t> packetSize, uint16_t interval,bool errorModelEnabled, bool useIdealRrc)
114   : TestCase (BuildNameString (dist.size (), dist)),
115     m_nUser (dist.size ()),
116     m_dist (dist),
117     m_packetSize (packetSize),
118     m_interval (interval),
119     m_estThrPssDl (estThrPssDl),
120     m_errorModelEnabled (errorModelEnabled)
121 {
122 }
123 
~LenaDeactivateBearerTestCase()124 LenaDeactivateBearerTestCase::~LenaDeactivateBearerTestCase ()
125 {
126 }
127 
128 void
DoRun(void)129 LenaDeactivateBearerTestCase::DoRun (void)
130 {
131   if (!m_errorModelEnabled)
132     {
133       Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
134       Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
135     }
136 
137   Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
138   Config::SetDefault ("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename", StringValue (CreateTempDirFilename ("DlRlcStats.txt")));
139   Config::SetDefault ("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename", StringValue (CreateTempDirFilename ("UlRlcStats.txt")));
140 
141   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
142   Ptr<PointToPointEpcHelper>  epcHelper = CreateObject<PointToPointEpcHelper> ();
143   lteHelper->SetEpcHelper (epcHelper);
144 
145   Ptr<Node> pgw = epcHelper->GetPgwNode ();
146 
147   // Create a single RemoteHost
148   NodeContainer remoteHostContainer;
149   remoteHostContainer.Create (1);
150   Ptr<Node> remoteHost = remoteHostContainer.Get (0);
151   InternetStackHelper internet;
152   internet.Install (remoteHostContainer);
153 
154   // Create the Internet
155   PointToPointHelper p2ph;
156   p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s")));
157   p2ph.SetDeviceAttribute ("Mtu", UintegerValue (1500));
158   p2ph.SetChannelAttribute ("Delay", TimeValue (Seconds (0.001)));
159   NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost);
160   Ipv4AddressHelper ipv4h;
161   ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
162   Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign (internetDevices);
163   // interface 0 is localhost, 1 is the p2p device
164   Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress (1);
165 
166   Ipv4StaticRoutingHelper ipv4RoutingHelper;
167   Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ());
168   remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.0.0.0"), 1);
169 
170   // LogLevel logLevel = (LogLevel)(LOG_PREFIX_FUNC | LOG_PREFIX_TIME | LOG_LEVEL_ALL);
171 
172   // LogComponentEnable ("LenaTestDeactivateBearer", LOG_LEVEL_ALL);
173   // LogComponentEnable ("LteHelper", logLevel);
174   // LogComponentEnable ("EpcHelper", logLevel);
175   // LogComponentEnable ("EpcEnbApplication", logLevel);
176   // LogComponentEnable ("EpcMmeApplication", logLevel);
177   // LogComponentEnable ("EpcPgwApplication", logLevel);
178   // LogComponentEnable ("EpcSgwApplication", logLevel);
179   // LogComponentEnable ("LteEnbRrc", logLevel);
180 
181   lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
182 
183   // Create Nodes: eNodeB and UE
184   NodeContainer enbNodes;
185   NodeContainer ueNodes;
186   enbNodes.Create (1);
187   ueNodes.Create (m_nUser);
188 
189   // Install Mobility Model
190   MobilityHelper mobility;
191   mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
192   mobility.Install (enbNodes);
193   mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
194   mobility.Install (ueNodes);
195 
196   // Create Devices and install them in the Nodes (eNB and UE)
197   NetDeviceContainer enbDevs;
198   NetDeviceContainer ueDevs;
199   lteHelper->SetSchedulerType ("ns3::PssFfMacScheduler");
200   enbDevs = lteHelper->InstallEnbDevice (enbNodes);
201   ueDevs = lteHelper->InstallUeDevice (ueNodes);
202 
203   Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
204   Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
205   enbPhy->SetAttribute ("TxPower", DoubleValue (30.0));
206   enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
207 
208   // Set UEs' position and power
209   for (int i = 0; i < m_nUser; i++)
210     {
211       Ptr<ConstantPositionMobilityModel> mm = ueNodes.Get (i)->GetObject<ConstantPositionMobilityModel> ();
212       mm->SetPosition (Vector (m_dist.at (i), 0.0, 0.0));
213       Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
214       Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
215       uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
216       uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
217     }
218 
219   // Install the IP stack on the UEs
220   internet.Install (ueNodes);
221   Ipv4InterfaceContainer ueIpIface;
222   ueIpIface = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueDevs));
223 
224   // Assign IP address to UEs
225   for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
226     {
227       Ptr<Node> ueNode = ueNodes.Get (u);
228       // Set the default gateway for the UE
229       Ptr<Ipv4StaticRouting> ueStaticRouting = ipv4RoutingHelper.GetStaticRouting (ueNode->GetObject<Ipv4> ());
230       ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1);
231     }
232 
233   // Attach a UE to a eNB
234   lteHelper->Attach (ueDevs, enbDevs.Get (0));
235 
236   // Activate an EPS bearer on all UEs
237 
238   for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
239     {
240       Ptr<NetDevice> ueDevice = ueDevs.Get (u);
241       GbrQosInformation qos;
242       qos.gbrDl = (m_packetSize.at (u) + 32) * (1000 / m_interval) * 8;  // bit/s, considering IP, UDP, RLC, PDCP header size
243       qos.gbrUl = (m_packetSize.at (u) + 32) * (1000 / m_interval) * 8;
244       qos.mbrDl = qos.gbrDl;
245       qos.mbrUl = qos.gbrUl;
246 
247       enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
248       EpsBearer bearer (q, qos);
249       bearer.arp.priorityLevel = 15 - (u + 1);
250       bearer.arp.preemptionCapability = true;
251       bearer.arp.preemptionVulnerability = true;
252       lteHelper->ActivateDedicatedEpsBearer (ueDevice, bearer, EpcTft::Default ());
253     }
254 
255 
256   // Install downlink and uplink applications
257   uint16_t dlPort = 1234;
258   uint16_t ulPort = 2000;
259   PacketSinkHelper dlPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), dlPort));
260   ApplicationContainer clientApps;
261   ApplicationContainer serverApps;
262 
263   for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
264     {
265       ++ulPort;
266       serverApps.Add (dlPacketSinkHelper.Install (ueNodes.Get (u))); // receive packets from remotehost
267       PacketSinkHelper ulPacketSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), ulPort));
268       serverApps.Add (ulPacketSinkHelper.Install (remoteHost));  // receive packets from UEs
269 
270       UdpClientHelper dlClient (ueIpIface.GetAddress (u), dlPort); // uplink packets generator
271       dlClient.SetAttribute ("Interval", TimeValue (MilliSeconds (m_interval)));
272       dlClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
273       dlClient.SetAttribute ("PacketSize", UintegerValue (m_packetSize.at (u)));
274 
275       UdpClientHelper ulClient (remoteHostAddr, ulPort);           // downlink packets generator
276       ulClient.SetAttribute ("Interval", TimeValue (MilliSeconds (m_interval)));
277       ulClient.SetAttribute ("MaxPackets", UintegerValue (1000000));
278       ulClient.SetAttribute ("PacketSize", UintegerValue (m_packetSize.at (u)));
279 
280       clientApps.Add (dlClient.Install (remoteHost));
281       clientApps.Add (ulClient.Install (ueNodes.Get (u)));
282     }
283 
284 
285   serverApps.Start (Seconds (0.030));
286   clientApps.Start (Seconds (0.030));
287 
288   double statsStartTime = 0.04; // need to allow for RRC connection establishment + SRS
289   double statsDuration = 1.0;
290   double tolerance = 0.1;
291 
292   lteHelper->EnableRlcTraces ();
293   Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
294   rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
295   rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
296 
297 
298   //get ue device pointer for UE-ID 0 IMSI 1 and enb device pointer
299   Ptr<NetDevice> ueDevice = ueDevs.Get (0);
300   Ptr<NetDevice> enbDevice = enbDevs.Get (0);
301 
302   /*
303    *   Instantiate De-activation using Simulator::Schedule() method which will initiate bearer de-activation after deActivateTime
304    *   Instantiate De-activation in sequence (Time const &time, MEM mem_ptr, OBJ obj, T1 a1, T2 a2, T3 a3)
305    */
306   Time deActivateTime (Seconds (1.5));
307   Simulator::Schedule (deActivateTime, &LteHelper::DeActivateDedicatedEpsBearer, lteHelper, ueDevice, enbDevice, 2);
308 
309   //stop simulation after 3 seconds
310   Simulator::Stop (Seconds (3.0));
311 
312   Simulator::Run ();
313 
314   NS_LOG_INFO ("DL - Test with " << m_nUser << " user(s)");
315   std::vector <uint64_t> dlDataRxed;
316   std::vector <uint64_t> dlDataTxed;
317   for (int i = 0; i < m_nUser; i++)
318     {
319       // get the imsi
320       uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
321       // get the lcId
322       // lcId is hard-coded, since only one dedicated bearer is added
323       uint8_t lcId = 4;
324       dlDataRxed.push_back (rlcStats->GetDlRxData (imsi, lcId));
325       dlDataTxed.push_back (rlcStats->GetDlTxData (imsi, lcId));
326       NS_LOG_INFO ("\tUser " << i << " dist " << m_dist.at (i) << " imsi " << imsi << " bytes rxed " << (double)dlDataRxed.at (i) << "  thr " << (double)dlDataRxed.at (i) / statsDuration << " ref " << m_estThrPssDl.at (i));
327       NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " bytes txed " << (double)dlDataTxed.at (i) << "  thr " << (double)dlDataTxed.at (i) / statsDuration);
328     }
329 
330   for (int i = 0; i < m_nUser; i++)
331     {
332       uint64_t imsi = ueDevs.Get (i)->GetObject<LteUeNetDevice> ()->GetImsi ();
333 
334       /*
335        * For UE ID-0 IMSI 1, LCID=4 is deactivated hence If traffic seen on it, test case should fail
336        * Else For other UE's, test case should validate throughput
337        */
338       if (imsi == 1)
339         {
340           NS_TEST_ASSERT_MSG_EQ ((double)dlDataTxed.at (i), 0, "Invalid LCID in Statistics ");
341         }
342       else
343         {
344           NS_TEST_ASSERT_MSG_EQ_TOL ((double)dlDataTxed.at (i) / statsDuration, m_estThrPssDl.at (i), m_estThrPssDl.at (i) * tolerance, " Unfair Throughput!");
345         }
346     }
347 
348   Simulator::Destroy ();
349 }
350 }
351