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
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
35namespace ns3 {
36
37NS_LOG_COMPONENT_DEFINE ("LteRrcProtocolReal");
38
41
43
45 : m_ueRrcSapProvider (0),
46 m_enbRrcSapProvider (0)
47{
51}
52
54{
55}
56
57void
59{
60 NS_LOG_FUNCTION (this);
61 delete m_ueRrcSapUser;
64 m_rrc = 0;
65}
66
69{
70 static TypeId tid = TypeId ("ns3::LteUeRrcProtocolReal")
71 .SetParent<Object> ()
72 .SetGroupName("Lte")
73 .AddConstructor<LteUeRrcProtocolReal> ()
74 ;
75 return tid;
76}
77
78void
80{
82}
83
86{
87 return m_ueRrcSapUser;
88}
89
90void
92{
93 m_rrc = rrc;
94}
95
96void
98{
99 NS_LOG_FUNCTION (this);
100
104}
105
106void
108{
109 // initialize the RNTI and get the EnbLteRrcSapProvider for the
110 // eNB we are currently attached to
111 m_rnti = m_rrc->GetRnti ();
113
114 Ptr<Packet> packet = Create<Packet> ();
115
116 RrcConnectionRequestHeader rrcConnectionRequestHeader;
117 rrcConnectionRequestHeader.SetMessage (msg);
118
119 packet->AddHeader (rrcConnectionRequestHeader);
120
121 LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
122 transmitPdcpPduParameters.pdcpPdu = packet;
123 transmitPdcpPduParameters.rnti = m_rnti;
124 transmitPdcpPduParameters.lcid = 0;
125
126 m_setupParameters.srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
127}
128
129void
131{
132 Ptr<Packet> packet = Create<Packet> ();
133
134 RrcConnectionSetupCompleteHeader rrcConnectionSetupCompleteHeader;
135 rrcConnectionSetupCompleteHeader.SetMessage (msg);
136
137 packet->AddHeader (rrcConnectionSetupCompleteHeader);
138
139 LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
140 transmitPdcpSduParameters.pdcpSdu = packet;
141 transmitPdcpSduParameters.rnti = m_rnti;
142 transmitPdcpSduParameters.lcid = 1;
143
145 {
146 m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
147 }
148}
149
150void
152{
153 // re-initialize the RNTI and get the EnbLteRrcSapProvider for the
154 // eNB we are currently attached to
155 m_rnti = m_rrc->GetRnti ();
157
158 Ptr<Packet> packet = Create<Packet> ();
159
160 RrcConnectionReconfigurationCompleteHeader rrcConnectionReconfigurationCompleteHeader;
161 rrcConnectionReconfigurationCompleteHeader.SetMessage (msg);
162
163 packet->AddHeader (rrcConnectionReconfigurationCompleteHeader);
164
165 LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
166 transmitPdcpSduParameters.pdcpSdu = packet;
167 transmitPdcpSduParameters.rnti = m_rnti;
168 transmitPdcpSduParameters.lcid = 1;
169
170 m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
171}
172
173void
175{
176 // re-initialize the RNTI and get the EnbLteRrcSapProvider for the
177 // eNB we are currently attached to
178 m_rnti = m_rrc->GetRnti ();
180
181 Ptr<Packet> packet = Create<Packet> ();
182
183 MeasurementReportHeader measurementReportHeader;
184 measurementReportHeader.SetMessage (msg);
185
186 packet->AddHeader (measurementReportHeader);
187
188 LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
189 transmitPdcpSduParameters.pdcpSdu = packet;
190 transmitPdcpSduParameters.rnti = m_rnti;
191 transmitPdcpSduParameters.lcid = 1;
192
193 m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
194}
195
196void
198{
199 NS_LOG_FUNCTION(this<<rnti);
200 uint16_t cellId = m_rrc->GetCellId ();
201 // re-initialize the RNTI and get the EnbLteRrcSapProvider for the
202 // eNB we are currently attached to or attempting random access to
203 // a target eNB
204 m_rnti = m_rrc->GetRnti ();
205
206 NS_LOG_DEBUG ("RNTI " << rnti
207 << " sending UE context remove request to cell id " << cellId);
208 NS_ABORT_MSG_IF (m_rnti != rnti, "RNTI mismatch");
209
210 SetEnbRrcSapProvider (); //the provider has to be reset since the cell might
211 // have changed due to handover
212 //ideally informing eNB
214 m_enbRrcSapProvider, rnti);
215}
216
217void
219{
220 Ptr<Packet> packet = Create<Packet> ();
221
222 RrcConnectionReestablishmentRequestHeader rrcConnectionReestablishmentRequestHeader;
223 rrcConnectionReestablishmentRequestHeader.SetMessage (msg);
224
225 packet->AddHeader (rrcConnectionReestablishmentRequestHeader);
226
227 LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
228 transmitPdcpPduParameters.pdcpPdu = packet;
229 transmitPdcpPduParameters.rnti = m_rnti;
230 transmitPdcpPduParameters.lcid = 0;
231
232 m_setupParameters.srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
233}
234
235void
237{
238 Ptr<Packet> packet = Create<Packet> ();
239
240 RrcConnectionReestablishmentCompleteHeader rrcConnectionReestablishmentCompleteHeader;
241 rrcConnectionReestablishmentCompleteHeader.SetMessage (msg);
242
243 packet->AddHeader (rrcConnectionReestablishmentCompleteHeader);
244
245 LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
246 transmitPdcpSduParameters.pdcpSdu = packet;
247 transmitPdcpSduParameters.rnti = m_rnti;
248 transmitPdcpSduParameters.lcid = 1;
249
250 m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
251}
252
253
254void
256{
257 NS_LOG_FUNCTION (this);
258
259 uint16_t cellId = m_rrc->GetCellId ();
260
261 NS_LOG_DEBUG ("RNTI " << m_rnti << " connected to cell " << cellId);
262
263 // walk list of all nodes to get the peer eNB
266 bool found = false;
268 (i != listEnd) && (!found);
269 ++i)
270 {
271 Ptr<Node> node = *i;
272 int nDevs = node->GetNDevices ();
273 for (int j = 0;
274 (j < nDevs) && (!found);
275 j++)
276 {
277 enbDev = node->GetDevice (j)->GetObject <LteEnbNetDevice> ();
278 if (enbDev == 0)
279 {
280 continue;
281 }
282 else
283 {
284 if (enbDev->HasCellId (cellId))
285 {
286 found = true;
287 break;
288 }
289 }
290 }
291 }
292 NS_ASSERT_MSG (found, " Unable to find eNB with CellId =" << cellId);
293 m_enbRrcSapProvider = enbDev->GetRrc ()->GetLteEnbRrcSapProvider ();
294 Ptr<LteEnbRrcProtocolReal> enbRrcProtocolReal = enbDev->GetRrc ()->GetObject<LteEnbRrcProtocolReal> ();
295 enbRrcProtocolReal->SetUeRrcSapProvider (m_rnti, m_ueRrcSapProvider);
296}
297
298void
300{
301 // Get type of message received
302 RrcDlCcchMessage rrcDlCcchMessage;
303 p->PeekHeader (rrcDlCcchMessage);
304
305 // Declare possible headers to receive
306 RrcConnectionReestablishmentHeader rrcConnectionReestablishmentHeader;
307 RrcConnectionReestablishmentRejectHeader rrcConnectionReestablishmentRejectHeader;
308 RrcConnectionSetupHeader rrcConnectionSetupHeader;
309 RrcConnectionRejectHeader rrcConnectionRejectHeader;
310
311 // Declare possible messages
312 LteRrcSap::RrcConnectionReestablishment rrcConnectionReestablishmentMsg;
313 LteRrcSap::RrcConnectionReestablishmentReject rrcConnectionReestablishmentRejectMsg;
314 LteRrcSap::RrcConnectionSetup rrcConnectionSetupMsg;
315 LteRrcSap::RrcConnectionReject rrcConnectionRejectMsg;
316
317 // Deserialize packet and call member recv function with appropriate structure
318 switch ( rrcDlCcchMessage.GetMessageType () )
319 {
320 case 0:
321 // RrcConnectionReestablishment
322 p->RemoveHeader (rrcConnectionReestablishmentHeader);
323 rrcConnectionReestablishmentMsg = rrcConnectionReestablishmentHeader.GetMessage ();
324 m_ueRrcSapProvider->RecvRrcConnectionReestablishment (rrcConnectionReestablishmentMsg);
325 break;
326 case 1:
327 // RrcConnectionReestablishmentReject
328 p->RemoveHeader (rrcConnectionReestablishmentRejectHeader);
329 rrcConnectionReestablishmentRejectMsg = rrcConnectionReestablishmentRejectHeader.GetMessage ();
330 // m_ueRrcSapProvider->RecvRrcConnectionReestablishmentReject (rrcConnectionReestablishmentRejectMsg);
331 break;
332 case 2:
333 // RrcConnectionReject
334 p->RemoveHeader (rrcConnectionRejectHeader);
335 rrcConnectionRejectMsg = rrcConnectionRejectHeader.GetMessage ();
336 m_ueRrcSapProvider->RecvRrcConnectionReject (rrcConnectionRejectMsg);
337 break;
338 case 3:
339 // RrcConnectionSetup
340 p->RemoveHeader (rrcConnectionSetupHeader);
341 rrcConnectionSetupMsg = rrcConnectionSetupHeader.GetMessage ();
342 m_ueRrcSapProvider->RecvRrcConnectionSetup (rrcConnectionSetupMsg);
343 break;
344 }
345}
346
347void
349{
350 // Get type of message received
351 RrcDlDcchMessage rrcDlDcchMessage;
352 params.pdcpSdu->PeekHeader (rrcDlDcchMessage);
353
354 // Declare possible headers to receive
355 RrcConnectionReconfigurationHeader rrcConnectionReconfigurationHeader;
356 RrcConnectionReleaseHeader rrcConnectionReleaseHeader;
357
358 // Declare possible messages to receive
359 LteRrcSap::RrcConnectionReconfiguration rrcConnectionReconfigurationMsg;
360 LteRrcSap::RrcConnectionRelease rrcConnectionReleaseMsg;
361
362 // Deserialize packet and call member recv function with appropriate structure
363 switch ( rrcDlDcchMessage.GetMessageType () )
364 {
365 case 4:
366 params.pdcpSdu->RemoveHeader (rrcConnectionReconfigurationHeader);
367 rrcConnectionReconfigurationMsg = rrcConnectionReconfigurationHeader.GetMessage ();
368 m_ueRrcSapProvider->RecvRrcConnectionReconfiguration (rrcConnectionReconfigurationMsg);
369 break;
370 case 5:
371 params.pdcpSdu->RemoveHeader (rrcConnectionReleaseHeader);
372 rrcConnectionReleaseMsg = rrcConnectionReleaseHeader.GetMessage ();
373 //m_ueRrcSapProvider->RecvRrcConnectionRelease (rrcConnectionReleaseMsg);
374 break;
375 }
376}
377
379
381 : m_enbRrcSapProvider (0)
382{
383 NS_LOG_FUNCTION (this);
385}
386
388{
389 NS_LOG_FUNCTION (this);
390}
391
392void
394{
395 NS_LOG_FUNCTION (this);
396 delete m_enbRrcSapUser;
397 for (std::map<uint16_t, LteEnbRrcSapProvider::CompleteSetupUeParameters>::iterator
398 it = m_completeSetupUeParametersMap.begin ();
400 ++it)
401 {
402 delete it->second.srb0SapUser;
403 delete it->second.srb1SapUser;
404 }
406}
407
408TypeId
410{
411 static TypeId tid = TypeId ("ns3::LteEnbRrcProtocolReal")
412 .SetParent<Object> ()
413 .SetGroupName("Lte")
414 .AddConstructor<LteEnbRrcProtocolReal> ()
415 ;
416 return tid;
417}
418
419void
421{
423}
424
427{
428 return m_enbRrcSapUser;
429}
430
431void
433{
434 m_cellId = cellId;
435}
436
439{
440 std::map<uint16_t, LteUeRrcSapProvider*>::const_iterator it;
441 it = m_enbRrcSapProviderMap.find (rnti);
442 NS_ASSERT_MSG (it != m_enbRrcSapProviderMap.end (), "could not find RNTI = " << rnti);
443 return it->second;
444}
445
446void
448{
449 std::map<uint16_t, LteUeRrcSapProvider*>::iterator it;
450 it = m_enbRrcSapProviderMap.find (rnti);
451 // TODO: remove after merge of ho_failure branch
452 // assign UE RRC only if the RNTI is found at eNB
453 if (it != m_enbRrcSapProviderMap.end ())
454 {
455 it->second = p;
456 }
457}
458
459void
461{
462 NS_LOG_FUNCTION (this << rnti);
463
464 // // walk list of all nodes to get the peer UE RRC SAP Provider
465 // Ptr<LteUeRrc> ueRrc;
466 // NodeList::Iterator listEnd = NodeList::End ();
467 // bool found = false;
468 // for (NodeList::Iterator i = NodeList::Begin (); (i != listEnd) && (found == false); i++)
469 // {
470 // Ptr<Node> node = *i;
471 // int nDevs = node->GetNDevices ();
472 // for (int j = 0; j < nDevs; j++)
473 // {
474 // Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
475 // if (!ueDev)
476 // {
477 // continue;
478 // }
479 // else
480 // {
481 // ueRrc = ueDev->GetRrc ();
482 // if ((ueRrc->GetRnti () == rnti) && (ueRrc->GetCellId () == m_cellId))
483 // {
484 // found = true;
485 // break;
486 // }
487 // }
488 // }
489 // }
490 // NS_ASSERT_MSG (found , " Unable to find UE with RNTI=" << rnti << " cellId=" << m_cellId);
491 // m_enbRrcSapProviderMap[rnti] = ueRrc->GetLteUeRrcSapProvider ();
492
493 // just create empty entry, the UeRrcSapProvider will be set by the
494 // ue upon connection request or connection reconfiguration
495 // completed
496 m_enbRrcSapProviderMap[rnti] = 0;
497
498 // Store SetupUeParameters
499 m_setupUeParametersMap[rnti] = params;
500
501 LteEnbRrcSapProvider::CompleteSetupUeParameters completeSetupUeParameters;
502 std::map<uint16_t, LteEnbRrcSapProvider::CompleteSetupUeParameters>::iterator
503 csupIt = m_completeSetupUeParametersMap.find (rnti);
504 if (csupIt == m_completeSetupUeParametersMap.end ())
505 {
506 // Create LteRlcSapUser, LtePdcpSapUser
507 LteRlcSapUser* srb0SapUser = new RealProtocolRlcSapUser (this,rnti);
509 completeSetupUeParameters.srb0SapUser = srb0SapUser;
510 completeSetupUeParameters.srb1SapUser = srb1SapUser;
511 // Store LteRlcSapUser, LtePdcpSapUser
512 m_completeSetupUeParametersMap[rnti] = completeSetupUeParameters;
513 }
514 else
515 {
516 completeSetupUeParameters = csupIt->second;
517 }
518 m_enbRrcSapProvider->CompleteSetupUe (rnti, completeSetupUeParameters);
519}
520
521void
523{
524 NS_LOG_FUNCTION (this << rnti);
525 std::map<uint16_t, LteEnbRrcSapProvider::CompleteSetupUeParameters>::iterator
526 it = m_completeSetupUeParametersMap.find (rnti);
528 delete it->second.srb0SapUser;
529 delete it->second.srb1SapUser;
531 m_enbRrcSapProviderMap.erase (rnti);
532 m_setupUeParametersMap.erase (rnti);
533}
534
535void
537{
538 NS_LOG_FUNCTION (this << cellId);
539 // walk list of all nodes to get UEs with this cellId
540 Ptr<LteUeRrc> ueRrc;
541 for (NodeList::Iterator i = NodeList::Begin (); i != NodeList::End (); ++i)
542 {
543 Ptr<Node> node = *i;
544 int nDevs = node->GetNDevices ();
545 for (int j = 0; j < nDevs; ++j)
546 {
548 if (ueDev != 0)
549 {
550 Ptr<LteUeRrc> ueRrc = ueDev->GetRrc ();
551 NS_LOG_LOGIC ("considering UE IMSI " << ueDev->GetImsi () << " that has cellId " << ueRrc->GetCellId ());
552 if (ueRrc->GetCellId () == cellId)
553 {
554 NS_LOG_LOGIC ("sending SI to IMSI " << ueDev->GetImsi ());
555
559 ueRrc->GetLteUeRrcSapProvider (),
560 msg);
561 }
562 }
563 }
564 }
565}
566
567void
569{
570 Ptr<Packet> packet = Create<Packet> ();
571
572 RrcConnectionSetupHeader rrcConnectionSetupHeader;
573 rrcConnectionSetupHeader.SetMessage (msg);
574
575 packet->AddHeader (rrcConnectionSetupHeader);
576
577 LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
578 transmitPdcpPduParameters.pdcpPdu = packet;
579 transmitPdcpPduParameters.rnti = rnti;
580 transmitPdcpPduParameters.lcid = 0;
581
582 m_setupUeParametersMap.at (rnti).srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
583}
584
585void
587{
588 Ptr<Packet> packet = Create<Packet> ();
589
590 RrcConnectionRejectHeader rrcConnectionRejectHeader;
591 rrcConnectionRejectHeader.SetMessage (msg);
592
593 packet->AddHeader (rrcConnectionRejectHeader);
594
595 LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
596 transmitPdcpPduParameters.pdcpPdu = packet;
597 transmitPdcpPduParameters.rnti = rnti;
598 transmitPdcpPduParameters.lcid = 0;
599
600 m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
601}
602
603void
605{
606 Ptr<Packet> packet = Create<Packet> ();
607
608 RrcConnectionReconfigurationHeader rrcConnectionReconfigurationHeader;
609 rrcConnectionReconfigurationHeader.SetMessage (msg);
610
611 packet->AddHeader (rrcConnectionReconfigurationHeader);
612
613 LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
614 transmitPdcpSduParameters.pdcpSdu = packet;
615 transmitPdcpSduParameters.rnti = rnti;
616 transmitPdcpSduParameters.lcid = 1;
617
618 m_setupUeParametersMap[rnti].srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
619}
620
621void
623{
624 Ptr<Packet> packet = Create<Packet> ();
625
626 RrcConnectionReestablishmentHeader rrcConnectionReestablishmentHeader;
627 rrcConnectionReestablishmentHeader.SetMessage (msg);
628
629 packet->AddHeader (rrcConnectionReestablishmentHeader);
630
631 LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
632 transmitPdcpPduParameters.pdcpPdu = packet;
633 transmitPdcpPduParameters.rnti = rnti;
634 transmitPdcpPduParameters.lcid = 0;
635
636 m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
637}
638
639void
641{
642 Ptr<Packet> packet = Create<Packet> ();
643
644 RrcConnectionReestablishmentRejectHeader rrcConnectionReestablishmentRejectHeader;
645 rrcConnectionReestablishmentRejectHeader.SetMessage (msg);
646
647 packet->AddHeader (rrcConnectionReestablishmentRejectHeader);
648
649 LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
650 transmitPdcpPduParameters.pdcpPdu = packet;
651 transmitPdcpPduParameters.rnti = rnti;
652 transmitPdcpPduParameters.lcid = 0;
653
654 m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
655}
656
657void
659{
660 Ptr<Packet> packet = Create<Packet> ();
661
662 RrcConnectionReleaseHeader rrcConnectionReleaseHeader;
663 rrcConnectionReleaseHeader.SetMessage (msg);
664
665 packet->AddHeader (rrcConnectionReleaseHeader);
666
667 LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
668 transmitPdcpSduParameters.pdcpSdu = packet;
669 transmitPdcpSduParameters.rnti = rnti;
670 transmitPdcpSduParameters.lcid = 1;
671
672 m_setupUeParametersMap[rnti].srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
673}
674
675void
677{
678 // Get type of message received
679 RrcUlCcchMessage rrcUlCcchMessage;
680 p->PeekHeader (rrcUlCcchMessage);
681
682 // Declare possible headers to receive
683 RrcConnectionReestablishmentRequestHeader rrcConnectionReestablishmentRequestHeader;
684 RrcConnectionRequestHeader rrcConnectionRequestHeader;
685
686 // Deserialize packet and call member recv function with appropriate structure
687 switch ( rrcUlCcchMessage.GetMessageType () )
688 {
689 case 0:
690 p->RemoveHeader (rrcConnectionReestablishmentRequestHeader);
691 LteRrcSap::RrcConnectionReestablishmentRequest rrcConnectionReestablishmentRequestMsg;
692 rrcConnectionReestablishmentRequestMsg = rrcConnectionReestablishmentRequestHeader.GetMessage ();
693 m_enbRrcSapProvider->RecvRrcConnectionReestablishmentRequest (rnti,rrcConnectionReestablishmentRequestMsg);
694 break;
695 case 1:
696 p->RemoveHeader (rrcConnectionRequestHeader);
697 LteRrcSap::RrcConnectionRequest rrcConnectionRequestMsg;
698 rrcConnectionRequestMsg = rrcConnectionRequestHeader.GetMessage ();
699 m_enbRrcSapProvider->RecvRrcConnectionRequest (rnti,rrcConnectionRequestMsg);
700 break;
701 }
702}
703
704void
706{
707 // Get type of message received
708 RrcUlDcchMessage rrcUlDcchMessage;
709 params.pdcpSdu->PeekHeader (rrcUlDcchMessage);
710
711 // Declare possible headers to receive
712 MeasurementReportHeader measurementReportHeader;
713 RrcConnectionReconfigurationCompleteHeader rrcConnectionReconfigurationCompleteHeader;
714 RrcConnectionReestablishmentCompleteHeader rrcConnectionReestablishmentCompleteHeader;
715 RrcConnectionSetupCompleteHeader rrcConnectionSetupCompleteHeader;
716
717 // Declare possible messages to receive
718 LteRrcSap::MeasurementReport measurementReportMsg;
719 LteRrcSap::RrcConnectionReconfigurationCompleted rrcConnectionReconfigurationCompleteMsg;
720 LteRrcSap::RrcConnectionReestablishmentComplete rrcConnectionReestablishmentCompleteMsg;
721 LteRrcSap::RrcConnectionSetupCompleted rrcConnectionSetupCompletedMsg;
722
723 // Deserialize packet and call member recv function with appropriate structure
724 switch ( rrcUlDcchMessage.GetMessageType () )
725 {
726 case 1:
727 params.pdcpSdu->RemoveHeader (measurementReportHeader);
728 measurementReportMsg = measurementReportHeader.GetMessage ();
729 m_enbRrcSapProvider->RecvMeasurementReport (params.rnti,measurementReportMsg);
730 break;
731 case 2:
732 params.pdcpSdu->RemoveHeader (rrcConnectionReconfigurationCompleteHeader);
733 rrcConnectionReconfigurationCompleteMsg = rrcConnectionReconfigurationCompleteHeader.GetMessage ();
734 m_enbRrcSapProvider->RecvRrcConnectionReconfigurationCompleted (params.rnti,rrcConnectionReconfigurationCompleteMsg);
735 break;
736 case 3:
737 params.pdcpSdu->RemoveHeader (rrcConnectionReestablishmentCompleteHeader);
738 rrcConnectionReestablishmentCompleteMsg = rrcConnectionReestablishmentCompleteHeader.GetMessage ();
739 m_enbRrcSapProvider->RecvRrcConnectionReestablishmentComplete (params.rnti,rrcConnectionReestablishmentCompleteMsg);
740 break;
741 case 4:
742 params.pdcpSdu->RemoveHeader (rrcConnectionSetupCompleteHeader);
743 rrcConnectionSetupCompletedMsg = rrcConnectionSetupCompleteHeader.GetMessage ();
744 m_enbRrcSapProvider->RecvRrcConnectionSetupCompleted (params.rnti, rrcConnectionSetupCompletedMsg);
745 break;
746 }
747}
748
751{
753 h.SetMessage (msg);
754
755 Ptr<Packet> p = Create<Packet> ();
756 p->AddHeader (h);
757 return p;
758}
759
762{
764 p->RemoveHeader (h);
766 return msg;
767}
768
771{
773 h.SetMessage (msg);
774 Ptr<Packet> p = Create<Packet> ();
775 p->AddHeader (h);
776 return p;
777}
778
781{
783 p->RemoveHeader (h);
785 return msg;
786}
787
789
791 : m_pdcp (pdcp),
792 m_rnti (rnti)
793{
794}
795
797{
798}
799
800void
802{
804}
805
806} // namespace ns3
This class manages the serialization/deserialization of HandoverPreparationInfo IE.
void SetMessage(LteRrcSap::HandoverPreparationInfo msg)
Receives a HandoverPreparationInfo IE and stores the contents into the class attributes.
LteRrcSap::HandoverPreparationInfo GetMessage() const
Returns a HandoverPreparationInfo IE from the values in the class attributes.
The eNodeB device implementation.
bool HasCellId(uint16_t cellId) const
Ptr< LteEnbRrc > GetRrc() const
Models the transmission of RRC messages from the UE to the eNB in a real fashion, by creating real RR...
void DoSendRrcConnectionRelease(uint16_t rnti, LteRrcSap::RrcConnectionRelease msg)
Send RRC connection release function.
std::map< uint16_t, LteEnbRrcSapProvider::CompleteSetupUeParameters > m_completeSetupUeParametersMap
complete setup UE parameters map
friend class LtePdcpSpecificLtePdcpSapUser< LteEnbRrcProtocolReal >
allow LtePdcpSpecificLtePdcpSapUser<LteEnbRrcProtocolReal> class friend access
void DoSetupUe(uint16_t rnti, LteEnbRrcSapUser::SetupUeParameters params)
Setup UE function.
LteUeRrcSapProvider * GetUeRrcSapProvider(uint16_t rnti)
Get UE RRC SAP provider function.
void SetCellId(uint16_t cellId)
Set cell ID function.
void DoReceivePdcpSdu(LtePdcpSapUser::ReceivePdcpSduParameters params)
Receive PDCP SDU function.
void DoSendRrcConnectionReestablishmentReject(uint16_t rnti, LteRrcSap::RrcConnectionReestablishmentReject msg)
Send RRC connection reestabishment reject function.
void DoSendSystemInformation(uint16_t cellId, LteRrcSap::SystemInformation msg)
Send system information function.
void DoReceivePdcpPdu(uint16_t rnti, Ptr< Packet > p)
Receive PDCP PDU function.
LteEnbRrcSapProvider * m_enbRrcSapProvider
ENB RRC SAP provider.
Ptr< Packet > DoEncodeHandoverCommand(LteRrcSap::RrcConnectionReconfiguration msg)
Encode handover command function.
LteEnbRrcSapUser * GetLteEnbRrcSapUser()
Get LTE ENB RRC SAP user function.
void DoSendRrcConnectionSetup(uint16_t rnti, LteRrcSap::RrcConnectionSetup msg)
Send RRC connection setup function.
friend class MemberLteEnbRrcSapUser< LteEnbRrcProtocolReal >
allow MemberLteEnbRrcSapUser<LteEnbRrcProtocolReal> class friend access
static TypeId GetTypeId(void)
Get the type ID.
void DoRemoveUe(uint16_t rnti)
Remove UE function.
Ptr< Packet > DoEncodeHandoverPreparationInformation(LteRrcSap::HandoverPreparationInfo msg)
Encode handover preparation information function.
void SetLteEnbRrcSapProvider(LteEnbRrcSapProvider *p)
Set LTE ENB RRC SAP provider function.
LteEnbRrcSapUser * m_enbRrcSapUser
ENB RRC SAP user.
void DoSendRrcConnectionReject(uint16_t rnti, LteRrcSap::RrcConnectionReject msg)
Send RRC connection reject function.
friend class RealProtocolRlcSapUser
allow RealProtocolRlcSapUser class friend access
std::map< uint16_t, LteEnbRrcSapUser::SetupUeParameters > m_setupUeParametersMap
setup UE parameters map
LteRrcSap::RrcConnectionReconfiguration DoDecodeHandoverCommand(Ptr< Packet > p)
Decode handover command function.
LteRrcSap::HandoverPreparationInfo DoDecodeHandoverPreparationInformation(Ptr< Packet > p)
Decode handover preparation information function.
virtual void DoDispose(void)
Destructor implementation.
void DoSendRrcConnectionReestablishment(uint16_t rnti, LteRrcSap::RrcConnectionReestablishment msg)
Send RRC connection reestabishment function.
void SetUeRrcSapProvider(uint16_t rnti, LteUeRrcSapProvider *p)
Set UE RRC SAP provider function.
void DoSendRrcConnectionReconfiguration(uint16_t rnti, LteRrcSap::RrcConnectionReconfiguration msg)
Send RRC connection reconfiguration function.
std::map< uint16_t, LteUeRrcSapProvider * > m_enbRrcSapProviderMap
ENB RRC SAP provider map.
Part of the RRC protocol.
Definition: lte-rrc-sap.h:1201
virtual void RecvRrcConnectionReestablishmentRequest(uint16_t rnti, RrcConnectionReestablishmentRequest msg)=0
Receive an RRCConnectionReestablishmentRequest message from a UE during an RRC connection re-establis...
virtual void RecvRrcConnectionReestablishmentComplete(uint16_t rnti, RrcConnectionReestablishmentComplete msg)=0
Receive an RRCConnectionReestablishmentComplete message from a UE during an RRC connection re-establi...
virtual void RecvRrcConnectionReconfigurationCompleted(uint16_t rnti, RrcConnectionReconfigurationCompleted msg)=0
Receive an RRCConnectionReconfigurationComplete message from a UE during an RRC connection reconfigur...
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 RecvRrcConnectionSetupCompleted(uint16_t rnti, RrcConnectionSetupCompleted msg)=0
Receive an RRCConnectionSetupComplete message from a UE during an RRC connection establishment proced...
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 CompleteSetupUe(uint16_t rnti, CompleteSetupUeParameters params)=0
Complete setup UE function.
virtual void RecvIdealUeContextRemoveRequest(uint16_t rnti)=0
Receive ideal UE context remove request from the UE RRC.
Part of the RRC protocol.
Definition: lte-rrc-sap.h:1082
virtual void TransmitPdcpSdu(TransmitPdcpSduParameters params)=0
Send RRC PDU parameters to the PDCP for transmission.
Service Access Point (SAP) offered by the PDCP entity to the RRC entity See 3GPP 36....
Definition: lte-pdcp-sap.h:70
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 ...
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:68
The LteUeNetDevice class implements the UE net device.
Models the transmission of RRC messages from the UE to the eNB in a real fashion, by creating real RR...
LteEnbRrcSapProvider * m_enbRrcSapProvider
ENB RRC SAP provider.
LteUeRrcSapProvider * m_ueRrcSapProvider
UE RRC SAP provider.
LteUeRrcSapUser::SetupParameters m_setupParameters
setup parameters
void SetEnbRrcSapProvider()
Set ENB RRC SAP provider.
void DoSendRrcConnectionReconfigurationCompleted(LteRrcSap::RrcConnectionReconfigurationCompleted msg)
Send RRC connection reconfiguration setup completed function.
virtual void DoDispose(void)
Destructor implementation.
void SetLteUeRrcSapProvider(LteUeRrcSapProvider *p)
Set LTE UE RRC SAP provider function.
void DoSendRrcConnectionSetupCompleted(LteRrcSap::RrcConnectionSetupCompleted msg)
Send RRC connection setup completed function.
friend class MemberLteUeRrcSapUser< LteUeRrcProtocolReal >
allow MemberLteUeRrcSapUser<LteUeRrcProtocolReal> class friend access
void DoReceivePdcpPdu(Ptr< Packet > p)
Receive PDCP PDU function.
Ptr< LteUeRrc > m_rrc
the RRC
void DoSendRrcConnectionReestablishmentComplete(LteRrcSap::RrcConnectionReestablishmentComplete msg)
Send RRC connection reestablishment complete function.
void DoReceivePdcpSdu(LtePdcpSapUser::ReceivePdcpSduParameters params)
Receive PDCP SDU function.
void DoSetup(LteUeRrcSapUser::SetupParameters params)
Setup function.
void SetUeRrc(Ptr< LteUeRrc > rrc)
Set UE RRC function.
LteUeRrcSapUser * m_ueRrcSapUser
UE RRC SAP user.
void DoSendMeasurementReport(LteRrcSap::MeasurementReport msg)
Send measurement report function.
friend class LtePdcpSpecificLtePdcpSapUser< LteUeRrcProtocolReal >
allow LtePdcpSpecificLtePdcpSapUser<LteUeRrcProtocolReal> class friend access
void DoSendRrcConnectionReestablishmentRequest(LteRrcSap::RrcConnectionReestablishmentRequest msg)
Send RRC connection reestablishment request function.
LteUeRrcSapUser * GetLteUeRrcSapUser()
Get LTE UE RRC SAP user function.
void DoSendIdealUeContextRemoveRequest(uint16_t rnti)
Send ideal UE context remove request function.
static TypeId GetTypeId(void)
Get the type ID.
void DoSendRrcConnectionRequest(LteRrcSap::RrcConnectionRequest msg)
Send RRC connection request function.
LteUeRrcSapProvider::CompleteSetupParameters m_completeSetupParameters
complete setup parameters
friend class LteRlcSpecificLteRlcSapUser< LteUeRrcProtocolReal >
allow LteRlcSpecificLteRlcSapUser<LteUeRrcProtocolReal> class friend access
Part of the RRC protocol.
Definition: lte-rrc-sap.h:1001
virtual void RecvRrcConnectionReconfiguration(RrcConnectionReconfiguration msg)=0
Receive an RRCConnectionReconfiguration message from the serving eNodeB during an RRC connection reco...
virtual void RecvRrcConnectionReject(RrcConnectionReject msg)=0
Receive an RRCConnectionReject message from the serving eNodeB during an RRC connection establishment...
virtual void RecvSystemInformation(SystemInformation msg)=0
Receive a SystemInformation message from the serving eNodeB during a system information acquisition p...
virtual void CompleteSetup(CompleteSetupParameters params)=0
Complete setup function.
virtual void RecvRrcConnectionSetup(RrcConnectionSetup msg)=0
Receive an RRCConnectionSetup message from the serving eNodeB during an RRC connection establishment ...
virtual void RecvRrcConnectionReestablishment(RrcConnectionReestablishment msg)=0
Receive an RRCConnectionReestablishment message from the serving eNodeB during an RRC connection re-e...
Part of the RRC protocol.
Definition: lte-rrc-sap.h:917
This class manages the serialization/deserialization of MeasurementReport IE.
LteRrcSap::MeasurementReport GetMessage() const
Returns a MeasurementReport IE from the values in the class attributes.
void SetMessage(LteRrcSap::MeasurementReport msg)
Receives a MeasurementReport IE and stores the contents into the class attributes.
uint32_t GetId(void) const
Definition: node.cc:109
uint32_t GetNDevices(void) const
Definition: node.cc:152
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
Definition: node.cc:144
static Iterator End(void)
Definition: node-list.cc:235
static Iterator Begin(void)
Definition: node-list.cc:229
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
Definition: node-list.h:44
A base class which provides memory management and object aggregation.
Definition: object.h:88
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:280
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:256
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Definition: packet.cc:290
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
virtual void ReceivePdcpPdu(Ptr< Packet > p)
Called by the RLC entity to notify the PDCP entity of the reception of a new PDCP PDU.
LteEnbRrcProtocolReal * m_pdcp
PDCP.
int GetMessageType()
Get message type.
This class manages the serialization/deserialization of RrcConnectionSetupComplete IE.
LteRrcSap::RrcConnectionReconfigurationCompleted GetMessage() const
Returns a RrcConnectionReconfigurationCompleted IE from the values in the class attributes.
void SetMessage(LteRrcSap::RrcConnectionReconfigurationCompleted msg)
Receives a RrcConnectionReconfigurationCompleted IE and stores the contents into the class attributes...
This class manages the serialization/deserialization of RrcConnectionReconfiguration IE.
LteRrcSap::RrcConnectionReconfiguration GetMessage() const
Returns a RrcConnectionReconfiguration 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 RrcConnectionReestablishmentComplete IE.
void SetMessage(LteRrcSap::RrcConnectionReestablishmentComplete msg)
Receives a RrcConnectionReestablishmentComplete IE and stores the contents into the class attributes.
LteRrcSap::RrcConnectionReestablishmentComplete GetMessage() const
Returns a RrcConnectionReestablishmentComplete IE from the values in the class attributes.
This class manages the serialization/deserialization of RrcConnectionReestablishment IE.
LteRrcSap::RrcConnectionReestablishment GetMessage() const
Returns a RrcConnectionReestablishment IE from the values in the class attributes.
void SetMessage(LteRrcSap::RrcConnectionReestablishment msg)
Receives a RrcConnectionReestablishment IE and stores the contents into the class attributes.
This class manages the serialization/deserialization of RrcConnectionReestablishmentReject IE.
void SetMessage(LteRrcSap::RrcConnectionReestablishmentReject msg)
Receives a RrcConnectionReestablishmentReject IE and stores the contents into the class attributes.
LteRrcSap::RrcConnectionReestablishmentReject GetMessage() const
Returns a RrcConnectionReestablishmentReject IE from the values in the class attributes.
This class manages the serialization/deserialization of RRCConnectionReestablishmentRequest IE.
LteRrcSap::RrcConnectionReestablishmentRequest GetMessage() const
Returns a RrcConnectionReestablishmentRequest IE from the values in the class attributes.
void SetMessage(LteRrcSap::RrcConnectionReestablishmentRequest msg)
Receives a RrcConnectionReestablishmentRequest IE and stores the contents into the class attributes.
This class manages the serialization/deserialization of RrcConnectionReject IE.
LteRrcSap::RrcConnectionReject GetMessage() const
Returns a RrcConnectionReject IE from the values in the class attributes.
void SetMessage(LteRrcSap::RrcConnectionReject msg)
Receives a RrcConnectionReject IE and stores the contents into the class attributes.
This class manages the serialization/deserialization of RrcConnectionRelease IE.
LteRrcSap::RrcConnectionRelease GetMessage() const
Returns a RrcConnectionRelease IE from the values in the class attributes.
void SetMessage(LteRrcSap::RrcConnectionRelease msg)
Receives a RrcConnectionRelease IE and stores the contents into the class attributes.
This class manages the serialization/deserialization of RrcConnectionRequest IE.
void SetMessage(LteRrcSap::RrcConnectionRequest msg)
Receives a RrcConnectionRequest IE and stores the contents into the class attributes.
LteRrcSap::RrcConnectionRequest GetMessage() const
Returns a RrcConnectionRequest IE from the values in the class attributes.
This class manages the serialization/deserialization of RrcConnectionSetupComplete IE.
LteRrcSap::RrcConnectionSetupCompleted GetMessage() const
Returns a RrcConnectionSetupCompleted IE from the values in the class attributes.
void SetMessage(LteRrcSap::RrcConnectionSetupCompleted msg)
Receives a RrcConnectionSetupCompleted IE and stores the contents into the class attributes.
This class manages the serialization/deserialization of RrcConnectionSetup IE.
void SetMessage(LteRrcSap::RrcConnectionSetup msg)
Receives a RrcConnectionSetup IE and stores the contents into the class attributes.
LteRrcSap::RrcConnectionSetup GetMessage() const
Returns a RrcConnectionSetup IE from the values in the class attributes.
This class only serves to discriminate which message type has been received in downlink (eNb to ue) f...
This class only serves to discriminate which message type has been received in downlink (eNb to ue) f...
This class only serves to discriminate which message type has been received in uplink (ue to eNb) for...
This class only serves to discriminate which message type has been received in uplink (ue to eNb) for...
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition: simulator.h:556
static void ScheduleWithContext(uint32_t context, Time const &delay, FUNC f, Ts &&... args)
Schedule an event with the given context.
Definition: simulator.h:571
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
#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_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:88
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition: abort.h:108
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:289
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1252
Every class exported by the ns3 library is enclosed in the ns3 namespace.
const Time RRC_REAL_MSG_DELAY
RRC real message delay.
CompleteSetupUeParameters structure.
Definition: lte-rrc-sap.h:1205
SetupUeParameters structure.
Definition: lte-rrc-sap.h:1086
Parameters for LtePdcpSapProvider::TransmitPdcpSdu.
Definition: lte-pdcp-sap.h:44
uint8_t lcid
the logical channel id corresponding to the sending RLC instance
Definition: lte-pdcp-sap.h:47
uint16_t rnti
the C-RNTI identifying the UE
Definition: lte-pdcp-sap.h:46
Parameters for LtePdcpSapUser::ReceivePdcpSdu.
Definition: lte-pdcp-sap.h:78
uint16_t rnti
the C-RNTI identifying the UE
Definition: lte-pdcp-sap.h:80
Parameters for LteRlcSapProvider::TransmitPdcpPdu.
Definition: lte-rlc-sap.h:44
uint8_t lcid
the logical channel id corresponding to the sending RLC instance
Definition: lte-rlc-sap.h:47
uint16_t rnti
the C-RNTI identifying the UE
Definition: lte-rlc-sap.h:46
HandoverPreparationInfo structure.
Definition: lte-rrc-sap.h:896
MeasurementReport structure.
Definition: lte-rrc-sap.h:902
RrcConnectionReconfigurationCompleted structure.
Definition: lte-rrc-sap.h:852
RrcConnectionReconfiguration structure.
Definition: lte-rrc-sap.h:837
RrcConnectionReestablishmentComplete structure.
Definition: lte-rrc-sap.h:873
RrcConnectionReestablishment structure.
Definition: lte-rrc-sap.h:866
RrcConnectionReestablishmentReject structure.
Definition: lte-rrc-sap.h:879
RrcConnectionReestablishmentRequest structure.
Definition: lte-rrc-sap.h:859
RrcConnectionReject structure.
Definition: lte-rrc-sap.h:890
RrcConnectionRelease structure.
Definition: lte-rrc-sap.h:884
RrcConnectionRequest structure.
Definition: lte-rrc-sap.h:693
RrcConnectionSetupCompleted structure.
Definition: lte-rrc-sap.h:706
RrcConnectionSetup structure.
Definition: lte-rrc-sap.h:699
SystemInformation structure.
Definition: lte-rrc-sap.h:609
LtePdcpSapUser * srb1SapUser
SRB1 SAP user.
Definition: lte-rrc-sap.h:1007
SetupParameters structure.
Definition: lte-rrc-sap.h:921
LteRlcSapProvider * srb0SapProvider
SRB0 SAP provider.
Definition: lte-rrc-sap.h:922
LtePdcpSapProvider * srb1SapProvider
SRB1 SAP provider.
Definition: lte-rrc-sap.h:923