A Discrete-Event Network Simulator
API
lte-enb-net-device.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2010 TELEMATICS LAB, DEE - Politecnico di Bari
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: Giuseppe Piro <g.piro@poliba.it>
19 * Author: Marco Miozzo <mmiozzo@cttc.es> : Update to FF API Architecture
20 * Author: Nicola Baldo <nbaldo@cttc.es> : Integrated with new RRC and MAC architecture
21 * Author: Danilo Abrignani <danilo.abrignani@unibo.it> : Integrated with new architecture - GSoC 2015 - Carrier Aggregation
22 */
23
24#include <ns3/llc-snap-header.h>
25#include <ns3/simulator.h>
26#include <ns3/callback.h>
27#include <ns3/node.h>
28#include <ns3/packet.h>
29#include <ns3/lte-net-device.h>
30#include <ns3/packet-burst.h>
31#include <ns3/uinteger.h>
32#include <ns3/trace-source-accessor.h>
33#include <ns3/pointer.h>
34#include <ns3/enum.h>
35#include <ns3/lte-amc.h>
36#include <ns3/lte-enb-mac.h>
37#include <ns3/lte-enb-net-device.h>
38#include <ns3/lte-enb-rrc.h>
39#include <ns3/lte-ue-net-device.h>
40#include <ns3/lte-enb-phy.h>
41#include <ns3/ff-mac-scheduler.h>
42#include <ns3/lte-handover-algorithm.h>
43#include <ns3/lte-anr.h>
44#include <ns3/lte-ffr-algorithm.h>
45#include <ns3/ipv4-l3-protocol.h>
46#include <ns3/ipv6-l3-protocol.h>
47#include <ns3/abort.h>
48#include <ns3/log.h>
49#include <ns3/lte-enb-component-carrier-manager.h>
50#include <ns3/object-map.h>
51#include <ns3/object-factory.h>
52
53namespace ns3 {
54
55NS_LOG_COMPONENT_DEFINE ("LteEnbNetDevice");
56
57NS_OBJECT_ENSURE_REGISTERED ( LteEnbNetDevice);
58
60{
61 static TypeId
62 tid =
63 TypeId ("ns3::LteEnbNetDevice")
65 .AddConstructor<LteEnbNetDevice> ()
66 .AddAttribute ("LteEnbRrc",
67 "The RRC associated to this EnbNetDevice",
68 PointerValue (),
70 MakePointerChecker <LteEnbRrc> ())
71 .AddAttribute ("LteHandoverAlgorithm",
72 "The handover algorithm associated to this EnbNetDevice",
73 PointerValue (),
75 MakePointerChecker <LteHandoverAlgorithm> ())
76 .AddAttribute ("LteAnr",
77 "The automatic neighbour relation function associated to this EnbNetDevice",
78 PointerValue (),
80 MakePointerChecker <LteAnr> ())
81 .AddAttribute ("LteFfrAlgorithm",
82 "The FFR algorithm associated to this EnbNetDevice",
83 PointerValue (),
85 MakePointerChecker <LteFfrAlgorithm> ())
86 .AddAttribute ("LteEnbComponentCarrierManager",
87 "The RRC associated to this EnbNetDevice",
88 PointerValue (),
90 MakePointerChecker <LteEnbComponentCarrierManager> ())
91 .AddAttribute ("ComponentCarrierMap", "List of component carriers.",
94 MakeObjectMapChecker<ComponentCarrierEnb> ())
95 .AddAttribute ("UlBandwidth",
96 "Uplink Transmission Bandwidth Configuration in number of Resource Blocks",
97 UintegerValue (25),
100 MakeUintegerChecker<uint8_t> ())
101 .AddAttribute ("DlBandwidth",
102 "Downlink Transmission Bandwidth Configuration in number of Resource Blocks",
103 UintegerValue (25),
106 MakeUintegerChecker<uint8_t> ())
107 .AddAttribute ("CellId",
108 "Cell Identifier",
109 UintegerValue (0),
111 MakeUintegerChecker<uint16_t> ())
112 .AddAttribute ("DlEarfcn",
113 "Downlink E-UTRA Absolute Radio Frequency Channel Number (EARFCN) "
114 "as per 3GPP 36.101 Section 5.7.3.",
115 UintegerValue (100),
117 MakeUintegerChecker<uint32_t> (0, 262143))
118 .AddAttribute ("UlEarfcn",
119 "Uplink E-UTRA Absolute Radio Frequency Channel Number (EARFCN) "
120 "as per 3GPP 36.101 Section 5.7.3.",
121 UintegerValue (18100),
123 MakeUintegerChecker<uint32_t> (0, 262143))
124 .AddAttribute ("CsgId",
125 "The Closed Subscriber Group (CSG) identity that this eNodeB belongs to",
126 UintegerValue (0),
129 MakeUintegerChecker<uint32_t> ())
130 .AddAttribute ("CsgIndication",
131 "If true, only UEs which are members of the CSG (i.e. same CSG ID) "
132 "can gain access to the eNodeB, therefore enforcing closed access mode. "
133 "Otherwise, the eNodeB operates as a non-CSG cell and implements open access mode.",
134 BooleanValue (false),
138 ;
139 return tid;
140}
141
143 : m_isConstructed (false),
144 m_isConfigured (false),
145 m_anr (0),
146 m_componentCarrierManager(0)
147{
148 NS_LOG_FUNCTION (this);
149}
150
152{
153 NS_LOG_FUNCTION (this);
154}
155
156void
158{
159 NS_LOG_FUNCTION (this);
160
161 m_rrc->Dispose ();
162 m_rrc = 0;
163
164 m_handoverAlgorithm->Dispose ();
166
167 if (m_anr)
168 {
169 m_anr->Dispose ();
170 m_anr = 0;
171 }
172 m_componentCarrierManager->Dispose();
174 // ComponentCarrierEnb::DoDispose() will call DoDispose
175 // of its PHY, MAC, FFR and scheduler instance
176 for (uint32_t i = 0; i < m_ccMap.size (); i++)
177 {
178 m_ccMap.at (i)->Dispose ();
179 m_ccMap.at (i) = 0;
180 }
181
183}
184
185
186
189{
190 return GetMac (0);
191}
192
195{
196 return GetPhy (0);
197}
198
200LteEnbNetDevice::GetMac (uint8_t index) const
201{
202 return DynamicCast<ComponentCarrierEnb> (m_ccMap.at (index))->GetMac ();
203}
204
206LteEnbNetDevice::GetPhy(uint8_t index) const
207{
208 return DynamicCast<ComponentCarrierEnb> (m_ccMap.at (index))->GetPhy ();
209}
210
213{
214 return m_rrc;
215}
216
219{
221}
222
223uint16_t
225{
226 return m_cellId;
227}
228
229std::vector<uint16_t>
231{
232 std::vector<uint16_t> cellIds;
233
234 for (auto &it: m_ccMap)
235 {
236 cellIds.push_back (it.second->GetCellId ());
237 }
238 return cellIds;
239}
240
241bool
242LteEnbNetDevice::HasCellId (uint16_t cellId) const
243{
244 return m_rrc->HasCellId (cellId);
245}
246
247uint16_t
249{
250 return m_ulBandwidth;
251}
252
253void
255{
256 NS_LOG_FUNCTION (this << bw);
257 switch (bw)
258 {
259 case 6:
260 case 15:
261 case 25:
262 case 50:
263 case 75:
264 case 100:
265 m_ulBandwidth = bw;
266 break;
267
268 default:
269 NS_FATAL_ERROR ("invalid bandwidth value " << bw);
270 break;
271 }
272}
273
274uint16_t
276{
277 return m_dlBandwidth;
278}
279
280void
282{
283 NS_LOG_FUNCTION (this << uint16_t (bw));
284 switch (bw)
285 {
286 case 6:
287 case 15:
288 case 25:
289 case 50:
290 case 75:
291 case 100:
292 m_dlBandwidth = bw;
293 break;
294
295 default:
296 NS_FATAL_ERROR ("invalid bandwidth value " << bw);
297 break;
298 }
299}
300
303{
304 return m_dlEarfcn;
305}
306
307void
309{
310 NS_LOG_FUNCTION (this << earfcn);
311 m_dlEarfcn = earfcn;
312}
313
316{
317 return m_ulEarfcn;
318}
319
320void
322{
323 NS_LOG_FUNCTION (this << earfcn);
324 m_ulEarfcn = earfcn;
325}
326
329{
330 return m_csgId;
331}
332
333void
335{
336 NS_LOG_FUNCTION (this << csgId);
337 m_csgId = csgId;
338 UpdateConfig (); // propagate the change to RRC level
339}
340
341bool
343{
344 return m_csgIndication;
345}
346
347void
349{
350 NS_LOG_FUNCTION (this << csgIndication);
351 m_csgIndication = csgIndication;
352 UpdateConfig (); // propagate the change to RRC level
353}
354
355std::map < uint8_t, Ptr<ComponentCarrierBaseStation> >
357{
358 return m_ccMap;
359}
360
361void
363{
364 NS_ASSERT_MSG (!m_isConfigured, "attempt to set CC map after configuration");
365 m_ccMap = ccm;
366}
367
368void
370{
371 NS_LOG_FUNCTION (this);
372 m_isConstructed = true;
373 UpdateConfig ();
374 for (auto it = m_ccMap.begin (); it != m_ccMap.end (); ++it)
375 {
376 it->second->Initialize ();
377 }
378 m_rrc->Initialize ();
379 m_componentCarrierManager->Initialize();
380 m_handoverAlgorithm->Initialize ();
381
382 if (m_anr)
383 {
384 m_anr->Initialize ();
385 }
386
387 m_ffrAlgorithm->Initialize ();
388}
389
390
391bool
392LteEnbNetDevice::Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber)
393{
394 NS_LOG_FUNCTION (this << packet << dest << protocolNumber);
396 && protocolNumber != Ipv6L3Protocol::PROT_NUMBER,
397 "unsupported protocol " << protocolNumber << ", only IPv4 and IPv6 are supported");
398 return m_rrc->SendData (packet);
399}
400
401
402void
404{
405 NS_LOG_FUNCTION (this);
406
407 if (m_isConstructed)
408 {
409 if (!m_isConfigured)
410 {
411 NS_LOG_LOGIC (this << " Configure cell " << m_cellId);
412 // we have to make sure that this function is called only once
413 NS_ASSERT (!m_ccMap.empty ());
414 m_rrc->ConfigureCell (m_ccMap);
415 m_isConfigured = true;
416 }
417
418 NS_LOG_LOGIC (this << " Updating SIB1 of cell " << m_cellId
419 << " with CSG ID " << m_csgId
420 << " and CSG indication " << m_csgIndication);
421 m_rrc->SetCsgId (m_csgId, m_csgIndication);
422 }
423 else
424 {
425 /*
426 * Lower layers are not ready yet, so do nothing now and expect
427 * ``DoInitialize`` to re-invoke this function.
428 */
429 }
430}
431
432
433} // namespace ns3
a polymophic address class
Definition: address.h:91
AttributeValue implementation for Boolean.
Definition: boolean.h:37
static const uint16_t PROT_NUMBER
Protocol number (0x0800)
static const uint16_t PROT_NUMBER
The protocol number for IPv6 (0x86DD).
void SetUlEarfcn(uint32_t earfcn)
bool HasCellId(uint16_t cellId) const
Ptr< LteAnr > m_anr
ANR.
void UpdateConfig()
Propagate attributes and configuration to sub-modules.
uint32_t m_dlEarfcn
DEPRECATE - It is maintained for backward compatibility after adding CA feature- downlink carrier fre...
void SetCsgId(uint32_t csgId)
Associate the eNodeB device with a particular CSG.
Ptr< LteHandoverAlgorithm > m_handoverAlgorithm
the handover algorithm
void SetDlEarfcn(uint32_t earfcn)
void SetCcMap(std::map< uint8_t, Ptr< ComponentCarrierBaseStation > > ccm)
Set the ComponentCarrier Map of the Enb.
bool m_isConfigured
is configured?
bool GetCsgIndication() const
Returns the CSG indication flag of the eNodeB.
void SetUlBandwidth(uint16_t bw)
uint16_t m_dlBandwidth
DEPRECATE - It is maintained for backward compatibility after adding CA feature- downlink bandwidth i...
bool m_isConstructed
is constructed?
static TypeId GetTypeId(void)
Get the type ID.
virtual ~LteEnbNetDevice(void)
uint32_t GetCsgId() const
Returns the CSG ID of the eNodeB.
uint16_t GetDlBandwidth() const
virtual void DoDispose(void)
Destructor implementation.
uint32_t GetUlEarfcn() const
uint32_t GetDlEarfcn() const
Ptr< LteEnbRrc > GetRrc() const
void SetCsgIndication(bool csgIndication)
Enable or disable the CSG indication flag.
Ptr< LteEnbRrc > m_rrc
the RRC
Ptr< LteEnbMac > GetMac(void) const
virtual bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber)
uint16_t m_cellId
Cell Identifier.
uint16_t GetUlBandwidth() const
std::vector< uint16_t > GetCellIds() const
Ptr< LteEnbPhy > GetPhy(void) const
Ptr< LteEnbComponentCarrierManager > GetComponentCarrierManager() const
bool m_csgIndication
CSG indication.
void SetDlBandwidth(uint16_t bw)
uint32_t m_ulEarfcn
DEPRECATE - It is maintained for backward compatibility after adding CA feature- uplink carrier frequ...
virtual void DoInitialize(void)
Initialize() implementation.
Ptr< LteFfrAlgorithm > m_ffrAlgorithm
DEPRECATED - It is maintained for backward compatibility after adding CA feature.
Ptr< LteEnbComponentCarrierManager > m_componentCarrierManager
the component carrier manager of this eNb
std::map< uint8_t, Ptr< ComponentCarrierBaseStation > > m_ccMap
ComponentCarrier map.
uint16_t GetCellId() const
std::map< uint8_t, Ptr< ComponentCarrierBaseStation > > GetCcMap(void) const
uint16_t m_ulBandwidth
DEPRECATE - It is maintained for backward compatibility after adding CA feature- uplink bandwidth in ...
LteNetDevice provides basic implementation for all LTE network devices.
virtual void DoDispose(void)
Destructor implementation.
Container for a set of ns3::Object pointers.
Hold objects of type Ptr<T>.
Definition: pointer.h:37
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:78
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
Hold an unsigned integer type.
Definition: uinteger.h:44
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:88
Ptr< const AttributeChecker > MakeBooleanChecker(void)
Definition: boolean.cc:121
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Definition: boolean.h:85
Ptr< const AttributeAccessor > MakeObjectMapAccessor(U T::*memberVariable)
MakeAccessorHelper implementation for ObjectVector.
Definition: object-map.h:80
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Definition: pointer.h:227
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Definition: uinteger.h:45
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition: abort.h:108
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:206
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:290
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Every class exported by the ns3 library is enclosed in the ns3 namespace.