src/lte/helper/rlc-stats-calculator.cc
changeset 8160 3acc5e72aa88
parent 8149 810e24692db8
child 8169 228e49cdbb11
--- a/src/lte/helper/rlc-stats-calculator.cc	Thu Jun 23 11:31:44 2011 +0200
+++ b/src/lte/helper/rlc-stats-calculator.cc	Mon Jun 27 14:28:58 2011 +0200
@@ -40,16 +40,16 @@
 bool
 operator == (const ImsiLcidPair &a, const ImsiLcidPair &b)
 {
-  return ( (a.m_imsi == b.m_imsi) && (a.m_lcId == b.m_lcId) );
+  return ((a.m_imsi == b.m_imsi) && (a.m_lcId == b.m_lcId));
 }
 
 bool
 operator < (const ImsiLcidPair& a, const ImsiLcidPair& b)
 {
-  return ( (a.m_imsi < b.m_imsi) || ( (a.m_imsi == b.m_imsi) && (a.m_lcId < b.m_lcId) ) );
+  return ((a.m_imsi < b.m_imsi) || ((a.m_imsi == b.m_imsi) && (a.m_lcId
+                                                               < b.m_lcId)));
 }
 
-
 NS_LOG_COMPONENT_DEFINE ("RlcStatsCalculator");
 
 NS_OBJECT_ENSURE_REGISTERED (RlcStatsCalculator);
@@ -72,29 +72,23 @@
 TypeId
 RlcStatsCalculator::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::RlcStatsCalculator")
-    .SetParent<Object> ()
-    .AddConstructor<RlcStatsCalculator> ()
-    .AddAttribute ("DlOutputFilename",
-                   "Name of the file where the downlink results will be saved.",
-                   StringValue ("DlRlcStats.csv"),
-                   MakeStringAccessor (&RlcStatsCalculator::SetDlOutputFilename),
-                   MakeStringChecker ())
-    .AddAttribute ("UlOutputFilename",
-                   "Name of the file where the uplink results will be saved.",
-                   StringValue ("UlRlcStats.csv"),
-                   MakeStringAccessor (&RlcStatsCalculator::SetUlOutputFilename),
-                   MakeStringChecker ())
-    .AddAttribute ("StartTime",
-                   "Start time of the on going epoch.",
-                   TimeValue ( Seconds (0.) ),
-                   MakeTimeAccessor (&RlcStatsCalculator::m_startTime),
-                   MakeTimeChecker ())
-    .AddAttribute ("EpochDuration",
-                   "Epoch duration.", TimeValue (Seconds (0.25)),
-                   MakeTimeAccessor (&RlcStatsCalculator::m_epochDuration),
-                   MakeTimeChecker ())
-  ;
+  static TypeId
+    tid =
+    TypeId ("ns3::RlcStatsCalculator").SetParent<Object> ().AddConstructor<
+      RlcStatsCalculator> ().AddAttribute ("DlOutputFilename",
+                                           "Name of the file where the downlink results will be saved.",
+                                           StringValue ("DlRlcStats.csv"), MakeStringAccessor (
+                                             &RlcStatsCalculator::SetDlOutputFilename),
+                                           MakeStringChecker ()).AddAttribute ("UlOutputFilename",
+                                                                               "Name of the file where the uplink results will be saved.",
+                                                                               StringValue ("UlRlcStats.csv"), MakeStringAccessor (
+                                                                                 &RlcStatsCalculator::SetUlOutputFilename),
+                                                                               MakeStringChecker ()).AddAttribute ("StartTime",
+                                                                                                                   "Start time of the on going epoch.", TimeValue (Seconds (0.)),
+                                                                                                                   MakeTimeAccessor (&RlcStatsCalculator::m_startTime),
+                                                                                                                   MakeTimeChecker ()).AddAttribute ("EpochDuration",
+                                                                                                                                                     "Epoch duration.", TimeValue (Seconds (0.25)), MakeTimeAccessor (
+                                                                                                                                                       &RlcStatsCalculator::m_epochDuration), MakeTimeChecker ());
   return tid;
 }
 
@@ -111,11 +105,12 @@
 }
 
 void
-RlcStatsCalculator::UlTxPdu (uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize)
+RlcStatsCalculator::UlTxPdu (uint64_t imsi, uint16_t rnti,
+                             uint8_t lcid, uint32_t packetSize)
 {
   NS_LOG_FUNCTION (this << "UlTxPDU" << imsi << rnti << (uint32_t) lcid << packetSize);
   ImsiLcidPair p (imsi, lcid);
-  if (Simulator::Now () > m_startTime )
+  if (Simulator::Now () > m_startTime)
     {
       m_flowId[p] = LteFlowId_t (rnti, lcid);
       m_ulTxPackets[p]++;
@@ -125,26 +120,51 @@
 }
 
 void
-RlcStatsCalculator::DlTxPdu (uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize)
+RlcStatsCalculator::DlTxPdu (uint16_t cellId, uint64_t imsi, uint16_t rnti,
+                             uint8_t lcid, uint32_t packetSize)
 {
-  NS_LOG_FUNCTION (this << "DlTxPDU" << imsi  << rnti << (uint32_t) lcid << packetSize);
+  NS_LOG_FUNCTION (this << "DlTxPDU" << imsi << rnti << (uint32_t) lcid << packetSize);
   ImsiLcidPair p (imsi, lcid);
-  if (Simulator::Now () > m_startTime )
+  bool forceEpoch = false;
+  if (Simulator::Now () > m_startTime)
     {
+
+      // If the UE hands off to another cell, restart the epoch automatically
+      if (m_dlCellId[p] != 0 && m_dlCellId[p] != cellId)
+        {
+          forceEpoch = true;
+        }
+      else
+        {
+          m_dlCellId[p] = cellId;
+        }
       m_flowId[p] = LteFlowId_t (rnti, lcid);
       m_dlTxPackets[p]++;
       m_dlTxData[p] += packetSize;
     }
-  CheckEpoch ();
+  CheckEpoch (forceEpoch);
 }
 
 void
-RlcStatsCalculator::UlRxPdu (uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize, uint64_t delay)
+RlcStatsCalculator::UlRxPdu (uint16_t cellId, uint64_t imsi, uint16_t rnti,
+                             uint8_t lcid, uint32_t packetSize, uint64_t delay)
 {
   NS_LOG_FUNCTION (this << "UlRxPDU" << imsi << rnti << (uint32_t) lcid << packetSize << delay);
   ImsiLcidPair p (imsi, lcid);
-  if (Simulator::Now () > m_startTime )
+  bool forceEpoch = false;
+
+  if (Simulator::Now () > m_startTime)
     {
+      // If the UE hands off to another cell, restart the epoch automatically
+      if (m_ulCellId[p] != 0 && m_ulCellId[p] != cellId)
+        {
+          forceEpoch = true;
+        }
+      else
+        {
+          m_ulCellId[p] = cellId;
+        }
+
       m_ulRxPackets[p]++;
       m_ulRxData[p] += packetSize;
 
@@ -159,15 +179,16 @@
       m_ulPduSize[p]->Update (packetSize);
     }
 
-  CheckEpoch ();
+  CheckEpoch (forceEpoch);
 }
 
 void
-RlcStatsCalculator::DlRxPdu (uint64_t imsi, uint16_t rnti, uint8_t lcid, uint32_t packetSize, uint64_t delay)
+RlcStatsCalculator::DlRxPdu (uint64_t imsi, uint16_t rnti,
+                             uint8_t lcid, uint32_t packetSize, uint64_t delay)
 {
   NS_LOG_FUNCTION (this << "DlRxPDU" << imsi << rnti << (uint32_t) lcid << packetSize << delay);
   ImsiLcidPair p (imsi, lcid);
-  if (Simulator::Now () > m_startTime )
+  if (Simulator::Now () > m_startTime)
     {
       m_dlRxPackets[p]++;
       m_dlRxData[p] += packetSize;
@@ -189,14 +210,14 @@
 RlcStatsCalculator::ShowResults (void)
 {
 
-  NS_LOG_FUNCTION (this <<  m_ulOutputFilename.c_str () << m_dlOutputFilename.c_str () );
+  NS_LOG_FUNCTION (this << m_ulOutputFilename.c_str () << m_dlOutputFilename.c_str () );
   NS_LOG_INFO ("Write Rlc Stats in " << m_ulOutputFilename.c_str () <<
                " and in " << m_dlOutputFilename.c_str ());
 
   std::ofstream ulOutFile;
   std::ofstream dlOutFile;
 
-  if ( m_firstWrite == true )
+  if (m_firstWrite == true)
     {
       ulOutFile.open (m_ulOutputFilename.c_str ());
       if (!ulOutFile.is_open ())
@@ -212,25 +233,27 @@
           return;
         }
       m_firstWrite = false;
-      ulOutFile << "% start\tend\tIMSI\tRNTI\tLCID\tnTxPDUs\tTxBytes\tnRxPDUs\tRxBytes\t";
+      ulOutFile
+      << "% start\tend\tCellId\tIMSI\tRNTI\tLCID\tnTxPDUs\tTxBytes\tnRxPDUs\tRxBytes\t";
       ulOutFile << "delay\tstdDev\tmin\tmax\t";
       ulOutFile << "PduSize\tstdDev\tmin\tmax";
       ulOutFile << std::endl;
-      dlOutFile << "% start\tend\tIMSI\tRNTI\tLCID\tnTxPDUs\tTxBytes\tnRxPDUs\tRxBytes\t";
+      dlOutFile
+      << "% start\tend\tCellId\tIMSI\tRNTI\tLCID\tnTxPDUs\tTxBytes\tnRxPDUs\tRxBytes\t";
       dlOutFile << "delay\tstdDev\tmin\tmax\t";
       dlOutFile << "PduSize\tstdDev\tmin\tmax";
       dlOutFile << std::endl;
     }
   else
     {
-      ulOutFile.open (m_ulOutputFilename.c_str (),  std::ios_base::app);
+      ulOutFile.open (m_ulOutputFilename.c_str (), std::ios_base::app);
       if (!ulOutFile.is_open ())
         {
           NS_LOG_ERROR ("Can't open file " << m_ulOutputFilename.c_str ());
           return;
         }
 
-      dlOutFile.open (m_dlOutputFilename.c_str (),  std::ios_base::app);
+      dlOutFile.open (m_dlOutputFilename.c_str (), std::ios_base::app);
       if (!dlOutFile.is_open ())
         {
           NS_LOG_ERROR ("Can't open file " << m_dlOutputFilename.c_str ());
@@ -248,35 +271,39 @@
 {
   // Get the unique IMSI / LCID list
 
-  std::vector<ImsiLcidPair > pairVector;
-  for (Uint32Map::iterator it = m_ulTxPackets.begin (); it != m_ulTxPackets.end (); ++it)
+  std::vector<ImsiLcidPair> pairVector;
+  for (Uint32Map::iterator it = m_ulTxPackets.begin (); it
+       != m_ulTxPackets.end (); ++it)
     {
-      if (find (pairVector.begin (), pairVector.end (),  (*it).first ) == pairVector.end () )
+      if (find (pairVector.begin (), pairVector.end (), (*it).first)
+          == pairVector.end ())
         {
           pairVector.push_back ((*it).first);
         }
     }
 
   Time endTime = m_startTime + m_epochDuration;
-  for (std::vector<ImsiLcidPair>::iterator it = pairVector.begin (); it != pairVector.end (); ++it)
+  for (std::vector<ImsiLcidPair>::iterator it = pairVector.begin (); it
+       != pairVector.end (); ++it)
     {
       ImsiLcidPair p = *it;
       outFile << m_startTime.GetNanoSeconds () / 1.0e9 << "\t";
-      outFile << endTime.GetNanoSeconds () / 1.0e9      << "\t";
-      outFile << p.m_imsi                               << "\t";
-      outFile << m_flowId[p].m_rnti                    << "\t";
-      outFile << (uint32_t) m_flowId[p].m_lcId         << "\t";
-      outFile << GetUlTxPackets (p.m_imsi, p.m_lcId)    << "\t";
-      outFile << GetUlTxData (p.m_imsi, p.m_lcId)       << "\t";
-      outFile << GetUlRxPackets (p.m_imsi, p.m_lcId)    << "\t";
-      outFile << GetUlRxData (p.m_imsi, p.m_lcId)       << "\t";
+      outFile << endTime.GetNanoSeconds () / 1.0e9 << "\t";
+      outFile << GetUlCellId (p.m_imsi, p.m_lcId) << "\t";
+      outFile << p.m_imsi << "\t";
+      outFile << m_flowId[p].m_rnti << "\t";
+      outFile << (uint32_t) m_flowId[p].m_lcId << "\t";
+      outFile << GetUlTxPackets (p.m_imsi, p.m_lcId) << "\t";
+      outFile << GetUlTxData (p.m_imsi, p.m_lcId) << "\t";
+      outFile << GetUlRxPackets (p.m_imsi, p.m_lcId) << "\t";
+      outFile << GetUlRxData (p.m_imsi, p.m_lcId) << "\t";
       std::vector<double> stats = GetUlDelayStats (p.m_imsi, p.m_lcId);
-      for ( std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it )
+      for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
         {
           outFile << (*it) * 1e-9 << "\t";
         }
       stats = GetUlPduSizeStats (p.m_imsi, p.m_lcId);
-      for ( std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it )
+      for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
         {
           outFile << (*it) << "\t";
         }
@@ -290,35 +317,39 @@
 RlcStatsCalculator::WriteDlResults (std::ofstream& outFile)
 {
   // Get the unique IMSI list
-  std::vector<ImsiLcidPair > pairVector;
-  for (Uint32Map::iterator it = m_dlTxPackets.begin (); it != m_dlTxPackets.end (); ++it)
+  std::vector<ImsiLcidPair> pairVector;
+  for (Uint32Map::iterator it = m_dlTxPackets.begin (); it
+       != m_dlTxPackets.end (); ++it)
     {
-      if (find (pairVector.begin (), pairVector.end (),  (*it).first ) == pairVector.end () )
+      if (find (pairVector.begin (), pairVector.end (), (*it).first)
+          == pairVector.end ())
         {
           pairVector.push_back ((*it).first);
         }
     }
 
   Time endTime = m_startTime + m_epochDuration;
-  for (std::vector<ImsiLcidPair>::iterator pair = pairVector.begin (); pair != pairVector.end (); ++pair)
+  for (std::vector<ImsiLcidPair>::iterator pair = pairVector.begin (); pair
+       != pairVector.end (); ++pair)
     {
       ImsiLcidPair p = *pair;
       outFile << m_startTime.GetNanoSeconds () / 1.0e9 << "\t";
-      outFile << endTime.GetNanoSeconds () / 1.0e9      << "\t";
-      outFile << p.m_imsi                               << "\t";
-      outFile << m_flowId[p].m_rnti                    << "\t";
-      outFile << (uint32_t) m_flowId[p].m_lcId         << "\t";
-      outFile << GetDlTxPackets (p.m_imsi, p.m_lcId)    << "\t";
-      outFile << GetDlTxData (p.m_imsi, p.m_lcId)       << "\t";
-      outFile << GetDlRxPackets (p.m_imsi, p.m_lcId)    << "\t";
-      outFile << GetDlRxData (p.m_imsi, p.m_lcId)       << "\t";
+      outFile << endTime.GetNanoSeconds () / 1.0e9 << "\t";
+      outFile << GetDlCellId (p.m_imsi, p.m_lcId) << "\t";
+      outFile << p.m_imsi << "\t";
+      outFile << m_flowId[p].m_rnti << "\t";
+      outFile << (uint32_t) m_flowId[p].m_lcId << "\t";
+      outFile << GetDlTxPackets (p.m_imsi, p.m_lcId) << "\t";
+      outFile << GetDlTxData (p.m_imsi, p.m_lcId) << "\t";
+      outFile << GetDlRxPackets (p.m_imsi, p.m_lcId) << "\t";
+      outFile << GetDlRxData (p.m_imsi, p.m_lcId) << "\t";
       std::vector<double> stats = GetDlDelayStats (p.m_imsi, p.m_lcId);
-      for ( std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it )
+      for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
         {
           outFile << (*it) * 1e-9 << "\t";
         }
       stats = GetDlPduSizeStats (p.m_imsi, p.m_lcId);
-      for ( std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it )
+      for (std::vector<double>::iterator it = stats.begin (); it != stats.end (); ++it)
         {
           outFile << (*it) << "\t";
         }
@@ -331,27 +362,26 @@
 void
 RlcStatsCalculator::ResetResults (void)
 {
-  m_ulTxPackets.erase (m_ulTxPackets.begin (), m_ulTxPackets.end () );
-  m_ulRxPackets.erase (m_ulRxPackets.begin (), m_ulRxPackets.end () );
-  m_ulRxData.erase (m_ulRxData.begin (), m_ulRxData.end () );
-  m_ulTxData.erase (m_ulTxData.begin (), m_ulTxData.end () );
-  m_ulDelay.erase (m_ulDelay.begin (), m_ulDelay.end () );
-  m_ulPduSize.erase (m_ulPduSize.begin (), m_ulPduSize.end () );
+  m_ulTxPackets.erase (m_ulTxPackets.begin (), m_ulTxPackets.end ());
+  m_ulRxPackets.erase (m_ulRxPackets.begin (), m_ulRxPackets.end ());
+  m_ulRxData.erase (m_ulRxData.begin (), m_ulRxData.end ());
+  m_ulTxData.erase (m_ulTxData.begin (), m_ulTxData.end ());
+  m_ulDelay.erase (m_ulDelay.begin (), m_ulDelay.end ());
+  m_ulPduSize.erase (m_ulPduSize.begin (), m_ulPduSize.end ());
 
-  m_dlTxPackets.erase (m_dlTxPackets.begin (), m_dlTxPackets.end () );
-  m_dlRxPackets.erase (m_dlRxPackets.begin (), m_dlRxPackets.end () );
-  m_dlRxData.erase (m_dlRxData.begin (), m_dlRxData.end () );
-  m_dlTxData.erase (m_dlTxData.begin (), m_dlTxData.end () );
-  m_dlDelay.erase (m_dlDelay.begin (), m_dlDelay.end () );
-  m_dlPduSize.erase (m_dlPduSize.begin (), m_dlPduSize.end () );
+  m_dlTxPackets.erase (m_dlTxPackets.begin (), m_dlTxPackets.end ());
+  m_dlRxPackets.erase (m_dlRxPackets.begin (), m_dlRxPackets.end ());
+  m_dlRxData.erase (m_dlRxData.begin (), m_dlRxData.end ());
+  m_dlTxData.erase (m_dlTxData.begin (), m_dlTxData.end ());
+  m_dlDelay.erase (m_dlDelay.begin (), m_dlDelay.end ());
+  m_dlPduSize.erase (m_dlPduSize.begin (), m_dlPduSize.end ());
 }
 
 void
-RlcStatsCalculator::CheckEpoch (void)
+RlcStatsCalculator::CheckEpoch (bool forceEpoch)
 {
-  if ( Simulator::Now () > m_startTime + m_epochDuration )
+  if (Simulator::Now () > m_startTime + m_epochDuration /*|| forceEpoch == true*/)
     {
-      std::cout << "JNNNNNNNNNG New epoch! startTime " << m_startTime << " epoch duration " << m_epochDuration << std::endl;
       ShowResults ();
       ResetResults ();
       StartEpoch ();
@@ -398,7 +428,7 @@
 {
   ImsiLcidPair p (imsi, lcid);
   Uint64StatsMap::iterator it = m_ulDelay.find (p);
-  if ( it == m_ulDelay.end () )
+  if (it == m_ulDelay.end ())
     {
       NS_LOG_ERROR ("UL delay for " << imsi << " - " << lcid << " not found");
       return 0;
@@ -413,9 +443,9 @@
   ImsiLcidPair p (imsi, lcid);
   std::vector<double> stats;
   Uint64StatsMap::iterator it = m_ulDelay.find (p);
-  if ( it == m_ulDelay.end () )
+  if (it == m_ulDelay.end ())
     {
-      NS_LOG_ERROR ("UL delay for " << imsi << " - " << lcid  << " not found");
+      NS_LOG_ERROR ("UL delay for " << imsi << " - " << lcid << " not found");
       return stats;
 
     }
@@ -432,7 +462,7 @@
   ImsiLcidPair p (imsi, lcid);
   std::vector<double> stats;
   Uint32StatsMap::iterator it = m_ulPduSize.find (p);
-  if ( it == m_ulPduSize.end () )
+  if (it == m_ulPduSize.end ())
     {
       NS_LOG_ERROR ("UL PDU Size for " << imsi << " - " << lcid << " not found");
       return stats;
@@ -473,12 +503,26 @@
   return m_dlRxData[p];
 }
 
+uint32_t
+RlcStatsCalculator::GetUlCellId (uint64_t imsi, uint8_t lcid)
+{
+  ImsiLcidPair p (imsi, lcid);
+  return m_ulCellId[p];
+}
+
+uint32_t
+RlcStatsCalculator::GetDlCellId (uint64_t imsi, uint8_t lcid)
+{
+  ImsiLcidPair p (imsi, lcid);
+  return m_dlCellId[p];
+}
+
 double
 RlcStatsCalculator::GetDlDelay (uint64_t imsi, uint8_t lcid)
 {
   ImsiLcidPair p (imsi, lcid);
   Uint64StatsMap::iterator it = m_dlDelay.find (p);
-  if ( it == m_dlDelay.end () )
+  if (it == m_dlDelay.end ())
     {
       NS_LOG_ERROR ("DL delay for " << imsi << " not found");
       return 0;
@@ -492,10 +536,10 @@
   ImsiLcidPair p (imsi, lcid);
   std::vector<double> stats;
   Uint64StatsMap::iterator it = m_dlDelay.find (p);
-  if ( it == m_dlDelay.end () )
+  if (it == m_dlDelay.end ())
     {
 
-      NS_LOG_ERROR ("DL delay for " << imsi  << " not found");
+      NS_LOG_ERROR ("DL delay for " << imsi << " not found");
       return stats;
 
     }
@@ -512,7 +556,7 @@
   ImsiLcidPair p (imsi, lcid);
   std::vector<double> stats;
   Uint32StatsMap::iterator it = m_dlPduSize.find (p);
-  if ( it == m_dlPduSize.end () )
+  if (it == m_dlPduSize.end ())
     {
 
       NS_LOG_ERROR ("DL delay for " << imsi << " not found");