A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
lte-rrc-protocol-ideal.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Nicola Baldo <nbaldo@cttc.es>
19  */
20 
21 #include <ns3/fatal-error.h>
22 #include <ns3/log.h>
23 #include <ns3/nstime.h>
24 #include <ns3/node-list.h>
25 #include <ns3/node.h>
26 #include <ns3/simulator.h>
27 
28 #include "lte-rrc-protocol-ideal.h"
29 #include "lte-ue-rrc.h"
30 #include "lte-enb-rrc.h"
31 #include "lte-enb-net-device.h"
32 #include "lte-ue-net-device.h"
33 
34 NS_LOG_COMPONENT_DEFINE ("LteRrcProtocolIdeal");
35 
36 
37 namespace ns3 {
38 
39 
41 
43 
45  : m_ueRrcSapProvider (0),
46  m_enbRrcSapProvider (0)
47 {
49 }
50 
52 {
53 }
54 
55 void
57 {
58  NS_LOG_FUNCTION (this);
59  delete m_ueRrcSapUser;
60  m_rrc = 0;
61 }
62 
63 TypeId
65 {
66  static TypeId tid = TypeId ("ns3::LteUeRrcProtocolIdeal")
67  .SetParent<Object> ()
68  .AddConstructor<LteUeRrcProtocolIdeal> ()
69  ;
70  return tid;
71 }
72 
73 void
75 {
77 }
78 
81 {
82  return m_ueRrcSapUser;
83 }
84 
85 void
87 {
88  m_rrc = rrc;
89 }
90 
91 void
93 {
94  NS_LOG_FUNCTION (this);
95  // We don't care about SRB0/SRB1 since we use ideal RRC messages.
96 }
97 
98 void
100 {
101  // initialize the RNTI and get the EnbLteRrcSapProvider for the
102  // eNB we are currently attached to
103  m_rnti = m_rrc->GetRnti ();
105 
109  m_rnti,
110  msg);
111 }
112 
113 void
115 {
119  m_rnti,
120  msg);
121 }
122 
123 void
125 {
126  // re-initialize the RNTI and get the EnbLteRrcSapProvider for the
127  // eNB we are currently attached to
128  m_rnti = m_rrc->GetRnti ();
130 
134  m_rnti,
135  msg);
136 }
137 
138 void
140 {
144  m_rnti,
145  msg);
146 }
147 
148 void
150 {
154  m_rnti,
155 msg);
156 }
157 
158 void
160 {
164  m_rnti,
165  msg);
166 }
167 
168 void
170 {
171  uint16_t cellId = m_rrc->GetCellId ();
172 
173  // walk list of all nodes to get the peer eNB
174  Ptr<LteEnbNetDevice> enbDev;
175  NodeList::Iterator listEnd = NodeList::End ();
176  bool found = false;
177  for (NodeList::Iterator i = NodeList::Begin ();
178  (i != listEnd) && (!found);
179  ++i)
180  {
181  Ptr<Node> node = *i;
182  int nDevs = node->GetNDevices ();
183  for (int j = 0;
184  (j < nDevs) && (!found);
185  j++)
186  {
187  enbDev = node->GetDevice (j)->GetObject <LteEnbNetDevice> ();
188  if (enbDev == 0)
189  {
190  continue;
191  }
192  else
193  {
194  if (enbDev->GetCellId () == cellId)
195  {
196  found = true;
197  break;
198  }
199  }
200  }
201  }
202  NS_ASSERT_MSG (found, " Unable to find eNB with CellId =" << cellId);
203  m_enbRrcSapProvider = enbDev->GetRrc ()->GetLteEnbRrcSapProvider ();
204  Ptr<LteEnbRrcProtocolIdeal> enbRrcProtocolIdeal = enbDev->GetRrc ()->GetObject<LteEnbRrcProtocolIdeal> ();
205  enbRrcProtocolIdeal->SetUeRrcSapProvider (m_rnti, m_ueRrcSapProvider);
206 }
207 
208 
210 
212  : m_enbRrcSapProvider (0)
213 {
214  NS_LOG_FUNCTION (this);
216 }
217 
219 {
220  NS_LOG_FUNCTION (this);
221 }
222 
223 void
225 {
226  NS_LOG_FUNCTION (this);
227  delete m_enbRrcSapUser;
228 }
229 
230 TypeId
232 {
233  static TypeId tid = TypeId ("ns3::LteEnbRrcProtocolIdeal")
234  .SetParent<Object> ()
235  .AddConstructor<LteEnbRrcProtocolIdeal> ()
236  ;
237  return tid;
238 }
239 
240 void
242 {
244 }
245 
248 {
249  return m_enbRrcSapUser;
250 }
251 
252 void
254 {
255  m_cellId = cellId;
256 }
257 
260 {
261  std::map<uint16_t, LteUeRrcSapProvider*>::const_iterator it;
262  it = m_enbRrcSapProviderMap.find (rnti);
263  NS_ASSERT_MSG (it != m_enbRrcSapProviderMap.end (), "could not find RNTI = " << rnti);
264  return it->second;
265 }
266 
267 void
269 {
270  std::map<uint16_t, LteUeRrcSapProvider*>::iterator it;
271  it = m_enbRrcSapProviderMap.find (rnti);
272  NS_ASSERT_MSG (it != m_enbRrcSapProviderMap.end (), "could not find RNTI = " << rnti);
273  it->second = p;
274 }
275 
276 void
278 {
279  NS_LOG_FUNCTION (this << rnti);
280 
281  // // walk list of all nodes to get the peer UE RRC SAP Provider
282  // Ptr<LteUeRrc> ueRrc;
283  // NodeList::Iterator listEnd = NodeList::End ();
284  // bool found = false;
285  // for (NodeList::Iterator i = NodeList::Begin (); (i != listEnd) && (found == false); i++)
286  // {
287  // Ptr<Node> node = *i;
288  // int nDevs = node->GetNDevices ();
289  // for (int j = 0; j < nDevs; j++)
290  // {
291  // Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
292  // if (!ueDev)
293  // {
294  // continue;
295  // }
296  // else
297  // {
298  // ueRrc = ueDev->GetRrc ();
299  // if ((ueRrc->GetRnti () == rnti) && (ueRrc->GetCellId () == m_cellId))
300  // {
301  // found = true;
302  // break;
303  // }
304  // }
305  // }
306  // }
307  // NS_ASSERT_MSG (found , " Unable to find UE with RNTI=" << rnti << " cellId=" << m_cellId);
308  // m_enbRrcSapProviderMap[rnti] = ueRrc->GetLteUeRrcSapProvider ();
309 
310 
311  // just create empty entry, the UeRrcSapProvider will be set by the
312  // ue upon connection request or connection reconfiguration
313  // completed
314  m_enbRrcSapProviderMap[rnti] = 0;
315 
316 }
317 
318 void
320 {
321  NS_LOG_FUNCTION (this << rnti);
322  m_enbRrcSapProviderMap.erase (rnti);
323 }
324 
325 void
327 {
328  NS_LOG_FUNCTION (this << m_cellId);
329  // walk list of all nodes to get UEs with this cellId
330  Ptr<LteUeRrc> ueRrc;
331  for (NodeList::Iterator i = NodeList::Begin (); i != NodeList::End (); ++i)
332  {
333  Ptr<Node> node = *i;
334  int nDevs = node->GetNDevices ();
335  for (int j = 0; j < nDevs; ++j)
336  {
337  Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
338  if (ueDev != 0)
339  {
340  Ptr<LteUeRrc> ueRrc = ueDev->GetRrc ();
341  NS_LOG_LOGIC ("considering UE IMSI " << ueDev->GetImsi () << " that has cellId " << ueRrc->GetCellId ());
342  if (ueRrc->GetCellId () == m_cellId)
343  {
344  NS_LOG_LOGIC ("sending SI to IMSI " << ueDev->GetImsi ());
345  ueRrc->GetLteUeRrcSapProvider ()->RecvSystemInformation (msg);
348  ueRrc->GetLteUeRrcSapProvider (),
349  msg);
350  }
351  }
352  }
353  }
354 }
355 
356 void
358 {
361  GetUeRrcSapProvider (rnti),
362  msg);
363 }
364 
365 void
367 {
370  GetUeRrcSapProvider (rnti),
371  msg);
372 }
373 
374 void
376 {
379  GetUeRrcSapProvider (rnti),
380  msg);
381 }
382 
383 void
385 {
388  GetUeRrcSapProvider (rnti),
389  msg);
390 }
391 
392 void
394 {
397  GetUeRrcSapProvider (rnti),
398  msg);
399 }
400 
401 void
403 {
406  GetUeRrcSapProvider (rnti),
407  msg);
408 }
409 
410 /*
411  * The purpose of LteEnbRrcProtocolIdeal is to avoid encoding
412  * messages. In order to do so, we need to have some form of encoding for
413  * inter-node RRC messages like HandoverPreparationInfo and HandoverCommand. Doing so
414  * directly is not practical (these messages includes a lot of
415  * information elements, so encoding all of them would defeat the
416  * purpose of LteEnbRrcProtocolIdeal. The workaround is to store the
417  * actual message in a global map, so that then we can just encode the
418  * key in a header and send that between eNBs over X2.
419  *
420  */
421 
422 static std::map<uint32_t, LteRrcSap::HandoverPreparationInfo> g_handoverPreparationInfoMsgMap;
424 
425 /*
426  * This header encodes the map key discussed above. We keep this
427  * private since it should not be used outside this file.
428  *
429  */
431 {
432 public:
433  uint32_t GetMsgId ();
434  void SetMsgId (uint32_t id);
435  static TypeId GetTypeId (void);
436  virtual TypeId GetInstanceTypeId (void) const;
437  virtual void Print (std::ostream &os) const;
438  virtual uint32_t GetSerializedSize (void) const;
439  virtual void Serialize (Buffer::Iterator start) const;
440  virtual uint32_t Deserialize (Buffer::Iterator start);
441 
442 private:
443  uint32_t m_msgId;
444 };
445 
446 uint32_t
448 {
449  return m_msgId;
450 }
451 
452 void
454 {
455  m_msgId = id;
456 }
457 
458 
459 TypeId
461 {
462  static TypeId tid = TypeId ("ns3::IdealHandoverPreparationInfoHeader")
463  .SetParent<Header> ()
464  .AddConstructor<IdealHandoverPreparationInfoHeader> ()
465  ;
466  return tid;
467 }
468 
469 TypeId
471 {
472  return GetTypeId ();
473 }
474 
475 void IdealHandoverPreparationInfoHeader::Print (std::ostream &os) const
476 {
477  os << " msgId=" << m_msgId;
478 }
479 
481 {
482  return 4;
483 }
484 
486 {
487  start.WriteU32 (m_msgId);
488 }
489 
491 {
492  m_msgId = start.ReadU32 ();
493  return GetSerializedSize ();
494 }
495 
496 
497 
500 {
501  uint32_t msgId = ++g_handoverPreparationInfoMsgIdCounter;
502  NS_ASSERT_MSG (g_handoverPreparationInfoMsgMap.find (msgId) == g_handoverPreparationInfoMsgMap.end (), "msgId " << msgId << " already in use");
503  NS_LOG_INFO (" encoding msgId = " << msgId);
504  g_handoverPreparationInfoMsgMap.insert (std::pair<uint32_t, LteRrcSap::HandoverPreparationInfo> (msgId, msg));
506  h.SetMsgId (msgId);
507  Ptr<Packet> p = Create<Packet> ();
508  p->AddHeader (h);
509  return p;
510 }
511 
514 {
516  p->RemoveHeader (h);
517  uint32_t msgId = h.GetMsgId ();
518  NS_LOG_INFO (" decoding msgId = " << msgId);
519  std::map<uint32_t, LteRrcSap::HandoverPreparationInfo>::iterator it = g_handoverPreparationInfoMsgMap.find (msgId);
520  NS_ASSERT_MSG (it != g_handoverPreparationInfoMsgMap.end (), "msgId " << msgId << " not found");
521  LteRrcSap::HandoverPreparationInfo msg = it->second;
523  return msg;
524 }
525 
526 
527 
528 static std::map<uint32_t, LteRrcSap::RrcConnectionReconfiguration> g_handoverCommandMsgMap;
529 static uint32_t g_handoverCommandMsgIdCounter = 0;
530 
531 /*
532  * This header encodes the map key discussed above. We keep this
533  * private since it should not be used outside this file.
534  *
535  */
537 {
538 public:
539  uint32_t GetMsgId ();
540  void SetMsgId (uint32_t id);
541  static TypeId GetTypeId (void);
542  virtual TypeId GetInstanceTypeId (void) const;
543  virtual void Print (std::ostream &os) const;
544  virtual uint32_t GetSerializedSize (void) const;
545  virtual void Serialize (Buffer::Iterator start) const;
546  virtual uint32_t Deserialize (Buffer::Iterator start);
547 
548 private:
549  uint32_t m_msgId;
550 };
551 
552 uint32_t
554 {
555  return m_msgId;
556 }
557 
558 void
560 {
561  m_msgId = id;
562 }
563 
564 
565 TypeId
567 {
568  static TypeId tid = TypeId ("ns3::IdealHandoverCommandHeader")
569  .SetParent<Header> ()
570  .AddConstructor<IdealHandoverCommandHeader> ()
571  ;
572  return tid;
573 }
574 
575 TypeId
577 {
578  return GetTypeId ();
579 }
580 
581 void IdealHandoverCommandHeader::Print (std::ostream &os) const
582 {
583  os << " msgId=" << m_msgId;
584 }
585 
587 {
588  return 4;
589 }
590 
592 {
593  start.WriteU32 (m_msgId);
594 }
595 
597 {
598  m_msgId = start.ReadU32 ();
599  return GetSerializedSize ();
600 }
601 
602 
603 
606 {
607  uint32_t msgId = ++g_handoverCommandMsgIdCounter;
608  NS_ASSERT_MSG (g_handoverCommandMsgMap.find (msgId) == g_handoverCommandMsgMap.end (), "msgId " << msgId << " already in use");
609  NS_LOG_INFO (" encoding msgId = " << msgId);
610  g_handoverCommandMsgMap.insert (std::pair<uint32_t, LteRrcSap::RrcConnectionReconfiguration> (msgId, msg));
612  h.SetMsgId (msgId);
613  Ptr<Packet> p = Create<Packet> ();
614  p->AddHeader (h);
615  return p;
616 }
617 
620 {
622  p->RemoveHeader (h);
623  uint32_t msgId = h.GetMsgId ();
624  NS_LOG_INFO (" decoding msgId = " << msgId);
625  std::map<uint32_t, LteRrcSap::RrcConnectionReconfiguration>::iterator it = g_handoverCommandMsgMap.find (msgId);
626  NS_ASSERT_MSG (it != g_handoverCommandMsgMap.end (), "msgId " << msgId << " not found");
628  g_handoverCommandMsgMap.erase (it);
629  return msg;
630 }
631 
632 
633 
634 
635 
636 } // namespace ns3
Protocol header serialization and deserialization.
Definition: header.h:42
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:268
LteUeRrcSapProvider * m_ueRrcSapProvider
void DoSendRrcConnectionReestablishmentReject(uint16_t rnti, LteRrcSap::RrcConnectionReestablishmentReject msg)
LteEnbRrcSapProvider * m_enbRrcSapProvider
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:95
uint32_t ReadU32(void)
Definition: buffer.cc:1001
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:60
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
virtual void RecvRrcConnectionSetupCompleted(uint16_t rnti, RrcConnectionSetupCompleted msg)=0
Receive an RRCConnectionSetupComplete message from a UE during an RRC connection establishment proced...
Part of the RRC protocol.
Definition: lte-rrc-sap.h:739
void DoSendRrcConnectionReconfigurationCompleted(LteRrcSap::RrcConnectionReconfigurationCompleted msg)
void DoSendRrcConnectionReestablishmentRequest(LteRrcSap::RrcConnectionReestablishmentRequest msg)
static std::map< uint32_t, LteRrcSap::HandoverPreparationInfo > g_handoverPreparationInfoMsgMap
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register the class in the ns-3 factory.
Definition: object-base.h:38
uint16_t GetCellId() const
virtual void DoDispose(void)
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
void DoSendRrcConnectionReconfiguration(uint16_t rnti, LteRrcSap::RrcConnectionReconfiguration msg)
Part of the RRC protocol.
Definition: lte-rrc-sap.h:903
void DoSendRrcConnectionRelease(uint16_t rnti, LteRrcSap::RrcConnectionRelease msg)
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:170
virtual uint32_t GetSerializedSize(void) const
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:853
void SetUeRrc(Ptr< LteUeRrc > rrc)
void SetLteEnbRrcSapProvider(LteEnbRrcSapProvider *p)
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:223
Template for the implementation of the LteEnbRrcSapUser as a member of an owner class of type C to wh...
Definition: lte-rrc-sap.h:1170
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached.
Definition: simulator.h:825
void DoSendRrcConnectionSetup(uint16_t rnti, LteRrcSap::RrcConnectionSetup msg)
static uint32_t g_handoverPreparationInfoMsgIdCounter
void SetLteUeRrcSapProvider(LteUeRrcSapProvider *p)
virtual void RecvRrcConnectionRelease(RrcConnectionRelease msg)=0
Receive an RRCConnectionRelease message from the serving eNodeB during an RRC connection release proc...
iterator in a Buffer instance
Definition: buffer.h:98
void DoSetupUe(uint16_t rnti, LteEnbRrcSapUser::SetupUeParameters params)
virtual void RecvRrcConnectionReestablishmentReject(RrcConnectionReestablishmentReject msg)=0
Receive an RRCConnectionReestablishmentReject message from the serving eNodeB during an RRC connectio...
virtual void RecvRrcConnectionReject(RrcConnectionReject msg)=0
Receive an RRCConnectionReject message from the serving eNodeB during an RRC connection establishment...
static const Time RRC_IDEAL_MSG_DELAY
void DoSendSystemInformation(LteRrcSap::SystemInformation msg)
virtual void Serialize(Buffer::Iterator start) const
Ptr< Packet > DoEncodeHandoverPreparationInformation(LteRrcSap::HandoverPreparationInfo msg)
void DoSendRrcConnectionSetupCompleted(LteRrcSap::RrcConnectionSetupCompleted msg)
static Iterator End(void)
Definition: node-list.cc:234
virtual void RecvRrcConnectionReconfiguration(RrcConnectionReconfiguration msg)=0
Receive an RRCConnectionReconfiguration message from the serving eNodeB during an RRC connection reco...
virtual void RecvRrcConnectionReestablishment(RrcConnectionReestablishment msg)=0
Receive an RRCConnectionReestablishment message from the serving eNodeB during an RRC connection re-e...
virtual void Print(std::ostream &os) const
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
Definition: node.cc:134
virtual uint32_t Deserialize(Buffer::Iterator start)
void DoSendRrcConnectionRequest(LteRrcSap::RrcConnectionRequest msg)
virtual void Print(std::ostream &os) const
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:233
std::map< uint16_t, LteUeRrcSapProvider * > m_enbRrcSapProviderMap
LteRrcSap::HandoverPreparationInfo DoDecodeHandoverPreparationInformation(Ptr< Packet > p)
Models the transmission of RRC messages from the UE to the eNB in an ideal fashion, without errors and without consuming any radio resources.
virtual void Serialize(Buffer::Iterator start) const
uint32_t GetNDevices(void) const
Definition: node.cc:142
Part of the RRC protocol.
Definition: lte-rrc-sap.h:815
Ptr< LteEnbRrc > GetRrc() const
LteUeRrcSapUser * GetLteUeRrcSapUser()
virtual void RecvRrcConnectionSetup(RrcConnectionSetup msg)=0
Receive an RRCConnectionSetup message from the serving eNodeB during an RRC connection establishment ...
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
Definition: node-list.h:44
virtual void RecvRrcConnectionRequest(uint16_t rnti, RrcConnectionRequest msg)=0
Receive an RRCConnectionRequest message from a UE during an RRC connection establishment procedure (S...
virtual void RecvSystemInformation(SystemInformation msg)=0
Receive a SystemInformation message from the serving eNodeB during a system information acquisition p...
LteUeRrcSapProvider * GetUeRrcSapProvider(uint16_t rnti)
#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:84
LteRrcSap::RrcConnectionReconfiguration DoDecodeHandoverCommand(Ptr< Packet > p)
void DoSendRrcConnectionReject(uint16_t rnti, LteRrcSap::RrcConnectionReject msg)
static std::map< uint32_t, LteRrcSap::RrcConnectionReconfiguration > g_handoverCommandMsgMap
void DoSetup(LteUeRrcSapUser::SetupParameters params)
virtual void RecvRrcConnectionReestablishmentRequest(uint16_t rnti, RrcConnectionReestablishmentRequest msg)=0
Receive an RRCConnectionReestablishmentRequest message from a UE during an RRC connection re-establis...
void DoSendRrcConnectionReestablishmentComplete(LteRrcSap::RrcConnectionReestablishmentComplete msg)
static Iterator Begin(void)
Definition: node-list.cc:228
void DoSendRrcConnectionReestablishment(uint16_t rnti, LteRrcSap::RrcConnectionReestablishment msg)
void SetUeRrcSapProvider(uint16_t rnti, LteUeRrcSapProvider *p)
virtual void RecvMeasurementReport(uint16_t rnti, MeasurementReport msg)=0
Receive a MeasurementReport message from a UE during a measurement reporting procedure (Section 5...
virtual void DoDispose(void)
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
virtual uint32_t Deserialize(Buffer::Iterator start)
LteEnbRrcSapProvider * m_enbRrcSapProvider
static uint32_t g_handoverCommandMsgIdCounter
virtual void RecvRrcConnectionReestablishmentComplete(uint16_t rnti, RrcConnectionReestablishmentComplete msg)=0
Receive an RRCConnectionReestablishmentComplete message from a UE during an RRC connection re-establi...
Template for the implementation of the LteUeRrcSapUser as a member of an owner class of type C to whi...
Definition: lte-rrc-sap.h:991
a base class which provides memory management and object aggregation
Definition: object.h:64
Ptr< Packet > DoEncodeHandoverCommand(LteRrcSap::RrcConnectionReconfiguration msg)
Part of the RRC protocol.
Definition: lte-rrc-sap.h:671
virtual TypeId GetInstanceTypeId(void) const
LteEnbRrcSapUser * GetLteEnbRrcSapUser()
void WriteU32(uint32_t data)
Definition: buffer.cc:907
The eNodeB device implementation.
virtual void RecvRrcConnectionReconfigurationCompleted(uint16_t rnti, RrcConnectionReconfigurationCompleted msg)=0
Receive an RRCConnectionReconfigurationComplete message from a UE during an RRC connection reconfigur...
a unique identifier for an interface.
Definition: type-id.h:49
TypeId SetParent(TypeId tid)
Definition: type-id.cc:610
void DoSendMeasurementReport(LteRrcSap::MeasurementReport msg)
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:253
virtual uint32_t GetSerializedSize(void) const
Models the transmission of RRC messages from the UE to the eNB in an ideal fashion, without errors and without consuming any radio resources.
The LteUeNetDevice class implements the UE net device.