From ca2220ad7beff95ba77278308441b8f824de1cc0 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Fri, 19 Mar 2010 11:28:49 +0000 Subject: [PATCH] FlowMonitor: measure flow interruptions --- .../gcc-ILP32/ns3_module_flow_monitor.py | 2 ++ .../gcc-LP64/ns3_module_flow_monitor.py | 2 ++ src/contrib/flow-monitor/flow-monitor.cc | 19 +++++++++++++++++++ src/contrib/flow-monitor/flow-monitor.h | 3 +++ 4 files changed, 26 insertions(+) diff --git a/bindings/python/apidefs/gcc-ILP32/ns3_module_flow_monitor.py b/bindings/python/apidefs/gcc-ILP32/ns3_module_flow_monitor.py index 86fc98184..3a1533977 100644 --- a/bindings/python/apidefs/gcc-ILP32/ns3_module_flow_monitor.py +++ b/bindings/python/apidefs/gcc-ILP32/ns3_module_flow_monitor.py @@ -290,6 +290,8 @@ def register_Ns3FlowMonitorFlowStats_methods(root_module, cls): cls.add_instance_attribute('delayHistogram', 'ns3::Histogram', is_const=False) ## flow-monitor.h: ns3::FlowMonitor::FlowStats::delaySum [variable] cls.add_instance_attribute('delaySum', 'ns3::Time', is_const=False) + ## flow-monitor.h: ns3::FlowMonitor::FlowStats::flowInterruptionsHistogram [variable] + cls.add_instance_attribute('flowInterruptionsHistogram', 'ns3::Histogram', is_const=False) ## flow-monitor.h: ns3::FlowMonitor::FlowStats::jitterHistogram [variable] cls.add_instance_attribute('jitterHistogram', 'ns3::Histogram', is_const=False) ## flow-monitor.h: ns3::FlowMonitor::FlowStats::jitterSum [variable] diff --git a/bindings/python/apidefs/gcc-LP64/ns3_module_flow_monitor.py b/bindings/python/apidefs/gcc-LP64/ns3_module_flow_monitor.py index 6d3a03c41..04aa0d2a9 100644 --- a/bindings/python/apidefs/gcc-LP64/ns3_module_flow_monitor.py +++ b/bindings/python/apidefs/gcc-LP64/ns3_module_flow_monitor.py @@ -290,6 +290,8 @@ def register_Ns3FlowMonitorFlowStats_methods(root_module, cls): cls.add_instance_attribute('delayHistogram', 'ns3::Histogram', is_const=False) ## flow-monitor.h: ns3::FlowMonitor::FlowStats::delaySum [variable] cls.add_instance_attribute('delaySum', 'ns3::Time', is_const=False) + ## flow-monitor.h: ns3::FlowMonitor::FlowStats::flowInterruptionsHistogram [variable] + cls.add_instance_attribute('flowInterruptionsHistogram', 'ns3::Histogram', is_const=False) ## flow-monitor.h: ns3::FlowMonitor::FlowStats::jitterHistogram [variable] cls.add_instance_attribute('jitterHistogram', 'ns3::Histogram', is_const=False) ## flow-monitor.h: ns3::FlowMonitor::FlowStats::jitterSum [variable] diff --git a/src/contrib/flow-monitor/flow-monitor.cc b/src/contrib/flow-monitor/flow-monitor.cc index 9a6536f25..45f14e0b0 100644 --- a/src/contrib/flow-monitor/flow-monitor.cc +++ b/src/contrib/flow-monitor/flow-monitor.cc @@ -63,6 +63,14 @@ FlowMonitor::GetTypeId (void) DoubleValue (20), MakeDoubleAccessor (&FlowMonitor::m_packetSizeBinWidth), MakeDoubleChecker ()) + .AddAttribute ("FlowInterruptionsBinWidth", ("The width used in the flowInterruptions histogram."), + DoubleValue (0.250), + MakeDoubleAccessor (&FlowMonitor::m_flowInterruptionsBinWidth), + MakeDoubleChecker ()) + .AddAttribute ("FlowInterruptionsMinTime", ("The minimum inter-arrival time that is considered a flow interruption."), + TimeValue (Seconds (0.5)), + MakeTimeAccessor (&FlowMonitor::m_flowInterruptionsMinTime), + MakeTimeChecker ()) ; return tid; } @@ -100,6 +108,7 @@ FlowMonitor::GetStatsForFlow (FlowId flowId) ref.delayHistogram.SetDefaultBinWidth (m_delayBinWidth); ref.jitterHistogram.SetDefaultBinWidth (m_jitterBinWidth); ref.packetSizeHistogram.SetDefaultBinWidth (m_packetSizeBinWidth); + ref.flowInterruptionsHistogram.SetDefaultBinWidth (m_flowInterruptionsBinWidth); return ref; } else @@ -206,6 +215,15 @@ FlowMonitor::ReportLastRx (Ptr probe, uint32_t flowId, uint32_t packe { stats.timeFirstRxPacket = now; } + else + { + // measure possible flow interruptions + Time interArrivalTime = now - stats.timeLastRxPacket; + if (interArrivalTime > m_flowInterruptionsMinTime) + { + stats.flowInterruptionsHistogram.AddValue (interArrivalTime.GetSeconds ()); + } + } stats.timeLastRxPacket = now; stats.timesForwarded += tracked->second.timesForwarded; @@ -418,6 +436,7 @@ FlowMonitor::SerializeToXmlStream (std::ostream &os, int indent, bool enableHist flowI->second.delayHistogram.SerializeToXmlStream (os, indent, "delayHistogram"); flowI->second.jitterHistogram.SerializeToXmlStream (os, indent, "jitterHistogram"); flowI->second.packetSizeHistogram.SerializeToXmlStream (os, indent, "packetSizeHistogram"); + flowI->second.flowInterruptionsHistogram.SerializeToXmlStream (os, indent, "flowInterruptionsHistogram"); } indent -= 2; diff --git a/src/contrib/flow-monitor/flow-monitor.h b/src/contrib/flow-monitor/flow-monitor.h index 7f8096219..f79559de0 100644 --- a/src/contrib/flow-monitor/flow-monitor.h +++ b/src/contrib/flow-monitor/flow-monitor.h @@ -123,6 +123,7 @@ public: /// This attribute also tracks the number of lost bytes. See also /// comment in attribute packetsDropped. std::vector bytesDropped; // bytesDropped[reasonCode] => number of dropped bytes + Histogram flowInterruptionsHistogram; // histogram of durations of flow interruptions }; // --- basic methods --- @@ -232,6 +233,8 @@ private: double m_delayBinWidth; double m_jitterBinWidth; double m_packetSizeBinWidth; + double m_flowInterruptionsBinWidth; + Time m_flowInterruptionsMinTime; FlowStats& GetStatsForFlow (FlowId flowId); void PeriodicCheckForLostPackets ();