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  .SetGroupName("Lte")
72  .AddConstructor<LteUeRrcProtocolReal> ()
73  ;
74  return tid;
75 }
76 
77 void
79 {
81 }
82 
85 {
86  return m_ueRrcSapUser;
87 }
88 
89 void
91 {
92  m_rrc = rrc;
93 }
94 
95 void
97 {
98  NS_LOG_FUNCTION (this);
99 
103 }
104 
105 void
107 {
108  // initialize the RNTI and get the EnbLteRrcSapProvider for the
109  // eNB we are currently attached to
110  m_rnti = m_rrc->GetRnti ();
112 
113  Ptr<Packet> packet = Create<Packet> ();
114 
115  RrcConnectionRequestHeader rrcConnectionRequestHeader;
116  rrcConnectionRequestHeader.SetMessage (msg);
117 
118  packet->AddHeader (rrcConnectionRequestHeader);
119 
120  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
121  transmitPdcpPduParameters.pdcpPdu = packet;
122  transmitPdcpPduParameters.rnti = m_rnti;
123  transmitPdcpPduParameters.lcid = 0;
124 
125  m_setupParameters.srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
126 }
127 
128 void
130 {
131  Ptr<Packet> packet = Create<Packet> ();
132 
133  RrcConnectionSetupCompleteHeader rrcConnectionSetupCompleteHeader;
134  rrcConnectionSetupCompleteHeader.SetMessage (msg);
135 
136  packet->AddHeader (rrcConnectionSetupCompleteHeader);
137 
138  LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
139  transmitPdcpSduParameters.pdcpSdu = packet;
140  transmitPdcpSduParameters.rnti = m_rnti;
141  transmitPdcpSduParameters.lcid = 1;
142 
144  {
145  m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
146  }
147 }
148 
149 void
151 {
152  // re-initialize the RNTI and get the EnbLteRrcSapProvider for the
153  // eNB we are currently attached to
154  m_rnti = m_rrc->GetRnti ();
156 
157  Ptr<Packet> packet = Create<Packet> ();
158 
159  RrcConnectionReconfigurationCompleteHeader rrcConnectionReconfigurationCompleteHeader;
160  rrcConnectionReconfigurationCompleteHeader.SetMessage (msg);
161 
162  packet->AddHeader (rrcConnectionReconfigurationCompleteHeader);
163 
164  LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
165  transmitPdcpSduParameters.pdcpSdu = packet;
166  transmitPdcpSduParameters.rnti = m_rnti;
167  transmitPdcpSduParameters.lcid = 1;
168 
169  m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
170 }
171 
172 void
174 {
175  // re-initialize the RNTI and get the EnbLteRrcSapProvider for the
176  // eNB we are currently attached to
177  m_rnti = m_rrc->GetRnti ();
179 
180  Ptr<Packet> packet = Create<Packet> ();
181 
182  MeasurementReportHeader measurementReportHeader;
183  measurementReportHeader.SetMessage (msg);
184 
185  packet->AddHeader (measurementReportHeader);
186 
187  LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
188  transmitPdcpSduParameters.pdcpSdu = packet;
189  transmitPdcpSduParameters.rnti = m_rnti;
190  transmitPdcpSduParameters.lcid = 1;
191 
192  m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
193 }
194 
195 void
197 {
198  Ptr<Packet> packet = Create<Packet> ();
199 
200  RrcConnectionReestablishmentRequestHeader rrcConnectionReestablishmentRequestHeader;
201  rrcConnectionReestablishmentRequestHeader.SetMessage (msg);
202 
203  packet->AddHeader (rrcConnectionReestablishmentRequestHeader);
204 
205  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
206  transmitPdcpPduParameters.pdcpPdu = packet;
207  transmitPdcpPduParameters.rnti = m_rnti;
208  transmitPdcpPduParameters.lcid = 0;
209 
210  m_setupParameters.srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
211 }
212 
213 void
215 {
216  Ptr<Packet> packet = Create<Packet> ();
217 
218  RrcConnectionReestablishmentCompleteHeader rrcConnectionReestablishmentCompleteHeader;
219  rrcConnectionReestablishmentCompleteHeader.SetMessage (msg);
220 
221  packet->AddHeader (rrcConnectionReestablishmentCompleteHeader);
222 
223  LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
224  transmitPdcpSduParameters.pdcpSdu = packet;
225  transmitPdcpSduParameters.rnti = m_rnti;
226  transmitPdcpSduParameters.lcid = 1;
227 
228  m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
229 }
230 
231 
232 void
234 {
235  uint16_t cellId = m_rrc->GetCellId ();
236 
237  // walk list of all nodes to get the peer eNB
238  Ptr<LteEnbNetDevice> enbDev;
239  NodeList::Iterator listEnd = NodeList::End ();
240  bool found = false;
241  for (NodeList::Iterator i = NodeList::Begin ();
242  (i != listEnd) && (!found);
243  ++i)
244  {
245  Ptr<Node> node = *i;
246  int nDevs = node->GetNDevices ();
247  for (int j = 0;
248  (j < nDevs) && (!found);
249  j++)
250  {
251  enbDev = node->GetDevice (j)->GetObject <LteEnbNetDevice> ();
252  if (enbDev == 0)
253  {
254  continue;
255  }
256  else
257  {
258  if (enbDev->GetCellId () == cellId)
259  {
260  found = true;
261  break;
262  }
263  }
264  }
265  }
266  NS_ASSERT_MSG (found, " Unable to find eNB with CellId =" << cellId);
267  m_enbRrcSapProvider = enbDev->GetRrc ()->GetLteEnbRrcSapProvider ();
268  Ptr<LteEnbRrcProtocolReal> enbRrcProtocolReal = enbDev->GetRrc ()->GetObject<LteEnbRrcProtocolReal> ();
269  enbRrcProtocolReal->SetUeRrcSapProvider (m_rnti, m_ueRrcSapProvider);
270 }
271 
272 void
274 {
275  // Get type of message received
276  RrcDlCcchMessage rrcDlCcchMessage;
277  p->PeekHeader (rrcDlCcchMessage);
278 
279  // Declare possible headers to receive
280  RrcConnectionReestablishmentHeader rrcConnectionReestablishmentHeader;
281  RrcConnectionReestablishmentRejectHeader rrcConnectionReestablishmentRejectHeader;
282  RrcConnectionSetupHeader rrcConnectionSetupHeader;
283  RrcConnectionRejectHeader rrcConnectionRejectHeader;
284 
285  // Declare possible messages
286  LteRrcSap::RrcConnectionReestablishment rrcConnectionReestablishmentMsg;
287  LteRrcSap::RrcConnectionReestablishmentReject rrcConnectionReestablishmentRejectMsg;
288  LteRrcSap::RrcConnectionSetup rrcConnectionSetupMsg;
289  LteRrcSap::RrcConnectionReject rrcConnectionRejectMsg;
290 
291  // Deserialize packet and call member recv function with appropiate structure
292  switch ( rrcDlCcchMessage.GetMessageType () )
293  {
294  case 0:
295  // RrcConnectionReestablishment
296  p->RemoveHeader (rrcConnectionReestablishmentHeader);
297  rrcConnectionReestablishmentMsg = rrcConnectionReestablishmentHeader.GetMessage ();
298  m_ueRrcSapProvider->RecvRrcConnectionReestablishment (rrcConnectionReestablishmentMsg);
299  break;
300  case 1:
301  // RrcConnectionReestablishmentReject
302  p->RemoveHeader (rrcConnectionReestablishmentRejectHeader);
303  rrcConnectionReestablishmentRejectMsg = rrcConnectionReestablishmentRejectHeader.GetMessage ();
304  // m_ueRrcSapProvider->RecvRrcConnectionReestablishmentReject (rrcConnectionReestablishmentRejectMsg);
305  break;
306  case 2:
307  // RrcConnectionReject
308  p->RemoveHeader (rrcConnectionRejectHeader);
309  rrcConnectionRejectMsg = rrcConnectionRejectHeader.GetMessage ();
310  m_ueRrcSapProvider->RecvRrcConnectionReject (rrcConnectionRejectMsg);
311  break;
312  case 3:
313  // RrcConnectionSetup
314  p->RemoveHeader (rrcConnectionSetupHeader);
315  rrcConnectionSetupMsg = rrcConnectionSetupHeader.GetMessage ();
316  m_ueRrcSapProvider->RecvRrcConnectionSetup (rrcConnectionSetupMsg);
317  break;
318  }
319 }
320 
321 void
323 {
324  // Get type of message received
325  RrcDlDcchMessage rrcDlDcchMessage;
326  params.pdcpSdu->PeekHeader (rrcDlDcchMessage);
327 
328  // Declare possible headers to receive
329  RrcConnectionReconfigurationHeader rrcConnectionReconfigurationHeader;
330  RrcConnectionReleaseHeader rrcConnectionReleaseHeader;
331 
332  // Declare possible messages to receive
333  LteRrcSap::RrcConnectionReconfiguration rrcConnectionReconfigurationMsg;
334  LteRrcSap::RrcConnectionRelease rrcConnectionReleaseMsg;
335 
336  // Deserialize packet and call member recv function with appropiate structure
337  switch ( rrcDlDcchMessage.GetMessageType () )
338  {
339  case 4:
340  params.pdcpSdu->RemoveHeader (rrcConnectionReconfigurationHeader);
341  rrcConnectionReconfigurationMsg = rrcConnectionReconfigurationHeader.GetMessage ();
342  m_ueRrcSapProvider->RecvRrcConnectionReconfiguration (rrcConnectionReconfigurationMsg);
343  break;
344  case 5:
345  params.pdcpSdu->RemoveHeader (rrcConnectionReleaseHeader);
346  rrcConnectionReleaseMsg = rrcConnectionReleaseHeader.GetMessage ();
347  //m_ueRrcSapProvider->RecvRrcConnectionRelease (rrcConnectionReleaseMsg);
348  break;
349  }
350 }
351 
353 
355  : m_enbRrcSapProvider (0)
356 {
357  NS_LOG_FUNCTION (this);
359 }
360 
362 {
363  NS_LOG_FUNCTION (this);
364 }
365 
366 void
368 {
369  NS_LOG_FUNCTION (this);
370  delete m_enbRrcSapUser;
371  for (std::map<uint16_t, LteEnbRrcSapProvider::CompleteSetupUeParameters>::iterator
372  it = m_completeSetupUeParametersMap.begin ();
373  it != m_completeSetupUeParametersMap.end ();
374  ++it)
375  {
376  delete it->second.srb0SapUser;
377  delete it->second.srb1SapUser;
378  }
380 }
381 
382 TypeId
384 {
385  static TypeId tid = TypeId ("ns3::LteEnbRrcProtocolReal")
386  .SetParent<Object> ()
387  .SetGroupName("Lte")
388  .AddConstructor<LteEnbRrcProtocolReal> ()
389  ;
390  return tid;
391 }
392 
393 void
395 {
397 }
398 
401 {
402  return m_enbRrcSapUser;
403 }
404 
405 void
407 {
408  m_cellId = cellId;
409 }
410 
413 {
414  std::map<uint16_t, LteUeRrcSapProvider*>::const_iterator it;
415  it = m_enbRrcSapProviderMap.find (rnti);
416  NS_ASSERT_MSG (it != m_enbRrcSapProviderMap.end (), "could not find RNTI = " << rnti);
417  return it->second;
418 }
419 
420 void
422 {
423  std::map<uint16_t, LteUeRrcSapProvider*>::iterator it;
424  it = m_enbRrcSapProviderMap.find (rnti);
425  NS_ASSERT_MSG (it != m_enbRrcSapProviderMap.end (), "could not find RNTI = " << rnti);
426  it->second = p;
427 }
428 
429 void
431 {
432  NS_LOG_FUNCTION (this << rnti);
433 
434  // // walk list of all nodes to get the peer UE RRC SAP Provider
435  // Ptr<LteUeRrc> ueRrc;
436  // NodeList::Iterator listEnd = NodeList::End ();
437  // bool found = false;
438  // for (NodeList::Iterator i = NodeList::Begin (); (i != listEnd) && (found == false); i++)
439  // {
440  // Ptr<Node> node = *i;
441  // int nDevs = node->GetNDevices ();
442  // for (int j = 0; j < nDevs; j++)
443  // {
444  // Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
445  // if (!ueDev)
446  // {
447  // continue;
448  // }
449  // else
450  // {
451  // ueRrc = ueDev->GetRrc ();
452  // if ((ueRrc->GetRnti () == rnti) && (ueRrc->GetCellId () == m_cellId))
453  // {
454  // found = true;
455  // break;
456  // }
457  // }
458  // }
459  // }
460  // NS_ASSERT_MSG (found , " Unable to find UE with RNTI=" << rnti << " cellId=" << m_cellId);
461  // m_enbRrcSapProviderMap[rnti] = ueRrc->GetLteUeRrcSapProvider ();
462 
463  // just create empty entry, the UeRrcSapProvider will be set by the
464  // ue upon connection request or connection reconfiguration
465  // completed
466  m_enbRrcSapProviderMap[rnti] = 0;
467 
468  // Store SetupUeParameters
469  m_setupUeParametersMap[rnti] = params;
470 
471  LteEnbRrcSapProvider::CompleteSetupUeParameters completeSetupUeParameters;
472  std::map<uint16_t, LteEnbRrcSapProvider::CompleteSetupUeParameters>::iterator
473  csupIt = m_completeSetupUeParametersMap.find (rnti);
474  if (csupIt == m_completeSetupUeParametersMap.end ())
475  {
476  // Create LteRlcSapUser, LtePdcpSapUser
477  LteRlcSapUser* srb0SapUser = new RealProtocolRlcSapUser (this,rnti);
479  completeSetupUeParameters.srb0SapUser = srb0SapUser;
480  completeSetupUeParameters.srb1SapUser = srb1SapUser;
481  // Store LteRlcSapUser, LtePdcpSapUser
482  m_completeSetupUeParametersMap[rnti] = completeSetupUeParameters;
483  }
484  else
485  {
486  completeSetupUeParameters = csupIt->second;
487  }
488  m_enbRrcSapProvider->CompleteSetupUe (rnti, completeSetupUeParameters);
489 }
490 
491 void
493 {
494  NS_LOG_FUNCTION (this << rnti);
495  std::map<uint16_t, LteEnbRrcSapProvider::CompleteSetupUeParameters>::iterator
496  it = m_completeSetupUeParametersMap.find (rnti);
498  delete it->second.srb0SapUser;
499  delete it->second.srb1SapUser;
501  m_enbRrcSapProviderMap.erase (rnti);
502  m_setupUeParametersMap.erase (rnti);
503 }
504 
505 void
507 {
508  NS_LOG_FUNCTION (this << m_cellId);
509  // walk list of all nodes to get UEs with this cellId
510  Ptr<LteUeRrc> ueRrc;
511  for (NodeList::Iterator i = NodeList::Begin (); i != NodeList::End (); ++i)
512  {
513  Ptr<Node> node = *i;
514  int nDevs = node->GetNDevices ();
515  for (int j = 0; j < nDevs; ++j)
516  {
517  Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
518  if (ueDev != 0)
519  {
520  Ptr<LteUeRrc> ueRrc = ueDev->GetRrc ();
521  NS_LOG_LOGIC ("considering UE IMSI " << ueDev->GetImsi () << " that has cellId " << ueRrc->GetCellId ());
522  if (ueRrc->GetCellId () == m_cellId)
523  {
524  NS_LOG_LOGIC ("sending SI to IMSI " << ueDev->GetImsi ());
525  ueRrc->GetLteUeRrcSapProvider ()->RecvSystemInformation (msg);
526  Simulator::Schedule (RRC_REAL_MSG_DELAY,
528  ueRrc->GetLteUeRrcSapProvider (),
529  msg);
530  }
531  }
532  }
533  }
534 }
535 
536 void
538 {
539  Ptr<Packet> packet = Create<Packet> ();
540 
541  RrcConnectionSetupHeader rrcConnectionSetupHeader;
542  rrcConnectionSetupHeader.SetMessage (msg);
543 
544  packet->AddHeader (rrcConnectionSetupHeader);
545 
546  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
547  transmitPdcpPduParameters.pdcpPdu = packet;
548  transmitPdcpPduParameters.rnti = rnti;
549  transmitPdcpPduParameters.lcid = 0;
550 
551  if (m_setupUeParametersMap.find (rnti) == m_setupUeParametersMap.end () )
552  {
553  std::cout << "RNTI not found in Enb setup parameters Map!" << std::endl;
554  }
555  else
556  {
557  m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
558  }
559 }
560 
561 void
563 {
564  Ptr<Packet> packet = Create<Packet> ();
565 
566  RrcConnectionRejectHeader rrcConnectionRejectHeader;
567  rrcConnectionRejectHeader.SetMessage (msg);
568 
569  packet->AddHeader (rrcConnectionRejectHeader);
570 
571  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
572  transmitPdcpPduParameters.pdcpPdu = packet;
573  transmitPdcpPduParameters.rnti = rnti;
574  transmitPdcpPduParameters.lcid = 0;
575 
576  m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
577 }
578 
579 void
581 {
582  Ptr<Packet> packet = Create<Packet> ();
583 
584  RrcConnectionReconfigurationHeader rrcConnectionReconfigurationHeader;
585  rrcConnectionReconfigurationHeader.SetMessage (msg);
586 
587  packet->AddHeader (rrcConnectionReconfigurationHeader);
588 
589  LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
590  transmitPdcpSduParameters.pdcpSdu = packet;
591  transmitPdcpSduParameters.rnti = rnti;
592  transmitPdcpSduParameters.lcid = 1;
593 
594  m_setupUeParametersMap[rnti].srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
595 }
596 
597 void
599 {
600  Ptr<Packet> packet = Create<Packet> ();
601 
602  RrcConnectionReestablishmentHeader rrcConnectionReestablishmentHeader;
603  rrcConnectionReestablishmentHeader.SetMessage (msg);
604 
605  packet->AddHeader (rrcConnectionReestablishmentHeader);
606 
607  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
608  transmitPdcpPduParameters.pdcpPdu = packet;
609  transmitPdcpPduParameters.rnti = rnti;
610  transmitPdcpPduParameters.lcid = 0;
611 
612  m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
613 }
614 
615 void
617 {
618  Ptr<Packet> packet = Create<Packet> ();
619 
620  RrcConnectionReestablishmentRejectHeader rrcConnectionReestablishmentRejectHeader;
621  rrcConnectionReestablishmentRejectHeader.SetMessage (msg);
622 
623  packet->AddHeader (rrcConnectionReestablishmentRejectHeader);
624 
625  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
626  transmitPdcpPduParameters.pdcpPdu = packet;
627  transmitPdcpPduParameters.rnti = rnti;
628  transmitPdcpPduParameters.lcid = 0;
629 
630  m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
631 }
632 
633 void
635 {
636  Ptr<Packet> packet = Create<Packet> ();
637 
638  RrcConnectionReleaseHeader rrcConnectionReleaseHeader;
639  rrcConnectionReleaseHeader.SetMessage (msg);
640 
641  packet->AddHeader (rrcConnectionReleaseHeader);
642 
643  LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
644  transmitPdcpSduParameters.pdcpSdu = packet;
645  transmitPdcpSduParameters.rnti = rnti;
646  transmitPdcpSduParameters.lcid = 1;
647 
648  m_setupUeParametersMap[rnti].srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
649 }
650 
651 void
653 {
654  // Get type of message received
655  RrcUlCcchMessage rrcUlCcchMessage;
656  p->PeekHeader (rrcUlCcchMessage);
657 
658  // Declare possible headers to receive
659  RrcConnectionReestablishmentRequestHeader rrcConnectionReestablishmentRequestHeader;
660  RrcConnectionRequestHeader rrcConnectionRequestHeader;
661 
662  // Deserialize packet and call member recv function with appropiate structure
663  switch ( rrcUlCcchMessage.GetMessageType () )
664  {
665  case 0:
666  p->RemoveHeader (rrcConnectionReestablishmentRequestHeader);
667  LteRrcSap::RrcConnectionReestablishmentRequest rrcConnectionReestablishmentRequestMsg;
668  rrcConnectionReestablishmentRequestMsg = rrcConnectionReestablishmentRequestHeader.GetMessage ();
669  m_enbRrcSapProvider->RecvRrcConnectionReestablishmentRequest (rnti,rrcConnectionReestablishmentRequestMsg);
670  break;
671  case 1:
672  p->RemoveHeader (rrcConnectionRequestHeader);
673  LteRrcSap::RrcConnectionRequest rrcConnectionRequestMsg;
674  rrcConnectionRequestMsg = rrcConnectionRequestHeader.GetMessage ();
675  m_enbRrcSapProvider->RecvRrcConnectionRequest (rnti,rrcConnectionRequestMsg);
676  break;
677  }
678 }
679 
680 void
682 {
683  // Get type of message received
684  RrcUlDcchMessage rrcUlDcchMessage;
685  params.pdcpSdu->PeekHeader (rrcUlDcchMessage);
686 
687  // Declare possible headers to receive
688  MeasurementReportHeader measurementReportHeader;
689  RrcConnectionReconfigurationCompleteHeader rrcConnectionReconfigurationCompleteHeader;
690  RrcConnectionReestablishmentCompleteHeader rrcConnectionReestablishmentCompleteHeader;
691  RrcConnectionSetupCompleteHeader rrcConnectionSetupCompleteHeader;
692 
693  // Declare possible messages to receive
694  LteRrcSap::MeasurementReport measurementReportMsg;
695  LteRrcSap::RrcConnectionReconfigurationCompleted rrcConnectionReconfigurationCompleteMsg;
696  LteRrcSap::RrcConnectionReestablishmentComplete rrcConnectionReestablishmentCompleteMsg;
697  LteRrcSap::RrcConnectionSetupCompleted rrcConnectionSetupCompletedMsg;
698 
699  // Deserialize packet and call member recv function with appropiate structure
700  switch ( rrcUlDcchMessage.GetMessageType () )
701  {
702  case 1:
703  params.pdcpSdu->RemoveHeader (measurementReportHeader);
704  measurementReportMsg = measurementReportHeader.GetMessage ();
705  m_enbRrcSapProvider->RecvMeasurementReport (params.rnti,measurementReportMsg);
706  break;
707  case 2:
708  params.pdcpSdu->RemoveHeader (rrcConnectionReconfigurationCompleteHeader);
709  rrcConnectionReconfigurationCompleteMsg = rrcConnectionReconfigurationCompleteHeader.GetMessage ();
710  m_enbRrcSapProvider->RecvRrcConnectionReconfigurationCompleted (params.rnti,rrcConnectionReconfigurationCompleteMsg);
711  break;
712  case 3:
713  params.pdcpSdu->RemoveHeader (rrcConnectionReestablishmentCompleteHeader);
714  rrcConnectionReestablishmentCompleteMsg = rrcConnectionReestablishmentCompleteHeader.GetMessage ();
715  m_enbRrcSapProvider->RecvRrcConnectionReestablishmentComplete (params.rnti,rrcConnectionReestablishmentCompleteMsg);
716  break;
717  case 4:
718  params.pdcpSdu->RemoveHeader (rrcConnectionSetupCompleteHeader);
719  rrcConnectionSetupCompletedMsg = rrcConnectionSetupCompleteHeader.GetMessage ();
720  m_enbRrcSapProvider->RecvRrcConnectionSetupCompleted (params.rnti, rrcConnectionSetupCompletedMsg);
721  break;
722  }
723 }
724 
727 {
729  h.SetMessage (msg);
730 
731  Ptr<Packet> p = Create<Packet> ();
732  p->AddHeader (h);
733  return p;
734 }
735 
738 {
740  p->RemoveHeader (h);
742  return msg;
743 }
744 
747 {
749  h.SetMessage (msg);
750  Ptr<Packet> p = Create<Packet> ();
751  p->AddHeader (h);
752  return p;
753 }
754 
757 {
759  p->RemoveHeader (h);
761  return msg;
762 }
763 
765 
767  : m_pdcp (pdcp),
768  m_rnti (rnti)
769 {
770 }
771 
773 {
774 }
775 
776 void
778 {
780 }
781 
782 } // 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:102
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:67
#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:903
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)
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.
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
Definition: simulator.h:1238
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:235
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:142
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:150
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Definition: packet.cc:278
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:90
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:229
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:58
LteRrcSap::RrcConnectionReject GetMessage() const
Returns a RrcConnectionReject IE from the values in the class attributes.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:904
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:257
The LteUeNetDevice class implements the UE net device.
void DoSendSystemInformation(LteRrcSap::SystemInformation msg)