A Discrete-Event Network Simulator
API
lte-rrc-protocol-real.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  * Authors: Nicola Baldo <nbaldo@cttc.es>
19  * Lluis Parcerisa <lparcerisa@cttc.cat>
20  */
21 
22 #include <ns3/fatal-error.h>
23 #include <ns3/log.h>
24 #include <ns3/nstime.h>
25 #include <ns3/node-list.h>
26 #include <ns3/node.h>
27 #include <ns3/simulator.h>
28 
29 #include "lte-rrc-protocol-real.h"
30 #include "lte-ue-rrc.h"
31 #include "lte-enb-rrc.h"
32 #include "lte-enb-net-device.h"
33 #include "lte-ue-net-device.h"
34 
35 namespace ns3 {
36 
37 NS_LOG_COMPONENT_DEFINE ("LteRrcProtocolReal");
38 
40 
42 
44  : m_ueRrcSapProvider (0),
45  m_enbRrcSapProvider (0)
46 {
50 }
51 
53 {
54 }
55 
56 void
58 {
59  NS_LOG_FUNCTION (this);
60  delete m_ueRrcSapUser;
63  m_rrc = 0;
64 }
65 
66 TypeId
68 {
69  static TypeId tid = TypeId ("ns3::LteUeRrcProtocolReal")
70  .SetParent<Object> ()
71  .AddConstructor<LteUeRrcProtocolReal> ()
72  ;
73  return tid;
74 }
75 
76 void
78 {
80 }
81 
84 {
85  return m_ueRrcSapUser;
86 }
87 
88 void
90 {
91  m_rrc = rrc;
92 }
93 
94 void
96 {
97  NS_LOG_FUNCTION (this);
98 
102 }
103 
104 void
106 {
107  // initialize the RNTI and get the EnbLteRrcSapProvider for the
108  // eNB we are currently attached to
109  m_rnti = m_rrc->GetRnti ();
111 
112  Ptr<Packet> packet = Create<Packet> ();
113 
114  RrcConnectionRequestHeader rrcConnectionRequestHeader;
115  rrcConnectionRequestHeader.SetMessage (msg);
116 
117  packet->AddHeader (rrcConnectionRequestHeader);
118 
119  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
120  transmitPdcpPduParameters.pdcpPdu = packet;
121  transmitPdcpPduParameters.rnti = m_rnti;
122  transmitPdcpPduParameters.lcid = 0;
123 
124  m_setupParameters.srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
125 }
126 
127 void
129 {
130  Ptr<Packet> packet = Create<Packet> ();
131 
132  RrcConnectionSetupCompleteHeader rrcConnectionSetupCompleteHeader;
133  rrcConnectionSetupCompleteHeader.SetMessage (msg);
134 
135  packet->AddHeader (rrcConnectionSetupCompleteHeader);
136 
137  LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
138  transmitPdcpSduParameters.pdcpSdu = packet;
139  transmitPdcpSduParameters.rnti = m_rnti;
140  transmitPdcpSduParameters.lcid = 1;
141 
143  {
144  m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
145  }
146 }
147 
148 void
150 {
151  // re-initialize the RNTI and get the EnbLteRrcSapProvider for the
152  // eNB we are currently attached to
153  m_rnti = m_rrc->GetRnti ();
155 
156  Ptr<Packet> packet = Create<Packet> ();
157 
158  RrcConnectionReconfigurationCompleteHeader rrcConnectionReconfigurationCompleteHeader;
159  rrcConnectionReconfigurationCompleteHeader.SetMessage (msg);
160 
161  packet->AddHeader (rrcConnectionReconfigurationCompleteHeader);
162 
163  LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
164  transmitPdcpSduParameters.pdcpSdu = packet;
165  transmitPdcpSduParameters.rnti = m_rnti;
166  transmitPdcpSduParameters.lcid = 1;
167 
168  m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
169 }
170 
171 void
173 {
174  // re-initialize the RNTI and get the EnbLteRrcSapProvider for the
175  // eNB we are currently attached to
176  m_rnti = m_rrc->GetRnti ();
178 
179  Ptr<Packet> packet = Create<Packet> ();
180 
181  MeasurementReportHeader measurementReportHeader;
182  measurementReportHeader.SetMessage (msg);
183 
184  packet->AddHeader (measurementReportHeader);
185 
186  LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
187  transmitPdcpSduParameters.pdcpSdu = packet;
188  transmitPdcpSduParameters.rnti = m_rnti;
189  transmitPdcpSduParameters.lcid = 1;
190 
191  m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
192 }
193 
194 void
196 {
197  Ptr<Packet> packet = Create<Packet> ();
198 
199  RrcConnectionReestablishmentRequestHeader rrcConnectionReestablishmentRequestHeader;
200  rrcConnectionReestablishmentRequestHeader.SetMessage (msg);
201 
202  packet->AddHeader (rrcConnectionReestablishmentRequestHeader);
203 
204  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
205  transmitPdcpPduParameters.pdcpPdu = packet;
206  transmitPdcpPduParameters.rnti = m_rnti;
207  transmitPdcpPduParameters.lcid = 0;
208 
209  m_setupParameters.srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
210 }
211 
212 void
214 {
215  Ptr<Packet> packet = Create<Packet> ();
216 
217  RrcConnectionReestablishmentCompleteHeader rrcConnectionReestablishmentCompleteHeader;
218  rrcConnectionReestablishmentCompleteHeader.SetMessage (msg);
219 
220  packet->AddHeader (rrcConnectionReestablishmentCompleteHeader);
221 
222  LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
223  transmitPdcpSduParameters.pdcpSdu = packet;
224  transmitPdcpSduParameters.rnti = m_rnti;
225  transmitPdcpSduParameters.lcid = 1;
226 
227  m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
228 }
229 
230 
231 void
233 {
234  uint16_t cellId = m_rrc->GetCellId ();
235 
236  // walk list of all nodes to get the peer eNB
237  Ptr<LteEnbNetDevice> enbDev;
238  NodeList::Iterator listEnd = NodeList::End ();
239  bool found = false;
240  for (NodeList::Iterator i = NodeList::Begin ();
241  (i != listEnd) && (!found);
242  ++i)
243  {
244  Ptr<Node> node = *i;
245  int nDevs = node->GetNDevices ();
246  for (int j = 0;
247  (j < nDevs) && (!found);
248  j++)
249  {
250  enbDev = node->GetDevice (j)->GetObject <LteEnbNetDevice> ();
251  if (enbDev == 0)
252  {
253  continue;
254  }
255  else
256  {
257  if (enbDev->GetCellId () == cellId)
258  {
259  found = true;
260  break;
261  }
262  }
263  }
264  }
265  NS_ASSERT_MSG (found, " Unable to find eNB with CellId =" << cellId);
266  m_enbRrcSapProvider = enbDev->GetRrc ()->GetLteEnbRrcSapProvider ();
267  Ptr<LteEnbRrcProtocolReal> enbRrcProtocolReal = enbDev->GetRrc ()->GetObject<LteEnbRrcProtocolReal> ();
268  enbRrcProtocolReal->SetUeRrcSapProvider (m_rnti, m_ueRrcSapProvider);
269 }
270 
271 void
273 {
274  // Get type of message received
275  RrcDlCcchMessage rrcDlCcchMessage;
276  p->PeekHeader (rrcDlCcchMessage);
277 
278  // Declare possible headers to receive
279  RrcConnectionReestablishmentHeader rrcConnectionReestablishmentHeader;
280  RrcConnectionReestablishmentRejectHeader rrcConnectionReestablishmentRejectHeader;
281  RrcConnectionSetupHeader rrcConnectionSetupHeader;
282  RrcConnectionRejectHeader rrcConnectionRejectHeader;
283 
284  // Declare possible messages
285  LteRrcSap::RrcConnectionReestablishment rrcConnectionReestablishmentMsg;
286  LteRrcSap::RrcConnectionReestablishmentReject rrcConnectionReestablishmentRejectMsg;
287  LteRrcSap::RrcConnectionSetup rrcConnectionSetupMsg;
288  LteRrcSap::RrcConnectionReject rrcConnectionRejectMsg;
289 
290  // Deserialize packet and call member recv function with appropiate structure
291  switch ( rrcDlCcchMessage.GetMessageType () )
292  {
293  case 0:
294  // RrcConnectionReestablishment
295  p->RemoveHeader (rrcConnectionReestablishmentHeader);
296  rrcConnectionReestablishmentMsg = rrcConnectionReestablishmentHeader.GetMessage ();
297  m_ueRrcSapProvider->RecvRrcConnectionReestablishment (rrcConnectionReestablishmentMsg);
298  break;
299  case 1:
300  // RrcConnectionReestablishmentReject
301  p->RemoveHeader (rrcConnectionReestablishmentRejectHeader);
302  rrcConnectionReestablishmentRejectMsg = rrcConnectionReestablishmentRejectHeader.GetMessage ();
303  // m_ueRrcSapProvider->RecvRrcConnectionReestablishmentReject (rrcConnectionReestablishmentRejectMsg);
304  break;
305  case 2:
306  // RrcConnectionReject
307  p->RemoveHeader (rrcConnectionRejectHeader);
308  rrcConnectionRejectMsg = rrcConnectionRejectHeader.GetMessage ();
309  m_ueRrcSapProvider->RecvRrcConnectionReject (rrcConnectionRejectMsg);
310  break;
311  case 3:
312  // RrcConnectionSetup
313  p->RemoveHeader (rrcConnectionSetupHeader);
314  rrcConnectionSetupMsg = rrcConnectionSetupHeader.GetMessage ();
315  m_ueRrcSapProvider->RecvRrcConnectionSetup (rrcConnectionSetupMsg);
316  break;
317  }
318 }
319 
320 void
322 {
323  // Get type of message received
324  RrcDlDcchMessage rrcDlDcchMessage;
325  params.pdcpSdu->PeekHeader (rrcDlDcchMessage);
326 
327  // Declare possible headers to receive
328  RrcConnectionReconfigurationHeader rrcConnectionReconfigurationHeader;
329  RrcConnectionReleaseHeader rrcConnectionReleaseHeader;
330 
331  // Declare possible messages to receive
332  LteRrcSap::RrcConnectionReconfiguration rrcConnectionReconfigurationMsg;
333  LteRrcSap::RrcConnectionRelease rrcConnectionReleaseMsg;
334 
335  // Deserialize packet and call member recv function with appropiate structure
336  switch ( rrcDlDcchMessage.GetMessageType () )
337  {
338  case 4:
339  params.pdcpSdu->RemoveHeader (rrcConnectionReconfigurationHeader);
340  rrcConnectionReconfigurationMsg = rrcConnectionReconfigurationHeader.GetMessage ();
341  m_ueRrcSapProvider->RecvRrcConnectionReconfiguration (rrcConnectionReconfigurationMsg);
342  break;
343  case 5:
344  params.pdcpSdu->RemoveHeader (rrcConnectionReleaseHeader);
345  rrcConnectionReleaseMsg = rrcConnectionReleaseHeader.GetMessage ();
346  //m_ueRrcSapProvider->RecvRrcConnectionRelease (rrcConnectionReleaseMsg);
347  break;
348  }
349 }
350 
352 
354  : m_enbRrcSapProvider (0)
355 {
356  NS_LOG_FUNCTION (this);
358 }
359 
361 {
362  NS_LOG_FUNCTION (this);
363 }
364 
365 void
367 {
368  NS_LOG_FUNCTION (this);
369  delete m_enbRrcSapUser;
370  for (std::map<uint16_t, LteEnbRrcSapProvider::CompleteSetupUeParameters>::iterator
371  it = m_completeSetupUeParametersMap.begin ();
372  it != m_completeSetupUeParametersMap.end ();
373  ++it)
374  {
375  delete it->second.srb0SapUser;
376  delete it->second.srb1SapUser;
377  }
379 }
380 
381 TypeId
383 {
384  static TypeId tid = TypeId ("ns3::LteEnbRrcProtocolReal")
385  .SetParent<Object> ()
386  .AddConstructor<LteEnbRrcProtocolReal> ()
387  ;
388  return tid;
389 }
390 
391 void
393 {
395 }
396 
399 {
400  return m_enbRrcSapUser;
401 }
402 
403 void
405 {
406  m_cellId = cellId;
407 }
408 
411 {
412  std::map<uint16_t, LteUeRrcSapProvider*>::const_iterator it;
413  it = m_enbRrcSapProviderMap.find (rnti);
414  NS_ASSERT_MSG (it != m_enbRrcSapProviderMap.end (), "could not find RNTI = " << rnti);
415  return it->second;
416 }
417 
418 void
420 {
421  std::map<uint16_t, LteUeRrcSapProvider*>::iterator it;
422  it = m_enbRrcSapProviderMap.find (rnti);
423  NS_ASSERT_MSG (it != m_enbRrcSapProviderMap.end (), "could not find RNTI = " << rnti);
424  it->second = p;
425 }
426 
427 void
429 {
430  NS_LOG_FUNCTION (this << rnti);
431 
432  // // walk list of all nodes to get the peer UE RRC SAP Provider
433  // Ptr<LteUeRrc> ueRrc;
434  // NodeList::Iterator listEnd = NodeList::End ();
435  // bool found = false;
436  // for (NodeList::Iterator i = NodeList::Begin (); (i != listEnd) && (found == false); i++)
437  // {
438  // Ptr<Node> node = *i;
439  // int nDevs = node->GetNDevices ();
440  // for (int j = 0; j < nDevs; j++)
441  // {
442  // Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
443  // if (!ueDev)
444  // {
445  // continue;
446  // }
447  // else
448  // {
449  // ueRrc = ueDev->GetRrc ();
450  // if ((ueRrc->GetRnti () == rnti) && (ueRrc->GetCellId () == m_cellId))
451  // {
452  // found = true;
453  // break;
454  // }
455  // }
456  // }
457  // }
458  // NS_ASSERT_MSG (found , " Unable to find UE with RNTI=" << rnti << " cellId=" << m_cellId);
459  // m_enbRrcSapProviderMap[rnti] = ueRrc->GetLteUeRrcSapProvider ();
460 
461  // just create empty entry, the UeRrcSapProvider will be set by the
462  // ue upon connection request or connection reconfiguration
463  // completed
464  m_enbRrcSapProviderMap[rnti] = 0;
465 
466  // Store SetupUeParameters
467  m_setupUeParametersMap[rnti] = params;
468 
469  LteEnbRrcSapProvider::CompleteSetupUeParameters completeSetupUeParameters;
470  std::map<uint16_t, LteEnbRrcSapProvider::CompleteSetupUeParameters>::iterator
471  csupIt = m_completeSetupUeParametersMap.find (rnti);
472  if (csupIt == m_completeSetupUeParametersMap.end ())
473  {
474  // Create LteRlcSapUser, LtePdcpSapUser
475  LteRlcSapUser* srb0SapUser = new RealProtocolRlcSapUser (this,rnti);
477  completeSetupUeParameters.srb0SapUser = srb0SapUser;
478  completeSetupUeParameters.srb1SapUser = srb1SapUser;
479  // Store LteRlcSapUser, LtePdcpSapUser
480  m_completeSetupUeParametersMap[rnti] = completeSetupUeParameters;
481  }
482  else
483  {
484  completeSetupUeParameters = csupIt->second;
485  }
486  m_enbRrcSapProvider->CompleteSetupUe (rnti, completeSetupUeParameters);
487 }
488 
489 void
491 {
492  NS_LOG_FUNCTION (this << rnti);
493  std::map<uint16_t, LteEnbRrcSapProvider::CompleteSetupUeParameters>::iterator
494  it = m_completeSetupUeParametersMap.find (rnti);
496  delete it->second.srb0SapUser;
497  delete it->second.srb1SapUser;
499  m_enbRrcSapProviderMap.erase (rnti);
500  m_setupUeParametersMap.erase (rnti);
501 }
502 
503 void
505 {
506  NS_LOG_FUNCTION (this << m_cellId);
507  // walk list of all nodes to get UEs with this cellId
508  Ptr<LteUeRrc> ueRrc;
509  for (NodeList::Iterator i = NodeList::Begin (); i != NodeList::End (); ++i)
510  {
511  Ptr<Node> node = *i;
512  int nDevs = node->GetNDevices ();
513  for (int j = 0; j < nDevs; ++j)
514  {
515  Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
516  if (ueDev != 0)
517  {
518  Ptr<LteUeRrc> ueRrc = ueDev->GetRrc ();
519  NS_LOG_LOGIC ("considering UE IMSI " << ueDev->GetImsi () << " that has cellId " << ueRrc->GetCellId ());
520  if (ueRrc->GetCellId () == m_cellId)
521  {
522  NS_LOG_LOGIC ("sending SI to IMSI " << ueDev->GetImsi ());
523  ueRrc->GetLteUeRrcSapProvider ()->RecvSystemInformation (msg);
524  Simulator::Schedule (RRC_REAL_MSG_DELAY,
526  ueRrc->GetLteUeRrcSapProvider (),
527  msg);
528  }
529  }
530  }
531  }
532 }
533 
534 void
536 {
537  Ptr<Packet> packet = Create<Packet> ();
538 
539  RrcConnectionSetupHeader rrcConnectionSetupHeader;
540  rrcConnectionSetupHeader.SetMessage (msg);
541 
542  packet->AddHeader (rrcConnectionSetupHeader);
543 
544  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
545  transmitPdcpPduParameters.pdcpPdu = packet;
546  transmitPdcpPduParameters.rnti = rnti;
547  transmitPdcpPduParameters.lcid = 0;
548 
549  if (m_setupUeParametersMap.find (rnti) == m_setupUeParametersMap.end () )
550  {
551  std::cout << "RNTI not found in Enb setup parameters Map!" << std::endl;
552  }
553  else
554  {
555  m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
556  }
557 }
558 
559 void
561 {
562  Ptr<Packet> packet = Create<Packet> ();
563 
564  RrcConnectionRejectHeader rrcConnectionRejectHeader;
565  rrcConnectionRejectHeader.SetMessage (msg);
566 
567  packet->AddHeader (rrcConnectionRejectHeader);
568 
569  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
570  transmitPdcpPduParameters.pdcpPdu = packet;
571  transmitPdcpPduParameters.rnti = rnti;
572  transmitPdcpPduParameters.lcid = 0;
573 
574  m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
575 }
576 
577 void
579 {
580  Ptr<Packet> packet = Create<Packet> ();
581 
582  RrcConnectionReconfigurationHeader rrcConnectionReconfigurationHeader;
583  rrcConnectionReconfigurationHeader.SetMessage (msg);
584 
585  packet->AddHeader (rrcConnectionReconfigurationHeader);
586 
587  LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
588  transmitPdcpSduParameters.pdcpSdu = packet;
589  transmitPdcpSduParameters.rnti = rnti;
590  transmitPdcpSduParameters.lcid = 1;
591 
592  m_setupUeParametersMap[rnti].srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
593 }
594 
595 void
597 {
598  Ptr<Packet> packet = Create<Packet> ();
599 
600  RrcConnectionReestablishmentHeader rrcConnectionReestablishmentHeader;
601  rrcConnectionReestablishmentHeader.SetMessage (msg);
602 
603  packet->AddHeader (rrcConnectionReestablishmentHeader);
604 
605  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
606  transmitPdcpPduParameters.pdcpPdu = packet;
607  transmitPdcpPduParameters.rnti = rnti;
608  transmitPdcpPduParameters.lcid = 0;
609 
610  m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
611 }
612 
613 void
615 {
616  Ptr<Packet> packet = Create<Packet> ();
617 
618  RrcConnectionReestablishmentRejectHeader rrcConnectionReestablishmentRejectHeader;
619  rrcConnectionReestablishmentRejectHeader.SetMessage (msg);
620 
621  packet->AddHeader (rrcConnectionReestablishmentRejectHeader);
622 
623  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
624  transmitPdcpPduParameters.pdcpPdu = packet;
625  transmitPdcpPduParameters.rnti = rnti;
626  transmitPdcpPduParameters.lcid = 0;
627 
628  m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
629 }
630 
631 void
633 {
634  Ptr<Packet> packet = Create<Packet> ();
635 
636  RrcConnectionReleaseHeader rrcConnectionReleaseHeader;
637  rrcConnectionReleaseHeader.SetMessage (msg);
638 
639  packet->AddHeader (rrcConnectionReleaseHeader);
640 
641  LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
642  transmitPdcpSduParameters.pdcpSdu = packet;
643  transmitPdcpSduParameters.rnti = rnti;
644  transmitPdcpSduParameters.lcid = 1;
645 
646  m_setupUeParametersMap[rnti].srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
647 }
648 
649 void
651 {
652  // Get type of message received
653  RrcUlCcchMessage rrcUlCcchMessage;
654  p->PeekHeader (rrcUlCcchMessage);
655 
656  // Declare possible headers to receive
657  RrcConnectionReestablishmentRequestHeader rrcConnectionReestablishmentRequestHeader;
658  RrcConnectionRequestHeader rrcConnectionRequestHeader;
659 
660  // Deserialize packet and call member recv function with appropiate structure
661  switch ( rrcUlCcchMessage.GetMessageType () )
662  {
663  case 0:
664  p->RemoveHeader (rrcConnectionReestablishmentRequestHeader);
665  LteRrcSap::RrcConnectionReestablishmentRequest rrcConnectionReestablishmentRequestMsg;
666  rrcConnectionReestablishmentRequestMsg = rrcConnectionReestablishmentRequestHeader.GetMessage ();
667  m_enbRrcSapProvider->RecvRrcConnectionReestablishmentRequest (rnti,rrcConnectionReestablishmentRequestMsg);
668  break;
669  case 1:
670  p->RemoveHeader (rrcConnectionRequestHeader);
671  LteRrcSap::RrcConnectionRequest rrcConnectionRequestMsg;
672  rrcConnectionRequestMsg = rrcConnectionRequestHeader.GetMessage ();
673  m_enbRrcSapProvider->RecvRrcConnectionRequest (rnti,rrcConnectionRequestMsg);
674  break;
675  }
676 }
677 
678 void
680 {
681  // Get type of message received
682  RrcUlDcchMessage rrcUlDcchMessage;
683  params.pdcpSdu->PeekHeader (rrcUlDcchMessage);
684 
685  // Declare possible headers to receive
686  MeasurementReportHeader measurementReportHeader;
687  RrcConnectionReconfigurationCompleteHeader rrcConnectionReconfigurationCompleteHeader;
688  RrcConnectionReestablishmentCompleteHeader rrcConnectionReestablishmentCompleteHeader;
689  RrcConnectionSetupCompleteHeader rrcConnectionSetupCompleteHeader;
690 
691  // Declare possible messages to receive
692  LteRrcSap::MeasurementReport measurementReportMsg;
693  LteRrcSap::RrcConnectionReconfigurationCompleted rrcConnectionReconfigurationCompleteMsg;
694  LteRrcSap::RrcConnectionReestablishmentComplete rrcConnectionReestablishmentCompleteMsg;
695  LteRrcSap::RrcConnectionSetupCompleted rrcConnectionSetupCompletedMsg;
696 
697  // Deserialize packet and call member recv function with appropiate structure
698  switch ( rrcUlDcchMessage.GetMessageType () )
699  {
700  case 1:
701  params.pdcpSdu->RemoveHeader (measurementReportHeader);
702  measurementReportMsg = measurementReportHeader.GetMessage ();
703  m_enbRrcSapProvider->RecvMeasurementReport (params.rnti,measurementReportMsg);
704  break;
705  case 2:
706  params.pdcpSdu->RemoveHeader (rrcConnectionReconfigurationCompleteHeader);
707  rrcConnectionReconfigurationCompleteMsg = rrcConnectionReconfigurationCompleteHeader.GetMessage ();
708  m_enbRrcSapProvider->RecvRrcConnectionReconfigurationCompleted (params.rnti,rrcConnectionReconfigurationCompleteMsg);
709  break;
710  case 3:
711  params.pdcpSdu->RemoveHeader (rrcConnectionReestablishmentCompleteHeader);
712  rrcConnectionReestablishmentCompleteMsg = rrcConnectionReestablishmentCompleteHeader.GetMessage ();
713  m_enbRrcSapProvider->RecvRrcConnectionReestablishmentComplete (params.rnti,rrcConnectionReestablishmentCompleteMsg);
714  break;
715  case 4:
716  params.pdcpSdu->RemoveHeader (rrcConnectionSetupCompleteHeader);
717  rrcConnectionSetupCompletedMsg = rrcConnectionSetupCompleteHeader.GetMessage ();
718  m_enbRrcSapProvider->RecvRrcConnectionSetupCompleted (params.rnti, rrcConnectionSetupCompletedMsg);
719  break;
720  }
721 }
722 
725 {
727  h.SetMessage (msg);
728 
729  Ptr<Packet> p = Create<Packet> ();
730  p->AddHeader (h);
731  return p;
732 }
733 
736 {
738  p->RemoveHeader (h);
740  return msg;
741 }
742 
745 {
747  h.SetMessage (msg);
748  Ptr<Packet> p = Create<Packet> ();
749  p->AddHeader (h);
750  return p;
751 }
752 
755 {
757  p->RemoveHeader (h);
759  return msg;
760 }
761 
763 
765  : m_pdcp (pdcp),
766  m_rnti (rnti)
767 {
768 }
769 
771 {
772 }
773 
774 void
776 {
778 }
779 
780 } // namespace ns3
virtual void DoDispose(void)
Destructor implementation.
This class only serves to discriminate which message type has been received in downlink (eNb to ue) f...
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:268
Service Access Point (SAP) offered by the UM-RLC and AM-RLC entities to the PDCP entity See 3GPP 36...
Definition: lte-rlc-sap.h:66
virtual void ReceivePdcpPdu(Ptr< Packet > p)
Called by the RLC entity to notify the PDCP entity of the reception of a new PDCP PDU...
void DoSetup(LteUeRrcSapUser::SetupParameters params)
LtePdcpSapProvider * srb1SapProvider
Definition: lte-rrc-sap.h:677
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:95
void DoSendMeasurementReport(LteRrcSap::MeasurementReport msg)
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
LteUeRrcSapProvider * m_ueRrcSapProvider
void DoSendRrcConnectionReject(uint16_t rnti, LteRrcSap::RrcConnectionReject msg)
#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 DoSendRrcConnectionRelease(uint16_t rnti, LteRrcSap::RrcConnectionRelease msg)
Part of the RRC protocol.
Definition: lte-rrc-sap.h:903
void SetMessage(LteRrcSap::RrcConnectionRequest msg)
Receives a RrcConnectionRequest IE and stores the contents into the class attributes.
void SetMessage(LteRrcSap::RrcConnectionSetupCompleted msg)
Receives a RrcConnectionSetupCompleted IE and stores the contents into the class attributes.
void SetMessage(LteRrcSap::RrcConnectionReestablishmentRequest msg)
Receives a RrcConnectionReestablishmentRequest IE and stores the contents into the class attributes...
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
Definition: assert.h:61
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:867
Models the transmission of RRC messages from the UE to the eNB in a real fashion, by creating real RR...
void SetMessage(LteRrcSap::RrcConnectionReestablishmentComplete msg)
Receives a RrcConnectionReestablishmentComplete IE and stores the contents into the class attributes...
void SetMessage(LteRrcSap::RrcConnectionReestablishment msg)
Receives a RrcConnectionReestablishment IE and stores the contents into the class attributes...
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
Ptr< Packet > DoEncodeHandoverCommand(LteRrcSap::RrcConnectionReconfiguration msg)
LteUeRrcSapProvider::CompleteSetupParameters m_completeSetupParameters
LteRrcSap::RrcConnectionReconfiguration DoDecodeHandoverCommand(Ptr< Packet > p)
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
Ptr< Packet > DoEncodeHandoverPreparationInformation(LteRrcSap::HandoverPreparationInfo msg)
LteRrcSap::RrcConnectionReestablishment GetMessage() const
Returns a RrcConnectionReestablishment IE from the values in the class attributes.
virtual void TransmitPdcpPdu(TransmitPdcpPduParameters params)=0
Send a PDCP PDU to the RLC for transmission This method is to be called when upper PDCP entity has a ...
LteRrcSap::RrcConnectionRelease GetMessage() const
Returns a RrcConnectionRelease IE from the values in the class attributes.
LteUeRrcSapProvider * GetUeRrcSapProvider(uint16_t rnti)
Models the transmission of RRC messages from the UE to the eNB in a real fashion, by creating real RR...
LteRrcSap::RrcConnectionReestablishmentRequest GetMessage() const
Returns a RrcConnectionReestablishmentRequest IE from the values in the class attributes.
std::map< uint16_t, LteEnbRrcSapUser::SetupUeParameters > m_setupUeParametersMap
LteRrcSap::HandoverPreparationInfo GetMessage() const
Returns a HandoverPreparationInfo IE from the values in the class attributes.
std::map< uint16_t, LteUeRrcSapProvider * > m_enbRrcSapProviderMap
This class manages the serialization/deserialization of RrcConnectionSetupComplete IE...
virtual void RecvRrcConnectionReject(RrcConnectionReject msg)=0
Receive an RRCConnectionReject message from the serving eNodeB during an RRC connection establishment...
void SetMessage(LteRrcSap::RrcConnectionRelease msg)
Receives a RrcConnectionRelease IE and stores the contents into the class attributes.
Parameters for LtePdcpSapUser::ReceivePdcpSdu.
Definition: lte-pdcp-sap.h:76
uint16_t rnti
the C-RNTI identifying the UE
Definition: lte-pdcp-sap.h:79
void SetLteEnbRrcSapProvider(LteEnbRrcSapProvider *p)
This class manages the serialization/deserialization of RrcConnectionSetup IE.
void DoSendRrcConnectionSetup(uint16_t rnti, LteRrcSap::RrcConnectionSetup msg)
void SetMessage(LteRrcSap::RrcConnectionReestablishmentReject msg)
Receives a RrcConnectionReestablishmentReject IE and stores the contents into the class attributes...
This class only serves to discriminate which message type has been received in uplink (ue to eNb) for...
void SetUeRrcSapProvider(uint16_t rnti, LteUeRrcSapProvider *p)
void DoSendRrcConnectionReestablishmentRequest(LteRrcSap::RrcConnectionReestablishmentRequest msg)
static Iterator End(void)
Definition: node-list.cc:234
const Time RRC_REAL_MSG_DELAY
virtual void RecvRrcConnectionReconfiguration(RrcConnectionReconfiguration msg)=0
Receive an RRCConnectionReconfiguration message from the serving eNodeB during an RRC connection reco...
LteRrcSap::RrcConnectionReestablishmentReject GetMessage() const
Returns a RrcConnectionReestablishmentReject IE from the values in the class attributes.
std::map< uint16_t, LteEnbRrcSapProvider::CompleteSetupUeParameters > m_completeSetupUeParametersMap
This class manages the serialization/deserialization of RrcConnectionReject IE.
virtual void RecvRrcConnectionReestablishment(RrcConnectionReestablishment msg)=0
Receive an RRCConnectionReestablishment message from the serving eNodeB during an RRC connection re-e...
void DoReceivePdcpPdu(Ptr< Packet > p)
uint16_t rnti
the C-RNTI identifying the UE
Definition: lte-pdcp-sap.h:46
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
Definition: node.cc:134
This class only serves to discriminate which message type has been received in downlink (eNb to ue) f...
void SetMessage(LteRrcSap::RrcConnectionReject msg)
Receives a RrcConnectionReject IE and stores the contents into the class attributes.
Parameters for LtePdcpSapProvider::TransmitPdcpSdu.
Definition: lte-pdcp-sap.h:43
LteEnbRrcSapUser * GetLteEnbRrcSapUser()
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:252
This class manages the serialization/deserialization of RRCConnectionReestablishmentRequest IE...
uint8_t lcid
the logical channel id corresponding to the sending RLC instance
Definition: lte-rlc-sap.h:47
void SetMessage(LteRrcSap::MeasurementReport msg)
Receives a MeasurementReport IE and stores the contents into the class attributes.
uint32_t GetNDevices(void) const
Definition: node.cc:142
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Definition: packet.cc:277
void SetMessage(LteRrcSap::RrcConnectionReconfigurationCompleted msg)
Receives a RrcConnectionReconfigurationCompleted IE and stores the contents into the class attributes...
Part of the RRC protocol.
Definition: lte-rrc-sap.h:815
void DoSendRrcConnectionReestablishmentReject(uint16_t rnti, LteRrcSap::RrcConnectionReestablishmentReject msg)
LteRrcSap::RrcConnectionRequest GetMessage() const
Returns a RrcConnectionRequest IE from the values in the class attributes.
Ptr< LteEnbRrc > GetRrc() const
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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 CompleteSetup(CompleteSetupParameters params)=0
void DoSendRrcConnectionReconfiguration(uint16_t rnti, LteRrcSap::RrcConnectionReconfiguration msg)
virtual void RecvRrcConnectionRequest(uint16_t rnti, RrcConnectionRequest msg)=0
Receive an RRCConnectionRequest message from a UE during an RRC connection establishment procedure (S...
void DoSendRrcConnectionReestablishment(uint16_t rnti, LteRrcSap::RrcConnectionReestablishment msg)
This class manages the serialization/deserialization of RrcConnectionRequest IE.
LteRrcSap::MeasurementReport GetMessage() const
Returns a MeasurementReport IE from the values in the class attributes.
This class manages the serialization/deserialization of HandoverPreparationInfo IE.
This class manages the serialization/deserialization of RrcConnectionRelease IE.
LteEnbRrcSapProvider * m_enbRrcSapProvider
virtual void RecvSystemInformation(SystemInformation msg)=0
Receive a SystemInformation message from the serving eNodeB during a system information acquisition p...
LteRrcSap::RrcConnectionSetup GetMessage() const
Returns a RrcConnectionSetup IE from the values in the class attributes.
void DoReceivePdcpSdu(LtePdcpSapUser::ReceivePdcpSduParameters params)
void SetMessage(LteRrcSap::HandoverPreparationInfo msg)
Receives a HandoverPreparationInfo IE and stores the contents into the class attributes.
void DoSendRrcConnectionReestablishmentComplete(LteRrcSap::RrcConnectionReestablishmentComplete msg)
virtual void TransmitPdcpSdu(TransmitPdcpSduParameters params)=0
Send a RRC PDU to the RDCP for transmission This method is to be called when upper RRC entity has a R...
void DoSendRrcConnectionSetupCompleted(LteRrcSap::RrcConnectionSetupCompleted msg)
This class manages the serialization/deserialization of MeasurementReport IE.
Parameters for LteRlcSapProvider::TransmitPdcpPdu.
Definition: lte-rlc-sap.h:43
#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
void DoSendRrcConnectionReconfigurationCompleted(LteRrcSap::RrcConnectionReconfigurationCompleted msg)
LteRrcSap::RrcConnectionReconfigurationCompleted GetMessage() const
Returns a RrcConnectionReconfigurationCompleted IE from the values in the class attributes.
This class manages the serialization/deserialization of RrcConnectionReconfiguration IE...
LteUeRrcSapUser::SetupParameters m_setupParameters
void DoSendRrcConnectionRequest(LteRrcSap::RrcConnectionRequest msg)
LteRrcSap::RrcConnectionReconfiguration GetMessage() const
Returns a RrcConnectionReconfiguration IE from the values in the class attributes.
virtual void RecvRrcConnectionReestablishmentRequest(uint16_t rnti, RrcConnectionReestablishmentRequest msg)=0
Receive an RRCConnectionReestablishmentRequest message from a UE during an RRC connection re-establis...
void SetMessage(LteRrcSap::RrcConnectionSetup msg)
Receives a RrcConnectionSetup IE and stores the contents into the class attributes.
static Iterator Begin(void)
Definition: node-list.cc:228
Service Access Point (SAP) offered by the PDCP entity to the RRC entity See 3GPP 36.323 Packet Data Convergence Protocol (PDCP) specification.
Definition: lte-pdcp-sap.h:68
void DoReceivePdcpPdu(uint16_t rnti, Ptr< Packet > p)
This class manages the serialization/deserialization of RrcConnectionReestablishmentReject IE...
This class manages the serialization/deserialization of RrcConnectionReestablishmentComplete IE...
virtual void RecvMeasurementReport(uint16_t rnti, MeasurementReport msg)=0
Receive a MeasurementReport message from a UE during a measurement reporting procedure (Section 5...
LteRrcSap::HandoverPreparationInfo DoDecodeHandoverPreparationInformation(Ptr< Packet > p)
LteEnbRrcSapProvider * m_enbRrcSapProvider
LteRrcSap::RrcConnectionReestablishmentComplete GetMessage() const
Returns a RrcConnectionReestablishmentComplete IE from the values in the class attributes.
void SetMessage(LteRrcSap::RrcConnectionReconfiguration msg)
Receives a RrcConnectionReconfiguration IE and stores the contents into the class attributes...
This class manages the serialization/deserialization of RrcConnectionReestablishment IE...
void DoReceivePdcpSdu(LtePdcpSapUser::ReceivePdcpSduParameters params)
uint16_t rnti
the C-RNTI identifying the UE
Definition: lte-rlc-sap.h:46
virtual void RecvRrcConnectionReestablishmentComplete(uint16_t rnti, RrcConnectionReestablishmentComplete msg)=0
Receive an RRCConnectionReestablishmentComplete message from a UE during an RRC connection re-establi...
virtual void CompleteSetupUe(uint16_t rnti, CompleteSetupUeParameters params)=0
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
LteUeRrcSapUser * GetLteUeRrcSapUser()
Part of the RRC protocol.
Definition: lte-rrc-sap.h:671
LteEnbRrcProtocolReal * m_pdcp
uint8_t lcid
the logical channel id corresponding to the sending RLC instance
Definition: lte-pdcp-sap.h:47
void SetLteUeRrcSapProvider(LteUeRrcSapProvider *p)
The eNodeB device implementation.
This class only serves to discriminate which message type has been received in uplink (ue to eNb) for...
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
LteRrcSap::RrcConnectionReject GetMessage() const
Returns a RrcConnectionReject IE from the values in the class attributes.
TypeId SetParent(TypeId tid)
Definition: type-id.cc:631
LteRrcSap::RrcConnectionSetupCompleted GetMessage() const
Returns a RrcConnectionSetupCompleted IE from the values in the class attributes. ...
void DoSetupUe(uint16_t rnti, LteEnbRrcSapUser::SetupUeParameters params)
void SetUeRrc(Ptr< LteUeRrc > rrc)
This class manages the serialization/deserialization of RrcConnectionSetupComplete IE...
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:253
The LteUeNetDevice class implements the UE net device.
void DoSendSystemInformation(LteRrcSap::SystemInformation msg)