View | Details | Raw Unified | Return to bug 2840
Collapse All | Expand All

(-)a/RELEASE_NOTES (+1 lines)
 Lines 57-62    Link Here 
57
- Bug 2831 - wifi: runtime channel width switch has no effect
57
- Bug 2831 - wifi: runtime channel width switch has no effect
58
- Bug 2836 - wifi: Missing VHT information in radiotap header when A-MPDU is used
58
- Bug 2836 - wifi: Missing VHT information in radiotap header when A-MPDU is used
59
- Bug 2838 - wifi: ht-wifi-network crashes with RTS/CTS enabled and frequency set to 2.4GHz
59
- Bug 2838 - wifi: ht-wifi-network crashes with RTS/CTS enabled and frequency set to 2.4GHz
60
- Bug 2840 - lte: Wrong configuration of eNBs and UEs
60
- Bug 2843 - spectrum, wifi: Incorrect channel width and center frequency provided for non-HT PPDUs when building SpectralDensity
61
- Bug 2843 - spectrum, wifi: Incorrect channel width and center frequency provided for non-HT PPDUs when building SpectralDensity
61
- Bug 2848 - wifi: Association ID not correctly set upon association
62
- Bug 2848 - wifi: Association ID not correctly set upon association
62
- Bug 2849 - lte: Received RLC and PDCP PDUs are missing in the stats files
63
- Bug 2849 - lte: Received RLC and PDCP PDUs are missing in the stats files
(-)a/src/lte/doc/source/lte-testing.rst (-1 / +25 lines)
 Lines 1601-1604    Link Here 
1601
split the data uniformly between primary and secondary carrier. The test consists of checking that 
1601
split the data uniformly between primary and secondary carrier. The test consists of checking that 
1602
the throughput obtained over the different carriers are equal considering a given tolerance. For more 
1602
the throughput obtained over the different carriers are equal considering a given tolerance. For more 
1603
details about this test, see the section Carrier aggregation usage example.
1603
details about this test, see the section Carrier aggregation usage example.
1604
 
1604
1605
1606
Carrier aggregation test for eNB and UE configuration 
1607
------------------------------------------------------
1608
1609
The test suite ``carrier-aggregation-config-test`` is a system test program, which verifies the
1610
following two cases:
1611
1612
 * When carrier aggregation is enabled and UE carriers configuration is different than the default 
1613
   configuration done in LteHelper, we check that the UE(s) is configured properly once it receives
1614
   RRC Connection Reconfiguration message from eNB.
1615
1616
 * A user can configure 2 or more eNBs and UEs with different configuration parameters, i.e.,
1617
   each eNB and UE can have different EARFCN and Bandwidths and a UE connects to an eNB with similar DL EARFCN.
1618
   In this test, we check with CA enabled but the end results will be the same if carrier aggregation is not 
1619
   enabled and we have more than one eNBs and UEs with different configurations.
1620
1621
Since, we do not need EPC to test the configuration, this test only simulates the LTE radio access with RLC SM. 
1622
There are two test cases, Test 1 tests that the UE is configured properly after receiving RRC Connection Reconfiguration 
1623
message from the eNB, which will overwrite UE default configuration done in LteHelper for the sake of
1624
creating PHY and MAC instances equal to the number of component carriers. Test 2 tests that every eNB or UE in a 
1625
simulation scenario can be configured with different EARFCNs and Bandwidths. For both test cases, it also counts 
1626
the number of times the hooked trace source ``SCarrierConfigured`` get triggered. As, it reflects how many UEs 
1627
got attached to their respective eNB. If the count is not equal to the number of UEs in the scenario, the test fails, 
1628
which could be the result of improper UE configuration.
(-)a/src/lte/helper/lte-helper.cc (-32 / +48 lines)
 Lines 473-485    Link Here 
473
  m_channelFactory.Set (n, v);
473
  m_channelFactory.Set (n, v);
474
}
474
}
475
475
476
void
477
LteHelper::SetCcPhyParams ( std::map< uint8_t, ComponentCarrier> ccMapParams)
478
{
479
  NS_LOG_FUNCTION (this);
480
  m_componentCarrierPhyParams = ccMapParams;
481
}
482
483
NetDeviceContainer
476
NetDeviceContainer
484
LteHelper::InstallEnbDevice (NodeContainer c)
477
LteHelper::InstallEnbDevice (NodeContainer c)
485
{
478
{
 Lines 513-543    Link Here 
513
Ptr<NetDevice>
506
Ptr<NetDevice>
514
LteHelper::InstallSingleEnbDevice (Ptr<Node> n)
507
LteHelper::InstallSingleEnbDevice (Ptr<Node> n)
515
{
508
{
509
  NS_LOG_FUNCTION (this << n);
516
  uint16_t cellId = m_cellIdCounter; // \todo Remove, eNB has no cell ID
510
  uint16_t cellId = m_cellIdCounter; // \todo Remove, eNB has no cell ID
517
511
518
  Ptr<LteEnbNetDevice> dev = m_enbNetDeviceFactory.Create<LteEnbNetDevice> ();
512
  Ptr<LteEnbNetDevice> dev = m_enbNetDeviceFactory.Create<LteEnbNetDevice> ();
519
  Ptr<LteHandoverAlgorithm> handoverAlgorithm = m_handoverAlgorithmFactory.Create<LteHandoverAlgorithm> ();
513
  Ptr<LteHandoverAlgorithm> handoverAlgorithm = m_handoverAlgorithmFactory.Create<LteHandoverAlgorithm> ();
520
514
521
  if (m_componentCarrierPhyParams.size() == 0)
515
  NS_ABORT_MSG_IF (m_componentCarrierPhyParams.size() != 0, "CC map is not clean");
522
    {
516
  DoComponentCarrierConfigure (dev->GetUlEarfcn (), dev->GetDlEarfcn (),
523
      DoComponentCarrierConfigure (dev->GetUlEarfcn (), dev->GetDlEarfcn (), dev->GetUlBandwidth (), dev->GetDlBandwidth ());
517
                               dev->GetUlBandwidth (), dev->GetDlBandwidth ());
524
    }
518
  NS_ABORT_MSG_IF (m_componentCarrierPhyParams.size() != m_noOfCcs,
519
                   "CC map size (" << m_componentCarrierPhyParams.size () <<
520
                   ") must be equal to number of carriers (" <<
521
                   m_noOfCcs << ")");
525
522
526
  NS_ASSERT_MSG(m_componentCarrierPhyParams.size()!=0, "Cannot create enb ccm map.");
527
  // create component carrier map for this eNb device
523
  // create component carrier map for this eNb device
528
  std::map<uint8_t,Ptr<ComponentCarrierEnb> > ccMap;
524
  std::map<uint8_t,Ptr<ComponentCarrierEnb> > ccMap;
529
  for (std::map<uint8_t, ComponentCarrier >::iterator it = m_componentCarrierPhyParams.begin (); it != m_componentCarrierPhyParams.end (); ++it)
525
  for (std::map<uint8_t, ComponentCarrier >::iterator it = m_componentCarrierPhyParams.begin ();
526
       it != m_componentCarrierPhyParams.end ();
527
       ++it)
530
    {
528
    {
531
      Ptr <ComponentCarrierEnb> cc =  CreateObject<ComponentCarrierEnb> ();
529
      Ptr <ComponentCarrierEnb> cc = CreateObject<ComponentCarrierEnb> ();
532
      cc->SetUlBandwidth(it->second.GetUlBandwidth());
530
      cc->SetUlBandwidth (it->second.GetUlBandwidth ());
533
      cc->SetDlBandwidth(it->second.GetDlBandwidth());
531
      cc->SetDlBandwidth (it->second.GetDlBandwidth ());
534
      cc->SetDlEarfcn(it->second.GetDlEarfcn());
532
      cc->SetDlEarfcn (it->second.GetDlEarfcn ());
535
      cc->SetUlEarfcn(it->second.GetUlEarfcn());
533
      cc->SetUlEarfcn (it->second.GetUlEarfcn ());
536
      cc->SetAsPrimary(it->second.IsPrimary());
534
      cc->SetAsPrimary (it->second.IsPrimary ());
537
      NS_ABORT_MSG_IF (m_cellIdCounter == 65535, "max num cells exceeded");
535
      NS_ABORT_MSG_IF (m_cellIdCounter == 65535, "max num cells exceeded");
538
      cc->SetCellId (m_cellIdCounter++);
536
      cc->SetCellId (m_cellIdCounter++);
539
      ccMap [it->first] =  cc;
537
      ccMap [it->first] =  cc;
540
    }
538
    }
539
  // CC map is not needed anymore
540
  m_componentCarrierPhyParams.clear ();
541
541
  NS_ABORT_MSG_IF (m_useCa && ccMap.size()<2, "You have to either specify carriers or disable carrier aggregation");
542
  NS_ABORT_MSG_IF (m_useCa && ccMap.size()<2, "You have to either specify carriers or disable carrier aggregation");
542
  NS_ASSERT (ccMap.size () == m_noOfCcs);
543
  NS_ASSERT (ccMap.size () == m_noOfCcs);
543
544
 Lines 764-787    Link Here 
764
{
765
{
765
  NS_LOG_FUNCTION (this);
766
  NS_LOG_FUNCTION (this);
766
767
767
  NS_ABORT_MSG_IF (m_componentCarrierPhyParams.size() == 0 && m_useCa, "If CA is enabled, before call this method you need to install Enbs --> InstallEnbDevice()");
768
  Ptr<LteUeNetDevice> dev = m_ueNetDeviceFactory.Create<LteUeNetDevice> ();
768
769
769
  Ptr<LteUeNetDevice> dev = m_ueNetDeviceFactory.Create<LteUeNetDevice> ();
770
  // Initialize the component carriers with default values in order to initialize MACs and PHYs
771
  // of each component carrier. These values must be updated once the UE is attached to the
772
  // eNB and receives RRC Connection Reconfiguration message. In case of primary carrier or
773
  // a single carrier, these values will be updated once the UE will receive SIB2 and MIB.
774
  NS_ABORT_MSG_IF (m_componentCarrierPhyParams.size() != 0, "CC map is not clean");
775
  DoComponentCarrierConfigure (dev->GetDlEarfcn () + 18000, dev->GetDlEarfcn (), 25, 25);
776
  NS_ABORT_MSG_IF (m_componentCarrierPhyParams.size() != m_noOfCcs,
777
                   "CC map size (" << m_componentCarrierPhyParams.size () <<
778
                   ") must be equal to number of carriers (" <<
779
                   m_noOfCcs << ")");
780
770
  std::map<uint8_t, Ptr<ComponentCarrierUe> > ueCcMap;
781
  std::map<uint8_t, Ptr<ComponentCarrierUe> > ueCcMap;
771
782
772
  for (std::map< uint8_t, ComponentCarrier >::iterator it = m_componentCarrierPhyParams.begin() ; it != m_componentCarrierPhyParams.end(); ++it)
783
  for (std::map< uint8_t, ComponentCarrier >::iterator it = m_componentCarrierPhyParams.begin();
784
       it != m_componentCarrierPhyParams.end();
785
       ++it)
773
    {
786
    {
774
      Ptr <ComponentCarrierUe> cc =  CreateObject<ComponentCarrierUe> ();
787
      Ptr <ComponentCarrierUe> cc = CreateObject<ComponentCarrierUe> ();
775
      cc->SetUlBandwidth ( it->second.GetUlBandwidth ());
788
      cc->SetUlBandwidth (it->second.GetUlBandwidth ());
776
      cc->SetDlBandwidth ( it->second.GetDlBandwidth ());
789
      cc->SetDlBandwidth (it->second.GetDlBandwidth ());
777
      cc->SetDlEarfcn ( it->second.GetDlEarfcn ());
790
      cc->SetDlEarfcn (it->second.GetDlEarfcn ());
778
      cc->SetUlEarfcn ( it->second.GetUlEarfcn ());
791
      cc->SetUlEarfcn (it->second.GetUlEarfcn ());
779
      cc->SetAsPrimary (it->second.IsPrimary());
792
      cc->SetAsPrimary (it->second.IsPrimary ());
780
      Ptr<LteUeMac> mac = CreateObject<LteUeMac> ();
793
      Ptr<LteUeMac> mac = CreateObject<LteUeMac> ();
781
      cc->SetMac (mac);
794
      cc->SetMac (mac);
782
      // cc->GetPhy ()->Initialize (); // it is initialized within the LteUeNetDevice::DoInitialize ()
795
      // cc->GetPhy ()->Initialize (); // it is initialized within the LteUeNetDevice::DoInitialize ()
783
      ueCcMap.insert (std::pair<uint8_t, Ptr<ComponentCarrierUe> > (it->first, cc));
796
      ueCcMap.insert (std::pair<uint8_t, Ptr<ComponentCarrierUe> > (it->first, cc));
784
    }
797
    }
798
  // CC map is not needed anymore
799
  m_componentCarrierPhyParams.clear ();
785
800
786
  for (std::map<uint8_t, Ptr<ComponentCarrierUe> >::iterator it = ueCcMap.begin (); it != ueCcMap.end (); ++it)
801
  for (std::map<uint8_t, Ptr<ComponentCarrierUe> >::iterator it = ueCcMap.begin (); it != ueCcMap.end (); ++it)
787
    {
802
    {
 Lines 887-896    Link Here 
887
      it->second->GetPhy ()->SetLteUeCphySapUser (rrc->GetLteUeCphySapUser (it->first));
902
      it->second->GetPhy ()->SetLteUeCphySapUser (rrc->GetLteUeCphySapUser (it->first));
888
      rrc->SetLteUeCphySapProvider (it->second->GetPhy ()->GetLteUeCphySapProvider (), it->first);
903
      rrc->SetLteUeCphySapProvider (it->second->GetPhy ()->GetLteUeCphySapProvider (), it->first);
889
      it->second->GetPhy ()->SetComponentCarrierId (it->first);
904
      it->second->GetPhy ()->SetComponentCarrierId (it->first);
890
      
891
      it->second->GetPhy ()->SetLteUePhySapUser (it->second->GetMac ()->GetLteUePhySapUser ());
905
      it->second->GetPhy ()->SetLteUePhySapUser (it->second->GetMac ()->GetLteUePhySapUser ());
892
      it->second->GetMac ()->SetLteUePhySapProvider (it->second->GetPhy ()->GetLteUePhySapProvider ());
906
      it->second->GetMac ()->SetLteUePhySapProvider (it->second->GetPhy ()->GetLteUePhySapProvider ());
893
      
907
894
      bool ccmTest = ccmUe->SetComponentCarrierMacSapProviders (it->first, it->second->GetMac ()->GetLteMacSapProvider());
908
      bool ccmTest = ccmUe->SetComponentCarrierMacSapProviders (it->first, it->second->GetMac ()->GetLteMacSapProvider());
895
909
896
      if (ccmTest == false)
910
      if (ccmTest == false)
 Lines 1282-1288    Link Here 
1282
void
1296
void
1283
LteHelper::DoComponentCarrierConfigure (uint32_t ulEarfcn, uint32_t dlEarfcn, uint8_t ulbw, uint8_t dlbw)
1297
LteHelper::DoComponentCarrierConfigure (uint32_t ulEarfcn, uint32_t dlEarfcn, uint8_t ulbw, uint8_t dlbw)
1284
{
1298
{
1285
  NS_ASSERT_MSG (m_componentCarrierPhyParams.size()==0, "Cc map already exists.");
1299
  NS_LOG_FUNCTION (this << ulEarfcn << dlEarfcn << ulbw << dlbw);
1300
1301
  NS_ABORT_MSG_IF (m_componentCarrierPhyParams.size() != 0, "CC map is not clean");
1286
  Ptr<CcHelper> ccHelper = CreateObject<CcHelper> ();
1302
  Ptr<CcHelper> ccHelper = CreateObject<CcHelper> ();
1287
  ccHelper->SetNumberOfComponentCarriers (m_noOfCcs);
1303
  ccHelper->SetNumberOfComponentCarriers (m_noOfCcs);
1288
  ccHelper->SetUlEarfcn (ulEarfcn);
1304
  ccHelper->SetUlEarfcn (ulEarfcn);
 Lines 1290-1296    Link Here 
1290
  ccHelper->SetDlBandwidth (dlbw);
1306
  ccHelper->SetDlBandwidth (dlbw);
1291
  ccHelper->SetUlBandwidth (ulbw);
1307
  ccHelper->SetUlBandwidth (ulbw);
1292
  m_componentCarrierPhyParams = ccHelper->EquallySpacedCcs ();
1308
  m_componentCarrierPhyParams = ccHelper->EquallySpacedCcs ();
1293
  m_componentCarrierPhyParams.at(0).SetAsPrimary(true);
1309
  m_componentCarrierPhyParams.at (0).SetAsPrimary (true);
1294
}
1310
}
1295
1311
1296
void 
1312
void 
(-)a/src/lte/helper/lte-helper.h (-13 / +5 lines)
 Lines 270-283    Link Here 
270
  void SetUeAntennaModelAttribute (std::string n, const AttributeValue &v);
270
  void SetUeAntennaModelAttribute (std::string n, const AttributeValue &v);
271
271
272
  /**
272
  /**
273
   * This method is used to send the ComponentCarrier map created with CcHelper
274
   * to the helper, the structure will be used within InstallSingleEnbDevice
275
   *
276
   * \param ccmap the component carrier map
277
   */
278
   void SetCcPhyParams (std::map< uint8_t, ComponentCarrier> ccmap);
279
280
  /**
281
   * Set the type of spectrum channel to be used in both DL and UL.
273
   * Set the type of spectrum channel to be used in both DL and UL.
282
   *
274
   *
283
   * \param type type of spectrum channel model, must be a type name of any
275
   * \param type type of spectrum channel model, must be a type name of any
 Lines 685-696    Link Here 
685
private:
677
private:
686
678
687
  /**
679
  /**
688
   * A private function used for component carrier configuration.
680
   * Configure the component carriers
689
   *
681
   *
690
   * \param ulEarfcn uplink EARFCN - not control on the validity at this point
682
   * \param ulEarfcn uplink EARFCN
691
   * \param dlEarfcn downlink EARFCN - not control on the validity at this point	
683
   * \param dlEarfcn downlink EARFCN
692
   * \param ulbw uplink bandwidth for the current CC
684
   * \param ulbw uplink bandwidth for each CC
693
   * \param dlbw downlink bandwidth for the current CC
685
   * \param dlbw downlink bandwidth for each CC
694
   */
686
   */
695
  void DoComponentCarrierConfigure (uint32_t ulEarfcn, uint32_t dlEarfcn, uint8_t ulbw, uint8_t dlbw);
687
  void DoComponentCarrierConfigure (uint32_t ulEarfcn, uint32_t dlEarfcn, uint8_t ulbw, uint8_t dlbw);
696
  /**
688
  /**
(-)a/src/lte/model/lte-ue-rrc.cc (+8 lines)
 Lines 277-282    Link Here 
277
                     "trace fired upon failure of a handover procedure",
277
                     "trace fired upon failure of a handover procedure",
278
                     MakeTraceSourceAccessor (&LteUeRrc::m_handoverEndErrorTrace),
278
                     MakeTraceSourceAccessor (&LteUeRrc::m_handoverEndErrorTrace),
279
                     "ns3::LteUeRrc::ImsiCidRntiTracedCallback")
279
                     "ns3::LteUeRrc::ImsiCidRntiTracedCallback")
280
    .AddTraceSource ("SCarrierConfigured",
281
                     "trace fired after configuring secondary carriers",
282
                     MakeTraceSourceAccessor (&LteUeRrc::m_sCarrierConfiguredTrace),
283
                     "ns3::LteUeRrc::SCellConfiguredCallback")
280
  ;
284
  ;
281
  return tid;
285
  return tid;
282
}
286
}
 Lines 1231-1236    Link Here 
1231
{
1235
{
1232
  NS_LOG_FUNCTION (this);
1236
  NS_LOG_FUNCTION (this);
1233
1237
1238
  m_sCellToAddModList = nonCec.sCellsToAddModList;
1239
1234
  for(std::list<LteRrcSap::SCellToAddMod>::iterator it = nonCec.sCellsToAddModList.begin(); it!=nonCec.sCellsToAddModList.end(); it++)
1240
  for(std::list<LteRrcSap::SCellToAddMod>::iterator it = nonCec.sCellsToAddModList.begin(); it!=nonCec.sCellsToAddModList.end(); it++)
1235
    {
1241
    {
1236
      LteRrcSap::SCellToAddMod scell = *it;
1242
      LteRrcSap::SCellToAddMod scell = *it;
 Lines 1258-1263    Link Here 
1258
      m_cphySapProvider.at (ccId)->SetPa (paDouble);
1264
      m_cphySapProvider.at (ccId)->SetPa (paDouble);
1259
      m_cphySapProvider.at (ccId)->SetSrsConfigurationIndex (srsIndex);
1265
      m_cphySapProvider.at (ccId)->SetSrsConfigurationIndex (srsIndex);
1260
    }
1266
    }
1267
1268
  m_sCarrierConfiguredTrace (this, m_sCellToAddModList);
1261
}
1269
}
1262
1270
1263
void 
1271
void 
(-)a/src/lte/model/lte-ue-rrc.h (+16 lines)
 Lines 352-357    Link Here 
352
    (uint64_t imsi, uint16_t cellId, uint16_t rnti,
352
    (uint64_t imsi, uint16_t cellId, uint16_t rnti,
353
     State oldState, State newState);
353
     State oldState, State newState);
354
354
355
  /**
356
    * TracedCallback signature for secondary carrier configuration events.
357
    *
358
    * \param [in] Pointer to UE RRC
359
    * \param [in] List of LteRrcSap::SCellToAddMod
360
    */
361
  typedef void (* SCarrierConfiguredCallback)
362
    (Ptr<LteUeRrc>, std::list<LteRrcSap::SCellToAddMod>);
363
355
364
356
private:
365
private:
357
366
 Lines 768-773    Link Here 
768
777
769
  uint32_t m_dlEarfcn;  /**< Downlink carrier frequency. */
778
  uint32_t m_dlEarfcn;  /**< Downlink carrier frequency. */
770
  uint32_t m_ulEarfcn;  /**< Uplink carrier frequency. */
779
  uint32_t m_ulEarfcn;  /**< Uplink carrier frequency. */
780
  std::list<LteRrcSap::SCellToAddMod> m_sCellToAddModList; /**< Secondary carriers. */
771
781
772
  /**
782
  /**
773
   * The `MibReceived` trace source. Fired upon reception of Master Information
783
   * The `MibReceived` trace source. Fired upon reception of Master Information
 Lines 842-847    Link Here 
842
   * procedure. Exporting IMSI, cell ID, and RNTI.
852
   * procedure. Exporting IMSI, cell ID, and RNTI.
843
   */
853
   */
844
  TracedCallback<uint64_t, uint16_t, uint16_t> m_handoverEndErrorTrace;
854
  TracedCallback<uint64_t, uint16_t, uint16_t> m_handoverEndErrorTrace;
855
  /**
856
   * The `SCarrierConfigured` trace source. Fired after the configuration
857
   * of secondary carriers received through RRC Connection Reconfiguration
858
   * message.
859
   */
860
  TracedCallback<Ptr<LteUeRrc>, std::list<LteRrcSap::SCellToAddMod> > m_sCarrierConfiguredTrace;
845
861
846
  /// True if a connection request by upper layers is pending.
862
  /// True if a connection request by upper layers is pending.
847
  bool m_connectionPending;
863
  bool m_connectionPending;
(-)a/src/lte/test/lte-test-aggregation-throughput-scale.cc (-2 / +6 lines)
 Lines 73-78    Link Here 
73
{
73
{
74
  NS_LOG_FUNCTION (this << GetName ());
74
  NS_LOG_FUNCTION (this << GetName ());
75
75
76
  Config::SetDefault ("ns3::LteEnbNetDevice::DlEarfcn", UintegerValue (100));
77
  Config::SetDefault ("ns3::LteEnbNetDevice::UlEarfcn", UintegerValue (100 + 18000));
78
  Config::SetDefault ("ns3::LteEnbNetDevice::DlBandwidth", UintegerValue (25));
79
  Config::SetDefault ("ns3::LteEnbNetDevice::UlBandwidth", UintegerValue (25));
80
  Config::SetDefault ("ns3::LteUeNetDevice::DlEarfcn", UintegerValue (100));
81
76
  auto lteHelper = CreateObject<LteHelper> ();
82
  auto lteHelper = CreateObject<LteHelper> ();
77
  lteHelper->SetAttribute ("PathlossModel", TypeIdValue (ns3::FriisSpectrumPropagationLossModel::GetTypeId ()));
83
  lteHelper->SetAttribute ("PathlossModel", TypeIdValue (ns3::FriisSpectrumPropagationLossModel::GetTypeId ()));
78
  lteHelper->SetAttribute ("NumberOfComponentCarriers", UintegerValue (numberOfComponentCarriers));
84
  lteHelper->SetAttribute ("NumberOfComponentCarriers", UintegerValue (numberOfComponentCarriers));
 Lines 87-95    Link Here 
87
  cch->SetUlBandwidth (25);
93
  cch->SetUlBandwidth (25);
88
  cch->SetDlBandwidth (25);
94
  cch->SetDlBandwidth (25);
89
  cch->SetNumberOfComponentCarriers (numberOfComponentCarriers);
95
  cch->SetNumberOfComponentCarriers (numberOfComponentCarriers);
90
91
  const auto ccm = cch->EquallySpacedCcs ();
96
  const auto ccm = cch->EquallySpacedCcs ();
92
  lteHelper->SetCcPhyParams (ccm);
93
97
94
  auto enbNode = CreateObject<Node> ();
98
  auto enbNode = CreateObject<Node> ();
95
  auto ueNode = CreateObject<Node> ();
99
  auto ueNode = CreateObject<Node> ();
(-)52dae92273eb (+374 lines)
Added Link Here 
1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
 * Copyright (c) 2018 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: Zoraze Ali <zoraze.ali@cttc.es>
19
 *
20
 */
21
22
#include <ns3/object.h>
23
#include <ns3/log.h>
24
#include <ns3/test.h>
25
#include <ns3/simulator.h>
26
#include <ns3/ptr.h>
27
#include <ns3/constant-position-mobility-model.h>
28
#include <ns3/node-container.h>
29
#include <ns3/mobility-helper.h>
30
#include <ns3/net-device-container.h>
31
#include <ns3/lte-ue-rrc.h>
32
#include <ns3/lte-helper.h>
33
#include <ns3/lte-spectrum-value-helper.h>
34
#include <ns3/callback.h>
35
36
using namespace ns3;
37
38
/**
39
 * This test suite verifies following two things:
40
 *
41
 *  1. When CA is enabled and UE carriers configuration is different than the default one,
42
 *     we check that the UE is configured properly once it receives 
43
 *     RRC Connection Reconfiguration message from eNB.
44
 *
45
 *  2. A user can configure 2 or more eNBs and UEs with different configuration parameters,
46
 *     i.e, each eNB and UE can have different EARFCN and Bandwidths and a UE connects to
47
 *     an eNB with similar DL EARFCN.
48
 *     Here we check it with CA enabled but the end results will be the same if CA is not
49
 *     enabled and we have more than one eNBs and UEs with different configurations.
50
 *
51
 * Since we do not need EPC to test the configuration, this test only simulates
52
 * the LTE radio access with RLC SM.
53
 *
54
 * Test 1 tests that the UE is configured properly after receiving RRC Connection
55
 * Reconfiguration message from the eNB, which will overwrite UE default configuration
56
 * done in LteHelper for the sake of creating PHY and MAC instances equal to the number
57
 * of component carriers.
58
 *
59
 * Test 2 tests that in a simulation scenario every eNB or UE can be configured with
60
 * different EARFCNs and Bandwidths. This will check that the eNBs and UEs configuration
61
 * is not static, as reported in BUG 2840.
62
 */
63
64
struct ConfigToCheck
65
{
66
  uint16_t m_dlBandwidth;
67
  uint16_t m_ulBandwidth;
68
  uint32_t m_dlEarfcn;
69
  uint32_t m_ulEarfcn;
70
};
71
72
NS_LOG_COMPONENT_DEFINE ("TestCarrierAggregationConfig");
73
74
class CarrierAggregationConfigTestCase : public TestCase
75
{
76
public:
77
  /**
78
   * Constructor
79
   *
80
   * \param numberOfNodes, Total Number of eNBs and UEs
81
   * \param configToCheck, Vector containing all the configurations to check
82
   * \param simulationDuration, Duration of the simulation
83
   */
84
  CarrierAggregationConfigTestCase (uint32_t numberOfNodes, uint16_t numberOfComponentCarriers, std::vector<ConfigToCheck> configToCheck, Time simulationDuration)
85
    : TestCase (BuildNameString (numberOfNodes, numberOfComponentCarriers, configToCheck, simulationDuration)),
86
      m_numberOfNodes(numberOfNodes),
87
      m_numberOfComponentCarriers(numberOfComponentCarriers),
88
      m_configToCheck(configToCheck),
89
      m_simulationDuration (simulationDuration)
90
  {
91
    m_connectionCounter = 0.0;
92
  }
93
94
private:
95
  virtual void DoRun (void);
96
97
  std::string BuildNameString (uint32_t numberOfNodes, uint16_t numberOfComponentCarriers, std::vector<ConfigToCheck> configToCheck, Time simulationDuration);
98
  void Evaluate (std::string context, Ptr<LteUeRrc> ueRrc, std::list<LteRrcSap::SCellToAddMod> sCellToAddModList);
99
  std::vector<std::map<uint16_t, ConfigToCheck> > EquallySpacedCcs ();
100
101
  uint32_t m_numberOfNodes;
102
  uint16_t m_numberOfComponentCarriers;
103
  std::vector<ConfigToCheck> m_configToCheck;
104
  uint32_t m_connectionCounter;
105
  Time m_simulationDuration;
106
  std::vector<std::map<uint16_t, ConfigToCheck> > m_configToCheckContainer;
107
};
108
109
std::string
110
CarrierAggregationConfigTestCase::BuildNameString (uint32_t numberOfNodes, uint16_t numberOfComponentCarriers, std::vector<ConfigToCheck> configToCheck, Time simulationDuration)
111
{
112
  std::ostringstream oss;
113
  oss << " nodes " << numberOfNodes << " carriers " << numberOfComponentCarriers
114
      << " configurations " << configToCheck.size ()
115
      << " duration " << simulationDuration;
116
  return oss.str ();
117
}
118
119
std::vector<std::map<uint16_t, ConfigToCheck> >
120
CarrierAggregationConfigTestCase::EquallySpacedCcs ()
121
{
122
  std::vector<std::map<uint16_t, ConfigToCheck> > configToCheckContainer;
123
124
  for (auto &it: m_configToCheck)
125
    {
126
      std::map<uint16_t, ConfigToCheck> ccmap;
127
      uint32_t ulEarfcn = it.m_ulEarfcn;
128
      uint32_t dlEarfcn = it.m_dlEarfcn;
129
      uint32_t maxBandwidthRb = std::max<uint32_t> (it.m_ulBandwidth, it.m_dlBandwidth);
130
131
      // Convert bandwidth from RBs to kHz
132
      uint32_t maxBandwidthKhz = LteSpectrumValueHelper::GetChannelBandwidth (maxBandwidthRb) / 1e3;
133
134
      for (uint16_t i = 0; i < m_numberOfComponentCarriers; i++)
135
        {
136
          // Make sure we stay within the same band.
137
          if (LteSpectrumValueHelper::GetUplinkCarrierBand (ulEarfcn) !=
138
              LteSpectrumValueHelper::GetUplinkCarrierBand (it.m_ulEarfcn)
139
           || LteSpectrumValueHelper::GetDownlinkCarrierBand (dlEarfcn) !=
140
              LteSpectrumValueHelper::GetDownlinkCarrierBand (it.m_dlEarfcn))
141
            {
142
              NS_FATAL_ERROR ("Band is not wide enough to allocate " << m_numberOfComponentCarriers << " CCs");
143
            }
144
145
      ConfigToCheck cc;
146
      cc.m_dlBandwidth = it.m_dlBandwidth;
147
      cc.m_dlEarfcn = dlEarfcn;
148
      cc.m_ulBandwidth = it.m_ulBandwidth;
149
      cc.m_ulEarfcn = ulEarfcn;
150
151
      ccmap.insert (std::pair<uint16_t, ConfigToCheck> (i, cc));
152
153
      NS_LOG_INFO ("UL BW: " << it.m_ulBandwidth <<
154
                   ", DL BW: " << it.m_dlBandwidth <<
155
                   ", UL Earfcn: " << ulEarfcn <<
156
                   ", DL Earfcn: " << dlEarfcn);
157
158
      // The spacing between the center frequencies of two contiguous CCs should be multiple of 300 kHz.
159
      // Round spacing up to 300 kHz.
160
      uint32_t frequencyShift = 300 * (1 + (maxBandwidthKhz - 1) / 300);
161
162
      // Unit of EARFCN corresponds to 100kHz.
163
      uint32_t earfcnShift = frequencyShift / 100;
164
      ulEarfcn += earfcnShift;
165
      dlEarfcn += earfcnShift;
166
    }
167
168
    configToCheckContainer.push_back (ccmap);
169
  }
170
171
  return configToCheckContainer;
172
}
173
174
void
175
CarrierAggregationConfigTestCase::Evaluate (std::string context, Ptr<LteUeRrc> ueRrc, std::list<LteRrcSap::SCellToAddMod> sCellToAddModList)
176
{
177
  NS_LOG_INFO ("Secondary carriers configured");
178
179
  uint16_t cellId = ueRrc->GetCellId ();
180
  NS_LOG_INFO ("cellId " << cellId);
181
  NS_LOG_INFO ("m_configToCheckContainer size " << m_configToCheckContainer.size ());
182
183
  ++m_connectionCounter;
184
185
  std::map<uint16_t, ConfigToCheck> configToCheckMap;
186
187
  if (cellId == 1)
188
    {
189
      configToCheckMap = m_configToCheckContainer[cellId-1];
190
    }
191
  else
192
    {
193
      uint16_t n1 = std::max(cellId, m_numberOfComponentCarriers);
194
      uint16_t n2 = std::min(cellId, m_numberOfComponentCarriers);
195
      configToCheckMap = m_configToCheckContainer[n1-n2];
196
    }
197
198
  NS_LOG_INFO ("PCarrier - UL BW: " << static_cast<uint16_t> (ueRrc->GetUlBandwidth ()) <<
199
               ", DL BW: " << static_cast<uint16_t> (ueRrc->GetDlBandwidth ()) <<
200
               ", UL Earfcn: " << ueRrc->GetUlEarfcn () <<
201
               ", DL Earfcn: " << ueRrc->GetDlEarfcn ());
202
203
  for (auto scell: sCellToAddModList)
204
    {
205
      NS_LOG_INFO ("SCarrier - UL BW: " << static_cast<uint16_t> (scell.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulBandwidth)<<
206
                   ", DL BW: " << static_cast<uint16_t> (scell.radioResourceConfigCommonSCell.nonUlConfiguration.dlBandwidth) <<
207
                   ", UL Earfcn: " << scell.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulCarrierFreq <<
208
                   ", DL Earfcn: " << scell.cellIdentification.dlCarrierFreq);
209
    }
210
211
  ConfigToCheck pCConfig = configToCheckMap[0]; // Primary Carrier
212
  ConfigToCheck sCConfig; // Secondary Carriers
213
214
  NS_TEST_ASSERT_MSG_EQ (pCConfig.m_dlBandwidth, static_cast<uint16_t> (ueRrc->GetDlBandwidth ()),
215
                         "Primary Carrier DL bandwidth configuration failed");
216
  NS_TEST_ASSERT_MSG_EQ (pCConfig.m_ulBandwidth, static_cast<uint16_t> (ueRrc->GetUlBandwidth ()),
217
                         "Primary Carrier UL bandwidth configuration failed");
218
  NS_TEST_ASSERT_MSG_EQ (pCConfig.m_dlEarfcn, ueRrc->GetDlEarfcn (),
219
                         "Primary Carrier DL EARFCN configuration failed");
220
  NS_TEST_ASSERT_MSG_EQ (pCConfig.m_ulEarfcn, ueRrc->GetUlEarfcn (),
221
                         "Primary Carrier UL EARFCN configuration failed");
222
223
  uint32_t ConfigToCheckMapIndex = 1;
224
225
  for (auto scell: sCellToAddModList)
226
    {
227
      sCConfig = configToCheckMap[ConfigToCheckMapIndex];
228
229
      NS_TEST_ASSERT_MSG_EQ (sCConfig.m_dlBandwidth, static_cast<uint16_t> (scell.radioResourceConfigCommonSCell.nonUlConfiguration.dlBandwidth),
230
                             "Secondary Carrier DL bandwidth configuration failed");
231
      NS_TEST_ASSERT_MSG_EQ (sCConfig.m_ulBandwidth, static_cast<uint16_t> (scell.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulBandwidth),
232
                             "Secondary Carrier UL bandwidth configuration failed");
233
      NS_TEST_ASSERT_MSG_EQ (sCConfig.m_dlEarfcn, scell.cellIdentification.dlCarrierFreq,
234
                             "Secondary Carrier DL EARFCN configuration failed");
235
      NS_TEST_ASSERT_MSG_EQ (sCConfig.m_ulEarfcn, scell.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulCarrierFreq,
236
                             "Secondary Carrier UL EARFCN configuration failed");
237
      ConfigToCheckMapIndex++;
238
    }
239
}
240
241
void
242
CarrierAggregationConfigTestCase::DoRun ()
243
{
244
  Config::SetDefault ("ns3::LteHelper::UseCa", BooleanValue (true));
245
  Config::SetDefault ("ns3::LteHelper::NumberOfComponentCarriers", UintegerValue (m_numberOfComponentCarriers));
246
  Config::SetDefault ("ns3::LteHelper::EnbComponentCarrierManager", StringValue ("ns3::RrComponentCarrierManager"));
247
248
  int64_t stream = 1;
249
250
  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
251
252
  // Create Nodes: eNodeB and UE
253
  NodeContainer enbNodes;
254
  NodeContainer ueNodes;
255
  enbNodes.Create (m_numberOfNodes);
256
  ueNodes.Create (m_numberOfNodes);
257
258
  uint32_t totalNumberOfNodes = enbNodes.GetN () + ueNodes.GetN ();
259
260
  // Install Mobility Model
261
  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
262
  for (uint16_t i = 0; i < totalNumberOfNodes; i++)
263
    {
264
      positionAlloc->Add (Vector (2 * i, 0, 0));
265
    }
266
267
  MobilityHelper mobility;
268
  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
269
  mobility.SetPositionAllocator (positionAlloc);
270
271
  for (uint32_t n = 0; n < m_numberOfNodes; ++n)
272
    {
273
      mobility.Install (enbNodes.Get (n));
274
      mobility.Install (ueNodes.Get (n));
275
    }
276
277
  ConfigToCheck configuration;
278
  NetDeviceContainer enbDevs;
279
  NetDeviceContainer ueDevs;
280
281
  // Set bandwidth, EARFCN and install nodes (eNB and UE)
282
  for (uint32_t i = 0; i < m_configToCheck.size (); ++i)
283
    {
284
      configuration = m_configToCheck[i];
285
286
      lteHelper->SetEnbDeviceAttribute ("DlBandwidth", UintegerValue (configuration.m_dlBandwidth));
287
      lteHelper->SetEnbDeviceAttribute ("UlBandwidth", UintegerValue (configuration.m_ulBandwidth));
288
      lteHelper->SetEnbDeviceAttribute ("DlEarfcn", UintegerValue (configuration.m_dlEarfcn));
289
      lteHelper->SetEnbDeviceAttribute ("UlEarfcn", UintegerValue (configuration.m_ulEarfcn));
290
      lteHelper->SetUeDeviceAttribute ("DlEarfcn", UintegerValue (configuration.m_dlEarfcn));
291
      enbDevs.Add (lteHelper->InstallEnbDevice (enbNodes.Get (i)));
292
      lteHelper->AssignStreams (enbDevs, stream);
293
      ueDevs.Add (lteHelper->InstallUeDevice (ueNodes.Get (i)));
294
      lteHelper->AssignStreams (ueDevs, stream);
295
    }
296
297
  // Calculate the DlBandwidth, UlBandwidth, DlEarfcn and UlEarfcn to which the values from UE RRC would be compared
298
  m_configToCheckContainer = EquallySpacedCcs ();
299
300
  // Attach a UE to an eNB
301
  for(uint32_t k = 0; k < m_numberOfNodes; ++k)
302
    {
303
      lteHelper->Attach (ueDevs.Get (k), enbDevs.Get (k));
304
    }
305
306
   // Activate a data radio bearer
307
  enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
308
  EpsBearer bearer (q);
309
  lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
310
311
  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/SCarrierConfigured",
312
                   MakeCallback (&CarrierAggregationConfigTestCase::Evaluate, this));
313
314
  Simulator::Stop (m_simulationDuration);
315
  Simulator::Run ();
316
317
  NS_TEST_ASSERT_MSG_EQ (m_connectionCounter, ueNodes.GetN (), "Not all the UEs were connected");
318
319
  Simulator::Destroy ();
320
}
321
322
323
class CarrierAggregationConfigTestSuite : public TestSuite
324
{
325
public:
326
  CarrierAggregationConfigTestSuite ();
327
};
328
329
CarrierAggregationConfigTestSuite::CarrierAggregationConfigTestSuite ()
330
  : TestSuite ("lte-carrier-aggregation-configuration", SYSTEM)
331
{
332
  std::vector<ConfigToCheck> configToCheck;
333
334
  // Test1 with 1 eNB and 1 UE.
335
  // We put a configuration different than the default configuration done in LteHelper for the sake of
336
  // creating PHY and MAC instances equal to the number of component carriers.
337
338
  ConfigToCheck configToCheckTest1;
339
  configToCheckTest1.m_dlBandwidth = 50;
340
  configToCheckTest1.m_ulBandwidth = 50;
341
  configToCheckTest1.m_dlEarfcn = 300;
342
  configToCheckTest1.m_ulEarfcn = 300+18000;
343
  configToCheck.push_back (configToCheckTest1);
344
  uint32_t numberOfNodes = 1;
345
  uint16_t numberOfComponentCarriers = 2;
346
  Time simulationDuration = Seconds (1);
347
348
  AddTestCase (new CarrierAggregationConfigTestCase (numberOfNodes, numberOfComponentCarriers, configToCheck, simulationDuration), TestCase::QUICK);
349
350
//   configToCheck.erase(configToCheck.begin(), configToCheck.end());
351
  configToCheck.clear ();
352
353
  // Test2 with 2 eNBs and 2 UEs.
354
  // We decrease the bandwidth so not to exceed maximum band bandwidth of 20 MHz
355
356
  configToCheckTest1.m_dlBandwidth = 25;
357
  configToCheckTest1.m_ulBandwidth = 25;
358
  configToCheckTest1.m_dlEarfcn = 300;
359
  configToCheckTest1.m_ulEarfcn = 300+18000;
360
  configToCheck.push_back (configToCheckTest1);
361
362
  ConfigToCheck configToCheckTest2;
363
  configToCheckTest2.m_dlBandwidth = 25;
364
  configToCheckTest2.m_ulBandwidth = 25;
365
  configToCheckTest2.m_dlEarfcn = 502;
366
  configToCheckTest2.m_ulEarfcn = 502+18000;
367
  configToCheck.push_back (configToCheckTest2);
368
  numberOfNodes = 2;
369
  simulationDuration = Seconds (2);
370
371
  AddTestCase (new CarrierAggregationConfigTestCase (numberOfNodes, numberOfComponentCarriers, configToCheck, simulationDuration), TestCase::QUICK);
372
}
373
374
static CarrierAggregationConfigTestSuite g_carrierAggregationConfigTestSuite;
(-)a/src/lte/test/lte-test-carrier-aggregation.cc (-8 / +4 lines)
 Lines 272-279    Link Here 
272
{
272
{
273
  NS_LOG_FUNCTION (this << m_nUser << m_dist << m_dlBandwidth << m_ulBandwidth << m_numberOfComponentCarriers);
273
  NS_LOG_FUNCTION (this << m_nUser << m_dist << m_dlBandwidth << m_ulBandwidth << m_numberOfComponentCarriers);
274
274
275
  Config::SetDefault ("ns3::LteEnbNetDevice::DlEarfcn", UintegerValue (100));
276
  Config::SetDefault ("ns3::LteEnbNetDevice::UlEarfcn", UintegerValue (100 + 18000));
275
  Config::SetDefault ("ns3::LteEnbNetDevice::DlBandwidth", UintegerValue (m_dlBandwidth));
277
  Config::SetDefault ("ns3::LteEnbNetDevice::DlBandwidth", UintegerValue (m_dlBandwidth));
276
  Config::SetDefault ("ns3::LteEnbNetDevice::UlBandwidth", UintegerValue (m_ulBandwidth));
278
  Config::SetDefault ("ns3::LteEnbNetDevice::UlBandwidth", UintegerValue (m_ulBandwidth));
279
  Config::SetDefault ("ns3::LteUeNetDevice::DlEarfcn", UintegerValue (100));
280
277
  Config::SetDefault ("ns3::LteHelper::UseCa", BooleanValue (true));
281
  Config::SetDefault ("ns3::LteHelper::UseCa", BooleanValue (true));
278
  Config::SetDefault ("ns3::LteHelper::NumberOfComponentCarriers", UintegerValue (m_numberOfComponentCarriers));
282
  Config::SetDefault ("ns3::LteHelper::NumberOfComponentCarriers", UintegerValue (m_numberOfComponentCarriers));
279
  Config::SetDefault ("ns3::LteHelper::EnbComponentCarrierManager", StringValue ("ns3::RrComponentCarrierManager"));
283
  Config::SetDefault ("ns3::LteHelper::EnbComponentCarrierManager", StringValue ("ns3::RrComponentCarrierManager"));
 Lines 289-302    Link Here 
289
  
293
  
290
  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
294
  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
291
295
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
296
  // Create Nodes: eNodeB and UE
301
  NodeContainer enbNodes;
297
  NodeContainer enbNodes;
302
  NodeContainer ueNodes;
298
  NodeContainer ueNodes;
(-)a/src/lte/test/lte-test-secondary-cell-selection.cc (-2 lines)
 Lines 109-117    Link Here 
109
  cch->SetUlBandwidth (25);
109
  cch->SetUlBandwidth (25);
110
  cch->SetDlBandwidth (25);
110
  cch->SetDlBandwidth (25);
111
  cch->SetNumberOfComponentCarriers (m_numberOfComponentCarriers);
111
  cch->SetNumberOfComponentCarriers (m_numberOfComponentCarriers);
112
113
  const auto ccm = cch->EquallySpacedCcs ();
112
  const auto ccm = cch->EquallySpacedCcs ();
114
  lteHelper->SetCcPhyParams (ccm);
115
  
113
  
116
  // Create nodes.
114
  // Create nodes.
117
  auto enbNode = CreateObject<Node> ();
115
  auto enbNode = CreateObject<Node> ();
(-)a/src/lte/wscript (-1 / +2 lines)
 Lines 191-197    Link Here 
191
        'test/lte-simple-spectrum-phy.cc',
191
        'test/lte-simple-spectrum-phy.cc',
192
        'test/lte-test-carrier-aggregation.cc',
192
        'test/lte-test-carrier-aggregation.cc',
193
        'test/lte-test-aggregation-throughput-scale.cc',
193
        'test/lte-test-aggregation-throughput-scale.cc',
194
        'test/lte-test-ipv6-routing.cc'
194
        'test/lte-test-ipv6-routing.cc',
195
        'test/lte-test-carrier-aggregation-configuration.cc'
195
        ]
196
        ]
196
197
197
    headers = bld(features='ns3header')
198
    headers = bld(features='ns3header')

Return to bug 2840