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 
40 const Time RRC_IDEAL_MSG_DELAY = MilliSeconds (0);
41 
43  ;
44 
46  : m_ueRrcSapProvider (0),
47  m_enbRrcSapProvider (0)
48 {
50 }
51 
53 {
54 }
55 
56 void
58 {
59  NS_LOG_FUNCTION (this);
60  delete m_ueRrcSapUser;
61  m_rrc = 0;
62 }
63 
64 TypeId
66 {
67  static TypeId tid = TypeId ("ns3::LteUeRrcProtocolIdeal")
68  .SetParent<Object> ()
69  .AddConstructor<LteUeRrcProtocolIdeal> ()
70  ;
71  return tid;
72 }
73 
74 void
76 {
78 }
79 
82 {
83  return m_ueRrcSapUser;
84 }
85 
86 void
88 {
89  m_rrc = rrc;
90 }
91 
92 void
94 {
95  NS_LOG_FUNCTION (this);
96  // We don't care about SRB0/SRB1 since we use ideal RRC messages.
97 }
98 
99 void
101 {
102  // initialize the RNTI and get the EnbLteRrcSapProvider for the
103  // eNB we are currently attached to
104  m_rnti = m_rrc->GetRnti ();
106 
110  m_rnti,
111  msg);
112 }
113 
114 void
116 {
120  m_rnti,
121  msg);
122 }
123 
124 void
126 {
127  // re-initialize the RNTI and get the EnbLteRrcSapProvider for the
128  // eNB we are currently attached to
129  m_rnti = m_rrc->GetRnti ();
131 
135  m_rnti,
136  msg);
137 }
138 
139 void
141 {
145  m_rnti,
146  msg);
147 }
148 
149 void
151 {
155  m_rnti,
156 msg);
157 }
158 
159 void
161 {
165  m_rnti,
166  msg);
167 }
168 
169 void
171 {
172  uint16_t cellId = m_rrc->GetCellId ();
173 
174  // walk list of all nodes to get the peer eNB
175  Ptr<LteEnbNetDevice> enbDev;
176  NodeList::Iterator listEnd = NodeList::End ();
177  bool found = false;
178  for (NodeList::Iterator i = NodeList::Begin ();
179  (i != listEnd) && (!found);
180  ++i)
181  {
182  Ptr<Node> node = *i;
183  int nDevs = node->GetNDevices ();
184  for (int j = 0;
185  (j < nDevs) && (!found);
186  j++)
187  {
188  enbDev = node->GetDevice (j)->GetObject <LteEnbNetDevice> ();
189  if (enbDev == 0)
190  {
191  continue;
192  }
193  else
194  {
195  if (enbDev->GetCellId () == cellId)
196  {
197  found = true;
198  break;
199  }
200  }
201  }
202  }
203  NS_ASSERT_MSG (found, " Unable to find eNB with CellId =" << cellId);
204  m_enbRrcSapProvider = enbDev->GetRrc ()->GetLteEnbRrcSapProvider ();
205  Ptr<LteEnbRrcProtocolIdeal> enbRrcProtocolIdeal = enbDev->GetRrc ()->GetObject<LteEnbRrcProtocolIdeal> ();
206  enbRrcProtocolIdeal->SetUeRrcSapProvider (m_rnti, m_ueRrcSapProvider);
207 }
208 
209 
211  ;
212 
214  : m_enbRrcSapProvider (0)
215 {
216  NS_LOG_FUNCTION (this);
218 }
219 
221 {
222  NS_LOG_FUNCTION (this);
223 }
224 
225 void
227 {
228  NS_LOG_FUNCTION (this);
229  delete m_enbRrcSapUser;
230 }
231 
232 TypeId
234 {
235  static TypeId tid = TypeId ("ns3::LteEnbRrcProtocolIdeal")
236  .SetParent<Object> ()
237  .AddConstructor<LteEnbRrcProtocolIdeal> ()
238  ;
239  return tid;
240 }
241 
242 void
244 {
246 }
247 
250 {
251  return m_enbRrcSapUser;
252 }
253 
254 void
256 {
257  m_cellId = cellId;
258 }
259 
262 {
263  std::map<uint16_t, LteUeRrcSapProvider*>::const_iterator it;
264  it = m_enbRrcSapProviderMap.find (rnti);
265  NS_ASSERT_MSG (it != m_enbRrcSapProviderMap.end (), "could not find RNTI = " << rnti);
266  return it->second;
267 }
268 
269 void
271 {
272  std::map<uint16_t, LteUeRrcSapProvider*>::iterator it;
273  it = m_enbRrcSapProviderMap.find (rnti);
274  NS_ASSERT_MSG (it != m_enbRrcSapProviderMap.end (), "could not find RNTI = " << rnti);
275  it->second = p;
276 }
277 
278 void
280 {
281  NS_LOG_FUNCTION (this << rnti);
282 
283  // // walk list of all nodes to get the peer UE RRC SAP Provider
284  // Ptr<LteUeRrc> ueRrc;
285  // NodeList::Iterator listEnd = NodeList::End ();
286  // bool found = false;
287  // for (NodeList::Iterator i = NodeList::Begin (); (i != listEnd) && (found == false); i++)
288  // {
289  // Ptr<Node> node = *i;
290  // int nDevs = node->GetNDevices ();
291  // for (int j = 0; j < nDevs; j++)
292  // {
293  // Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
294  // if (!ueDev)
295  // {
296  // continue;
297  // }
298  // else
299  // {
300  // ueRrc = ueDev->GetRrc ();
301  // if ((ueRrc->GetRnti () == rnti) && (ueRrc->GetCellId () == m_cellId))
302  // {
303  // found = true;
304  // break;
305  // }
306  // }
307  // }
308  // }
309  // NS_ASSERT_MSG (found , " Unable to find UE with RNTI=" << rnti << " cellId=" << m_cellId);
310  // m_enbRrcSapProviderMap[rnti] = ueRrc->GetLteUeRrcSapProvider ();
311 
312 
313  // just create empty entry, the UeRrcSapProvider will be set by the
314  // ue upon connection request or connection reconfiguration
315  // completed
316  m_enbRrcSapProviderMap[rnti] = 0;
317 
318 }
319 
320 void
322 {
323  NS_LOG_FUNCTION (this << rnti);
324  m_enbRrcSapProviderMap.erase (rnti);
325 }
326 
327 void
329 {
330  NS_LOG_FUNCTION (this << m_cellId);
331  // walk list of all nodes to get UEs with this cellId
332  Ptr<LteUeRrc> ueRrc;
333  for (NodeList::Iterator i = NodeList::Begin (); i != NodeList::End (); ++i)
334  {
335  Ptr<Node> node = *i;
336  int nDevs = node->GetNDevices ();
337  for (int j = 0; j < nDevs; ++j)
338  {
339  Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
340  if (ueDev != 0)
341  {
342  Ptr<LteUeRrc> ueRrc = ueDev->GetRrc ();
343  NS_LOG_LOGIC ("considering UE IMSI " << ueDev->GetImsi () << " that has cellId " << ueRrc->GetCellId ());
344  if (ueRrc->GetCellId () == m_cellId)
345  {
346  NS_LOG_LOGIC ("sending SI to IMSI " << ueDev->GetImsi ());
347  ueRrc->GetLteUeRrcSapProvider ()->RecvSystemInformation (msg);
350  ueRrc->GetLteUeRrcSapProvider (),
351  msg);
352  }
353  }
354  }
355  }
356 }
357 
358 void
360 {
363  GetUeRrcSapProvider (rnti),
364  msg);
365 }
366 
367 void
369 {
372  GetUeRrcSapProvider (rnti),
373  msg);
374 }
375 
376 void
378 {
381  GetUeRrcSapProvider (rnti),
382  msg);
383 }
384 
385 void
387 {
390  GetUeRrcSapProvider (rnti),
391  msg);
392 }
393 
394 void
396 {
399  GetUeRrcSapProvider (rnti),
400  msg);
401 }
402 
403 void
405 {
408  GetUeRrcSapProvider (rnti),
409  msg);
410 }
411 
412 /*
413  * The purpose of LteEnbRrcProtocolIdeal is to avoid encoding
414  * messages. In order to do so, we need to have some form of encoding for
415  * inter-node RRC messages like HandoverPreparationInfo and HandoverCommand. Doing so
416  * directly is not practical (these messages includes a lot of
417  * information elements, so encoding all of them would defeat the
418  * purpose of LteEnbRrcProtocolIdeal. The workaround is to store the
419  * actual message in a global map, so that then we can just encode the
420  * key in a header and send that between eNBs over X2.
421  *
422  */
423 
424 std::map<uint32_t, LteRrcSap::HandoverPreparationInfo> g_handoverPreparationInfoMsgMap;
426 
427 /*
428  * This header encodes the map key discussed above. We keep this
429  * private since it should not be used outside this file.
430  *
431  */
433 {
434 public:
435  uint32_t GetMsgId ();
436  void SetMsgId (uint32_t id);
437  static TypeId GetTypeId (void);
438  virtual TypeId GetInstanceTypeId (void) const;
439  virtual void Print (std::ostream &os) const;
440  virtual uint32_t GetSerializedSize (void) const;
441  virtual void Serialize (Buffer::Iterator start) const;
442  virtual uint32_t Deserialize (Buffer::Iterator start);
443 
444 private:
445  uint32_t m_msgId;
446 };
447 
448 uint32_t
450 {
451  return m_msgId;
452 }
453 
454 void
456 {
457  m_msgId = id;
458 }
459 
460 
461 TypeId
463 {
464  static TypeId tid = TypeId ("ns3::IdealHandoverPreparationInfoHeader")
465  .SetParent<Header> ()
466  .AddConstructor<IdealHandoverPreparationInfoHeader> ()
467  ;
468  return tid;
469 }
470 
471 TypeId
473 {
474  return GetTypeId ();
475 }
476 
477 void IdealHandoverPreparationInfoHeader::Print (std::ostream &os) const
478 {
479  os << " msgId=" << m_msgId;
480 }
481 
483 {
484  return 4;
485 }
486 
488 {
489  start.WriteU32 (m_msgId);
490 }
491 
493 {
494  m_msgId = start.ReadU32 ();
495  return GetSerializedSize ();
496 }
497 
498 
499 
502 {
503  uint32_t msgId = ++g_handoverPreparationInfoMsgIdCounter;
504  NS_ASSERT_MSG (g_handoverPreparationInfoMsgMap.find (msgId) == g_handoverPreparationInfoMsgMap.end (), "msgId " << msgId << " already in use");
505  NS_LOG_INFO (" encoding msgId = " << msgId);
506  g_handoverPreparationInfoMsgMap.insert (std::pair<uint32_t, LteRrcSap::HandoverPreparationInfo> (msgId, msg));
508  h.SetMsgId (msgId);
509  Ptr<Packet> p = Create<Packet> ();
510  p->AddHeader (h);
511  return p;
512 }
513 
516 {
518  p->RemoveHeader (h);
519  uint32_t msgId = h.GetMsgId ();
520  NS_LOG_INFO (" decoding msgId = " << msgId);
521  std::map<uint32_t, LteRrcSap::HandoverPreparationInfo>::iterator it = g_handoverPreparationInfoMsgMap.find (msgId);
522  NS_ASSERT_MSG (it != g_handoverPreparationInfoMsgMap.end (), "msgId " << msgId << " not found");
523  LteRrcSap::HandoverPreparationInfo msg = it->second;
525  return msg;
526 }
527 
528 
529 
530 std::map<uint32_t, LteRrcSap::RrcConnectionReconfiguration> g_handoverCommandMsgMap;
532 
533 /*
534  * This header encodes the map key discussed above. We keep this
535  * private since it should not be used outside this file.
536  *
537  */
539 {
540 public:
541  uint32_t GetMsgId ();
542  void SetMsgId (uint32_t id);
543  static TypeId GetTypeId (void);
544  virtual TypeId GetInstanceTypeId (void) const;
545  virtual void Print (std::ostream &os) const;
546  virtual uint32_t GetSerializedSize (void) const;
547  virtual void Serialize (Buffer::Iterator start) const;
548  virtual uint32_t Deserialize (Buffer::Iterator start);
549 
550 private:
551  uint32_t m_msgId;
552 };
553 
554 uint32_t
556 {
557  return m_msgId;
558 }
559 
560 void
562 {
563  m_msgId = id;
564 }
565 
566 
567 TypeId
569 {
570  static TypeId tid = TypeId ("ns3::IdealHandoverCommandHeader")
571  .SetParent<Header> ()
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
keep track of time values and allow control of global simulation resolution
Definition: nstime.h:81
uint32_t ReadU32(void)
Definition: buffer.cc:997
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:59
#define NS_LOG_FUNCTION(parameters)
Definition: log.h:345
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:676
void DoSendRrcConnectionReconfigurationCompleted(LteRrcSap::RrcConnectionReconfigurationCompleted msg)
void DoSendRrcConnectionReestablishmentRequest(LteRrcSap::RrcConnectionReestablishmentRequest msg)
std::map< uint32_t, LteRrcSap::HandoverPreparationInfo > g_handoverPreparationInfoMsgMap
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:840
void DoSendRrcConnectionRelease(uint16_t rnti, LteRrcSap::RrcConnectionRelease msg)
NS_OBJECT_ENSURE_REGISTERED(NullMessageSimulatorImpl)
virtual uint32_t GetSerializedSize(void) const
void SetUeRrc(Ptr< LteUeRrc > rrc)
void SetLteEnbRrcSapProvider(LteEnbRrcSapProvider *p)
#define NS_LOG_INFO(msg)
Definition: log.h:298
Template for the implementation of the LteEnbRrcSapUser as a member of an owner class of type C to wh...
Definition: lte-rrc-sap.h:1107
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:824
void DoSendRrcConnectionSetup(uint16_t rnti, LteRrcSap::RrcConnectionSetup msg)
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...
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:188
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
Definition: node.cc:132
virtual uint32_t Deserialize(Buffer::Iterator start)
void DoSendRrcConnectionRequest(LteRrcSap::RrcConnectionRequest msg)
virtual void Print(std::ostream &os) const
#define NS_LOG_LOGIC(msg)
Definition: log.h:368
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:140
Part of the RRC protocol.
Definition: lte-rrc-sap.h:752
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
Definition: node-list.h:43
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...
NS_LOG_COMPONENT_DEFINE("LteRrcProtocolIdeal")
LteUeRrcSapProvider * GetUeRrcSapProvider(uint16_t rnti)
#define NS_ASSERT_MSG(condition, message)
Definition: assert.h:86
LteRrcSap::RrcConnectionReconfiguration DoDecodeHandoverCommand(Ptr< Packet > p)
void DoSendRrcConnectionReject(uint16_t rnti, LteRrcSap::RrcConnectionReject msg)
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:182
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
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:928
a base class which provides memory management and object aggregation
Definition: object.h:63
Ptr< Packet > DoEncodeHandoverCommand(LteRrcSap::RrcConnectionReconfiguration msg)
Part of the RRC protocol.
Definition: lte-rrc-sap.h:608
virtual TypeId GetInstanceTypeId(void) const
LteEnbRrcSapUser * GetLteEnbRrcSapUser()
void WriteU32(uint32_t data)
Definition: buffer.cc:903
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:611
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.