22 #include <ns3/object.h>
25 #include <ns3/simulator.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>
93 :
TestCase (BuildNameString (numberOfNodes, numberOfComponentCarriers, configToCheck, simulationDuration)),
94 m_numberOfNodes(numberOfNodes),
95 m_numberOfComponentCarriers(numberOfComponentCarriers),
96 m_configToCheck(configToCheck),
97 m_simulationDuration (simulationDuration)
99 m_connectionCounter = 0.0;
103 virtual void DoRun (
void);
114 std::string BuildNameString (uint32_t numberOfNodes, uint16_t numberOfComponentCarriers, std::vector<ConfigToCheck> configToCheck,
Time simulationDuration);
122 void Evaluate (std::string context,
Ptr<LteUeRrc> ueRrc, std::list<LteRrcSap::SCellToAddMod> sCellToAddModList);
128 std::vector<std::map<uint16_t, ConfigToCheck> > EquallySpacedCcs ();
141 std::ostringstream oss;
142 oss <<
" nodes " << numberOfNodes <<
" carriers " << numberOfComponentCarriers
143 <<
" configurations " << configToCheck.size ()
144 <<
" duration " << simulationDuration;
148 std::vector<std::map<uint16_t, ConfigToCheck> >
151 std::vector<std::map<uint16_t, ConfigToCheck> > configToCheckContainer;
153 for (
auto &it: m_configToCheck)
155 std::map<uint16_t, ConfigToCheck> ccmap;
156 uint32_t ulEarfcn = it.m_ulEarfcn;
157 uint32_t dlEarfcn = it.m_dlEarfcn;
158 uint32_t maxBandwidthRb = std::max<uint32_t> (it.m_ulBandwidth, it.m_dlBandwidth);
163 for (uint16_t i = 0; i < m_numberOfComponentCarriers; i++)
171 NS_FATAL_ERROR (
"Band is not wide enough to allocate " << m_numberOfComponentCarriers <<
" CCs");
180 ccmap.insert (std::pair<uint16_t, ConfigToCheck> (i, cc));
183 ", DL BW: " << it.m_dlBandwidth <<
184 ", UL Earfcn: " << ulEarfcn <<
185 ", DL Earfcn: " << dlEarfcn);
189 uint32_t frequencyShift = 300 * (1 + (maxBandwidthKhz - 1) / 300);
192 uint32_t earfcnShift = frequencyShift / 100;
193 ulEarfcn += earfcnShift;
194 dlEarfcn += earfcnShift;
197 configToCheckContainer.push_back (ccmap);
200 return configToCheckContainer;
208 uint16_t cellId = ueRrc->GetCellId ();
210 NS_LOG_INFO (
"m_configToCheckContainer size " << m_configToCheckContainer.size ());
212 ++m_connectionCounter;
214 std::map<uint16_t, ConfigToCheck> configToCheckMap;
218 configToCheckMap = m_configToCheckContainer[cellId-1];
222 uint16_t n1 =
std::max(cellId, m_numberOfComponentCarriers);
223 uint16_t n2 =
std::min(cellId, m_numberOfComponentCarriers);
224 configToCheckMap = m_configToCheckContainer[n1-n2];
227 NS_LOG_INFO (
"PCarrier - UL BW: " <<
static_cast<uint16_t
> (ueRrc->GetUlBandwidth ()) <<
228 ", DL BW: " <<
static_cast<uint16_t
> (ueRrc->GetDlBandwidth ()) <<
229 ", UL Earfcn: " << ueRrc->GetUlEarfcn () <<
230 ", DL Earfcn: " << ueRrc->GetDlEarfcn ());
232 for (
auto scell: sCellToAddModList)
234 NS_LOG_INFO (
"SCarrier - UL BW: " <<
static_cast<uint16_t
> (scell.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulBandwidth)<<
235 ", DL BW: " <<
static_cast<uint16_t
> (scell.radioResourceConfigCommonSCell.nonUlConfiguration.dlBandwidth) <<
236 ", UL Earfcn: " << scell.radioResourceConfigCommonSCell.ulConfiguration.ulFreqInfo.ulCarrierFreq <<
237 ", DL Earfcn: " << scell.cellIdentification.dlCarrierFreq);
244 "Primary Carrier DL bandwidth configuration failed");
246 "Primary Carrier UL bandwidth configuration failed");
248 "Primary Carrier DL EARFCN configuration failed");
250 "Primary Carrier UL EARFCN configuration failed");
252 uint32_t ConfigToCheckMapIndex = 1;
254 for (
auto scell: sCellToAddModList)
256 sCConfig = configToCheckMap[ConfigToCheckMapIndex];
259 "Secondary Carrier DL bandwidth configuration failed");
261 "Secondary Carrier UL bandwidth configuration failed");
263 "Secondary Carrier DL EARFCN configuration failed");
265 "Secondary Carrier UL EARFCN configuration failed");
266 ConfigToCheckMapIndex++;
284 enbNodes.
Create (m_numberOfNodes);
285 ueNodes.
Create (m_numberOfNodes);
287 uint32_t totalNumberOfNodes = enbNodes.
GetN () + ueNodes.
GetN ();
291 for (uint16_t i = 0; i < totalNumberOfNodes; i++)
293 positionAlloc->Add (Vector (2 * i, 0, 0));
297 mobility.SetMobilityModel (
"ns3::ConstantPositionMobilityModel");
298 mobility.SetPositionAllocator (positionAlloc);
300 for (uint32_t n = 0; n < m_numberOfNodes; ++n)
311 for (uint32_t i = 0; i < m_configToCheck.size (); ++i)
313 configuration = m_configToCheck[i];
327 m_configToCheckContainer = EquallySpacedCcs ();
330 for(uint32_t
k = 0;
k < m_numberOfNodes; ++
k)
340 Config::Connect (
"/NodeList/*/DeviceList/*/LteUeRrc/SCarrierConfigured",
364 :
TestSuite (
"lte-carrier-aggregation-configuration", SYSTEM)
366 std::vector<ConfigToCheck> configToCheck;
377 configToCheck.push_back (configToCheckTest1);
378 uint32_t numberOfNodes = 1;
379 uint16_t numberOfComponentCarriers = 2;
385 configToCheck.clear ();
394 configToCheck.push_back (configToCheckTest1);
401 configToCheck.push_back (configToCheckTest2);
403 simulationDuration =
Seconds (2);
Carrier aggregation configuration test case.
CarrierAggregationConfigTestCase(uint32_t numberOfNodes, uint16_t numberOfComponentCarriers, std::vector< ConfigToCheck > configToCheck, Time simulationDuration)
Constructor.
Time m_simulationDuration
Simulation duration.
virtual void DoRun(void)
Implementation to actually run this TestCase.
uint32_t m_numberOfNodes
Numer of nodes.
uint16_t m_numberOfComponentCarriers
Number of component carriers.
void Evaluate(std::string context, Ptr< LteUeRrc > ueRrc, std::list< LteRrcSap::SCellToAddMod > sCellToAddModList)
Evaluate function.
uint32_t m_connectionCounter
Connection counter.
std::vector< std::map< uint16_t, ConfigToCheck > > m_configToCheckContainer
Vector of maps containing the per component carrier configuration.
std::vector< ConfigToCheck > m_configToCheck
Vector containing all the configurations to check.
std::string BuildNameString(uint32_t numberOfNodes, uint16_t numberOfComponentCarriers, std::vector< ConfigToCheck > configToCheck, Time simulationDuration)
Build name string function.
std::vector< std::map< uint16_t, ConfigToCheck > > EquallySpacedCcs()
Equally spaced component carriers function.
Carrier aggregation configuration test suite.
CarrierAggregationConfigTestSuite()
AttributeValue implementation for Boolean.
This class contains the specification of EPS Bearers.
@ GBR_CONV_VOICE
GBR Conversational Voice.
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
void Attach(NetDeviceContainer ueDevices)
Enables automatic attachment of a set of UE devices to a suitable cell using Idle mode initial cell s...
void SetEnbDeviceAttribute(std::string n, const AttributeValue &v)
Set an attribute for the eNodeB devices (LteEnbNetDevice) to be created.
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
void SetUeDeviceAttribute(std::string n, const AttributeValue &v)
Set an attribute for the UE devices (LteUeNetDevice) to be created.
int64_t AssignStreams(NetDeviceContainer c, int64_t stream)
Assign a fixed random variable stream number to the random variables used.
static uint16_t GetUplinkCarrierBand(uint32_t nUl)
Converts uplink EARFCN to corresponding LTE frequency band number.
static uint16_t GetDownlinkCarrierBand(uint32_t nDl)
Converts downlink EARFCN to corresponding LTE frequency band number.
static double GetChannelBandwidth(uint16_t txBandwidthConf)
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
keep track of a set of node pointers.
uint32_t GetN(void) const
Get the number of Ptr<Node> stored in this container.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
Smart pointer class similar to boost::intrusive_ptr.
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
static void Run(void)
Run the simulation.
Hold variables of type string.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Simulation virtual time values and global simulation resolution.
Hold an unsigned integer type.
void SetDefault(std::string name, const AttributeValue &value)
void Connect(std::string path, const CallbackBase &cb)
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#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.
Time Seconds(double value)
Construct a Time in the indicated unit.
static CarrierAggregationConfigTestSuite g_carrierAggregationConfigTestSuite
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
This test suite verifies following two things:
uint16_t m_ulBandwidth
Uplink bandwidth.
uint32_t m_dlEarfcn
Downlink EARFCN.
uint32_t m_ulEarfcn
Uplink EARFCN.
uint16_t m_dlBandwidth
Downlink bandwidth.