From: Russ Combs (rucombs) Date: Tue, 16 Feb 2016 19:48:22 +0000 (-0500) Subject: Merge pull request #267 in SNORT/snort3 from perfmon to master X-Git-Tag: 3.0.0-233~603 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=89ed7d7bc94ad66f797eccc15960895737ed39ca;p=thirdparty%2Fsnort3.git Merge pull request #267 in SNORT/snort3 from perfmon to master Squashed commit of the following: commit f1eade234d514397a8d784232eb99d589a84585c Author: Carter Waxman Date: Tue Feb 16 14:06:43 2016 -0500 fixed minimum time on perfmon to disallow 0 seconds commit d3099e71110bf8e4571b45a09d1d9e555d731200 Author: Carter Waxman Date: Mon Feb 15 15:56:42 2016 -0500 fixed threadlocal init. fixed include. fixed ranged based for looping. commit 1d7a5bcd8331399d48aa1ad44a57bcbc5d798add Author: Carter Waxman Date: Mon Feb 15 13:09:50 2016 -0500 allow perfmon to dump when no traffic is present --- diff --git a/src/main/snort.cc b/src/main/snort.cc index 28c4a7f43..d4f54e9b3 100644 --- a/src/main/snort.cc +++ b/src/main/snort.cc @@ -607,6 +607,7 @@ void Snort::thread_idle() { if ( flow_con ) flow_con->timeout_flows(16384, time(NULL)); + perf_monitor_idle_process(); aux_counts.idle++; } diff --git a/src/network_inspectors/perf_monitor/perf_module.cc b/src/network_inspectors/perf_monitor/perf_module.cc index 4274d135f..a9e02e3ae 100644 --- a/src/network_inspectors/perf_monitor/perf_module.cc +++ b/src/network_inspectors/perf_monitor/perf_module.cc @@ -49,8 +49,8 @@ static const Parameter s_params[] = { "packets", Parameter::PT_INT, "0:", "10000", "minimum packets to report" }, - { "seconds", Parameter::PT_INT, "0:", "60", - "report interval; 0 means report at exit only" }, + { "seconds", Parameter::PT_INT, "1:", "60", + "report interval" }, { "flow_ip_memcap", Parameter::PT_INT, "8200:", "52428800", "maximum memory for flow tracking" }, diff --git a/src/network_inspectors/perf_monitor/perf_monitor.cc b/src/network_inspectors/perf_monitor/perf_monitor.cc index 993698f5e..762e5e866 100644 --- a/src/network_inspectors/perf_monitor/perf_monitor.cc +++ b/src/network_inspectors/perf_monitor/perf_monitor.cc @@ -87,6 +87,8 @@ public: void tterm() override; }; +static THREAD_LOCAL PerfMonitor* this_perf_monitor; + PerfMonitor::PerfMonitor(PerfMonModule* mod) { mod->get_config(config); @@ -165,16 +167,18 @@ void PerfMonitor::tinit() if (config.perf_flags & SFPERF_EVENT) trackers->push_back(perf_event = new EventTracker(&config)); - for (unsigned int i = 0; i < trackers->size(); i++) - trackers->at(i)->open(true); + for (auto& tracker : *trackers) + tracker->open(true); //FIXIT-M: move this #ifdef LINUX_SMP sfInitProcPidStats(&(sfBase.sfProcPidStats)); #endif - for (unsigned int i = 0; i < trackers->size(); i++) - trackers->at(i)->reset(); + for (auto& tracker : *trackers) + tracker->reset(); + + this_perf_monitor = this; } void PerfMonitor::tterm() @@ -221,42 +225,62 @@ void PerfMonitor::eval(Packet* p) if (IsSetRotatePerfFileFlag()) { - for (unsigned int i = 0; i < trackers->size(); i++) - trackers->at(i)->rotate(); + for (auto& tracker : *trackers) + tracker->rotate(); ClearRotatePerfFileFlag(); } - for (unsigned int i = 0; i < trackers->size(); i++) - trackers->at(i)->update(p); + if (p) + { + for (auto& tracker : *trackers) + tracker->update(p); + } - if ((config.perf_flags & SFPERF_TIME_COUNT) && !p->is_rebuilt()) + if (!p || ((config.perf_flags & SFPERF_TIME_COUNT) && !p->is_rebuilt())) { if (ready_to_process(p)) { - for (unsigned int i = 0; i < trackers->size(); i++) + for (auto& tracker : *trackers) { - trackers->at(i)->process(false); - trackers->at(i)->auto_rotate(); + tracker->process(false); + tracker->auto_rotate(); } } } - ++pmstats.total_packets; + + if (p) + ++pmstats.total_packets; +} + +//FIXIT-M uncouple from Snort class when framework permits +void perf_monitor_idle_process() +{ + this_perf_monitor->eval(nullptr); } static bool ready_to_process(Packet* p) { static THREAD_LOCAL time_t sample_time = 0; + static THREAD_LOCAL time_t cur_time; static THREAD_LOCAL uint64_t cnt = 0; - if (sample_time == 0) - sample_time = p->pkth->ts.tv_sec; + if (p) + { + cnt++; + cur_time = p->pkth->ts.tv_sec; + } + else + cur_time = time(nullptr); + + if (!sample_time) + sample_time = cur_time; - if ( ++cnt >= config.pkt_cnt ) + if ( cnt >= config.pkt_cnt ) { - if ((p->pkth->ts.tv_sec - sample_time) >= config.sample_interval) + if ((cur_time - sample_time) >= config.sample_interval) { cnt = 0; - sample_time = p->pkth->ts.tv_sec; + sample_time = cur_time; return true; } } diff --git a/src/network_inspectors/perf_monitor/perf_monitor.h b/src/network_inspectors/perf_monitor/perf_monitor.h index 43af28bba..b908d6254 100644 --- a/src/network_inspectors/perf_monitor/perf_monitor.h +++ b/src/network_inspectors/perf_monitor/perf_monitor.h @@ -70,6 +70,8 @@ typedef struct _SFPERF extern SFPERF* perfmon_config; extern THREAD_LOCAL bool perfmon_rotate_perf_file; +void perf_monitor_idle_process(); + /* functions to set & get the RotatePerfFileFlag */ inline void SetRotatePerfFileFlag(void) {