From d6d34f3a1fc11546a88f457a42e136a22d1e37b0 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Mon, 1 Aug 2011 16:25:27 -0500 Subject: [PATCH] Fix PktSrc::Statistics returning bogus stats. When reading from trace files, 'dropped' and 'link' fields are now just zeroed. When reading from an interface, the values filled in by pcap_stats() are now only used when that function indicates success. Closes #500. --- src/PktSrc.cc | 22 ++++++++++++------- .../Baseline/bifs.net_stats_trace/output | 1 + testing/btest/bifs/net_stats_trace.test | 8 +++++++ 3 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 testing/btest/Baseline/bifs.net_stats_trace/output create mode 100644 testing/btest/bifs/net_stats_trace.test diff --git a/src/PktSrc.cc b/src/PktSrc.cc index b2287bf8e8..23391c1ffa 100644 --- a/src/PktSrc.cc +++ b/src/PktSrc.cc @@ -393,21 +393,27 @@ void PktSrc::AddSecondaryTablePrograms() void PktSrc::Statistics(Stats* s) { - struct pcap_stat pstat; - if ( reading_traces ) s->received = s->dropped = s->link = 0; - else if ( pcap_stats(pd, &pstat) < 0 ) + else { - reporter->Error("problem getting packet filter statistics: %s", - ErrorMsg()); - s->received = s->dropped = s->link = 0; + struct pcap_stat pstat; + if ( pcap_stats(pd, &pstat) < 0 ) + { + reporter->Error("problem getting packet filter statistics: %s", + ErrorMsg()); + s->received = s->dropped = s->link = 0; + } + + else + { + s->dropped = pstat.ps_drop; + s->link = pstat.ps_recv; + } } s->received = stats.received; - s->dropped = pstat.ps_drop; - s->link = pstat.ps_recv; if ( pseudo_realtime ) s->dropped = 0; diff --git a/testing/btest/Baseline/bifs.net_stats_trace/output b/testing/btest/Baseline/bifs.net_stats_trace/output new file mode 100644 index 0000000000..a2e25e03a7 --- /dev/null +++ b/testing/btest/Baseline/bifs.net_stats_trace/output @@ -0,0 +1 @@ +[pkts_recvd=131, pkts_dropped=0, pkts_link=0] diff --git a/testing/btest/bifs/net_stats_trace.test b/testing/btest/bifs/net_stats_trace.test new file mode 100644 index 0000000000..fcf3e9ba0d --- /dev/null +++ b/testing/btest/bifs/net_stats_trace.test @@ -0,0 +1,8 @@ +# Checks that accurate stats are returned when reading from a trace file. +# @TEST-EXEC: bro -r $TRACES/wikipedia.trace >output %INPUT +# @TEST-EXEC: btest-diff output + +event bro_done() + { + print net_stats(); + }