A Discrete-Event Network Simulator
API
test-lte-rrc.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Nicola Baldo <nbaldo@cttc.es>
19  * Budiarto Herman <budiarto.herman@magister.fi>
20  */
21 
22 
23 #include <ns3/core-module.h>
24 #include <ns3/network-module.h>
25 #include <ns3/mobility-module.h>
26 #include <ns3/lte-module.h>
27 #include <cmath>
28 
29 using namespace ns3;
30 
31 NS_LOG_COMPONENT_DEFINE ("LteRrcTest");
32 
40 {
41 public:
56  uint32_t nBearers,
57  uint32_t tConnBase,
58  uint32_t tConnIncrPerUe,
59  uint32_t delayDiscStart,
60  bool errorExpected,
61  bool useIdealRrc,
62  bool admitRrcConnectionRequest,
63  std::string description = "");
64 
65 protected:
66 
67  virtual void DoRun (void);
68  uint32_t m_nUes;
69 
83  static std::string BuildNameString (uint32_t nUes,
84  uint32_t nBearers,
85  uint32_t tConnBase,
86  uint32_t tConnIncrPerUe,
87  uint32_t delayDiscStart,
88  bool useIdealRrc,
89  bool admitRrcConnectionRequest,
90  std::string description = "");
96  void Connect (Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice);
102  void CheckConnected (Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice);
108  void CheckNotConnected (Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice);
116  void ConnectionEstablishedCallback (std::string context, uint64_t imsi,
117  uint16_t cellId, uint16_t rnti);
126  void ConnectionTimeoutCallback (std::string context, uint64_t imsi,
127  uint16_t cellId, uint16_t rnti,
128  uint8_t connEstFailCount);
129 
130  uint32_t m_nBearers;
131  uint32_t m_tConnBase;
132  uint32_t m_tConnIncrPerUe;
133  uint32_t m_delayConnEnd;
134  uint32_t m_delayDiscStart;
135  uint32_t m_delayDiscEnd;
139 
141  std::map<uint64_t, bool> m_isConnectionEstablished;
142 };
143 
144 
145 std::string
147  uint32_t nBearers,
148  uint32_t tConnBase,
149  uint32_t tConnIncrPerUe,
150  uint32_t delayDiscStart,
151  bool useIdealRrc,
152  bool admitRrcConnectionRequest,
153  std::string description)
154 {
155  std::ostringstream oss;
156  oss << "nUes=" << nUes
157  << ", nBearers=" << nBearers
158  << ", tConnBase=" << tConnBase
159  << ", tConnIncrPerUe=" << tConnIncrPerUe
160  << ", delayDiscStart=" << delayDiscStart;
161 
162  if (useIdealRrc)
163  {
164  oss << ", ideal RRC";
165  }
166  else
167  {
168  oss << ", real RRC";
169  }
170 
171  if (admitRrcConnectionRequest)
172  {
173  oss << ", admitRrcConnectionRequest = true";
174  }
175  else
176  {
177  oss << ", admitRrcConnectionRequest = false";
178  }
179 
180  if (!description.empty ())
181  {
182  oss << ", " << description;
183  }
184 
185  return oss.str ();
186 }
187 
189  uint32_t nUes, uint32_t nBearers,
190  uint32_t tConnBase, uint32_t tConnIncrPerUe, uint32_t delayDiscStart,
191  bool errorExpected, bool useIdealRrc, bool admitRrcConnectionRequest,
192  std::string description)
193  : TestCase (BuildNameString (nUes, nBearers,
194  tConnBase, tConnIncrPerUe, delayDiscStart,
195  useIdealRrc, admitRrcConnectionRequest,
196  description)),
197  m_nUes (nUes),
198  m_nBearers (nBearers),
199  m_tConnBase (tConnBase),
200  m_tConnIncrPerUe (tConnIncrPerUe),
201 
202  m_delayDiscStart (delayDiscStart),
203  m_delayDiscEnd (10),
204  m_useIdealRrc (useIdealRrc),
205  m_admitRrcConnectionRequest (admitRrcConnectionRequest)
206 {
207  NS_LOG_FUNCTION (this << GetName ());
208 
209  // see the description of d^e in the LTE testing docs
210  double dsi = 90;
211  double nRaAttempts = 0;
212  if (nUes <= 20)
213  {
214  nRaAttempts += 5;
215  }
216  else
217  {
218  NS_ASSERT (nUes <= 50);
219  nRaAttempts += 10;
220  }
221 
222  nRaAttempts += std::ceil (nUes / 4.0);
223  double dra = nRaAttempts * 7;
224  double dce = 10.0 + (2.0 * nUes) / 4.0;
225  if (errorExpected)
226  {
227  /*
228  * If transmission error happens, the UE has to repeat again from
229  * acquiring system information.
230  */
231  dce += dsi + dce;
232  }
233  double nCrs;
234  if (nUes <= 2)
235  {
236  nCrs = 0;
237  }
238  else if (nUes <= 5)
239  {
240  nCrs = 1;
241  }
242  else if (nUes <= 10)
243  {
244  nCrs = 2;
245  }
246  else if (nUes <= 20)
247  {
248  nCrs = 3;
249  }
250  else
251  {
252  nCrs = 4;
253  }
254  double dcr = (10.0 + (2.0 * nUes) / 4.0) * (m_nBearers + nCrs);
255 
256  m_delayConnEnd = round (dsi + dra + dce + dcr);
257  NS_LOG_LOGIC (this << " " << GetName () << " dsi=" << dsi << " dra=" << dra << " dce=" << dce << " dcr=" << dcr << " m_delayConnEnd=" << m_delayConnEnd);
258 }
259 
260 void
262 {
263  NS_LOG_FUNCTION (this << GetName ());
264  Config::Reset ();
265 
266  if (m_nUes < 25)
267  {
268  Config::SetDefault ("ns3::LteEnbRrc::SrsPeriodicity", UintegerValue (40));
269  }
270  else if (m_nUes < 60)
271  {
272  Config::SetDefault ("ns3::LteEnbRrc::SrsPeriodicity", UintegerValue (80));
273  }
274  else if (m_nUes < 120)
275  {
276  Config::SetDefault ("ns3::LteEnbRrc::SrsPeriodicity", UintegerValue (160));
277  }
278  else
279  {
280  Config::SetDefault ("ns3::LteEnbRrc::SrsPeriodicity", UintegerValue (320));
281  }
282 
283  // normal code
284  m_lteHelper = CreateObject<LteHelper> ();
286 
287  NodeContainer enbNodes;
288  NodeContainer ueNodes;
289 
290 
291  enbNodes.Create (1);
292  ueNodes.Create (m_nUes);
293 
294  // the following positions all nodes at (0, 0, 0)
296  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
297  mobility.Install (enbNodes);
298  mobility.Install (ueNodes);
299 
300  int64_t stream = 1;
301  NetDeviceContainer enbDevs;
302  enbDevs = m_lteHelper->InstallEnbDevice (enbNodes);
303  stream += m_lteHelper->AssignStreams (enbDevs, stream);
304 
305  NetDeviceContainer ueDevs;
306  ueDevs = m_lteHelper->InstallUeDevice (ueNodes);
307  stream += m_lteHelper->AssignStreams (ueDevs, stream);
308 
309  // custom code used for testing purposes
310  // instead of lteHelper->Attach () and lteHelper->ActivateXxx
311 
312  // Set AdmitConnectionRequest attribute
313  for (NetDeviceContainer::Iterator it = enbDevs.Begin ();
314  it != enbDevs.End ();
315  ++it)
316  {
317  Ptr<LteEnbRrc> enbRrc = (*it)->GetObject<LteEnbNetDevice> ()->GetRrc ();
318  enbRrc->SetAttribute ("AdmitRrcConnectionRequest",
320  }
321 
322 
323  uint32_t i = 0;
324  uint32_t tmax = 0;
325  for (NetDeviceContainer::Iterator it = ueDevs.Begin (); it != ueDevs.End (); ++it)
326  {
327  Ptr<NetDevice> ueDevice = *it;
328  Ptr<NetDevice> enbDevice = enbDevs.Get (0);
329  Ptr<LteUeNetDevice> ueLteDevice = ueDevice->GetObject<LteUeNetDevice> ();
330 
331  uint32_t tc = m_tConnBase + m_tConnIncrPerUe * i; // time connection start
332  uint32_t tcc = tc + m_delayConnEnd; // time check connection completed;
333  uint32_t td = tcc + m_delayDiscStart; // time disconnect start
334  uint32_t tcd = td + m_delayDiscEnd; // time check disconnection completed
335  tmax = std::max (tmax, tcd);
336 
337  // trick to resolve overloading
338  //void (LteHelper::* overloadedAttachFunctionPointer) (Ptr<NetDevice>, Ptr<NetDevice>) = &LteHelper::Attach;
339  //Simulator::Schedule (MilliSeconds (tc), overloadedAttachFunctionPointer, lteHelper, *it, enbDevice);
340  Simulator::Schedule (MilliSeconds (tc), &LteRrcConnectionEstablishmentTestCase::Connect, this, ueDevice, enbDevice);
341 
342  Simulator::Schedule (MilliSeconds (tcc), &LteRrcConnectionEstablishmentTestCase::CheckConnected, this, *it, enbDevice);
343 
344  // disconnection not supported yet
345 
346  uint64_t imsi = ueLteDevice->GetImsi ();
347  m_isConnectionEstablished[imsi] = false;
348 
349  ++i;
350  }
351 
352  // Connect to trace sources in UEs
353  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/ConnectionEstablished",
355  this));
356  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/ConnectionTimeout",
358  this));
359 
360  Simulator::Stop (MilliSeconds (tmax + 1));
361 
362  Simulator::Run ();
363 
364  Simulator::Destroy ();
365 
366 }
367 
368 void
370 {
371  NS_LOG_FUNCTION (this);
372  m_lteHelper->Attach (ueDevice, enbDevice);
373 
374  for (uint32_t b = 0; b < m_nBearers; ++b)
375  {
376  enum EpsBearer::Qci q = EpsBearer::NGBR_VIDEO_TCP_DEFAULT;
377  EpsBearer bearer (q);
378  m_lteHelper->ActivateDataRadioBearer (ueDevice, bearer);
379  }
380 }
381 
382 void
384 {
385  Ptr<LteUeNetDevice> ueLteDevice = ueDevice->GetObject<LteUeNetDevice> ();
386  Ptr<LteUeRrc> ueRrc = ueLteDevice->GetRrc ();
387  const uint64_t imsi = ueLteDevice->GetImsi ();
388  const uint16_t rnti = ueRrc->GetRnti ();
389  NS_LOG_FUNCTION (this << imsi << rnti);
391  "Invalid IMSI " << imsi);
392 
394  {
396  "Connection with RNTI " << rnti << " should have been rejected");
397  return;
398  }
399 
400  /*
401  * Verifying UE state in UE RRC. Try to increase the test case duration if
402  * the following checks.
403  */
405  "RNTI " << rnti << " fails to establish connection");
406  NS_TEST_ASSERT_MSG_EQ (ueRrc->GetState (), LteUeRrc::CONNECTED_NORMALLY,
407  "RNTI " << rnti << " is not at CONNECTED_NORMALLY state");
408 
409  // Verifying UE context state in eNodeB RRC.
410 
411  Ptr<LteEnbNetDevice> enbLteDevice = enbDevice->GetObject<LteEnbNetDevice> ();
412  Ptr<LteEnbRrc> enbRrc = enbLteDevice->GetRrc ();
413  const bool hasContext = enbRrc->HasUeManager (rnti);
414 
415  if (hasContext)
416  {
417  Ptr<UeManager> ueManager = enbRrc->GetUeManager (rnti);
418  NS_ASSERT (ueManager != 0);
419  NS_TEST_ASSERT_MSG_EQ (ueManager->GetState (),
420  UeManager::CONNECTED_NORMALLY,
421  "The context of RNTI " << rnti << " is in invalid state");
422  }
423  else
424  {
425  NS_LOG_WARN (this << " RNTI " << rnti << " thinks that it has"
426  << " established connection but the eNodeB thinks"
427  << " that the UE has failed on connection setup.");
428  /*
429  * The standard specifies that this case would exceed the maximum
430  * retransmission limit at UE RLC (SRB1), which will then trigger an RLF.
431  * However, this behaviour is not implemented yet.
432  */
433  }
434 
435  // Verifying other attributes on both sides.
436 
437  uint16_t ueCellId = ueRrc->GetCellId ();
438  uint16_t enbCellId = enbLteDevice->GetCellId ();
439  uint16_t ueImsi = ueLteDevice->GetImsi ();
440 
441  uint8_t ueDlBandwidth = ueRrc->GetDlBandwidth ();
442  uint8_t enbDlBandwidth = enbLteDevice->GetDlBandwidth ();
443  uint8_t ueUlBandwidth = ueRrc->GetUlBandwidth ();
444  uint8_t enbUlBandwidth = enbLteDevice->GetUlBandwidth ();
445  uint8_t ueDlEarfcn = ueRrc->GetDlEarfcn ();
446  uint8_t enbDlEarfcn = enbLteDevice->GetDlEarfcn ();
447  uint8_t ueUlEarfcn = ueRrc->GetUlEarfcn ();
448  uint8_t enbUlEarfcn = enbLteDevice->GetUlEarfcn ();
449 
450  NS_TEST_ASSERT_MSG_EQ (ueCellId, enbCellId, "inconsistent CellId");
451  NS_TEST_ASSERT_MSG_EQ (ueDlBandwidth, enbDlBandwidth, "inconsistent DlBandwidth");
452  NS_TEST_ASSERT_MSG_EQ (ueUlBandwidth, enbUlBandwidth, "inconsistent UlBandwidth");
453  NS_TEST_ASSERT_MSG_EQ (ueDlEarfcn, enbDlEarfcn, "inconsistent DlEarfcn");
454  NS_TEST_ASSERT_MSG_EQ (ueUlEarfcn, enbUlEarfcn, "inconsistent UlEarfcn");
455 
456  if (hasContext)
457  {
458  Ptr<UeManager> ueManager = enbRrc->GetUeManager (rnti);
459  NS_ASSERT (ueManager != 0);
460  UeManager::State state = ueManager->GetState ();
461  uint16_t enbImsi = ueManager->GetImsi ();
462  NS_TEST_ASSERT_MSG_EQ (ueImsi, enbImsi, "inconsistent Imsi");
463 
464  if (state == UeManager::CONNECTED_NORMALLY)
465  {
466  ObjectMapValue enbDataRadioBearerMapValue;
467  ueManager->GetAttribute ("DataRadioBearerMap", enbDataRadioBearerMapValue);
468  NS_TEST_ASSERT_MSG_EQ (enbDataRadioBearerMapValue.GetN (), m_nBearers, "wrong num bearers at eNB");
469  ObjectMapValue ueDataRadioBearerMapValue;
470  ueRrc->GetAttribute ("DataRadioBearerMap", ueDataRadioBearerMapValue);
471  NS_TEST_ASSERT_MSG_EQ (ueDataRadioBearerMapValue.GetN (), m_nBearers, "wrong num bearers at UE");
472 
473  ObjectMapValue::Iterator enbBearerIt = enbDataRadioBearerMapValue.Begin ();
474  ObjectMapValue::Iterator ueBearerIt = ueDataRadioBearerMapValue.Begin ();
475  while (enbBearerIt != enbDataRadioBearerMapValue.End ()
476  && ueBearerIt != ueDataRadioBearerMapValue.End ())
477  {
478  Ptr<LteDataRadioBearerInfo> enbDrbInfo = enbBearerIt->second->GetObject<LteDataRadioBearerInfo> ();
479  Ptr<LteDataRadioBearerInfo> ueDrbInfo = ueBearerIt->second->GetObject<LteDataRadioBearerInfo> ();
480  //NS_TEST_ASSERT_MSG_EQ (enbDrbInfo->m_epsBearer, ueDrbInfo->m_epsBearer, "epsBearer differs");
481  NS_TEST_ASSERT_MSG_EQ ((uint32_t) enbDrbInfo->m_epsBearerIdentity, (uint32_t) ueDrbInfo->m_epsBearerIdentity, "epsBearerIdentity differs");
482  NS_TEST_ASSERT_MSG_EQ ((uint32_t) enbDrbInfo->m_drbIdentity, (uint32_t) ueDrbInfo->m_drbIdentity, "drbIdentity differs");
483  //NS_TEST_ASSERT_MSG_EQ (enbDrbInfo->m_rlcConfig, ueDrbInfo->m_rlcConfig, "rlcConfig differs");
484  NS_TEST_ASSERT_MSG_EQ ((uint32_t) enbDrbInfo->m_logicalChannelIdentity, (uint32_t) ueDrbInfo->m_logicalChannelIdentity, "logicalChannelIdentity differs");
485  //NS_TEST_ASSERT_MSG_EQ (enbDrbInfo->m_logicalChannelConfig, ueDrbInfo->m_logicalChannelConfig, "logicalChannelConfig differs");
486 
487  ++enbBearerIt;
488  ++ueBearerIt;
489  }
490 
491  NS_ASSERT_MSG (enbBearerIt == enbDataRadioBearerMapValue.End (), "too many bearers at eNB");
492  NS_ASSERT_MSG (ueBearerIt == ueDataRadioBearerMapValue.End (), "too many bearers at UE");
493  }
494  }
495 }
496 
497 void
499 {
500  Ptr<LteUeNetDevice> ueLteDevice = ueDevice->GetObject<LteUeNetDevice> ();
501  Ptr<LteUeRrc> ueRrc = ueLteDevice->GetRrc ();
502  const uint64_t imsi = ueLteDevice->GetImsi ();
503  const uint16_t rnti = ueRrc->GetRnti ();
504  NS_LOG_FUNCTION (this << imsi << rnti);
506  "Invalid IMSI " << imsi);
507 
508  bool ueStateIsConnectedNormally = (LteUeRrc::CONNECTED_NORMALLY == ueRrc->GetState ());
509 
510  Ptr<LteEnbNetDevice> enbLteDevice = enbDevice->GetObject<LteEnbNetDevice> ();
511  Ptr<LteEnbRrc> enbRrc = enbLteDevice->GetRrc ();
512  const bool hasContext = enbRrc->HasUeManager (rnti);
513  bool contextStateIsConnectedNormally = false;
514  if (hasContext)
515  {
516  Ptr<UeManager> ueManager = enbRrc->GetUeManager (rnti);
517  NS_ASSERT (ueManager != 0);
518  contextStateIsConnectedNormally = (UeManager::CONNECTED_NORMALLY == ueManager->GetState ());
519  }
521  || !ueStateIsConnectedNormally
522  || !hasContext
523  || !contextStateIsConnectedNormally),
524  true,
525  "it should not happen that connection is completed both at the UE and at the eNB side");
526 }
527 
528 void
530  std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
531 {
532  NS_LOG_FUNCTION (this << imsi << cellId);
533  m_isConnectionEstablished[imsi] = true;
534 }
535 
536 
537 void
539  std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti,
540  uint8_t connEstFailCount)
541 {
542  NS_LOG_FUNCTION (this << imsi << cellId);
543 }
544 
545 
546 
555 {
556 public:
565  std::string description = "");
566 protected:
567  virtual void DoRun (void);
568 
569 private:
571  void JumpAway ();
573  void JumpBack ();
574 
577 };
578 
579 
581  Time jumpAwayTime, std::string description)
582  : LteRrcConnectionEstablishmentTestCase (1, 1, 0, 0, 1, true, false, true,
583  description),
584  m_jumpAwayTime (jumpAwayTime)
585 {
586  NS_LOG_FUNCTION (this << GetName ());
587 }
588 
589 
590 void
592 {
593  NS_LOG_FUNCTION (this << GetName ());
594  Config::Reset ();
595 
596  if (m_nUes < 25)
597  {
598  Config::SetDefault ("ns3::LteEnbRrc::SrsPeriodicity", UintegerValue (40));
599  }
600  else if (m_nUes < 60)
601  {
602  Config::SetDefault ("ns3::LteEnbRrc::SrsPeriodicity", UintegerValue (80));
603  }
604  else if (m_nUes < 120)
605  {
606  Config::SetDefault ("ns3::LteEnbRrc::SrsPeriodicity", UintegerValue (160));
607  }
608  else
609  {
610  Config::SetDefault ("ns3::LteEnbRrc::SrsPeriodicity", UintegerValue (320));
611  }
612 
613  // normal code
614  m_lteHelper = CreateObject<LteHelper> ();
616 
617  NodeContainer enbNodes;
618  NodeContainer ueNodes;
619 
620 
621  enbNodes.Create (4);
622  ueNodes.Create (1);
623 
625  mobility.Install (ueNodes); // UE position at (0, 0, 0)
626  m_ueMobility = ueNodes.Get (0)->GetObject<MobilityModel> ();
627 
628  Ptr<ListPositionAllocator> enbPosition = CreateObject<ListPositionAllocator> ();
629  enbPosition->Add (Vector (0, 0, 0));
630  enbPosition->Add (Vector (100.0, 0, 0));
631  enbPosition->Add (Vector (0, 100.0, 0));
632  enbPosition->Add (Vector (100.0, 100.0, 0));
633  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
634  mobility.SetPositionAllocator (enbPosition);
635  mobility.Install (enbNodes);
636 
637  int64_t stream = 1;
638  NetDeviceContainer enbDevs;
639  enbDevs = m_lteHelper->InstallEnbDevice (enbNodes);
640  stream += m_lteHelper->AssignStreams (enbDevs, stream);
641 
642  NetDeviceContainer ueDevs;
643  ueDevs = m_lteHelper->InstallUeDevice (ueNodes);
644  stream += m_lteHelper->AssignStreams (ueDevs, stream);
645 
646  // custom code used for testing purposes
647  // instead of lteHelper->Attach () and lteHelper->ActivateXxx
648 
649  // Set AdmitConnectionRequest attribute
650  for (NetDeviceContainer::Iterator it = enbDevs.Begin ();
651  it != enbDevs.End ();
652  ++it)
653  {
654  Ptr<LteEnbRrc> enbRrc = (*it)->GetObject<LteEnbNetDevice> ()->GetRrc ();
655  enbRrc->SetAttribute ("AdmitRrcConnectionRequest",
657  }
658 
659 
660  uint32_t i = 0;
661  uint32_t tmax = 0;
662  for (NetDeviceContainer::Iterator it = ueDevs.Begin (); it != ueDevs.End (); ++it)
663  {
664  Ptr<NetDevice> ueDevice = *it;
665  Ptr<NetDevice> enbDevice = enbDevs.Get (0);
666  Ptr<LteUeNetDevice> ueLteDevice = ueDevice->GetObject<LteUeNetDevice> ();
667 
668  uint32_t tc = m_tConnBase + m_tConnIncrPerUe * i; // time connection start
669  uint32_t tcc = tc + m_delayConnEnd; // time check connection completed;
670  uint32_t td = tcc + m_delayDiscStart; // time disconnect start
671  uint32_t tcd = td + m_delayDiscEnd; // time check disconnection completed
672  tmax = std::max (tmax, tcd);
673 
674  // trick to resolve overloading
675  //void (LteHelper::* overloadedAttachFunctionPointer) (Ptr<NetDevice>, Ptr<NetDevice>) = &LteHelper::Attach;
676  //Simulator::Schedule (MilliSeconds (tc), overloadedAttachFunctionPointer, lteHelper, *it, enbDevice);
677  Simulator::Schedule (MilliSeconds (tc), &LteRrcConnectionEstablishmentErrorTestCase::Connect, this, ueDevice, enbDevice);
678 
679  // disconnection not supported yet
680 
681  uint64_t imsi = ueLteDevice->GetImsi ();
682  m_isConnectionEstablished[imsi] = false;
683 
684  ++i;
685  }
686 
687  // Connect to trace sources in UEs
688  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/ConnectionEstablished",
690  this));
691  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/ConnectionTimeout",
693  this));
694 
695 
696  Simulator::Schedule (m_jumpAwayTime,
698  this);
699  Simulator::Schedule (m_jumpAwayTime + MilliSeconds (99),
701  this, ueDevs.Get (0), enbDevs.Get (0));
702  Simulator::Schedule (m_jumpAwayTime + MilliSeconds (100),
704  this);
705 
706  Simulator::Stop (MilliSeconds (tmax + 1));
707 
708  Simulator::Run ();
709 
710  Simulator::Destroy ();
711 
712 }
713 
714 
715 void
717 {
718  NS_LOG_FUNCTION (this);
719  // move to a really far away location so that transmission errors occur
720  m_ueMobility->SetPosition (Vector (100000.0, 100000.0, 0.0));
721 }
722 
723 
724 void
726 {
727  NS_LOG_FUNCTION (this);
728  m_ueMobility->SetPosition (Vector (0.0, 0.0, 0.0));
729 }
730 
731 
739 {
740 public:
741  LteRrcTestSuite ();
742 };
743 
744 
746  : TestSuite ("lte-rrc", SYSTEM)
747 {
748 // LogComponentEnableAll (LOG_PREFIX_ALL);
749 // LogComponentEnable ("LteRrcTest", LOG_LEVEL_ALL);
750 // LogComponentEnable ("LteEnbRrc", LOG_INFO);
751 // LogComponentEnable ("LteUeRrc", LOG_INFO);
752 
753  NS_LOG_FUNCTION (this);
754 
755  for (uint32_t useIdealRrc = 0; useIdealRrc <= 1; ++useIdealRrc)
756  {
757  // <----- all times in ms ----------------->
758 
759  // nUes tConnBase delayDiscStart useIdealRrc
760  // nBearers tConnIncrPerUe errorExpected admitRrcConnectionRequest
761  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 0, 0, 0, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
762  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 0, 100, 0, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
763  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 1, 0, 0, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
764  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 1, 100, 0, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
765  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 2, 0, 0, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
766  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 2, 100, 0, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
767  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 0, 20, 0, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
768  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 0, 20, 10, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
769  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 0, 20, 100, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
770  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 1, 20, 0, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
771  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 1, 20, 10, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
772  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 1, 20, 100, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
773  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 2, 20, 0, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
774  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 2, 20, 10, 1, false, useIdealRrc, true), TestCase::QUICK);
775  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 2, 20, 100, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
776  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 3, 0, 20, 0, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
777  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 4, 0, 20, 0, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
778  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 4, 0, 20, 300, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
779  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 20, 0, 10, 1, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
780  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 50, 0, 0, 0, 1, false, useIdealRrc, true), TestCase::EXTENSIVE);
781 
782  // Test cases to check admitRrcConnectionRequest=false
783  // nUes tConnBase delayDiscStart useIdealRrc
784  // nBearers tConnIncrPerUe errorExpected admitRrcConnectionRequest
785  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 0, 0, 0, 1, false, useIdealRrc, false), TestCase::EXTENSIVE);
786  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 1, 2, 100, 0, 1, false, useIdealRrc, false), TestCase::EXTENSIVE);
787  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 0, 20, 0, 1, false, useIdealRrc, false), TestCase::EXTENSIVE);
788  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 2, 1, 20, 0, 1, false, useIdealRrc, false), TestCase::QUICK);
789  AddTestCase (new LteRrcConnectionEstablishmentTestCase ( 3, 0, 20, 0, 1, false, useIdealRrc, false), TestCase::EXTENSIVE);
790  }
791 
792  // Test cases with transmission error
794  Seconds (0.020214),
795  "failure at RRC Connection Request"),
796  TestCase::QUICK);
798  Seconds (0.025),
799  "failure at RRC Connection Setup"),
800  TestCase::QUICK);
801  /*
802  * With RLF implementation we now do support the Idle mode,
803  * thus it solve Bug 1762 Comment #25.
804  */
806  Seconds (0.030),
807  "failure at RRC Connection Setup Complete"),
808  TestCase::QUICK);
809 
810 }
811 
#define max(a, b)
Definition: 80211b.c:43
Lte Rrc Connection Establishment Error Test Case.
LteRrcConnectionEstablishmentErrorTestCase(Time jumpAwayTime, std::string description="")
virtual void DoRun(void)
Implementation to actually run this TestCase.
Ptr< MobilityModel > m_ueMobility
UE mobility model.
Test rrc connection establishment.
Definition: test-lte-rrc.cc:40
static std::string BuildNameString(uint32_t nUes, uint32_t nBearers, uint32_t tConnBase, uint32_t tConnIncrPerUe, uint32_t delayDiscStart, bool useIdealRrc, bool admitRrcConnectionRequest, std::string description="")
Build name string function.
std::map< uint64_t, bool > m_isConnectionEstablished
key: IMSI
void CheckNotConnected(Ptr< NetDevice > ueDevice, Ptr< NetDevice > enbDevice)
Check not connected function.
LteRrcConnectionEstablishmentTestCase(uint32_t nUes, uint32_t nBearers, uint32_t tConnBase, uint32_t tConnIncrPerUe, uint32_t delayDiscStart, bool errorExpected, bool useIdealRrc, bool admitRrcConnectionRequest, std::string description="")
virtual void DoRun(void)
Implementation to actually run this TestCase.
bool m_admitRrcConnectionRequest
If set to false, eNb will not allow UE connections.
void ConnectionEstablishedCallback(std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
Connection established callback function.
uint32_t m_nUes
number of UEs in the test
Definition: test-lte-rrc.cc:68
void CheckConnected(Ptr< NetDevice > ueDevice, Ptr< NetDevice > enbDevice)
Check connected function.
bool m_useIdealRrc
If set to false, real RRC protocol model will be used.
uint32_t m_delayConnEnd
expected duration to perform connection establishment in ms
uint32_t m_tConnBase
connection time base value for all UEs in ms
Ptr< LteHelper > m_lteHelper
LTE helper.
void ConnectionTimeoutCallback(std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti, uint8_t connEstFailCount)
Connection timeout callback function.
uint32_t m_delayDiscStart
delay between connection completed and disconnection request in ms
uint32_t m_tConnIncrPerUe
additional connection time increment for each UE index (0...nUes-1) in ms
void Connect(Ptr< NetDevice > ueDevice, Ptr< NetDevice > enbDevice)
Connect function.
uint32_t m_delayDiscEnd
expected duration to complete disconnection in ms
uint32_t m_nBearers
number of bearers to be setup in each connection
Lte Rrc Test Suite.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:92
Qci
QoS Class Indicator.
Definition: eps-bearer.h:107
store information on active data radio bearer instance
The eNodeB device implementation.
uint16_t GetDlBandwidth() const
uint32_t GetUlEarfcn() const
uint32_t GetDlEarfcn() const
Ptr< LteEnbRrc > GetRrc() const
uint16_t GetUlBandwidth() const
uint16_t GetCellId() const
NetDeviceContainer InstallEnbDevice(NodeContainer c)
Create a set of eNodeB devices.
Definition: lte-helper.cc:474
void Attach(NetDeviceContainer ueDevices)
Enables automatic attachment of a set of UE devices to a suitable cell using Idle mode initial cell s...
Definition: lte-helper.cc:959
void ActivateDataRadioBearer(NetDeviceContainer ueDevices, EpsBearer bearer)
Activate a Data Radio Bearer on a given UE devices (for LTE-only simulation).
Definition: lte-helper.cc:1313
NetDeviceContainer InstallUeDevice(NodeContainer c)
Create a set of UE devices.
Definition: lte-helper.cc:489
int64_t AssignStreams(NetDeviceContainer c, int64_t stream)
Assign a fixed random variable stream number to the random variables used.
Definition: lte-helper.cc:1443
The LteUeNetDevice class implements the UE net device.
Helper class used to assign positions and mobility models to nodes.
Keep track of the current position and velocity of an object.
void SetPosition(const Vector &position)
holds a vector of ns3::NetDevice pointers
Iterator End(void) const
Get an iterator which indicates past-the-last NetDevice in the container.
std::vector< Ptr< NetDevice > >::const_iterator Iterator
NetDevice container iterator.
Iterator Begin(void) const
Get an iterator which refers to the first NetDevice in the container.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:256
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
Container for a set of ns3::Object pointers.
std::size_t GetN(void) const
Get the number of Objects.
Iterator Begin(void) const
Get an iterator to the first Object.
std::map< std::size_t, Ptr< Object > >::const_iterator Iterator
Iterator type for traversing this container.
Iterator End(void) const
Get an iterator to the past-the-end Object.
encapsulates test code
Definition: test.h:994
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
std::string GetName(void) const
Definition: test.cc:370
A suite of tests to run.
Definition: test.h:1188
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
State
The state of the UeManager at the eNB RRC.
Definition: lte-enb-rrc.h:87
Hold an unsigned integer type.
Definition: uinteger.h:44
#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
void Reset(void)
Reset the initial value of every attribute as well as the value of every global to what they were bef...
Definition: config.cc:820
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:849
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:920
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#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_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Definition: log.h:265
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Definition: test.h:141
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
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.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1648
mobility
Definition: third.py:108
static LteRrcTestSuite g_lteRrcTestSuiteInstance