From 01fcd078f9cb0eff8b984d9f51026e011f85e874 Mon Sep 17 00:00:00 2001 From: Stefano Avallone Date: Mon, 22 Aug 2016 14:50:59 +0200 Subject: [PATCH] flow-monitor: (fixes #2479) Keep track of packets dropped by queue discs --- RELEASE_NOTES | 1 + src/flow-monitor/model/ipv4-flow-probe.cc | 25 +++++++++++++++++++++++ src/flow-monitor/model/ipv4-flow-probe.h | 6 ++++++ src/flow-monitor/model/ipv6-flow-probe.cc | 25 +++++++++++++++++++++++ src/flow-monitor/model/ipv6-flow-probe.h | 6 ++++++ 5 files changed, 63 insertions(+) diff --git a/RELEASE_NOTES b/RELEASE_NOTES index d8b1e5d0b..2f1709de0 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -93,6 +93,7 @@ Bugs fixed - Bug 2454 - DsrRouting::NotifyDataReceipt is also triggered for wifi management packets - Bug 2468 - Simulation with A-MPDU enabled hangs when fragmentation threshold is smaller than MSDU size - Bug 2469 - send Block Ack Request upon short/long retry failures +- Bug 2479 - Flow monitor does not a have a "DROP_QUEUE_DISC" drop reason Known issues ------------ diff --git a/src/flow-monitor/model/ipv4-flow-probe.cc b/src/flow-monitor/model/ipv4-flow-probe.cc index 11d1067b4..3b7fb0b75 100644 --- a/src/flow-monitor/model/ipv4-flow-probe.cc +++ b/src/flow-monitor/model/ipv4-flow-probe.cc @@ -252,6 +252,10 @@ Ipv4FlowProbe::Ipv4FlowProbe (Ptr monitor, NS_FATAL_ERROR ("trace fail"); } + std::ostringstream qd; + qd << "/NodeList/" << node->GetId () << "/$ns3::TrafficControlLayer/RootQueueDiscList/*/Drop"; + Config::ConnectWithoutContext (qd.str (), MakeCallback (&Ipv4FlowProbe::QueueDiscDropLogger, Ptr (this))); + // code copied from point-to-point-helper.cc std::ostringstream oss; oss << "/NodeList/" << node->GetId () << "/DeviceList/*/TxQueue/Drop"; @@ -463,6 +467,27 @@ Ipv4FlowProbe::QueueDropLogger (Ptr ipPayload) m_flowMonitor->ReportDrop (this, flowId, packetId, size, DROP_QUEUE); } +void +Ipv4FlowProbe::QueueDiscDropLogger (Ptr item) +{ + Ipv4FlowProbeTag fTag; + bool tagFound = item->GetPacket ()->FindFirstMatchingByteTag (fTag); + + if (!tagFound) + { + return; + } + + FlowId flowId = fTag.GetFlowId (); + FlowPacketId packetId = fTag.GetPacketId (); + uint32_t size = fTag.GetPacketSize (); + + NS_LOG_DEBUG ("Drop ("<ReportDrop (this, flowId, packetId, size, DROP_QUEUE_DISC); +} + } // namespace ns3 diff --git a/src/flow-monitor/model/ipv4-flow-probe.h b/src/flow-monitor/model/ipv4-flow-probe.h index 649b9f192..2371a8e05 100644 --- a/src/flow-monitor/model/ipv4-flow-probe.h +++ b/src/flow-monitor/model/ipv4-flow-probe.h @@ -70,6 +70,9 @@ public: /// PointToPoint devices, but not with WiFi or WiMax. DROP_QUEUE, + /// Packet dropped by the queue disc + DROP_QUEUE_DISC, + DROP_INTERFACE_DOWN, /**< Interface is down so can not send packet */ DROP_ROUTE_ERROR, /**< Route error */ DROP_FRAGMENT_TIMEOUT, /**< Fragment timeout exceeded */ @@ -108,6 +111,9 @@ private: /// Log a packet being dropped by a queue /// \param ipPayload IP payload void QueueDropLogger (Ptr ipPayload); + /// Log a packet being dropped by a queue disc + /// \param item queue item + void QueueDiscDropLogger (Ptr item); Ptr m_classifier; //!< the Ipv4FlowClassifier this probe is associated with Ptr m_ipv4; //!< the Ipv4L3Protocol this probe is bound to diff --git a/src/flow-monitor/model/ipv6-flow-probe.cc b/src/flow-monitor/model/ipv6-flow-probe.cc index 067740dd8..443f1aa45 100644 --- a/src/flow-monitor/model/ipv6-flow-probe.cc +++ b/src/flow-monitor/model/ipv6-flow-probe.cc @@ -222,6 +222,10 @@ Ipv6FlowProbe::Ipv6FlowProbe (Ptr monitor, NS_FATAL_ERROR ("trace fail"); } + std::ostringstream qd; + qd << "/NodeList/" << node->GetId () << "/$ns3::TrafficControlLayer/RootQueueDiscList/*/Drop"; + Config::ConnectWithoutContext (qd.str (), MakeCallback (&Ipv6FlowProbe::QueueDiscDropLogger, Ptr (this))); + // code copied from point-to-point-helper.cc std::ostringstream oss; oss << "/NodeList/" << node->GetId () << "/DeviceList/*/TxQueue/Drop"; @@ -407,6 +411,27 @@ Ipv6FlowProbe::QueueDropLogger (Ptr ipPayload) m_flowMonitor->ReportDrop (this, flowId, packetId, size, DROP_QUEUE); } +void +Ipv6FlowProbe::QueueDiscDropLogger (Ptr item) +{ + Ipv6FlowProbeTag fTag; + bool tagFound = item->GetPacket ()->FindFirstMatchingByteTag (fTag); + + if (!tagFound) + { + return; + } + + FlowId flowId = fTag.GetFlowId (); + FlowPacketId packetId = fTag.GetPacketId (); + uint32_t size = fTag.GetPacketSize (); + + NS_LOG_DEBUG ("Drop ("<ReportDrop (this, flowId, packetId, size, DROP_QUEUE_DISC); +} + } // namespace ns3 diff --git a/src/flow-monitor/model/ipv6-flow-probe.h b/src/flow-monitor/model/ipv6-flow-probe.h index 253e23fbe..071d2b0d3 100644 --- a/src/flow-monitor/model/ipv6-flow-probe.h +++ b/src/flow-monitor/model/ipv6-flow-probe.h @@ -71,6 +71,9 @@ public: /// PointToPoint devices, but not with WiFi or WiMax. DROP_QUEUE, + /// Packet dropped by the queue disc + DROP_QUEUE_DISC, + DROP_INTERFACE_DOWN, /**< Interface is down so can not send packet */ DROP_ROUTE_ERROR, /**< Route error */ @@ -114,6 +117,9 @@ private: /// Log a packet being dropped by a queue /// \param ipPayload IP payload void QueueDropLogger (Ptr ipPayload); + /// Log a packet being dropped by a queue disc + /// \param item queue item + void QueueDiscDropLogger (Ptr item); Ptr m_classifier; //!< the Ipv6FlowClassifier this probe is associated with };