A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
lte-rrc-protocol-real.cc
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 NS_LOG_COMPONENT_DEFINE ("LteRrcProtocolReal");
36 
37 
38 namespace ns3 {
39 
40 
41 const Time RRC_REAL_MSG_DELAY = MilliSeconds (0);
42 
43 NS_OBJECT_ENSURE_REGISTERED (LteUeRrcProtocolReal);
44 
45 LteUeRrcProtocolReal::LteUeRrcProtocolReal ()
46  : m_ueRrcSapProvider (0),
47  m_enbRrcSapProvider (0)
48 {
49  m_ueRrcSapUser = new MemberLteUeRrcSapUser<LteUeRrcProtocolReal> (this);
50  m_completeSetupParameters.srb0SapUser = new LteRlcSpecificLteRlcSapUser<LteUeRrcProtocolReal> (this);
51  m_completeSetupParameters.srb1SapUser = new LtePdcpSpecificLtePdcpSapUser<LteUeRrcProtocolReal> (this);
52 }
53 
54 LteUeRrcProtocolReal::~LteUeRrcProtocolReal ()
55 {
56 }
57 
58 void
60 {
61  NS_LOG_FUNCTION (this);
62  delete m_ueRrcSapUser;
63  delete m_completeSetupParameters.srb0SapUser;
64  delete m_completeSetupParameters.srb1SapUser;
65  m_rrc = 0;
66 }
67 
68 TypeId
69 LteUeRrcProtocolReal::GetTypeId (void)
70 {
71  static TypeId tid = TypeId ("ns3::LteUeRrcProtocolReal")
72  .SetParent<Object> ()
73  .AddConstructor<LteUeRrcProtocolReal> ()
74  ;
75  return tid;
76 }
77 
78 void
79 LteUeRrcProtocolReal::SetLteUeRrcSapProvider (LteUeRrcSapProvider* p)
80 {
81  m_ueRrcSapProvider = p;
82 }
83 
84 LteUeRrcSapUser*
85 LteUeRrcProtocolReal::GetLteUeRrcSapUser ()
86 {
87  return m_ueRrcSapUser;
88 }
89 
90 void
91 LteUeRrcProtocolReal::SetUeRrc (Ptr<LteUeRrc> rrc)
92 {
93  m_rrc = rrc;
94 }
95 
96 void
97 LteUeRrcProtocolReal::DoSetup (LteUeRrcSapUser::SetupParameters params)
98 {
99  NS_LOG_FUNCTION (this);
100 
101  m_setupParameters.srb0SapProvider = params.srb0SapProvider;
102  m_setupParameters.srb1SapProvider = params.srb1SapProvider;
103  m_ueRrcSapProvider->CompleteSetup (m_completeSetupParameters);
104 }
105 
106 void
107 LteUeRrcProtocolReal::DoSendRrcConnectionRequest (LteRrcSap::RrcConnectionRequest msg)
108 {
109  // initialize the RNTI and get the EnbLteRrcSapProvider for the
110  // eNB we are currently attached to
111  m_rnti = m_rrc->GetRnti ();
112  SetEnbRrcSapProvider ();
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 
129 void
130 LteUeRrcProtocolReal::DoSendRrcConnectionSetupCompleted (LteRrcSap::RrcConnectionSetupCompleted msg)
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 
144  if (m_setupParameters.srb1SapProvider)
145  {
146  m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
147  }
148 }
149 
150 void
151 LteUeRrcProtocolReal::DoSendRrcConnectionReconfigurationCompleted (LteRrcSap::RrcConnectionReconfigurationCompleted msg)
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 ();
156  SetEnbRrcSapProvider ();
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 
173 void
174 LteUeRrcProtocolReal::DoSendMeasurementReport (LteRrcSap::MeasurementReport msg)
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 ();
179  SetEnbRrcSapProvider ();
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 
196 void
197 LteUeRrcProtocolReal::DoSendRrcConnectionReestablishmentRequest (LteRrcSap::RrcConnectionReestablishmentRequest msg)
198 {
199  Ptr<Packet> packet = Create<Packet> ();
200 
201  RrcConnectionReestablishmentRequestHeader rrcConnectionReestablishmentRequestHeader;
202  rrcConnectionReestablishmentRequestHeader.SetMessage (msg);
203 
204  packet->AddHeader (rrcConnectionReestablishmentRequestHeader);
205 
206  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
207  transmitPdcpPduParameters.pdcpPdu = packet;
208  transmitPdcpPduParameters.rnti = m_rnti;
209  transmitPdcpPduParameters.lcid = 0;
210 
211  m_setupParameters.srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
212 }
213 
214 void
215 LteUeRrcProtocolReal::DoSendRrcConnectionReestablishmentComplete (LteRrcSap::RrcConnectionReestablishmentComplete msg)
216 {
217  Ptr<Packet> packet = Create<Packet> ();
218 
219  RrcConnectionReestablishmentCompleteHeader rrcConnectionReestablishmentCompleteHeader;
220  rrcConnectionReestablishmentCompleteHeader.SetMessage (msg);
221 
222  packet->AddHeader (rrcConnectionReestablishmentCompleteHeader);
223 
224  LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
225  transmitPdcpSduParameters.pdcpSdu = packet;
226  transmitPdcpSduParameters.rnti = m_rnti;
227  transmitPdcpSduParameters.lcid = 1;
228 
229  m_setupParameters.srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
230 }
231 
232 
233 void
234 LteUeRrcProtocolReal::SetEnbRrcSapProvider ()
235 {
236  uint16_t cellId = m_rrc->GetCellId ();
237 
238  // walk list of all nodes to get the peer eNB
239  Ptr<LteEnbNetDevice> enbDev;
240  NodeList::Iterator listEnd = NodeList::End ();
241  bool found = false;
242  for (NodeList::Iterator i = NodeList::Begin ();
243  (i != listEnd) && (!found);
244  ++i)
245  {
246  Ptr<Node> node = *i;
247  int nDevs = node->GetNDevices ();
248  for (int j = 0;
249  (j < nDevs) && (!found);
250  j++)
251  {
252  enbDev = node->GetDevice (j)->GetObject <LteEnbNetDevice> ();
253  if (enbDev == 0)
254  {
255  continue;
256  }
257  else
258  {
259  if (enbDev->GetCellId () == cellId)
260  {
261  found = true;
262  break;
263  }
264  }
265  }
266  }
267  NS_ASSERT_MSG (found, " Unable to find eNB with CellId =" << cellId);
268  m_enbRrcSapProvider = enbDev->GetRrc ()->GetLteEnbRrcSapProvider ();
269  Ptr<LteEnbRrcProtocolReal> enbRrcProtocolReal = enbDev->GetRrc ()->GetObject<LteEnbRrcProtocolReal> ();
270  enbRrcProtocolReal->SetUeRrcSapProvider (m_rnti, m_ueRrcSapProvider);
271 }
272 
273 void
274 LteUeRrcProtocolReal::DoReceivePdcpPdu (Ptr<Packet> p)
275 {
276  // Get type of message received
277  RrcDlCcchMessage rrcDlCcchMessage;
278  p->PeekHeader (rrcDlCcchMessage);
279 
280  // Declare possible headers to receive
281  RrcConnectionReestablishmentHeader rrcConnectionReestablishmentHeader;
282  RrcConnectionReestablishmentRejectHeader rrcConnectionReestablishmentRejectHeader;
283  RrcConnectionSetupHeader rrcConnectionSetupHeader;
284  RrcConnectionRejectHeader rrcConnectionRejectHeader;
285 
286  // Declare possible messages
287  LteRrcSap::RrcConnectionReestablishment rrcConnectionReestablishmentMsg;
288  LteRrcSap::RrcConnectionReestablishmentReject rrcConnectionReestablishmentRejectMsg;
289  LteRrcSap::RrcConnectionSetup rrcConnectionSetupMsg;
290  LteRrcSap::RrcConnectionReject rrcConnectionRejectMsg;
291 
292  // Deserialize packet and call member recv function with appropiate structure
293  switch ( rrcDlCcchMessage.GetMessageType () )
294  {
295  case 0:
296  // RrcConnectionReestablishment
297  p->RemoveHeader (rrcConnectionReestablishmentHeader);
298  rrcConnectionReestablishmentMsg = rrcConnectionReestablishmentHeader.GetMessage ();
299  m_ueRrcSapProvider->RecvRrcConnectionReestablishment (rrcConnectionReestablishmentMsg);
300  break;
301  case 1:
302  // RrcConnectionReestablishmentReject
303  p->RemoveHeader (rrcConnectionReestablishmentRejectHeader);
304  rrcConnectionReestablishmentRejectMsg = rrcConnectionReestablishmentRejectHeader.GetMessage ();
305  // m_ueRrcSapProvider->RecvRrcConnectionReestablishmentReject (rrcConnectionReestablishmentRejectMsg);
306  break;
307  case 2:
308  // RrcConnectionReject
309  p->RemoveHeader (rrcConnectionRejectHeader);
310  rrcConnectionRejectMsg = rrcConnectionRejectHeader.GetMessage ();
311  m_ueRrcSapProvider->RecvRrcConnectionReject (rrcConnectionRejectMsg);
312  break;
313  case 3:
314  // RrcConnectionSetup
315  p->RemoveHeader (rrcConnectionSetupHeader);
316  rrcConnectionSetupMsg = rrcConnectionSetupHeader.GetMessage ();
317  m_ueRrcSapProvider->RecvRrcConnectionSetup (rrcConnectionSetupMsg);
318  break;
319  }
320 }
321 
322 void
323 LteUeRrcProtocolReal::DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameters params)
324 {
325  // Get type of message received
326  RrcDlDcchMessage rrcDlDcchMessage;
327  params.pdcpSdu->PeekHeader (rrcDlDcchMessage);
328 
329  // Declare possible headers to receive
330  RrcConnectionReconfigurationHeader rrcConnectionReconfigurationHeader;
331  RrcConnectionReleaseHeader rrcConnectionReleaseHeader;
332 
333  // Declare possible messages to receive
334  LteRrcSap::RrcConnectionReconfiguration rrcConnectionReconfigurationMsg;
335  LteRrcSap::RrcConnectionRelease rrcConnectionReleaseMsg;
336 
337  // Deserialize packet and call member recv function with appropiate structure
338  switch ( rrcDlDcchMessage.GetMessageType () )
339  {
340  case 4:
341  params.pdcpSdu->RemoveHeader (rrcConnectionReconfigurationHeader);
342  rrcConnectionReconfigurationMsg = rrcConnectionReconfigurationHeader.GetMessage ();
343  m_ueRrcSapProvider->RecvRrcConnectionReconfiguration (rrcConnectionReconfigurationMsg);
344  break;
345  case 5:
346  params.pdcpSdu->RemoveHeader (rrcConnectionReleaseHeader);
347  rrcConnectionReleaseMsg = rrcConnectionReleaseHeader.GetMessage ();
348  //m_ueRrcSapProvider->RecvRrcConnectionRelease (rrcConnectionReleaseMsg);
349  break;
350  }
351 }
352 
353 NS_OBJECT_ENSURE_REGISTERED (LteEnbRrcProtocolReal);
354 
355 LteEnbRrcProtocolReal::LteEnbRrcProtocolReal ()
356  : m_enbRrcSapProvider (0)
357 {
358  NS_LOG_FUNCTION (this);
359  m_enbRrcSapUser = new MemberLteEnbRrcSapUser<LteEnbRrcProtocolReal> (this);
360 }
361 
362 LteEnbRrcProtocolReal::~LteEnbRrcProtocolReal ()
363 {
364  NS_LOG_FUNCTION (this);
365 }
366 
367 void
369 {
370  NS_LOG_FUNCTION (this);
371  delete m_enbRrcSapUser;
372  for (std::map<uint16_t, LteEnbRrcSapProvider::CompleteSetupUeParameters>::iterator
373  it = m_completeSetupUeParametersMap.begin ();
374  it != m_completeSetupUeParametersMap.end ();
375  ++it)
376  {
377  delete it->second.srb0SapUser;
378  delete it->second.srb1SapUser;
379  }
380  m_completeSetupUeParametersMap.clear ();
381 }
382 
383 TypeId
384 LteEnbRrcProtocolReal::GetTypeId (void)
385 {
386  static TypeId tid = TypeId ("ns3::LteEnbRrcProtocolReal")
387  .SetParent<Object> ()
388  .AddConstructor<LteEnbRrcProtocolReal> ()
389  ;
390  return tid;
391 }
392 
393 void
394 LteEnbRrcProtocolReal::SetLteEnbRrcSapProvider (LteEnbRrcSapProvider* p)
395 {
396  m_enbRrcSapProvider = p;
397 }
398 
399 LteEnbRrcSapUser*
400 LteEnbRrcProtocolReal::GetLteEnbRrcSapUser ()
401 {
402  return m_enbRrcSapUser;
403 }
404 
405 void
406 LteEnbRrcProtocolReal::SetCellId (uint16_t cellId)
407 {
408  m_cellId = cellId;
409 }
410 
411 LteUeRrcSapProvider*
412 LteEnbRrcProtocolReal::GetUeRrcSapProvider (uint16_t rnti)
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
421 LteEnbRrcProtocolReal::SetUeRrcSapProvider (uint16_t rnti, LteUeRrcSapProvider* p)
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
430 LteEnbRrcProtocolReal::DoSetupUe (uint16_t rnti, LteEnbRrcSapUser::SetupUeParameters params)
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);
478  LtePdcpSapUser* srb1SapUser = new LtePdcpSpecificLtePdcpSapUser<LteEnbRrcProtocolReal> (this);
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
492 LteEnbRrcProtocolReal::DoRemoveUe (uint16_t rnti)
493 {
494  NS_LOG_FUNCTION (this << rnti);
495  std::map<uint16_t, LteEnbRrcSapProvider::CompleteSetupUeParameters>::iterator
496  it = m_completeSetupUeParametersMap.find (rnti);
497  NS_ASSERT (it != m_completeSetupUeParametersMap.end ());
498  delete it->second.srb0SapUser;
499  delete it->second.srb1SapUser;
500  m_completeSetupUeParametersMap.erase (it);
501  m_enbRrcSapProviderMap.erase (rnti);
502  m_setupUeParametersMap.erase (rnti);
503 }
504 
505 void
506 LteEnbRrcProtocolReal::DoSendMasterInformationBlock (LteRrcSap::MasterInformationBlock msg)
507 {
508  NS_LOG_FUNCTION (this);
509  for (std::map<uint16_t, LteUeRrcSapProvider*>::const_iterator it = m_enbRrcSapProviderMap.begin ();
510  it != m_enbRrcSapProviderMap.end ();
511  ++it)
512  {
513  Simulator::Schedule (RRC_REAL_MSG_DELAY,
514  &LteUeRrcSapProvider::RecvMasterInformationBlock,
515  it->second,
516  msg);
517  }
518 }
519 
520 void
521 LteEnbRrcProtocolReal::DoSendSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 msg)
522 {
523  NS_LOG_FUNCTION (this << m_cellId);
524  // walk list of all nodes to get UEs with this cellId
525  Ptr<LteUeRrc> ueRrc;
526  for (NodeList::Iterator i = NodeList::Begin (); i != NodeList::End (); ++i)
527  {
528  Ptr<Node> node = *i;
529  int nDevs = node->GetNDevices ();
530  for (int j = 0; j < nDevs; ++j)
531  {
532  Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
533  if (ueDev != 0)
534  {
535  NS_LOG_LOGIC ("considering UE " << ueDev->GetImsi ());
536  Ptr<LteUeRrc> ueRrc = ueDev->GetRrc ();
537  if (ueRrc->GetCellId () == m_cellId)
538  {
539  Simulator::Schedule (RRC_REAL_MSG_DELAY,
540  &LteUeRrcSapProvider::RecvSystemInformationBlockType1,
541  ueRrc->GetLteUeRrcSapProvider (),
542  msg);
543  }
544  }
545  }
546  }
547 }
548 
549 void
550 LteEnbRrcProtocolReal::DoSendSystemInformation (LteRrcSap::SystemInformation msg)
551 {
552  NS_LOG_FUNCTION (this << m_cellId);
553  // walk list of all nodes to get UEs with this cellId
554  Ptr<LteUeRrc> ueRrc;
555  for (NodeList::Iterator i = NodeList::Begin (); i != NodeList::End (); ++i)
556  {
557  Ptr<Node> node = *i;
558  int nDevs = node->GetNDevices ();
559  for (int j = 0; j < nDevs; ++j)
560  {
561  Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
562  if (ueDev != 0)
563  {
564  Ptr<LteUeRrc> ueRrc = ueDev->GetRrc ();
565  NS_LOG_LOGIC ("considering UE IMSI " << ueDev->GetImsi () << " that has cellId " << ueRrc->GetCellId ());
566  if (ueRrc->GetCellId () == m_cellId)
567  {
568  NS_LOG_LOGIC ("sending SI to IMSI " << ueDev->GetImsi ());
569  ueRrc->GetLteUeRrcSapProvider ()->RecvSystemInformation (msg);
570  Simulator::Schedule (RRC_REAL_MSG_DELAY,
571  &LteUeRrcSapProvider::RecvSystemInformation,
572  ueRrc->GetLteUeRrcSapProvider (),
573  msg);
574  }
575  }
576  }
577  }
578 }
579 
580 void
581 LteEnbRrcProtocolReal::DoSendRrcConnectionSetup (uint16_t rnti, LteRrcSap::RrcConnectionSetup msg)
582 {
583  Ptr<Packet> packet = Create<Packet> ();
584 
585  RrcConnectionSetupHeader rrcConnectionSetupHeader;
586  rrcConnectionSetupHeader.SetMessage (msg);
587 
588  packet->AddHeader (rrcConnectionSetupHeader);
589 
590  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
591  transmitPdcpPduParameters.pdcpPdu = packet;
592  transmitPdcpPduParameters.rnti = rnti;
593  transmitPdcpPduParameters.lcid = 0;
594 
595  if (m_setupUeParametersMap.find (rnti) == m_setupUeParametersMap.end () )
596  {
597  std::cout << "RNTI not found in Enb setup parameters Map!" << std::endl;
598  }
599  else
600  {
601  m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
602  }
603 }
604 
605 void
606 LteEnbRrcProtocolReal::DoSendRrcConnectionReject (uint16_t rnti, LteRrcSap::RrcConnectionReject msg)
607 {
608  Ptr<Packet> packet = Create<Packet> ();
609 
610  RrcConnectionRejectHeader rrcConnectionRejectHeader;
611  rrcConnectionRejectHeader.SetMessage (msg);
612 
613  packet->AddHeader (rrcConnectionRejectHeader);
614 
615  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
616  transmitPdcpPduParameters.pdcpPdu = packet;
617  transmitPdcpPduParameters.rnti = rnti;
618  transmitPdcpPduParameters.lcid = 0;
619 
620  m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
621 }
622 
623 void
624 LteEnbRrcProtocolReal::DoSendRrcConnectionReconfiguration (uint16_t rnti, LteRrcSap::RrcConnectionReconfiguration msg)
625 {
626  Ptr<Packet> packet = Create<Packet> ();
627 
628  RrcConnectionReconfigurationHeader rrcConnectionReconfigurationHeader;
629  rrcConnectionReconfigurationHeader.SetMessage (msg);
630 
631  packet->AddHeader (rrcConnectionReconfigurationHeader);
632 
633  LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
634  transmitPdcpSduParameters.pdcpSdu = packet;
635  transmitPdcpSduParameters.rnti = rnti;
636  transmitPdcpSduParameters.lcid = 1;
637 
638  m_setupUeParametersMap[rnti].srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
639 }
640 
641 void
642 LteEnbRrcProtocolReal::DoSendRrcConnectionReestablishment (uint16_t rnti, LteRrcSap::RrcConnectionReestablishment msg)
643 {
644  Ptr<Packet> packet = Create<Packet> ();
645 
646  RrcConnectionReestablishmentHeader rrcConnectionReestablishmentHeader;
647  rrcConnectionReestablishmentHeader.SetMessage (msg);
648 
649  packet->AddHeader (rrcConnectionReestablishmentHeader);
650 
651  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
652  transmitPdcpPduParameters.pdcpPdu = packet;
653  transmitPdcpPduParameters.rnti = rnti;
654  transmitPdcpPduParameters.lcid = 0;
655 
656  m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
657 }
658 
659 void
660 LteEnbRrcProtocolReal::DoSendRrcConnectionReestablishmentReject (uint16_t rnti, LteRrcSap::RrcConnectionReestablishmentReject msg)
661 {
662  Ptr<Packet> packet = Create<Packet> ();
663 
664  RrcConnectionReestablishmentRejectHeader rrcConnectionReestablishmentRejectHeader;
665  rrcConnectionReestablishmentRejectHeader.SetMessage (msg);
666 
667  packet->AddHeader (rrcConnectionReestablishmentRejectHeader);
668 
669  LteRlcSapProvider::TransmitPdcpPduParameters transmitPdcpPduParameters;
670  transmitPdcpPduParameters.pdcpPdu = packet;
671  transmitPdcpPduParameters.rnti = rnti;
672  transmitPdcpPduParameters.lcid = 0;
673 
674  m_setupUeParametersMap[rnti].srb0SapProvider->TransmitPdcpPdu (transmitPdcpPduParameters);
675 }
676 
677 void
678 LteEnbRrcProtocolReal::DoSendRrcConnectionRelease (uint16_t rnti, LteRrcSap::RrcConnectionRelease msg)
679 {
680  Ptr<Packet> packet = Create<Packet> ();
681 
682  RrcConnectionReleaseHeader rrcConnectionReleaseHeader;
683  rrcConnectionReleaseHeader.SetMessage (msg);
684 
685  packet->AddHeader (rrcConnectionReleaseHeader);
686 
687  LtePdcpSapProvider::TransmitPdcpSduParameters transmitPdcpSduParameters;
688  transmitPdcpSduParameters.pdcpSdu = packet;
689  transmitPdcpSduParameters.rnti = rnti;
690  transmitPdcpSduParameters.lcid = 1;
691 
692  m_setupUeParametersMap[rnti].srb1SapProvider->TransmitPdcpSdu (transmitPdcpSduParameters);
693 }
694 
695 void
696 LteEnbRrcProtocolReal::DoReceivePdcpPdu (uint16_t rnti, Ptr<Packet> p)
697 {
698  // Get type of message received
699  RrcUlCcchMessage rrcUlCcchMessage;
700  p->PeekHeader (rrcUlCcchMessage);
701 
702  // Declare possible headers to receive
703  RrcConnectionReestablishmentRequestHeader rrcConnectionReestablishmentRequestHeader;
704  RrcConnectionRequestHeader rrcConnectionRequestHeader;
705 
706  // Deserialize packet and call member recv function with appropiate structure
707  switch ( rrcUlCcchMessage.GetMessageType () )
708  {
709  case 0:
710  p->RemoveHeader (rrcConnectionReestablishmentRequestHeader);
711  LteRrcSap::RrcConnectionReestablishmentRequest rrcConnectionReestablishmentRequestMsg;
712  rrcConnectionReestablishmentRequestMsg = rrcConnectionReestablishmentRequestHeader.GetMessage ();
713  m_enbRrcSapProvider->RecvRrcConnectionReestablishmentRequest (rnti,rrcConnectionReestablishmentRequestMsg);
714  break;
715  case 1:
716  p->RemoveHeader (rrcConnectionRequestHeader);
717  LteRrcSap::RrcConnectionRequest rrcConnectionRequestMsg;
718  rrcConnectionRequestMsg = rrcConnectionRequestHeader.GetMessage ();
719  m_enbRrcSapProvider->RecvRrcConnectionRequest (rnti,rrcConnectionRequestMsg);
720  break;
721  }
722 }
723 
724 void
725 LteEnbRrcProtocolReal::DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameters params)
726 {
727  // Get type of message received
728  RrcUlDcchMessage rrcUlDcchMessage;
729  params.pdcpSdu->PeekHeader (rrcUlDcchMessage);
730 
731  // Declare possible headers to receive
732  MeasurementReportHeader measurementReportHeader;
733  RrcConnectionReconfigurationCompleteHeader rrcConnectionReconfigurationCompleteHeader;
734  RrcConnectionReestablishmentCompleteHeader rrcConnectionReestablishmentCompleteHeader;
735  RrcConnectionSetupCompleteHeader rrcConnectionSetupCompleteHeader;
736 
737  // Declare possible messages to receive
738  LteRrcSap::MeasurementReport measurementReportMsg;
739  LteRrcSap::RrcConnectionReconfigurationCompleted rrcConnectionReconfigurationCompleteMsg;
740  LteRrcSap::RrcConnectionReestablishmentComplete rrcConnectionReestablishmentCompleteMsg;
741  LteRrcSap::RrcConnectionSetupCompleted rrcConnectionSetupCompletedMsg;
742 
743  // Deserialize packet and call member recv function with appropiate structure
744  switch ( rrcUlDcchMessage.GetMessageType () )
745  {
746  case 1:
747  params.pdcpSdu->RemoveHeader (measurementReportHeader);
748  measurementReportMsg = measurementReportHeader.GetMessage ();
749  m_enbRrcSapProvider->RecvMeasurementReport (params.rnti,measurementReportMsg);
750  break;
751  case 2:
752  params.pdcpSdu->RemoveHeader (rrcConnectionReconfigurationCompleteHeader);
753  rrcConnectionReconfigurationCompleteMsg = rrcConnectionReconfigurationCompleteHeader.GetMessage ();
754  m_enbRrcSapProvider->RecvRrcConnectionReconfigurationCompleted (params.rnti,rrcConnectionReconfigurationCompleteMsg);
755  break;
756  case 3:
757  params.pdcpSdu->RemoveHeader (rrcConnectionReestablishmentCompleteHeader);
758  rrcConnectionReestablishmentCompleteMsg = rrcConnectionReestablishmentCompleteHeader.GetMessage ();
759  m_enbRrcSapProvider->RecvRrcConnectionReestablishmentComplete (params.rnti,rrcConnectionReestablishmentCompleteMsg);
760  break;
761  case 4:
762  params.pdcpSdu->RemoveHeader (rrcConnectionSetupCompleteHeader);
763  rrcConnectionSetupCompletedMsg = rrcConnectionSetupCompleteHeader.GetMessage ();
764  m_enbRrcSapProvider->RecvRrcConnectionSetupCompleted (params.rnti, rrcConnectionSetupCompletedMsg);
765  break;
766  }
767 }
768 
769 Ptr<Packet>
770 LteEnbRrcProtocolReal::DoEncodeHandoverPreparationInformation (LteRrcSap::HandoverPreparationInfo msg)
771 {
772  HandoverPreparationInfoHeader h;
773  h.SetMessage (msg);
774 
775  Ptr<Packet> p = Create<Packet> ();
776  p->AddHeader (h);
777  return p;
778 }
779 
780 LteRrcSap::HandoverPreparationInfo
781 LteEnbRrcProtocolReal::DoDecodeHandoverPreparationInformation (Ptr<Packet> p)
782 {
783  HandoverPreparationInfoHeader h;
784  p->RemoveHeader (h);
785  LteRrcSap::HandoverPreparationInfo msg = h.GetMessage ();
786  return msg;
787 }
788 
789 Ptr<Packet>
790 LteEnbRrcProtocolReal::DoEncodeHandoverCommand (LteRrcSap::RrcConnectionReconfiguration msg)
791 {
792  RrcConnectionReconfigurationHeader h;
793  h.SetMessage (msg);
794  Ptr<Packet> p = Create<Packet> ();
795  p->AddHeader (h);
796  return p;
797 }
798 
799 LteRrcSap::RrcConnectionReconfiguration
800 LteEnbRrcProtocolReal::DoDecodeHandoverCommand (Ptr<Packet> p)
801 {
802  RrcConnectionReconfigurationHeader h;
803  p->RemoveHeader (h);
804  LteRrcSap::RrcConnectionReconfiguration msg = h.GetMessage ();
805  return msg;
806 }
807 
809 
810 RealProtocolRlcSapUser::RealProtocolRlcSapUser (LteEnbRrcProtocolReal* pdcp, uint16_t rnti)
811  : m_pdcp (pdcp),
812  m_rnti (rnti)
813 {
814 }
815 
816 RealProtocolRlcSapUser::RealProtocolRlcSapUser ()
817 {
818 }
819 
820 void
822 {
823  m_pdcp->DoReceivePdcpPdu (m_rnti, p);
824 }
825 
826 } // namespace ns3
virtual void ReceivePdcpPdu(Ptr< Packet > p)
#define NS_LOG_FUNCTION(parameters)
Definition: log.h:311
#define NS_ASSERT(condition)
Definition: assert.h:64
#define NS_LOG_COMPONENT_DEFINE(name)
Definition: log.h:122
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Definition: simulator.h:820
virtual void TransmitPdcpPdu(TransmitPdcpPduParameters params)=0
static Iterator End(void)
Definition: node-list.cc:186
#define NS_LOG_LOGIC(msg)
Definition: log.h:334
virtual void TransmitPdcpSdu(TransmitPdcpSduParameters params)=0
#define NS_ASSERT_MSG(condition, message)
Definition: assert.h:86
static Iterator Begin(void)
Definition: node-list.cc:180
Time MilliSeconds(uint64_t ms)
create ns3::Time instances in units of milliseconds.
Definition: nstime.h:601
a base class which provides memory management and object aggregation
Definition: object.h:63
a unique identifier for an interface.
Definition: type-id.h:44
TypeId SetParent(TypeId tid)
Definition: type-id.cc:471