25 #include <ns3/nstime.h> 
   26 #include <ns3/callback.h> 
   27 #include <ns3/config.h> 
   28 #include <ns3/boolean.h> 
   29 #include <ns3/simulator.h> 
   31 #include <ns3/node-container.h> 
   32 #include <ns3/net-device-container.h> 
   33 #include <ns3/ipv4-interface-container.h> 
   35 #include <ns3/lte-helper.h> 
   36 #include <ns3/point-to-point-epc-helper.h> 
   37 #include <ns3/internet-stack-helper.h> 
   38 #include <ns3/point-to-point-helper.h> 
   39 #include <ns3/ipv4-address-helper.h> 
   40 #include <ns3/ipv4-static-routing-helper.h> 
   41 #include <ns3/mobility-helper.h> 
   43 #include <ns3/data-rate.h> 
   44 #include <ns3/ipv4-static-routing.h> 
   45 #include <ns3/position-allocator.h> 
   72       Time delayThreshold, 
Time simulationDuration)
 
   73       : 
TestCase (
"Verifying that the time needed for handover is under a specified threshold"),
 
   74         m_numberOfComponentCarriers (numberOfComponentCarriers),
 
   75         m_useIdealRrc (useIdealRrc),
 
   76         m_handoverTime (handoverTime),
 
   77         m_delayThreshold (delayThreshold),
 
   78         m_simulationDuration (simulationDuration),
 
   79         m_ueHandoverStart (
Seconds (0)),
 
   80         m_enbHandoverStart (
Seconds (0))
 
   84   virtual void DoRun (
void);
 
   94   void UeHandoverStartCallback (std::string context, uint64_t imsi,
 
   95       uint16_t cellid, uint16_t rnti, uint16_t targetCellId);
 
  103   void UeHandoverEndOkCallback (std::string context, uint64_t imsi,
 
  104       uint16_t cellid, uint16_t rnti);
 
  113   void EnbHandoverStartCallback (std::string context, uint64_t imsi,
 
  114       uint16_t cellid, uint16_t rnti, uint16_t targetCellId);
 
  122   void EnbHandoverEndOkCallback (std::string context, uint64_t imsi,
 
  123       uint16_t cellid, uint16_t rnti);
 
  139   NS_LOG_INFO (
"-----test case: ideal RRC = " << m_useIdealRrc
 
  140       << 
" handover time = " << m_handoverTime.GetSeconds () << 
"-----");
 
  145   auto epcHelper = CreateObject<PointToPointEpcHelper> ();
 
  147   auto lteHelper = CreateObject<LteHelper> ();
 
  148   lteHelper->SetEpcHelper (epcHelper);
 
  149   lteHelper->SetAttribute (
"UseIdealRrc", 
BooleanValue (m_useIdealRrc));
 
  150   lteHelper->SetAttribute (
"NumberOfComponentCarriers", 
UintegerValue (m_numberOfComponentCarriers));
 
  152   auto ccHelper = CreateObject<CcHelper> ();
 
  153   ccHelper->SetUlEarfcn (100 + 18000);
 
  154   ccHelper->SetDlEarfcn (100);
 
  155   ccHelper->SetUlBandwidth (25);
 
  156   ccHelper->SetDlBandwidth (25);
 
  157   ccHelper->SetNumberOfComponentCarriers (m_numberOfComponentCarriers);
 
  170   auto ueNode = CreateObject<Node> ();
 
  173   auto posAlloc = CreateObject<ListPositionAllocator> ();
 
  174   posAlloc->Add (Vector (0, 0, 0));
 
  175   posAlloc->Add (Vector (1000, 0, 0));
 
  176   posAlloc->Add (Vector (500, 0, 0));
 
  181   mobilityHelper.
Install (enbNodes);
 
  182   mobilityHelper.
Install (ueNode);
 
  187   auto enbDevs = lteHelper->InstallEnbDevice (enbNodes);
 
  188   auto ueDev = lteHelper->InstallUeDevice (ueNode).Get (0);
 
  194   inetStackHelper.
Install (ueNode);
 
  196   ueIfs = epcHelper->AssignUeIpv4Address (ueDev);
 
  210   lteHelper->AddX2Interface (enbNodes);
 
  211   lteHelper->Attach (ueDev, enbDevs.Get(0));
 
  212   lteHelper->HandoverRequest (m_handoverTime, ueDev, enbDevs.Get (0), enbDevs.Get (1));
 
  224     uint64_t imsi, uint16_t cellid, uint16_t rnti, uint16_t targetCellId)
 
  232     uint64_t imsi, uint16_t cellid, uint16_t rnti)
 
  239       "UE handover delay is higher than the allowed threshold " 
  240       << 
"(ideal RRC = " << m_useIdealRrc
 
  241       << 
" handover time = " << m_handoverTime.GetSeconds () << 
")");
 
  247     uint64_t imsi, uint16_t cellid, uint16_t rnti, uint16_t targetCellId)
 
  255     uint64_t imsi, uint16_t cellid, uint16_t rnti)
 
  262       "eNodeB handover delay is higher than the allowed threshold " 
  263       << 
"(ideal RRC = " << m_useIdealRrc
 
  264       << 
" handover time = " << m_handoverTime.GetSeconds () << 
")");
 
  289         handoverTime += 
Seconds (0.001))
 
  299     for (
Time handoverTime = Seconds (0.100); handoverTime < 
Seconds (0.110);
 
  300         handoverTime += 
Seconds (0.001))
 
Simulation virtual time values and global simulation resolution. 
 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
 
AttributeValue implementation for Boolean. 
 
holds a vector of std::pair of Ptr and interface index. 
 
Lte Handover Delay Test Suite. 
 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
 
static void Run(void)
Run the simulation. 
 
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
 
void EnbHandoverStartCallback(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti, uint16_t targetCellId)
ENB handover start callback function. 
 
aggregate IP/TCP/UDP functionality to existing Nodes. 
 
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO. 
 
bool m_useIdealRrc
use ideal RRC? 
 
void EnbHandoverEndOkCallback(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
ENB handover end OK callback function. 
 
double GetSeconds(void) const 
Get an approximation of the time stored in this instance in the indicated unit. 
 
void Install(Ptr< Node > node) const 
"Layout" a single node according to the current position allocator type. 
 
LteHandoverDelayTestSuite g_lteHandoverDelayTestSuite
the test suite 
 
Hold an unsigned integer type. 
 
Time m_handoverTime
handover time 
 
virtual void DoRun(void)
Implementation to actually run this TestCase. 
 
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
 
Time m_enbHandoverStart
ENB handover start time. 
 
LteHandoverDelayTestSuite()
 
void Connect(std::string path, const CallbackBase &cb)
 
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy(). 
 
Verifying that the time needed for handover is under a specified threshold. 
 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
 
keep track of a set of node pointers. 
 
void SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
 
void Install(std::string nodeName) const 
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
 
static Time Now(void)
Return the current simulation virtual time. 
 
Time m_delayThreshold
the delay threshold 
 
Helper class used to assign positions and mobility models to nodes. 
 
static void Stop(void)
Tell the Simulator the calling event should be the last one executed. 
 
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG. 
 
Time Seconds(double value)
Construct a Time in the indicated unit. 
 
Time m_ueHandoverStart
UE handover start time. 
 
void UeHandoverStartCallback(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti, uint16_t targetCellId)
UE handover start callback function. 
 
void UeHandoverEndOkCallback(std::string context, uint64_t imsi, uint16_t cellid, uint16_t rnti)
UE handover end OK callback function. 
 
Time m_simulationDuration
the simulation duration 
 
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer. 
 
uint8_t m_numberOfComponentCarriers
 
LteHandoverDelayTestCase(uint8_t numberOfComponentCarriers, bool useIdealRrc, Time handoverTime, Time delayThreshold, Time simulationDuration)
Constructor. 
 
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
 
#define NS_TEST_ASSERT_MSG_LT(actual, limit, msg)
Test that an actual value is less than a limit and report and abort if not.