A Discrete-Event Network Simulator
API
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 namespace ns3 {
35 
36 NS_LOG_COMPONENT_DEFINE ("LteRrcProtocolIdeal");
37 
39 
41 
43  : m_ueRrcSapProvider (0),
44  m_enbRrcSapProvider (0)
45 {
47 }
48 
50 {
51 }
52 
53 void
55 {
56  NS_LOG_FUNCTION (this);
57  delete m_ueRrcSapUser;
58  m_rrc = 0;
59 }
60 
61 TypeId
63 {
64  static TypeId tid = TypeId ("ns3::LteUeRrcProtocolIdeal")
65  .SetParent<Object> ()
66  .SetGroupName("Lte")
67  .AddConstructor<LteUeRrcProtocolIdeal> ()
68  ;
69  return tid;
70 }
71 
72 void
74 {
76 }
77 
80 {
81  return m_ueRrcSapUser;
82 }
83 
84 void
86 {
87  m_rrc = rrc;
88 }
89 
90 void
92 {
93  NS_LOG_FUNCTION (this);
94  // We don't care about SRB0/SRB1 since we use ideal RRC messages.
95 }
96 
97 void
99 {
100  // initialize the RNTI and get the EnbLteRrcSapProvider for the
101  // eNB we are currently attached to
102  m_rnti = m_rrc->GetRnti ();
104 
105  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
108  m_rnti,
109  msg);
110 }
111 
112 void
114 {
115  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
118  m_rnti,
119  msg);
120 }
121 
122 void
124 {
125  // re-initialize the RNTI and get the EnbLteRrcSapProvider for the
126  // eNB we are currently attached to
127  m_rnti = m_rrc->GetRnti ();
129 
130  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
133  m_rnti,
134  msg);
135 }
136 
137 void
139 {
140  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
143  m_rnti,
144  msg);
145 }
146 
147 void
149 {
150  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
153  m_rnti,
154 msg);
155 }
156 
157 void
159 {
160  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
163  m_rnti,
164  msg);
165 }
166 
167 void
169 {
170  uint16_t cellId = m_rrc->GetCellId ();
171 
172  // walk list of all nodes to get the peer eNB
173  Ptr<LteEnbNetDevice> enbDev;
174  NodeList::Iterator listEnd = NodeList::End ();
175  bool found = false;
176  for (NodeList::Iterator i = NodeList::Begin ();
177  (i != listEnd) && (!found);
178  ++i)
179  {
180  Ptr<Node> node = *i;
181  int nDevs = node->GetNDevices ();
182  for (int j = 0;
183  (j < nDevs) && (!found);
184  j++)
185  {
186  enbDev = node->GetDevice (j)->GetObject <LteEnbNetDevice> ();
187  if (enbDev == 0)
188  {
189  continue;
190  }
191  else
192  {
193  if (enbDev->GetCellId () == cellId)
194  {
195  found = true;
196  break;
197  }
198  }
199  }
200  }
201  NS_ASSERT_MSG (found, " Unable to find eNB with CellId =" << cellId);
202  m_enbRrcSapProvider = enbDev->GetRrc ()->GetLteEnbRrcSapProvider ();
203  Ptr<LteEnbRrcProtocolIdeal> enbRrcProtocolIdeal = enbDev->GetRrc ()->GetObject<LteEnbRrcProtocolIdeal> ();
204  enbRrcProtocolIdeal->SetUeRrcSapProvider (m_rnti, m_ueRrcSapProvider);
205 }
206 
207 
209 
211  : m_enbRrcSapProvider (0)
212 {
213  NS_LOG_FUNCTION (this);
215 }
216 
218 {
219  NS_LOG_FUNCTION (this);
220 }
221 
222 void
224 {
225  NS_LOG_FUNCTION (this);
226  delete m_enbRrcSapUser;
227 }
228 
229 TypeId
231 {
232  static TypeId tid = TypeId ("ns3::LteEnbRrcProtocolIdeal")
233  .SetParent<Object> ()
234  .SetGroupName("Lte")
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);
346  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
348  ueRrc->GetLteUeRrcSapProvider (),
349  msg);
350  }
351  }
352  }
353  }
354 }
355 
356 void
358 {
359  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
361  GetUeRrcSapProvider (rnti),
362  msg);
363 }
364 
365 void
367 {
368  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
370  GetUeRrcSapProvider (rnti),
371  msg);
372 }
373 
374 void
376 {
377  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
379  GetUeRrcSapProvider (rnti),
380  msg);
381 }
382 
383 void
385 {
386  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
388  GetUeRrcSapProvider (rnti),
389  msg);
390 }
391 
392 void
394 {
395  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
397  GetUeRrcSapProvider (rnti),
398  msg);
399 }
400 
401 void
403 {
404  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
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  .SetGroupName("Lte")
465  .AddConstructor<IdealHandoverPreparationInfoHeader> ()
466  ;
467  return tid;
468 }
469 
470 TypeId
472 {
473  return GetTypeId ();
474 }
475 
476 void IdealHandoverPreparationInfoHeader::Print (std::ostream &os) const
477 {
478  os << " msgId=" << m_msgId;
479 }
480 
482 {
483  return 4;
484 }
485 
487 {
488  start.WriteU32 (m_msgId);
489 }
490 
492 {
493  m_msgId = start.ReadU32 ();
494  return GetSerializedSize ();
495 }
496 
497 
498 
501 {
502  uint32_t msgId = ++g_handoverPreparationInfoMsgIdCounter;
503  NS_ASSERT_MSG (g_handoverPreparationInfoMsgMap.find (msgId) == g_handoverPreparationInfoMsgMap.end (), "msgId " << msgId << " already in use");
504  NS_LOG_INFO (" encoding msgId = " << msgId);
505  g_handoverPreparationInfoMsgMap.insert (std::pair<uint32_t, LteRrcSap::HandoverPreparationInfo> (msgId, msg));
507  h.SetMsgId (msgId);
508  Ptr<Packet> p = Create<Packet> ();
509  p->AddHeader (h);
510  return p;
511 }
512 
515 {
517  p->RemoveHeader (h);
518  uint32_t msgId = h.GetMsgId ();
519  NS_LOG_INFO (" decoding msgId = " << msgId);
520  std::map<uint32_t, LteRrcSap::HandoverPreparationInfo>::iterator it = g_handoverPreparationInfoMsgMap.find (msgId);
521  NS_ASSERT_MSG (it != g_handoverPreparationInfoMsgMap.end (), "msgId " << msgId << " not found");
522  LteRrcSap::HandoverPreparationInfo msg = it->second;
523  g_handoverPreparationInfoMsgMap.erase (it);
524  return msg;
525 }
526 
527 
528 
529 static std::map<uint32_t, LteRrcSap::RrcConnectionReconfiguration> g_handoverCommandMsgMap;
530 static uint32_t g_handoverCommandMsgIdCounter = 0;
531 
532 /*
533  * This header encodes the map key discussed above. We keep this
534  * private since it should not be used outside this file.
535  *
536  */
538 {
539 public:
540  uint32_t GetMsgId ();
541  void SetMsgId (uint32_t id);
542  static TypeId GetTypeId (void);
543  virtual TypeId GetInstanceTypeId (void) const;
544  virtual void Print (std::ostream &os) const;
545  virtual uint32_t GetSerializedSize (void) const;
546  virtual void Serialize (Buffer::Iterator start) const;
547  virtual uint32_t Deserialize (Buffer::Iterator start);
548 
549 private:
550  uint32_t m_msgId;
551 };
552 
553 uint32_t
555 {
556  return m_msgId;
557 }
558 
559 void
561 {
562  m_msgId = id;
563 }
564 
565 
566 TypeId
568 {
569  static TypeId tid = TypeId ("ns3::IdealHandoverCommandHeader")
570  .SetParent<Header> ()
571  .SetGroupName("Lte")
572  .AddConstructor<IdealHandoverCommandHeader> ()
573  ;
574  return tid;
575 }
576 
577 TypeId
579 {
580  return GetTypeId ();
581 }
582 
583 void IdealHandoverCommandHeader::Print (std::ostream &os) const
584 {
585  os << " msgId=" << m_msgId;
586 }
587 
589 {
590  return 4;
591 }
592 
594 {
595  start.WriteU32 (m_msgId);
596 }
597 
599 {
600  m_msgId = start.ReadU32 ();
601  return GetSerializedSize ();
602 }
603 
604 
605 
608 {
609  uint32_t msgId = ++g_handoverCommandMsgIdCounter;
610  NS_ASSERT_MSG (g_handoverCommandMsgMap.find (msgId) == g_handoverCommandMsgMap.end (), "msgId " << msgId << " already in use");
611  NS_LOG_INFO (" encoding msgId = " << msgId);
612  g_handoverCommandMsgMap.insert (std::pair<uint32_t, LteRrcSap::RrcConnectionReconfiguration> (msgId, msg));
614  h.SetMsgId (msgId);
615  Ptr<Packet> p = Create<Packet> ();
616  p->AddHeader (h);
617  return p;
618 }
619 
622 {
624  p->RemoveHeader (h);
625  uint32_t msgId = h.GetMsgId ();
626  NS_LOG_INFO (" decoding msgId = " << msgId);
627  std::map<uint32_t, LteRrcSap::RrcConnectionReconfiguration>::iterator it = g_handoverCommandMsgMap.find (msgId);
628  NS_ASSERT_MSG (it != g_handoverCommandMsgMap.end (), "msgId " << msgId << " not found");
630  g_handoverCommandMsgMap.erase (it);
631  return msg;
632 }
633 
634 
635 
636 
637 
638 } // 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:102
uint32_t ReadU32(void)
Definition: buffer.cc:972
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
#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 an Object subclass with the TypeId system.
Definition: object-base.h:44
uint16_t GetCellId() const
virtual void DoDispose(void)
Destructor implementation.
void DoSendRrcConnectionReconfiguration(uint16_t rnti, LteRrcSap::RrcConnectionReconfiguration msg)
Part of the RRC protocol.
Definition: lte-rrc-sap.h:903
def start()
Definition: core.py:1482
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:201
virtual uint32_t GetSerializedSize(void) const
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:903
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:244
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
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
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
Definition: simulator.h:1238
Ptr< Packet > DoEncodeHandoverPreparationInformation(LteRrcSap::HandoverPreparationInfo msg)
void DoSendRrcConnectionSetupCompleted(LteRrcSap::RrcConnectionSetupCompleted msg)
static Iterator End(void)
Definition: node-list.cc:235
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:142
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:252
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:150
Part of the RRC protocol.
Definition: lte-rrc-sap.h:815
Ptr< LteEnbRrc > GetRrc() const
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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:90
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:229
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)
Destructor implementation.
virtual uint32_t Deserialize(Buffer::Iterator start)
LteEnbRrcSapProvider * m_enbRrcSapProvider
virtual TypeId GetInstanceTypeId(void) const
Get the most derived TypeId for this Object.
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:87
Ptr< Packet > DoEncodeHandoverCommand(LteRrcSap::RrcConnectionReconfiguration msg)
Part of the RRC protocol.
Definition: lte-rrc-sap.h:671
virtual TypeId GetInstanceTypeId(void) const
Get the most derived TypeId for this Object.
LteEnbRrcSapUser * GetLteEnbRrcSapUser()
void WriteU32(uint32_t data)
Definition: buffer.cc:878
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:58
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:904
void DoSendMeasurementReport(LteRrcSap::MeasurementReport msg)
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:257
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.