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  .AddConstructor<LteUeRrcProtocolIdeal> ()
67  ;
68  return tid;
69 }
70 
71 void
73 {
75 }
76 
79 {
80  return m_ueRrcSapUser;
81 }
82 
83 void
85 {
86  m_rrc = rrc;
87 }
88 
89 void
91 {
92  NS_LOG_FUNCTION (this);
93  // We don't care about SRB0/SRB1 since we use ideal RRC messages.
94 }
95 
96 void
98 {
99  // initialize the RNTI and get the EnbLteRrcSapProvider for the
100  // eNB we are currently attached to
101  m_rnti = m_rrc->GetRnti ();
103 
104  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
107  m_rnti,
108  msg);
109 }
110 
111 void
113 {
114  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
117  m_rnti,
118  msg);
119 }
120 
121 void
123 {
124  // re-initialize the RNTI and get the EnbLteRrcSapProvider for the
125  // eNB we are currently attached to
126  m_rnti = m_rrc->GetRnti ();
128 
129  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
132  m_rnti,
133  msg);
134 }
135 
136 void
138 {
139  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
142  m_rnti,
143  msg);
144 }
145 
146 void
148 {
149  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
152  m_rnti,
153 msg);
154 }
155 
156 void
158 {
159  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
162  m_rnti,
163  msg);
164 }
165 
166 void
168 {
169  uint16_t cellId = m_rrc->GetCellId ();
170 
171  // walk list of all nodes to get the peer eNB
172  Ptr<LteEnbNetDevice> enbDev;
173  NodeList::Iterator listEnd = NodeList::End ();
174  bool found = false;
175  for (NodeList::Iterator i = NodeList::Begin ();
176  (i != listEnd) && (!found);
177  ++i)
178  {
179  Ptr<Node> node = *i;
180  int nDevs = node->GetNDevices ();
181  for (int j = 0;
182  (j < nDevs) && (!found);
183  j++)
184  {
185  enbDev = node->GetDevice (j)->GetObject <LteEnbNetDevice> ();
186  if (enbDev == 0)
187  {
188  continue;
189  }
190  else
191  {
192  if (enbDev->GetCellId () == cellId)
193  {
194  found = true;
195  break;
196  }
197  }
198  }
199  }
200  NS_ASSERT_MSG (found, " Unable to find eNB with CellId =" << cellId);
201  m_enbRrcSapProvider = enbDev->GetRrc ()->GetLteEnbRrcSapProvider ();
202  Ptr<LteEnbRrcProtocolIdeal> enbRrcProtocolIdeal = enbDev->GetRrc ()->GetObject<LteEnbRrcProtocolIdeal> ();
203  enbRrcProtocolIdeal->SetUeRrcSapProvider (m_rnti, m_ueRrcSapProvider);
204 }
205 
206 
208 
210  : m_enbRrcSapProvider (0)
211 {
212  NS_LOG_FUNCTION (this);
214 }
215 
217 {
218  NS_LOG_FUNCTION (this);
219 }
220 
221 void
223 {
224  NS_LOG_FUNCTION (this);
225  delete m_enbRrcSapUser;
226 }
227 
228 TypeId
230 {
231  static TypeId tid = TypeId ("ns3::LteEnbRrcProtocolIdeal")
232  .SetParent<Object> ()
233  .AddConstructor<LteEnbRrcProtocolIdeal> ()
234  ;
235  return tid;
236 }
237 
238 void
240 {
242 }
243 
246 {
247  return m_enbRrcSapUser;
248 }
249 
250 void
252 {
253  m_cellId = cellId;
254 }
255 
258 {
259  std::map<uint16_t, LteUeRrcSapProvider*>::const_iterator it;
260  it = m_enbRrcSapProviderMap.find (rnti);
261  NS_ASSERT_MSG (it != m_enbRrcSapProviderMap.end (), "could not find RNTI = " << rnti);
262  return it->second;
263 }
264 
265 void
267 {
268  std::map<uint16_t, LteUeRrcSapProvider*>::iterator it;
269  it = m_enbRrcSapProviderMap.find (rnti);
270  NS_ASSERT_MSG (it != m_enbRrcSapProviderMap.end (), "could not find RNTI = " << rnti);
271  it->second = p;
272 }
273 
274 void
276 {
277  NS_LOG_FUNCTION (this << rnti);
278 
279  // // walk list of all nodes to get the peer UE RRC SAP Provider
280  // Ptr<LteUeRrc> ueRrc;
281  // NodeList::Iterator listEnd = NodeList::End ();
282  // bool found = false;
283  // for (NodeList::Iterator i = NodeList::Begin (); (i != listEnd) && (found == false); i++)
284  // {
285  // Ptr<Node> node = *i;
286  // int nDevs = node->GetNDevices ();
287  // for (int j = 0; j < nDevs; j++)
288  // {
289  // Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
290  // if (!ueDev)
291  // {
292  // continue;
293  // }
294  // else
295  // {
296  // ueRrc = ueDev->GetRrc ();
297  // if ((ueRrc->GetRnti () == rnti) && (ueRrc->GetCellId () == m_cellId))
298  // {
299  // found = true;
300  // break;
301  // }
302  // }
303  // }
304  // }
305  // NS_ASSERT_MSG (found , " Unable to find UE with RNTI=" << rnti << " cellId=" << m_cellId);
306  // m_enbRrcSapProviderMap[rnti] = ueRrc->GetLteUeRrcSapProvider ();
307 
308 
309  // just create empty entry, the UeRrcSapProvider will be set by the
310  // ue upon connection request or connection reconfiguration
311  // completed
312  m_enbRrcSapProviderMap[rnti] = 0;
313 
314 }
315 
316 void
318 {
319  NS_LOG_FUNCTION (this << rnti);
320  m_enbRrcSapProviderMap.erase (rnti);
321 }
322 
323 void
325 {
326  NS_LOG_FUNCTION (this << m_cellId);
327  // walk list of all nodes to get UEs with this cellId
328  Ptr<LteUeRrc> ueRrc;
329  for (NodeList::Iterator i = NodeList::Begin (); i != NodeList::End (); ++i)
330  {
331  Ptr<Node> node = *i;
332  int nDevs = node->GetNDevices ();
333  for (int j = 0; j < nDevs; ++j)
334  {
335  Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
336  if (ueDev != 0)
337  {
338  Ptr<LteUeRrc> ueRrc = ueDev->GetRrc ();
339  NS_LOG_LOGIC ("considering UE IMSI " << ueDev->GetImsi () << " that has cellId " << ueRrc->GetCellId ());
340  if (ueRrc->GetCellId () == m_cellId)
341  {
342  NS_LOG_LOGIC ("sending SI to IMSI " << ueDev->GetImsi ());
343  ueRrc->GetLteUeRrcSapProvider ()->RecvSystemInformation (msg);
344  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
346  ueRrc->GetLteUeRrcSapProvider (),
347  msg);
348  }
349  }
350  }
351  }
352 }
353 
354 void
356 {
357  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
359  GetUeRrcSapProvider (rnti),
360  msg);
361 }
362 
363 void
365 {
366  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
368  GetUeRrcSapProvider (rnti),
369  msg);
370 }
371 
372 void
374 {
375  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
377  GetUeRrcSapProvider (rnti),
378  msg);
379 }
380 
381 void
383 {
384  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
386  GetUeRrcSapProvider (rnti),
387  msg);
388 }
389 
390 void
392 {
393  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
395  GetUeRrcSapProvider (rnti),
396  msg);
397 }
398 
399 void
401 {
402  Simulator::Schedule (RRC_IDEAL_MSG_DELAY,
404  GetUeRrcSapProvider (rnti),
405  msg);
406 }
407 
408 /*
409  * The purpose of LteEnbRrcProtocolIdeal is to avoid encoding
410  * messages. In order to do so, we need to have some form of encoding for
411  * inter-node RRC messages like HandoverPreparationInfo and HandoverCommand. Doing so
412  * directly is not practical (these messages includes a lot of
413  * information elements, so encoding all of them would defeat the
414  * purpose of LteEnbRrcProtocolIdeal. The workaround is to store the
415  * actual message in a global map, so that then we can just encode the
416  * key in a header and send that between eNBs over X2.
417  *
418  */
419 
420 static std::map<uint32_t, LteRrcSap::HandoverPreparationInfo> g_handoverPreparationInfoMsgMap;
422 
423 /*
424  * This header encodes the map key discussed above. We keep this
425  * private since it should not be used outside this file.
426  *
427  */
429 {
430 public:
431  uint32_t GetMsgId ();
432  void SetMsgId (uint32_t id);
433  static TypeId GetTypeId (void);
434  virtual TypeId GetInstanceTypeId (void) const;
435  virtual void Print (std::ostream &os) const;
436  virtual uint32_t GetSerializedSize (void) const;
437  virtual void Serialize (Buffer::Iterator start) const;
438  virtual uint32_t Deserialize (Buffer::Iterator start);
439 
440 private:
441  uint32_t m_msgId;
442 };
443 
444 uint32_t
446 {
447  return m_msgId;
448 }
449 
450 void
452 {
453  m_msgId = id;
454 }
455 
456 
457 TypeId
459 {
460  static TypeId tid = TypeId ("ns3::IdealHandoverPreparationInfoHeader")
461  .SetParent<Header> ()
462  .AddConstructor<IdealHandoverPreparationInfoHeader> ()
463  ;
464  return tid;
465 }
466 
467 TypeId
469 {
470  return GetTypeId ();
471 }
472 
473 void IdealHandoverPreparationInfoHeader::Print (std::ostream &os) const
474 {
475  os << " msgId=" << m_msgId;
476 }
477 
479 {
480  return 4;
481 }
482 
484 {
485  start.WriteU32 (m_msgId);
486 }
487 
489 {
490  m_msgId = start.ReadU32 ();
491  return GetSerializedSize ();
492 }
493 
494 
495 
498 {
499  uint32_t msgId = ++g_handoverPreparationInfoMsgIdCounter;
500  NS_ASSERT_MSG (g_handoverPreparationInfoMsgMap.find (msgId) == g_handoverPreparationInfoMsgMap.end (), "msgId " << msgId << " already in use");
501  NS_LOG_INFO (" encoding msgId = " << msgId);
502  g_handoverPreparationInfoMsgMap.insert (std::pair<uint32_t, LteRrcSap::HandoverPreparationInfo> (msgId, msg));
504  h.SetMsgId (msgId);
505  Ptr<Packet> p = Create<Packet> ();
506  p->AddHeader (h);
507  return p;
508 }
509 
512 {
514  p->RemoveHeader (h);
515  uint32_t msgId = h.GetMsgId ();
516  NS_LOG_INFO (" decoding msgId = " << msgId);
517  std::map<uint32_t, LteRrcSap::HandoverPreparationInfo>::iterator it = g_handoverPreparationInfoMsgMap.find (msgId);
518  NS_ASSERT_MSG (it != g_handoverPreparationInfoMsgMap.end (), "msgId " << msgId << " not found");
519  LteRrcSap::HandoverPreparationInfo msg = it->second;
520  g_handoverPreparationInfoMsgMap.erase (it);
521  return msg;
522 }
523 
524 
525 
526 static std::map<uint32_t, LteRrcSap::RrcConnectionReconfiguration> g_handoverCommandMsgMap;
527 static uint32_t g_handoverCommandMsgIdCounter = 0;
528 
529 /*
530  * This header encodes the map key discussed above. We keep this
531  * private since it should not be used outside this file.
532  *
533  */
535 {
536 public:
537  uint32_t GetMsgId ();
538  void SetMsgId (uint32_t id);
539  static TypeId GetTypeId (void);
540  virtual TypeId GetInstanceTypeId (void) const;
541  virtual void Print (std::ostream &os) const;
542  virtual uint32_t GetSerializedSize (void) const;
543  virtual void Serialize (Buffer::Iterator start) const;
544  virtual uint32_t Deserialize (Buffer::Iterator start);
545 
546 private:
547  uint32_t m_msgId;
548 };
549 
550 uint32_t
552 {
553  return m_msgId;
554 }
555 
556 void
558 {
559  m_msgId = id;
560 }
561 
562 
563 TypeId
565 {
566  static TypeId tid = TypeId ("ns3::IdealHandoverCommandHeader")
567  .SetParent<Header> ()
568  .AddConstructor<IdealHandoverCommandHeader> ()
569  ;
570  return tid;
571 }
572 
573 TypeId
575 {
576  return GetTypeId ();
577 }
578 
579 void IdealHandoverCommandHeader::Print (std::ostream &os) const
580 {
581  os << " msgId=" << m_msgId;
582 }
583 
585 {
586  return 4;
587 }
588 
590 {
591  start.WriteU32 (m_msgId);
592 }
593 
595 {
596  m_msgId = start.ReadU32 ();
597  return GetSerializedSize ();
598 }
599 
600 
601 
604 {
605  uint32_t msgId = ++g_handoverCommandMsgIdCounter;
606  NS_ASSERT_MSG (g_handoverCommandMsgMap.find (msgId) == g_handoverCommandMsgMap.end (), "msgId " << msgId << " already in use");
607  NS_LOG_INFO (" encoding msgId = " << msgId);
608  g_handoverCommandMsgMap.insert (std::pair<uint32_t, LteRrcSap::RrcConnectionReconfiguration> (msgId, msg));
610  h.SetMsgId (msgId);
611  Ptr<Packet> p = Create<Packet> ();
612  p->AddHeader (h);
613  return p;
614 }
615 
618 {
620  p->RemoveHeader (h);
621  uint32_t msgId = h.GetMsgId ();
622  NS_LOG_INFO (" decoding msgId = " << msgId);
623  std::map<uint32_t, LteRrcSap::RrcConnectionReconfiguration>::iterator it = g_handoverCommandMsgMap.find (msgId);
624  NS_ASSERT_MSG (it != g_handoverCommandMsgMap.end (), "msgId " << msgId << " not found");
626  g_handoverCommandMsgMap.erase (it);
627  return msg;
628 }
629 
630 
631 
632 
633 
634 } // 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: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:867
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
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:819
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: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:142
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: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)
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: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:51
TypeId SetParent(TypeId tid)
Definition: type-id.cc:631
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.