A Discrete-Event Network Simulator
API
lte-test-carrier-aggregation.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2016 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: Biljana Bojovic <bbojovic@cttc.es>
19  *
20  */
21 
22 #include <ns3/object.h>
23 #include <ns3/spectrum-interference.h>
24 #include <ns3/spectrum-error-model.h>
25 #include <ns3/log.h>
26 #include <ns3/test.h>
27 #include <ns3/simulator.h>
28 #include <ns3/packet.h>
29 #include <ns3/ptr.h>
30 #include <iostream>
31 #include "ns3/radio-bearer-stats-calculator.h"
32 #include <ns3/constant-position-mobility-model.h>
33 #include <ns3/eps-bearer.h>
34 #include <ns3/node-container.h>
35 #include <ns3/mobility-helper.h>
36 #include <ns3/net-device-container.h>
37 #include <ns3/lte-ue-net-device.h>
38 #include <ns3/lte-enb-net-device.h>
39 #include <ns3/lte-ue-rrc.h>
40 #include <ns3/lte-helper.h>
41 #include "ns3/string.h"
42 #include "ns3/double.h"
43 #include <ns3/lte-enb-phy.h>
44 #include <ns3/lte-ue-phy.h>
45 #include <ns3/boolean.h>
46 #include <ns3/enum.h>
47 #include <ns3/config-store-module.h>
48 #include <errno.h>
49 
51 
52 using namespace ns3;
53 
54 NS_LOG_COMPONENT_DEFINE ("TestCarrierAggregation");
55 
56 bool CarrierAggregationTestCase::s_writeResults = false; // set to true to write response vectors
57 const std::string dlResultsFileName = "carrier_aggregation_results_dl.txt";
58 const std::string ulResultsFileName = "carrier_aggregation_results_ul.txt";
59 
60 
61 void
63 {
64  testcase->DlScheduling (dlInfo);
65 }
66 
67 void
69  uint32_t frameNo, uint32_t subframeNo, uint16_t rnti,
70  uint8_t mcs, uint16_t sizeTb, uint8_t ccId)
71 {
72  testcase->UlScheduling (frameNo, subframeNo, rnti, mcs, sizeTb, ccId);
73 }
74 
75 
77  : TestSuite ("lte-carrier-aggregation", SYSTEM)
78 {
79  NS_LOG_INFO ("creating CarrierAggregationTestCase");
80 
81  if (CarrierAggregationTestCase::s_writeResults) // write result vectors to file
82  {
83  std::cout<<"\n Running TestCarrierAggregationSuite with activated option to write results to files."
84  "Dl results will be written to "<<dlResultsFileName<<" and uplink results to "<<ulResultsFileName<<std::endl;
85 
86  bool abort = false;
87 
88  if (fopen(dlResultsFileName.c_str(), "r"))
89  {
90  std::cout<<"\nResults file "<<dlResultsFileName<<" already exists. Move it out of the way or specify another downlink results file name."<<std::endl;
91  abort = true;
92  }
93  if (fopen(ulResultsFileName.c_str(), "r"))
94  {
95  std::cout<<"\nResults file "<<ulResultsFileName<<" already exists. Move it out of the way or specify another uplink results file name."<<std::endl;
96  abort = true;
97  }
98 
99  if (abort)
100  return;
101 
102  AddTestCase (new CarrierAggregationTestCase (1,0, 100, 100, 1), TestCase::QUICK);
103  AddTestCase (new CarrierAggregationTestCase (3,0, 100, 100, 1), TestCase::QUICK);
104  AddTestCase (new CarrierAggregationTestCase (6,0, 100, 100, 1), TestCase::QUICK);
105  AddTestCase (new CarrierAggregationTestCase (9,0, 100, 100, 1), TestCase::QUICK);
106  AddTestCase (new CarrierAggregationTestCase (12,0, 100, 100, 1), TestCase::QUICK);
107  AddTestCase (new CarrierAggregationTestCase (15,0, 100, 100, 1), TestCase::QUICK);
108 
109  AddTestCase (new CarrierAggregationTestCase (1,0, 100, 100, 2), TestCase::QUICK);
110  AddTestCase (new CarrierAggregationTestCase (3,0, 100, 100, 2), TestCase::QUICK);
111  AddTestCase (new CarrierAggregationTestCase (6,0, 100, 100, 2), TestCase::QUICK);
112  AddTestCase (new CarrierAggregationTestCase (9,0, 100, 100, 2), TestCase::QUICK);
113  AddTestCase (new CarrierAggregationTestCase (12,0, 100, 100, 2), TestCase::QUICK);
114  AddTestCase (new CarrierAggregationTestCase (15,0, 100, 100, 2), TestCase::QUICK);
115 
116  AddTestCase (new CarrierAggregationTestCase (1,0, 100, 100, 3), TestCase::QUICK);
117  AddTestCase (new CarrierAggregationTestCase (3,0, 100, 100, 3), TestCase::QUICK);
118  AddTestCase (new CarrierAggregationTestCase (6,0, 100, 100, 3), TestCase::QUICK);
119  AddTestCase (new CarrierAggregationTestCase (9,0, 100, 100, 3), TestCase::QUICK);
120  AddTestCase (new CarrierAggregationTestCase (12,0, 100, 100, 3), TestCase::QUICK);
121  AddTestCase (new CarrierAggregationTestCase (15,0, 100, 100, 3), TestCase::QUICK);
122  }
123  else
124  {
125  // bandwidth is 25 and there are 2 carriers
126  AddTestCase (new CarrierAggregationTestCase (1,0, 25, 25, 2), TestCase::EXTENSIVE);
127  AddTestCase (new CarrierAggregationTestCase (3,0, 25, 25, 2), TestCase::EXTENSIVE);
128  AddTestCase (new CarrierAggregationTestCase (6,0, 25, 25, 2), TestCase::EXTENSIVE);
129  AddTestCase (new CarrierAggregationTestCase (9,0, 25, 25, 2), TestCase::EXTENSIVE);
130  AddTestCase (new CarrierAggregationTestCase (12,0, 25, 25, 2), TestCase::EXTENSIVE);
131  AddTestCase (new CarrierAggregationTestCase (15,0, 25, 25, 2), TestCase::EXTENSIVE);
132 
133  AddTestCase (new CarrierAggregationTestCase (1,4800, 25, 25, 2), TestCase::QUICK);
134  AddTestCase (new CarrierAggregationTestCase (3,4800, 25, 25, 2), TestCase::EXTENSIVE);
135  AddTestCase (new CarrierAggregationTestCase (6,4800, 25, 25, 2), TestCase::EXTENSIVE);
136  AddTestCase (new CarrierAggregationTestCase (9,4800, 25, 25, 2), TestCase::EXTENSIVE);
137  AddTestCase (new CarrierAggregationTestCase (12,4800, 25, 25, 2), TestCase::EXTENSIVE);
138  AddTestCase (new CarrierAggregationTestCase (15,4800, 25, 25, 2), TestCase::EXTENSIVE);
139 
140  AddTestCase (new CarrierAggregationTestCase (1,6000, 25, 25, 2), TestCase::EXTENSIVE);
141  AddTestCase (new CarrierAggregationTestCase (3,6000, 25, 25, 2), TestCase::EXTENSIVE);
142  AddTestCase (new CarrierAggregationTestCase (6,6000, 25, 25, 2), TestCase::EXTENSIVE);
143  AddTestCase (new CarrierAggregationTestCase (9,6000, 25, 25, 2), TestCase::EXTENSIVE);
144  AddTestCase (new CarrierAggregationTestCase (12,6000, 25, 25, 2), TestCase::EXTENSIVE);
145  AddTestCase (new CarrierAggregationTestCase (15,6000, 25, 25, 2), TestCase::EXTENSIVE);
146 
147  AddTestCase (new CarrierAggregationTestCase (1,20000, 25, 25, 2), TestCase::EXTENSIVE);
148  AddTestCase (new CarrierAggregationTestCase (3,20000, 25, 25, 2), TestCase::EXTENSIVE);
149  AddTestCase (new CarrierAggregationTestCase (6,20000, 25, 25, 2), TestCase::EXTENSIVE);
150  AddTestCase (new CarrierAggregationTestCase (9,20000, 25, 25, 2), TestCase::EXTENSIVE);
151  AddTestCase (new CarrierAggregationTestCase (12,20000, 25, 25, 2), TestCase::EXTENSIVE);
152  AddTestCase (new CarrierAggregationTestCase (15,20000, 25, 25, 2), TestCase::QUICK);
153 
154 
155  // bandwidth is 25 and there are 3 carriers
156  AddTestCase (new CarrierAggregationTestCase (1,0, 25, 25, 3), TestCase::EXTENSIVE);
157  AddTestCase (new CarrierAggregationTestCase (3,0, 25, 25, 3), TestCase::QUICK);
158  AddTestCase (new CarrierAggregationTestCase (6,0, 25, 25, 3), TestCase::EXTENSIVE);
159  AddTestCase (new CarrierAggregationTestCase (9,0, 25, 25, 3), TestCase::EXTENSIVE);
160  AddTestCase (new CarrierAggregationTestCase (12,0, 25, 25, 3), TestCase::EXTENSIVE);
161  AddTestCase (new CarrierAggregationTestCase (15,0, 25, 25, 3), TestCase::EXTENSIVE);
162 
163  AddTestCase (new CarrierAggregationTestCase (1,4800, 25, 25, 3), TestCase::QUICK);
164  AddTestCase (new CarrierAggregationTestCase (3,4800, 25, 25, 3), TestCase::EXTENSIVE);
165  AddTestCase (new CarrierAggregationTestCase (6,4800, 25, 25, 3), TestCase::EXTENSIVE);
166  AddTestCase (new CarrierAggregationTestCase (9,4800, 25, 25, 3), TestCase::EXTENSIVE);
167  AddTestCase (new CarrierAggregationTestCase (12,4800, 25, 25, 3), TestCase::EXTENSIVE);
168  AddTestCase (new CarrierAggregationTestCase (15,4800, 25, 25, 3), TestCase::EXTENSIVE);
169 
170  AddTestCase (new CarrierAggregationTestCase (1,6000, 25, 25, 3), TestCase::EXTENSIVE);
171  AddTestCase (new CarrierAggregationTestCase (3,6000, 25, 25, 3), TestCase::EXTENSIVE);
172  AddTestCase (new CarrierAggregationTestCase (6,6000, 25, 25, 3), TestCase::EXTENSIVE);
173  AddTestCase (new CarrierAggregationTestCase (9,6000, 25, 25, 3), TestCase::EXTENSIVE);
174  AddTestCase (new CarrierAggregationTestCase (12,6000, 25, 25, 3), TestCase::EXTENSIVE);
175  AddTestCase (new CarrierAggregationTestCase (15,6000, 25, 25, 3), TestCase::EXTENSIVE);
176 
177  AddTestCase (new CarrierAggregationTestCase (1,20000, 25, 25, 3), TestCase::EXTENSIVE);
178  AddTestCase (new CarrierAggregationTestCase (3,20000, 25, 25, 3), TestCase::EXTENSIVE);
179  AddTestCase (new CarrierAggregationTestCase (6,20000, 25, 25, 3), TestCase::EXTENSIVE);
180  AddTestCase (new CarrierAggregationTestCase (9,20000, 25, 25, 3), TestCase::EXTENSIVE);
181  AddTestCase (new CarrierAggregationTestCase (12,20000, 25, 25, 3), TestCase::EXTENSIVE);
182  AddTestCase (new CarrierAggregationTestCase (15,20000, 25, 25, 3), TestCase::EXTENSIVE);
183 
184 
185  // bandwidth = 6 RB and there are 3 carriers
186  AddTestCase (new CarrierAggregationTestCase (1,0, 6, 6, 3), TestCase::EXTENSIVE);
187  AddTestCase (new CarrierAggregationTestCase (3,0, 6, 6, 3), TestCase::EXTENSIVE);
188  AddTestCase (new CarrierAggregationTestCase (6,0, 6, 6, 3), TestCase::EXTENSIVE);
189  AddTestCase (new CarrierAggregationTestCase (9,0, 6, 6, 3), TestCase::EXTENSIVE);
190  AddTestCase (new CarrierAggregationTestCase (12,0, 6, 6, 3), TestCase::EXTENSIVE);
191  AddTestCase (new CarrierAggregationTestCase (15,0, 6, 6, 3), TestCase::EXTENSIVE);
192 
193  AddTestCase (new CarrierAggregationTestCase (1,4800, 6, 6, 3), TestCase::QUICK);
194  AddTestCase (new CarrierAggregationTestCase (3,4800, 6, 6, 3), TestCase::EXTENSIVE);
195  AddTestCase (new CarrierAggregationTestCase (6,4800, 6, 6, 3), TestCase::EXTENSIVE);
196  AddTestCase (new CarrierAggregationTestCase (9,4800, 6, 6, 3), TestCase::EXTENSIVE);
197  AddTestCase (new CarrierAggregationTestCase (12,4800, 6, 6, 3), TestCase::EXTENSIVE);
198  AddTestCase (new CarrierAggregationTestCase (15,4800, 6, 6, 3), TestCase::EXTENSIVE);
199  AddTestCase (new CarrierAggregationTestCase (1,6000, 6, 6, 3), TestCase::EXTENSIVE);
200  AddTestCase (new CarrierAggregationTestCase (3,6000, 6, 6, 3), TestCase::EXTENSIVE);
201  AddTestCase (new CarrierAggregationTestCase (6,6000, 6, 6, 3), TestCase::EXTENSIVE);
202  AddTestCase (new CarrierAggregationTestCase (9,6000, 6, 6, 3), TestCase::EXTENSIVE);
203  AddTestCase (new CarrierAggregationTestCase (12,6000, 6, 6, 3), TestCase::EXTENSIVE);
204  AddTestCase (new CarrierAggregationTestCase (15,6000, 6, 6, 3), TestCase::EXTENSIVE);
205  AddTestCase (new CarrierAggregationTestCase (1,20000, 6, 6, 3), TestCase::EXTENSIVE);
206  AddTestCase (new CarrierAggregationTestCase (3,20000, 6, 6, 3), TestCase::EXTENSIVE);
207  AddTestCase (new CarrierAggregationTestCase (6,20000, 6, 6, 3), TestCase::EXTENSIVE);
208  AddTestCase (new CarrierAggregationTestCase (9,20000, 6, 6, 3), TestCase::EXTENSIVE);
209  AddTestCase (new CarrierAggregationTestCase (12,20000, 6, 6, 3), TestCase::EXTENSIVE);
210  AddTestCase (new CarrierAggregationTestCase (15,20000, 6, 6, 3), TestCase::EXTENSIVE);
211 
212  // bandwidth = 6 RB and there are 2 carriers
213  AddTestCase (new CarrierAggregationTestCase (1,0, 6, 6, 2), TestCase::EXTENSIVE);
214  AddTestCase (new CarrierAggregationTestCase (3,0, 6, 6, 2), TestCase::EXTENSIVE);
215  AddTestCase (new CarrierAggregationTestCase (6,0, 6, 6, 2), TestCase::EXTENSIVE);
216  AddTestCase (new CarrierAggregationTestCase (9,0, 6, 6, 2), TestCase::EXTENSIVE);
217  AddTestCase (new CarrierAggregationTestCase (12,0, 6, 6, 2), TestCase::EXTENSIVE);
218  AddTestCase (new CarrierAggregationTestCase (15,0, 6, 6, 2), TestCase::EXTENSIVE);
219 
220  AddTestCase (new CarrierAggregationTestCase (1,4800, 6, 6, 2), TestCase::EXTENSIVE);
221  AddTestCase (new CarrierAggregationTestCase (3,4800, 6, 6, 2), TestCase::EXTENSIVE);
222  AddTestCase (new CarrierAggregationTestCase (6,4800, 6, 6, 2), TestCase::EXTENSIVE);
223  AddTestCase (new CarrierAggregationTestCase (9,4800, 6, 6, 2), TestCase::EXTENSIVE);
224  AddTestCase (new CarrierAggregationTestCase (12,4800, 6, 6, 2), TestCase::EXTENSIVE);
225  AddTestCase (new CarrierAggregationTestCase (15,4800, 6, 6, 2), TestCase::EXTENSIVE);
226 
227  AddTestCase (new CarrierAggregationTestCase (1,6000, 6, 6, 2), TestCase::EXTENSIVE);
228  AddTestCase (new CarrierAggregationTestCase (3,6000, 6, 6, 2), TestCase::EXTENSIVE);
229  AddTestCase (new CarrierAggregationTestCase (6,6000, 6, 6, 2), TestCase::EXTENSIVE);
230  AddTestCase (new CarrierAggregationTestCase (9,6000, 6, 6, 2), TestCase::EXTENSIVE);
231  AddTestCase (new CarrierAggregationTestCase (12,6000, 6, 6, 2), TestCase::EXTENSIVE);
232  AddTestCase (new CarrierAggregationTestCase (15,6000, 6, 6, 2), TestCase::QUICK);
233 
234  AddTestCase (new CarrierAggregationTestCase (1,20000, 6, 6, 2), TestCase::EXTENSIVE);
235  AddTestCase (new CarrierAggregationTestCase (3,20000, 6, 6, 2), TestCase::EXTENSIVE);
236  AddTestCase (new CarrierAggregationTestCase (6,20000, 6, 6, 2), TestCase::EXTENSIVE);
237  AddTestCase (new CarrierAggregationTestCase (9,20000, 6, 6, 2), TestCase::EXTENSIVE);
238  AddTestCase (new CarrierAggregationTestCase (12,20000, 6, 6, 2), TestCase::EXTENSIVE);
239  AddTestCase (new CarrierAggregationTestCase (15,20000, 6, 6, 2), TestCase::EXTENSIVE);
240  }
241 }
242 
243 
245 
246 std::string
247 CarrierAggregationTestCase::BuildNameString (uint16_t nUser, uint16_t dist, uint32_t dlBandwidth, uint32_t ulBandwidth, uint32_t numberOfComponentCarriers)
248 {
249  std::ostringstream oss;
250  oss << nUser << " UEs, distance " << dist << " m"<< " dlBandwidth "<< dlBandwidth <<" ulBandwidth "<< ulBandwidth <<" number of carriers "<<numberOfComponentCarriers;
251  return oss.str ();
252 }
253 
254 CarrierAggregationTestCase::CarrierAggregationTestCase (uint16_t nUser, uint16_t dist, uint32_t dlbandwidth, uint32_t ulBandwidth, uint32_t numberOfComponentCarriers)
255  : TestCase (BuildNameString (nUser, dist, dlbandwidth, ulBandwidth, numberOfComponentCarriers)),
256  m_nUser (nUser),
257  m_dist (dist),
258  m_dlBandwidth (dlbandwidth),
259  m_ulBandwidth (ulBandwidth),
260  m_numberOfComponentCarriers(numberOfComponentCarriers)
261 {
262  m_dlThroughput = 0;
263  m_statsDuration = 0.6;
264 }
265 
267 {
268 }
269 
270 void
272 {
274 
275  Config::SetDefault ("ns3::LteEnbNetDevice::DlBandwidth", UintegerValue (m_dlBandwidth));
276  Config::SetDefault ("ns3::LteEnbNetDevice::UlBandwidth", UintegerValue (m_ulBandwidth));
277  Config::SetDefault ("ns3::LteHelper::UseCa", BooleanValue (true));
278  Config::SetDefault ("ns3::LteHelper::NumberOfComponentCarriers", UintegerValue (m_numberOfComponentCarriers));
279  Config::SetDefault ("ns3::LteHelper::EnbComponentCarrierManager", StringValue ("ns3::RrComponentCarrierManager"));
280  Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
281  Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
282  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
283 
288  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
289 
290  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
291 
292  auto cch = CreateObject<CcHelper> ();
293  cch->SetDlEarfcn (100); // Same as default value for LteEnbNetDevice
294  cch->SetUlEarfcn (100 + 18000); // Same as default value for LteEnbNetDevice
295  cch->SetDlBandwidth (m_dlBandwidth);
296  cch->SetUlBandwidth (m_ulBandwidth);
297  cch->SetNumberOfComponentCarriers (m_numberOfComponentCarriers);
298  lteHelper->SetCcPhyParams (cch->EquallySpacedCcs ());
299 
300  // Create Nodes: eNodeB and UE
301  NodeContainer enbNodes;
302  NodeContainer ueNodes;
303  enbNodes.Create (1);
304  ueNodes.Create (m_nUser);
305 
306  // Install Mobility Model
308  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
309  mobility.Install (enbNodes);
310  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
311  mobility.Install (ueNodes);
312 
313  // Create Devices and install them in the Nodes (eNB and UE)
314  NetDeviceContainer enbDevs;
315  NetDeviceContainer ueDevs;
316  lteHelper->SetSchedulerType ("ns3::PfFfMacScheduler");
317  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
318  ueDevs = lteHelper->InstallUeDevice (ueNodes);
319 
320  // Attach a UE to a eNB
321  lteHelper->Attach (ueDevs, enbDevs.Get (0));
322 
323  // Activate an EPS bearer
324  enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
325  EpsBearer bearer (q);
326  lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
327 
328 
329  Ptr<LteEnbNetDevice> lteEnbDev = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ();
330  Ptr<LteEnbPhy> enbPhy = lteEnbDev->GetPhy ();
331  enbPhy->SetAttribute ("TxPower", DoubleValue (30.0));
332  enbPhy->SetAttribute ("NoiseFigure", DoubleValue (5.0));
333 
334  // Set UEs' position and power
335  for (int i = 0; i < m_nUser; i++)
336  {
338  mm->SetPosition (Vector (m_dist, 0.0, 0.0));
339  Ptr<LteUeNetDevice> lteUeDev = ueDevs.Get (i)->GetObject<LteUeNetDevice> ();
340  Ptr<LteUePhy> uePhy = lteUeDev->GetPhy ();
341  uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
342  uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
343  }
344 
345 
346  double statsStartTime = 0.300; // need to allow for RRC connection establishment + SRS
347 
348  Simulator::Stop (Seconds (statsStartTime + m_statsDuration - 0.0001));
349 
350  Config::Connect ("/NodeList/*/DeviceList/*/ComponentCarrierMap/*/LteEnbMac/DlScheduling",
352 
353  Config::Connect ("/NodeList/*/DeviceList/*/ComponentCarrierMap/*/LteEnbMac/UlScheduling",
355 
356  lteHelper->EnableTraces();
357 
358  Simulator::Run ();
359 
363  NS_LOG_INFO ("DL - Test with " << m_nUser << " user(s) at distance " << m_dist);
364  std::vector <uint64_t> dlDataRxed;
365 
366  // tolerance increases with the number of users because the lc 0 and lc 1 will go always over primary carrier, so as the number of users increases the difference between primary and secondary
367  //carrier will increase
368 
369  bool testDownlinkShare = true;
370 
371  for (std::map <uint8_t, uint32_t>::iterator itDownlink = m_ccDownlinkTraffic.begin(); itDownlink!=m_ccDownlinkTraffic.end(); itDownlink++)
372  {
373 
374  if (itDownlink == m_ccDownlinkTraffic.begin())
375  {
376  NS_LOG_INFO ("Downlink traffic per carrier:"<<itDownlink->second);
377  }
378  else
379  {
380  if (itDownlink->second != m_ccDownlinkTraffic.begin()->second)
381  {
382  testDownlinkShare = false;
383  break;
384  }
385  }
386  }
387 
388  bool testUplinkShare = true;
389 
390  for (std::map <uint8_t, uint32_t>::iterator itUplink = m_ccUplinkTraffic.begin(); itUplink!=m_ccUplinkTraffic.end(); itUplink++)
391  {
392  if (itUplink == m_ccUplinkTraffic.begin())
393  {
394  NS_LOG_INFO ("Uplink traffic per carrier:"<<itUplink->second);
395  }
396  else
397  {
398  if (itUplink->second != m_ccUplinkTraffic.begin()->second)
399  {
400  testUplinkShare = false;
401  break;
402  }
403  }
404  }
405 
406  NS_TEST_ASSERT_MSG_EQ (m_ccUplinkTraffic.size(), m_numberOfComponentCarriers, "Number of carriers in uplink does not correspond to number of carriers being configured in test.");
407  NS_TEST_ASSERT_MSG_EQ (m_ccDownlinkTraffic.size(), m_numberOfComponentCarriers, "Number of carriers in downlink does not correspond to number of carriers being configured in test.");
408 
409  NS_TEST_ASSERT_MSG_EQ (testDownlinkShare, true, " Downlink traffic not split equally between carriers!");
410  NS_TEST_ASSERT_MSG_EQ (testUplinkShare, true , " Uplink traffic not split equally between carriers");
411 
412  if (s_writeResults)
414 
415  Simulator::Destroy ();
416 }
417 
418 void
420 {
421  //NS_LOG_FUNCTION (dlInfo.frameNo << dlInfo.subframeNo << dlInfo.rnti << (uint32_t) dlInfo.mcsTb1 << dlInfo.sizeTb1 << (uint32_t) dlInfo.mcsTb2 << dlInfo.sizeTb2<<(uint16_t)dlInfo.componentCarrierId);
422  // need to allow for RRC connection establishment + CQI feedback reception + persistent data transmission
423  if (Simulator::Now () > MilliSeconds (300))
424  {
426  {
427  m_ccDownlinkTraffic.insert (std::pair<uint8_t, uint32_t> (dlInfo.componentCarrierId, dlInfo.sizeTb1 + dlInfo.sizeTb2));
428  }
429  else
430  {
431  m_ccDownlinkTraffic[dlInfo.componentCarrierId]+= (dlInfo.sizeTb1 + dlInfo.sizeTb2);
432  }
433 
434  m_dlThroughput += dlInfo.sizeTb1 + dlInfo.sizeTb2;
435  }
436 }
437 
438 void
439 CarrierAggregationTestCase::UlScheduling (uint32_t frameNo, uint32_t subframeNo, uint16_t rnti,
440  uint8_t mcs, uint16_t sizeTb, uint8_t componentCarrierId)
441 {
442  //NS_LOG_FUNCTION (frameNo << subframeNo << rnti << (uint32_t) mcs << sizeTb);
443  // need to allow for RRC connection establishment + SRS transmission
444  if (Simulator::Now () > MilliSeconds (300))
445  {
446  if (m_ccUplinkTraffic.find(componentCarrierId) == m_ccUplinkTraffic.end())
447  {
448  m_ccUplinkTraffic.insert (std::pair<uint8_t, uint32_t> (componentCarrierId, sizeTb));
449  }
450  else
451  {
452  m_ccUplinkTraffic[componentCarrierId] += sizeTb;
453  }
454 
455  m_ulThroughput += sizeTb;
456  }
457 }
458 
459 void
461 {
462  std::ofstream dlOutFile;
463  dlOutFile.open (dlResultsFileName.c_str(), std::ofstream::out | std::ofstream::app);
464  dlOutFile.setf (std::ios_base::fixed);
465 
466  if (!dlOutFile.is_open ())
467  {
468  NS_LOG_ERROR ("Can't open file "<<dlResultsFileName);
469  return;
470  }
471  dlOutFile << m_nUser <<" "<<m_numberOfComponentCarriers <<" "<< ((m_dlThroughput*8)/m_statsDuration)/m_nUser<<std::endl;
472  dlOutFile.close ();
473 
474  std::ofstream ulOutFile;
475  ulOutFile.open (ulResultsFileName.c_str(), std::ofstream::out | std::ofstream::app);
476  ulOutFile.setf (std::ios_base::fixed);
477 
478  if (!ulOutFile.is_open ())
479  {
480  NS_LOG_ERROR ("Can't open file "<<ulResultsFileName);
481  return;
482  }
483  ulOutFile << m_nUser <<" "<<m_numberOfComponentCarriers <<" "<< ((m_ulThroughput*8)/m_statsDuration)/m_nUser<<std::endl;
484  ulOutFile.close ();
485 }
486 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
AttributeValue implementation for Boolean.
Definition: boolean.h:36
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:484
void SetCcPhyParams(std::map< uint8_t, ComponentCarrier > ccmap)
This method is used to send the ComponentCarrier map created with CcHelper to the helper...
Definition: lte-helper.cc:477
uint16_t sizeTb2
size TB2
Definition: lte-common.h:247
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:459
Hold variables of type string.
Definition: string.h:41
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
std::map< uint8_t, uint32_t > m_ccDownlinkTraffic
CC DL traffic.
A suite of tests to run.
Definition: test.h:1342
Callback< R > MakeBoundCallback(R(*fnPtr)(TX), ARG a1)
Make Callbacks with one bound argument.
Definition: callback.h:1686
Ptr< LteEnbPhy > GetPhy(void) const
Mobility model for which the current position does not change once it has been set and until it is se...
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:943
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1001
virtual void DoRun(void)
Implementation to actually run this TestCase.
static std::string BuildNameString(uint16_t nUser, uint16_t dist, uint32_t dlBandwidth, uint32_t ulBandwidth, uint32_t numberOfComponentCarriers)
Builds the test name string based on provided parameter values.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:277
void LteTestDlSchedulingCallback(CarrierAggregationTestCase *testcase, std::string path, DlSchedulingCallbackInfo dlInfo)
encapsulates test code
Definition: test.h:1155
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
Definition: lte-helper.cc:1294
uint16_t sizeTb1
size TB1
Definition: lte-common.h:245
uint32_t m_numberOfComponentCarriers
number of component carriers
uint8_t componentCarrierId
component carrier ID
Definition: lte-common.h:248
void SetSchedulerType(std::string type)
Set the type of scheduler to be used by eNodeB devices.
Definition: lte-helper.cc:282
CarrierAggregationTestCase(uint16_t nUser, uint16_t dist, uint32_t dlbandwidth, uint32_t ulBandwidth, uint32_t numberOfComponentCarriers)
Constructor of test case.
static TestCarrierAggregationSuite lenaTestRrFfMacSchedulerSuite
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:71
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
tuple mobility
Definition: third.py:101
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
void LteTestUlSchedulingCallback(CarrierAggregationTestCase *testcase, std::string path, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcs, uint16_t sizeTb, uint8_t ccId)
void EnableTraces(void)
Enables trace sinks for PHY, MAC, RLC and PDCP.
Definition: lte-helper.cc:1341
Hold an unsigned integer type.
Definition: uinteger.h:44
void DlScheduling(DlSchedulingCallbackInfo dlInfo)
DL Scheduling function that is used in this test as callback function of DL scheduling trace...
#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
void UlScheduling(uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcs, uint16_t sizeTb, uint8_t componentCarrierId)
UL Scheduling function that is used in this test as callback function of UL sceduling trace...
holds a vector of ns3::NetDevice pointers
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:843
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
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())
This system test program creates different test cases with a single eNB and several UEs...
const std::string dlResultsFileName
void SetPosition(const Vector &position)
const std::string ulResultsFileName
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:499
uint16_t m_nUser
the number of users
Helper class used to assign positions and mobility models to nodes.
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:993
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:782
static bool s_writeResults
write results flag, determines whether to write results to outoput files
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:365
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
Definition: log.h:253
void WriteResultToFile()
Write result to file function.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
DlSchedulingCallbackInfo structure.
Definition: lte-common.h:239
Ptr< LteUePhy > GetPhy(void) const
Get the Phy.
Test Carrier Aggregation Suite.
This class can be used to hold variables of floating point type such as 'double' or 'float'...
Definition: double.h:41
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:185
The eNodeB device implementation.
Qci
QoS Class Indicator.
Definition: eps-bearer.h:77
std::map< uint8_t, uint32_t > m_ccUplinkTraffic
CC UL traffic.
The LteUeNetDevice class implements the UE net device.